微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > FPGA基础学习笔记--组合逻辑电路-多路选择器与多路分解器

FPGA基础学习笔记--组合逻辑电路-多路选择器与多路分解器

时间:10-02 整理:3721RD 点击:
1.2多路选择器
1.2.1不带优先级的多路选择器
四路选择器如下


代码如下:

  1. module multiplexer
  2. (
  3.      input iA,
  4.      input iB,
  5.      input iC,
  6.      input iD,
  7.      input [1:0] iSel,
  8.      output reg oQ
  9. );

  10. always @(*)
  11. begin
  12.      case(iSel)
  13.          2'b00 : oQ=iA;
  14.          2'b01 : oQ=iB;
  15.          2'b10 : oQ=iC;
  16.          2'b11 : oQ=iD;
  17.      endcase
  18. end

  19. endmodule

复制代码

case语句如果没有全部包含所有的情况,则一般要用default语句将信号默认赋值为0,否则会出现锁存器,使得仿真结果不一致。
RTL级视图如下:


testbench如下:

  1. `timescale 1 ns/ 1 ns
  2. module logics_tb();

  3. reg ia;
  4. reg ib;

  5. wire oAnd;
  6. wire oOr;
  7. wire oNot;

  8. initial
  9. begin
  10.      ia=0;
  11.      #40 ia=1;
  12.      #40 ia=0;
  13.      #40 ia=1;
  14.      #40 ia=0;
  15. end

  16. initial
  17. begin
  18.      ib=0;
  19.      #40 ib=0;
  20.      #40 ib=1;
  21.      #40 ib=1;
  22.      #40 ib=0;
  23. end

  24. logics logics_inst
  25. (
  26.      .iA(ia),
  27.      .iB(ib),
  28.      .oAnd(oAnd),
  29.      .oOr(oOr),
  30.      .oNot(oNot)
  31. );

  32. endmodule

复制代码

initial语句和always语句左边的信号类型都要为reg。
RTL级仿真图形如下:


1.2.2 带优先级的多路选择器
代码如下:

  1. module multiplexer
  2. (
  3.      input iA,
  4.      input iB,
  5.      input iC,
  6.      input iD,
  7.      input [1:0] iSel,
  8.      output reg oQ
  9. );

  10. always @(*)
  11.      if(iSel==2'b00)
  12.          oQ=iA;
  13.      else if(iSel==2'b01)
  14.          oQ=iB;
  15.      else if(iSel==2'b10)
  16.          oQ=iC;
  17.      else
  18.          oQ=iD;

  19. endmodule

复制代码

RTL级视图如下:


1.2.3多路分解器
一路输入,三路输出分解器代码如下:

  1. module de_multiplexer
  2. (
  3.      input iA,
  4.      input [1:0] iSel,
  5.      output reg oA,
  6.      output reg oB,
  7.      output reg oC
  8. );

  9. always @(*)
  10. begin
  11.      oA=0;oB=0;oC=0;
  12.      case(iSel)
  13.          2'b00 : oA=iA;
  14.          2'b01 : oB=iA;
  15.          2'b10 : oC=iA;
  16.          default :;
  17.      endcase
  18. end

  19. endmodule

复制代码

RTL级视图如下:

  1. `timescale 1ns/1ns
  2. module de_multiplexer_tb;
  3. reg ia;
  4. reg [1:0] isel;
  5. wire oa;
  6. wire ob;
  7. wire oc;

  8. initial
  9. begin
  10.      ia=0;
  11.      forever
  12.          #10 ia=~ia;
  13. end

  14. initial
  15. begin
  16.      isel=2'b00;
  17.      #20 isel=2'b01;
  18.      #20 isel=2'b10;
  19.      #20 isel=2'b11;
  20.      #20 $stop;
  21. end

  22. de_multiplexer de_multiplexer_inst
  23. (
  24.      .iA(ia),
  25.      .iSel(isel),
  26.      .oA(oa),
  27.      .oB(ob),
  28.      .oC(oc)
  29. );

  30. endmodule

复制代码

RTL级仿真波形如下:

学习了

受益了

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

小编太厉害,引得我们无不称羡啊,32个赞

不错啊!不错啊!不错啊!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top