VHDL计数器内的if语句

时间:2018-12-10 12:11:04

标签: if-statement vhdl counter

我有一个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;

如何更改程序以执行预期的行为?

1 个答案:

答案 0 :(得分:2)

那是完全正确的,这就是您编写的代码。

用语言表达:  “在时钟的上升沿,当计数器的值为101时,w_en将被设置为高。”

因此,在时钟的上升沿之后 ,从中导出w_en的{​​{1}}信号将变高。
o_en更改的同时,之后,上升时钟变为“ 110”。

有两种解决方案:

  1. 测试“ 100”(因此要早一个周期)

  2. 使w_en(从而使o_en)组合。

对于后者,您必须将作业移至“已计时”部分之外 并使用例如

w_en <='1',而w_data =“ 101”否则为'0';