2017-04-17 15 views
1

すべての入力がxclk = 1の場合、出力値はQplになりますが、出力されません。次のコードの問題点は何ですか?VHDLデザインで予期しない結果が発生しました

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
--This is a D Flip-Flop with Synchronous Reset,Set and Clock Enable(posedge clk). 
--Note that the reset input has the highest priority,Set being the next highest 
--priority and clock enable having the lowest priority. 
ENTITY syn IS 
    PORT (
     Q : OUT std_logic; -- Data output 
     CLK : IN std_logic; -- Clock input 
     Qpl : IN std_logic; 
     RESET : IN std_logic; -- Synchronous reset input 
     D : IN std_logic; -- Data input 
     SET : IN std_logic -- Synchronous set input 
    ); 
END syn; 
ARCHITECTURE Behavioral OF syn IS --architecture of the circuit. 
BEGIN 
    --"begin" statement for architecture. 
    PROCESS (CLK) --process with sensitivity list. 
    BEGIN 
     --"begin" statment for the process. 
     IF (CLK'EVENT AND CLK = '1') THEN --This makes the process synchronous(with clock) 
      IF (RESET = '1') THEN 
       Q <= '0'; 
      ELSE 
       IF (SET = '1') THEN 
        Q <= D; 
       ELSE 
        Q <= Qpl; 
       END IF; 
      END IF; 
     END IF; 
    END PROCESS; --end of process statement. 
END Behavioral; 

以下の図は、上記デザインの波形と望ましい動作要件を示しています。波形図から

waveform
+0

'SET'は' D'を適用するのに適していないことに注意してください。 "reset"はレジスタを '0'に設定し、setは通常レジスタを '1'に設定します。通常の名前は "load"または "enable"です。私は "負荷"が最善の選択だと思います。 – JHBonarius

答えて

1

、条件を評価することができない場合、このように出力QもつまりU、などとなり、入力信号SETUなったとき、すべてが、申し分なく動作するようです。 SET0であるのに対して、出力QQplの値を正しく取得していました。

enter image description here

粗製の描画のため申し訳ありません

が、SET0ているときに、立ち上がり円で囲まれたクロックで見ることができ、Qは予想通りQplの値を取得します。 SET信号がUになった後でのみ、出力Qも次のクロック上昇イベントでその値を失い、またU

+0

私のコードでも正しい質問が正しいのですか?(波形イメージの上に) –

+0

'Qpl'部分以外は設定しておらず、ロジックも間違っています。入力信号ではなく、ローカルに格納された値 - >変数Qtempを持ち、その値を保持している間に 'Q'の値を保持する必要があります。[this](http: /stackoverflow.com/a/14593941/3641067) –

+0

おそらくこれは尋ねるのがたくさんあるだろうが、私のコードにそのようなことを暗示する方法はわからない。私はこのコード言語には本当に新しいです。あなたの助け –

1

となります。テーブル/図と同様。 Dフリップフロップ/レジスタは非常に単純なコンポーネントです。例:

entity dff is 
    port (
     clk : in std_logic; 
     rst : in std_logic; 
     set : in std_logic; 
     load : in std_logic; 
     d : in std_logic; 
     q : out std_logic 
    ); 

architecture rtl of dff is 
begin 
    dff_proc : process(clk) 
    begin 
     if rising_edge(clk) then 
      if rst='1' then 
       q <= '0'; 
      elsif set='1' then 
       q <= '1'; 
      elsif load='1' then 
       q <= d; 
      end if; 
     end if; 
    end process; 
end architecture; 
関連する問題