【发布时间】:2016-06-26 23:44:56
【问题描述】:
我遇到了波形输出错误的问题,基本上我的代码作为一个计数器工作,当我的负载信号等于“1”时,计数器会上升,如果负载信号为“0”,则计数器不会” t 很重要。我有一个明确的信号让计数器进入 0,我的问题出在输出中,输出始终显示相同的值,并且当清除信号等于 1 时不会进入 0。
波形下方:
代码下方:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity tot is
port (
i_CLR : IN STD_LOGIC;
i_CLK : IN STD_ULOGIC;
i_DINL : IN STD_LOGIC ;
i_DINK : IN INTEGER;
o_DOUTK : BUFFER INTEGER);
end tot;
architecture arch_1 of tot is
signal w_K : integer;
begin
PROCESS (i_DINL)
begin
IF rising_edge(i_CLK) THEN
IF (i_CLR = '1') THEN
w_K <= 0;
ELSE
w_K <= i_DINK;
END IF;
IF (i_DINL = '1') THEN
w_K <= w_K + 1;
ELSE
w_K <= w_K;
END IF;
o_DOUTK <= w_K;
END IF;
end process;
end arch_1;
更新 1:
architecture arch_1 of tot is
signal w_k: integer;
begin
process (i_clk) -- WAS (i_dinl)
begin
if rising_edge(i_clk) then
if i_clr = '1' then
w_k <= 0;
else
w_k <= i_dink;
end if;
if i_dinl = '1' then
w_k <= w_k + 1;
-- else
-- w_k <= w_k;
end if;
-- o_doutk <= w_k;
end if;
end process;
o_doutk <= w_k; -- MOVED to here.
end architecture arch_1;
当我尝试执行此逻辑将值从 k 加载到初始计数值时,波形中的错误仍然出现。
波形:
更新2(正确情况):
在阅读了 cmets 后,我得到了解决问题的方法,我使用状态机让我的计数器从 K 加载先前的值,使用这段代码我已经让代码正常工作。
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.std_logic_arith.ALL;
ENTITY controle IS
PORT (
i_RST : IN STD_LOGIC;
i_CLR : IN STD_LOGIC; -- Sinal vindo do controle para limpar o valor de K
i_CLK : IN STD_ULOGIC; -- Sinal de clock para sincronizar com o controle
i_DINL : IN STD_LOGIC ; -- Sinal de load para carregar K
i_DINK : IN INTEGER; -- Valor antigo de K
o_DOUTK : BUFFER INTEGER
);
END controle;
ARCHITECTURE arch_1 OF controle IS
TYPE state_type IS (s0, s1, s2,s3);
SIGNAL stateT : state_type;
signal w_k: integer;
BEGIN
PROCESS(i_CLK)
BEGIN
IF rising_edge(i_CLK) THEN
IF (i_RST = '1') THEN
stateT <= s0;
ELSE
CASE stateT IS
when s0 => if (i_CLR = '1') THEN
w_k <= 0;
stateT <= s2;
else
stateT <= s1;
end if;
when s1 => if (i_dinl = '1') then
w_k <= i_dink;
stateT <= s2;
end if;
when s2 => w_K <= w_k + 1;
stateT <= s3;
when s3 => o_DOUTK <= w_K;
stateT <= s0;
END CASE;
END IF;
END IF;
END PROCESS;
END arch_1;
【问题讨论】:
标签: integer vhdl unsigned waveform quartus