热度 18
2013-9-2 10:19
3471 次阅读|
0 个评论
看过一些资料,是研究if和case的好处和坏处,在什么时候该用if,在什么时候该用case等等的。但是看完这些分析后,并没有很明确地体会到这两者的优缺点,也没有体会这两个选择器该什么时候用。因此做几个小实验,自己体验一下到底if和case是怎么实现的。 实验过程用的是xilinx的virtex-6系列的240T,6系列的slice中的LUT是6输入的,由两个5输入的LUT组成。首先根据数电的知识,对于一个选择器,我们是可以把选择信号当成输入信号的,输入的数据信号和选择信号同时输入,这两路信号之间是可以构成逻辑函数的。 为了能让一个6输入的LUT即能实现这个逻辑函数,因此设置我们的选择器的选择信号为两位,数据输入4位,两位选择信号从四路中选择一路输出。 1、首先看case语句的实现代码: always @( posedge clk) begin if (rst) data = 1 'b0; else begin case (sel) 2'b00: data = data_in ; 2'b01: data = data_in ; 2'b10: data = data_in ; 2'b11: data = data_in ; default: data = data; endcase end 综合以后的Technology Schematic图如下: 发现一个六输入的LUT便实现了我们的选择器。大致的实现过程如下: 根据case中的描述,综合器将输入的选择信号和输入的四位信号作为一个逻辑函数的输入,列出输入信号的真值表,得到输出data和输入data_in和sel之间的逻辑函数。我们知道LUT可以直接实现逻辑函数的,这样便通过一个6输入的LUT实现了一个case语句描述的选择器。 2、下面在看if描述的选择器的生成代码: always @( posedge clk) begin if (rst) data = 1 'b0; else begin if (sel == 2'b00) data = data_in ; else if (sel == 2 'b01) data = data_in ; else if (sel==2'b10) data = data_in ; else if (sel==2 'b11) data = data_in ; end 综合以后的Technology Schematic图如下: 综合器将插入一个选择器,至于这个选择器的最终实现,还得看低层的结构,如下图所示绿色部分电路: 这样我们同样可以看到,这个选择器还是用了一个LUT实现,实现的过程和case是一样的。 从这里可以看到,if和case所实现的选择器,是等效的。 3、总结 因此,个人觉得If和case这两个选择器,本身属于行为上的描述,从行为上来看,if是一种串行结构,必须一层一层地进行条件判断,而case则是只对条件进行一次判断,然后从中选取一个结果,行为上可以理解所有条件都是并行判断了一次,但是这些只是从行为上来看的并行和串行,综合器不会理解这些行为。在综合的过程中,综合器在对if综合时,综合器可能遍历if中所有的条件,然后推导出逻辑函数,并将if描述的串行行为用并行的电路实现,如上例中所示,当然也能用串行的结构来实现,这取决于综合器。 所以我个人认为,if和case在行为上描述可以更好地理解一个功能的实现,但是在硬件的实现上并不一定和行为上的描述结构一致。至于什么时候用if,什么时候用case,一来若两者综合的结果是一致的,我们肯定愿意选择行为上更好理解的电路描述,若综合器选择的综合方式不同,那就要看综合器了,毕竟串行的电路结构延时太大,关键路径太长,系统性能受到影响。