编码器vhdl程序的问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 03:55:07
我写了两个编码器的程序,功能仿真都通过,也就是说他们的功能都一样,可是生成的电路图差别可就大了,且用的资源相差一倍,不知道是什么问题,下面是这两个程序
程序一:
library ieee;
use ieee.std_logic_1164.all;

entity bianma is
port(input : in std_logic_vector(7 downto 0);
output : out std_logic_vector(2 downto 0)
);
end entity;

architecture bianma of bianma is
begin
process(input)
begin
case input is
when"00000001"=>output<="000";
when"00000010"=>output<="001";
when"00000100"=>output<="010";
when"00001000"=>output<="011";
when"00010000"=>output<="100";
when"00100000"=>output<="101";
when"01000000"=>output<="110";
when"10000000"=>output<="111";
when others=> output<="000";
end case;
end process;
end archi

二楼说的有问题,因为if..else和case是有区别的,不是语句的先后执行的问题,硬件语言是要考虑它的布线关系的问题。对于case语句,因为它的各个选项之间是互斥的,所以case语句比较容易综合成mux选择器。但是if..else语句之间的关系是后面语句的条件是以前面语句条件不成立为基础的,在这个例子中第二句elsif (input="00000010") then 等价于 input="00000010" and input/="00000001"。以此类推这类语法综合以后是逐级判断的所以综合的结果会完全不同。
所以在quartus的RTL Viewer中可以看出来 case语句综合出来是并行的MUX,而if..else综合出来是逐级递推的关系。

资源问题的话,不同的器件确实不一样,因为cyclone的LE和stratix的ALU的基本结构不一样,所以实现的资源数也不一样。如果是xilinx的器件就更不一样。但是在同样的器件下,case结构确实比if..else结构省资源

if..else结构和case结构描述的电路是不同的,if..else结构是有优先级的,第一个判断条件具有最高的优先级,向下类推!case结构所有的分枝都是平级的!可以参考一下编译生成的rtl图,看看终合以后生成的硬件电路。个人认为尽量用case这种并行的选择结构。

楼上的回去看书去,不要望文生义。
虽然case...when看上去像是并行的,但vhdl语法里它也是顺序语句。执行过程和if...then...else是一样的,先判断第一个when,然后判断第二个when,也是有优先级的。
并行语句是with...select和when...else。

我也把上面的两个编码器compile了一下,结果是一样的,都是9个logic elements。

结果不用的原因可能与quartus的版本和自己的电脑有关,以及所选用的芯片有关。这些都会影响compile.

请确定编译用的是同样的芯片.

这个逻辑太简单,所以资源消耗达到了1倍的惊人差距,但其实只差了7个逻辑单元。实际上