If statement VHDL中计数器内的if语句

If statement VHDL中计数器内的if语句,if-statement,vhdl,counter,If Statement,Vhdl,Counter,我有一个从“000”开始向上计数的3位计数器。每次达到“101”时,我希望o_en信号为高 我有以下VHDL文件 不幸的是,行为有所不同。 当达到“110”时,o_en信号为高电平(延迟一个时钟周期) ieee库; 使用ieee.std_logic_1164.all; 使用ieee.std_logic_unsigned.all; 实体专用计数器为 港口( i_clk:标准逻辑; i_en:标准逻辑; 第一:标准逻辑; o_数据:输出标准逻辑向量(2到0); 输出标准逻辑 ); 终端实体; 特殊_

我有一个从“000”开始向上计数的3位计数器。每次达到“101”时,我希望o_en信号为高
我有以下VHDL文件
不幸的是,行为有所不同。
当达到“110”时,o_en信号为高电平(延迟一个时钟周期)

ieee库;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_unsigned.all;
实体专用计数器为
港口(
i_clk:标准逻辑;
i_en:标准逻辑;
第一:标准逻辑;
o_数据:输出标准逻辑向量(2到0);
输出标准逻辑
);
终端实体;
特殊_计数器的结构表现为
信号w_数据:标准逻辑向量(2到0);
信号w_en:标准逻辑;
开始
过程(i_clk,i_rst)开始
如果i_rst='1',那么

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

换言之: ‘在时钟上升沿,当计数器的值为101时,
w_en
将设置为高。’

因此,从中导出
o\u en
w\u en
信号将在时钟上升沿之后为高
w_数据
变化的同时,之后,上升时钟变为“110”

有两种解决方案:

  • 测试“100”(因此提前一个周期)

  • 使w_en(从而o_en)组合

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


    这是完全正确的,这就是你所编码的

    换言之: ‘在时钟上升沿,当计数器的值为101时,
    w_en
    将设置为高。’

    因此,从中导出
    o\u en
    w\u en
    信号将在
    时钟上升沿之后为高
    w_数据
    变化的同时,之后,上升时钟变为“110”

    有两种解决方案:

  • 测试“100”(因此提前一个周期)

  • 使w_en(从而o_en)组合

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

    沃恩
    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;