将一个信号重新赋值给进程中的自身



我正在开发一个简单的计数器,在VHDL中具有启用信号,问题是将信号重新分配给其先前的值如output_reg信号是否正确。额外的问题:有必要把信号放在灵敏度列表中吗?我不这么认为,因为在这种情况下,我们有一个顺序的过程。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity counter is
generic (
NBit : positive := 8
);
port (
en: in std_logic; 
rst,clk : in std_logic;
overflow: out std_logic;
o: out std_logic_vector( NBit-1 downto 0 )
);
end counter;
-- when en = '1' it counts the clock cycles, otherwise the counting is freezed
-- set overflow to 1 when max_val is reached
architecture beh of counter is
signal output_reg : std_logic_vector (NBit-1 downto 0);
constant max_val  : std_logic_vector (NBit-1 downto 0) := (others => '1');
begin
counter_output_reg: process(clk, rst)
begin
if(rst = '1') then 
output_reg <= (others => '0');
overflow <= '0';
elsif((rising_edge(clk)) AND en='1') then 

if (unsigned(output_reg) = unsigned(max_val)) then
output_reg <= (others => '0');
overflow <= '1';
else
output_reg <= output_reg + 1;
end if;

else
output_reg <= output_reg;
end if;
end process counter_output_reg;

-- mapping the output
o <= output_reg; -- when output_reg change this thing change.
end beh;

注释指出该语句不是必需的,但是您最终得到的结构实际上根本不可取。你基本上得到了:

process(clk, rst)
begin
if(rst = '1') then 
output_reg <= (others => '0');
elsif(rising_edge(clk)) then
output_reg <= output_reg + 1;
else
-- Last branch
output_reg <= output_reg;
end if;
end process;

rst没有断言且clk上没有上升沿时,最后一个分支是活动的。如果你需要合成这个过程,没有任何真正的硬件可以检测"没有上升沿"。在这种情况下,因为你在这个分支中的分配什么也不做,也许工具会解决这个问题,但通常我会避免这种结构,因为它会邀请其他人(或未来的你)在这个分支中放入其他代码,然后可能无法工作。

相关内容

  • 没有找到相关文章

最新更新