私はこのコードに問題があります。状態S0は、想定されていなくても、常にアクティブであるようです。この状態の出力は反転しているように見えます(無効にする必要がある場合はアクティブです)。何か案は?最下部のシミュレーションを印刷します。おかげVHDLステート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;
は、ここでシミュレーションの印刷です:
これは1つのホットエンコーディングのようです(これは合成後のシミュレーションです)。 PState.S0の極性は反転しているように見え、残りは正のように見えます。合成されたハードウェアは極性をまっすぐに保つ必要がありますが、PStateは出力ではありません。正しくシミュレートしますか?あなたは、合成前のシミュレーションを可能にする[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を提供していません。 *どんなアイディアですか?*は質問のために少し広いです。おそらく、あなたが内部を仲間に入れたいのであれば、合成を違ったものにすることができました。 – user1155120