我有一个3位计数器,从“ 000”开始向上计数。每次达到“ 101”时,我都希望o_en信号为HIGH。
我有以下VHDL文件。
不幸的是,行为不同。
当达到“ 110”时(延迟一个时钟周期),o_en信号为HIGH。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity special_counter is
port(
i_clk : in std_logic;
i_en : in std_logic;
i_rst : in std_logic;
o_data : out std_logic_vector(2 downto 0);
o_en : out std_logic
);
end entity;
architecture behave of special_counter is
signal w_data : std_logic_vector(2 downto 0);
signal w_en : std_logic;
begin
process(i_clk, i_rst) begin
if i_rst = '1' then
w_data <= "000";
elsif rising_edge(i_clk) then
if i_en = '1' then
if w_data = "101" then
w_en <= '1';
w_data <= w_data + 1;
else
w_en <= '0';
w_data <= w_data + 1;
end if;
end if;
end if;
end process;
o_data <= w_data;
o_en <= w_en;
end architecture;
如何更改程序以执行预期的行为?
答案 0 :(得分:2)
那是完全正确的,这就是您编写的代码。
用语言表达:
“在时钟的上升沿,当计数器的值为101时,w_en
将被设置为高。”
因此,在时钟的上升沿之后 ,从中导出w_en
的{{1}}信号将变高。
在o_en
更改的同时,之后,上升时钟变为“ 110”。
有两种解决方案:
测试“ 100”(因此要早一个周期)
使w_en(从而使o_en)组合。
对于后者,您必须将作业移至“已计时”部分之外 并使用例如
w_en <='1',而w_data =“ 101”否则为'0';