我在使用这段代码时遇到了一些麻烦。似乎状态S0始终处于活动状态,即使它不应该是活动的。似乎该状态的输出被反转(当它被禁用时激活)。有任何想法吗?在底部打印模拟。感谢
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity ControlUnit is
port(clk : in std_logic;
reset : in std_logic;
validTime : in std_logic;
timeData : in std_logic_vector(3 downto 0);
writeEnable : out std_logic;
writeAddress : out std_logic_vector(3 downto 0);
averageReady : out std_logic);
end ControlUnit;
architecture Behavioral of ControlUnit is
type TState is (S0, S1, S2, S3, S4, S5);
signal PState, NState: TState;
begin
sync_proc: process(clk, reset)
begin
if(reset = '1') then
PState <= S0;
elsif(rising_edge(clk)) then
PState <= NState;
end if;
end process;
comb_proc: process(PState, validTime, timeData)
begin
averageReady <= '0';
writeEnable <= '0';
case PState is
when S0 =>
if(validTime = '1') then
writeEnable <= '1';
NState <= S1;
else
NState <= S0;
end if;
when S1 =>
if(validTime = '1') then
writeEnable <= '1';
NState <= S2;
else
NState <= S1;
end if;
when S2 =>
if(validTime = '1') then
writeEnable <= '1';
NState <= S3;
else
NState <= S2;
end if;
when S3 =>
if(validTime = '1') then
writeEnable <= '1';
NState <= S4;
else
NState <= S3;
end if;
when S4 =>
if(validTime = '1') then
writeEnable <= '1';
NState <= S5;
else
NState <= S4;
end if;
when S5 =>
averageReady <= '1';
NState <= S0;
when others =>
NState <= S0;
end case;
end process;
with PState select
writeAddress <= "0000" when S0,
"0001" When S1,
"0010" when S2,
"0011" when S3,
"0100" when S4,
"XXXX" when others;
end Behavioral;
以下是模拟的印刷品:
答案 0 :(得分:0)
您的代码一切正常。为什么你认为S0状态总是有效?你不能用波形说出来,因为你不知道编码方案。另一方面,您不断地写地址信号更改意味着您的状态机改变其状态。