If statement VHDL中计数器内的if语句
我有一个从“000”开始向上计数的3位计数器。每次达到“101”时,我希望o_en信号为高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); 输出标准逻辑 ); 终端实体; 特殊_
我有以下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;