减少资源占用的方法--避免产生全比较器

今天在看这本书《VHDL数字电路设计教程》中第76页有写到如何避免使用全比较器,觉得可以记录下来,以后在写代码的时候可以借鉴。
先来看一下这个例子:
实现的是一个进行循环累加的模10计数器,代码如下:
----------------------------
LIBRARY ieee
USE ieee.std_logic_1164.all
----------------------------
entity counter is
    port ( clk : in std_logic;
           digit: out integer range 0 to 9 );
end counter;
----------------------------
architecture counter of counter is
bedin 
    counter : process (clk)
        variable temp : integer range 0 to 10;
    begin 
        if(clk'event and clk = '1') then
            temp := temp + 1;
            if (temp = 10) then temp := 0;
            end if;
        end if;
        digit <= temp;
    end process count; 
end counter;

在上面代码中,为了在temp计数到10时对计数器复位,每次对temp累加时都会将它与10进行比较,这是计数器设计常用的一种方法。由于10是一个常数,编译器会产生相对来说比较简单的常数比较器电路。然而如果不使用常数而是一个可编程的参数,那么在电路实现时就会产生一个全比较器,这样会需要更多的逻辑资源,这种情况下,更好的解决办法是在代码开头就把参数赋值给temp,然后对temp进行递减计数操作,当递减到0的时候把参数重新赋值给temp,这样,比较器是对temp和0(常数)进行比较,就可以避免产生全比较器了。还有就是使用temp=10比使用temp>=10要占用更少的硬件资源,所以在编写代码的时候要尽量减少<=和>=的使用。

另外还需要注意的是,上面的代码中没有复位输入端口,process内部也没有对temp变量进行初始化,从而使输出信号digit没有确定的初始值,因此,在实际电路刚启动的时候,temp可以是任意值。在这个是需要相当的注意的,在实际应用中容易出现大问题,所以对于计数器,我个人比较推荐的做法是接入复位信号,保证上电的时候从0开始计数是比较稳妥的一种做法。

当然了,有些人为了仿真的时候给计数器赋初值,直接在定义变量或者信号的时候赋值0,这样仅仅只是在仿真的时候有一个初始值,在实际电路工作的时候它的初始值还是不定值。

你可能感兴趣的:(FPGA)