EDN首页   博客首页 用户登陆  |  注册

日志档案

发表于 2008/10/3 22:10:09

8

标签: verilog  RTL视图  

不同的verilog代码风格看RTL视图之三

不同的verilog代码风格看RTL视图之三

 

    我们来做一个4选一的Mux的实验,首先是利用ifelse语句来做,如下。

(由输入xsel来选择输出的路数xin0,xin1,xin2,xin3其一,输出yout

    Ex3:

input clk;

input xin0,xin1,xin2,xin3;

input[1:0] xsel;

 

output yout;

 

reg youtr;

 

always @ (posedge clk)

    if(xsel == 2'b00) youtr <= xin0;

    else if(xsel == 2'b01) youtr <= xin1;

    else if(xsel == 2'b10) youtr <= xin2;

    else youtr <= xin3;

 

assign yout = youtr;

 

    综合后的RTL视图如下:

点击看大图

    上面的视图里,可以看出有三个等于比较器,然后在触发器前会有三个21的选择器。和我们的代码是一样的,第一个if语句的优先级是最高的(这里所谓的优先级最高不是软件意义上的高优先级,由于HDL设计的并行性,判断语句综合后不是先后进行判断,而是在同一时刻进行判断,也就是说if和后面的if else 或者else其实是同时进行判断的),看红线连接的网络,如果它的等于比较器的逻辑值为1,那么决定了最后一个21mux的值必定是和xin0连接的而与前面的结果无关。依次类推,如果它的等于比较器的值为0,那么最后的输出就由前面的逻辑来决定。其实,综合出来这样的结果和我们的设想还是有出入的,一个41mux何必如此复杂呢。

    下面就看用case语句来做这个41mcu吧。

 

input clk;

input xin0,xin1,xin2,xin3;

input[1:0] xsel;

 

output yout;

 

reg youtr;

 

always @ (posedge clk)

    case (xsel)

       2'b00: youtr <= xin0;

       2'b01: youtr <= xin1;

       2'b10: youtr <= xin2;

       default: youtr <= xin3;

       endcase

      

assign yout = youtr;

 

    它的RTL视图如下:

点击看大图 

    呵呵,上面应该就是我们所要的,41mux,一目了然。Caseif的用法还是应该根据具体的情况而定,但是尽量多用case往往会更简化硬件电路。

系统分类: CPLD/FPGA   |   用户分类: FPGA设计感悟   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

阅读(2046)  |  评论(7)  |  收藏(2)  |  举报  

投一票您将和博主都有获奖机会!

最新评论

  • ilove314

    2008/10/9 18:34:45

    截图啊!

  • MCU520

    2008/10/9 16:44:40

    小声的问,RTL视图怎么上传滴?

  • wangxing

    2008/10/8 9:57:10

    不错的!!!!!

  • ilove314

    2008/10/7 22:01:52

    LS的说的也没有错,我这里只是做时序逻辑说明这个问题,如果你用纯组合逻辑做确实是节省了一个寄存器。但话说回来,纯组合逻辑综合出来的优化效果也是不一样。感兴趣的朋友可以比较下后面两个组合逻辑综合出来的逻辑。 EX1: input xin0,xin1,xin2,xin3; input[1:0] xsel; output yout; assign yout = (xsel == 2'b00) ? xin0 : ((xsel == 2'b01) ? xin1 : ((xsel == 2'b10) ? xin2:xin3)); EX2: input xin0,xin1,xin2,xin3; input[1:0] xsel; output yout; assign yout = xsel[1] ? (xsel[0] ? xin3:xin2):(xsel[0] ? xin1:xin0);

  • qipeihong

    2008/10/7 18:57:17

    用纯组合逻辑实现不就是更简单了,省去一个寄存器,相应于verilog中的 assign a = en ? x : y; 这种结构不是更简单吗?

  • ilove314

    2008/10/7 18:33:16

    那么请问如何才更简单呢? 难道做一个4选1还可以有更优化的方法?

  • qipeihong

    2008/10/7 17:16:08

    晕,MUX是一个组合逻辑电路,这样两种方法实现起来都不简单……