2017-02-17 8 views
0

私は単純なVHDLデザインと期待される出力を生成しないテストベンチを持っています。 ISimは、「実行中」状態になるまで(myState = '1')、すべての出力に対して 'U'を表示します。次に、0とXの値を表示します。 ENABLEが '0'の場合、最初のPROCESSブロックはすべての出力を '0'に設定する必要があります。テストベンチは、ENABLE 0-1-0をトグルしてイベントがプロセスをトリガすることを保証しますが、出力は「U」のままです。問題は、設計、テスト、またはその両方ですか? =ISimはすべての出力に対してUを表示します

VHDL

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity TestHarness1 is 
port (
    ADAT_WDCLK : in std_logic; 
    ADAT_BCLK: in std_logic; 
    ADAT_OUT12: in std_logic; 
    ENABLE: in std_logic; 

    PCM_FS : out std_logic; 
    PCM_CLK : out std_logic; 
    PCM_DIN : out std_logic 
); 
end TestHarness1; 

architecture Behavioral of TestHarness1 is 
    --type state is (STOPPED, RUNNING); 
    signal tmp : std_logic; 
    signal myState : std_logic; 
begin 
    PCM_DIN <= tmp; 

    -- State management process 
    process (ENABLE, ADAT_WDCLK) begin -- Eval on input changes 
     if (ENABLE = '0') then 
      myState <= '0'; --STOPPED; 
      PCM_FS <= '0'; -- All outputs muted 
      PCM_CLK <= '0'; 
      tmp <= '0'; 
     else 
      if (myState = '0' and rising_edge(ADAT_WDCLK)) then 
       -- Move to running state only at start of a frame 
       myState <= '1'; --RUNNING; 
      end if; 
     end if; 
    end process; 

    -- Output process 
    process (ADAT_WDCLK, ADAT_BCLK, myState) variable counter: integer := 0; begin 
     -- Only do something if we are in running state, process above 
     -- sets outputs when stopped. 
     if (myState = '1') then 

      -- Pass the clocks through, inverting the bit clock 
      PCM_FS <= ADAT_WDCLK; 
      PCM_CLK <= not ADAT_BCLK; 

      -- Generate fixed bit pattern data '11000101' 
      if rising_edge(ADAT_WDCLK) then 
       -- This would happen naturally since there are 4 bytes per word clock 
       counter := 0; 
      end if; 
      if falling_edge(ADAT_WDCLK) then 
       -- This would happen naturally since there are 4 bytes per word clock 
       counter := 0; 
      end if; 
      if rising_edge(ADAT_BCLK) then -- Change data state only on falling edge of output PCM_CLK 
       if counter = 0 or counter = 1 or counter = 5 or counter = 7 then 
        tmp <= '1'; 
       else 
        tmp <= '0'; 
       end if; 
       if (counter = 7) then 
        counter := 0;  -- Reset counter 
       else 
        counter := counter + 1; -- Just inc counter 
       end if; 

      end if; 
     end if; 
    end process; 
end Behavioral; 

テストベンチ

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY TH1TestBench3 IS 
END TH1TestBench3; 

ARCHITECTURE behavior OF TH1TestBench3 IS 

    -- Component Declaration for the Unit Under Test (UUT) 

    COMPONENT TestHarness1 
    PORT(
     ADAT_WDCLK : IN std_logic; 
     ADAT_BCLK : IN std_logic; 
     ADAT_OUT12 : IN std_logic; 
     ENABLE : IN std_logic; 
     PCM_FS : OUT std_logic; 
     PCM_CLK : OUT std_logic; 
     PCM_DIN : OUT std_logic 
     ); 
    END COMPONENT; 


    --Inputs 
    signal ADAT_WDCLK : std_logic := '0'; 
    signal ADAT_BCLK : std_logic := '0'; 
    signal ADAT_OUT12 : std_logic := '0'; 
    signal ENABLE : std_logic := '0'; 

    --Outputs 
    signal PCM_FS : std_logic; 
    signal PCM_CLK : std_logic; 
    signal PCM_DIN : std_logic; 

    -- Clock period definitions. Note WDCLK is defined in terms of the bit clock 
    -- to insure they are exactly in sync. 
    constant ADAT_BCLK_period : time := 326 ns; -- About 3.072MHz (https://www.sensorsone.com/frequency-to-period-calculator/) 
    constant ADAT_WDCLK_period : time := ADAT_BCLK_period * 64; -- 48KHz 

BEGIN 

    -- Instantiate the Unit Under Test (UUT) 
    uut: TestHarness1 PORT MAP (
      ADAT_WDCLK => ADAT_WDCLK, 
      ADAT_BCLK => ADAT_BCLK, 
      ADAT_OUT12 => ADAT_OUT12, 
      ENABLE => ENABLE, 
      PCM_FS => PCM_FS, 
      PCM_CLK => PCM_CLK, 
      PCM_DIN => PCM_DIN 
     ); 


    -- Clock process definitions 
    ADAT_WDCLK_process :process 
    begin 
     ADAT_WDCLK <= '0'; 
     wait for ADAT_WDCLK_period/2; 
     ADAT_WDCLK <= '1'; 
     wait for ADAT_WDCLK_period/2; 
    end process; 

    ADAT_BCLK_process :process 
    begin 
     ADAT_BCLK <= '1'; 
     wait for ADAT_BCLK_period/2; 
     ADAT_BCLK <= '0'; 
     wait for ADAT_BCLK_period/2; 
    end process; 


    -- Stimulus process 
    stim_proc: process 
    begin   
     -- hold reset state for 100 ns. 
     wait for 100 ns; 
     ENABLE <= '1'; 
     wait for 100 ns; 
     ENABLE <= '0'; 
     wait for 7500 ns; 
     ENABLE <= '1'; 


     wait for ADAT_WDCLK_period*10; 

     -- insert stimulus here 

     wait; 
    end process; 

END; 

ISimでは初期シミュレーションでイネーブルパルスを示しているが、出力がイネーブルとWCLKの立ち上がりエッジまで、 'U' が残ります1。その後、彼らは(設計どおりに)変更を開始しますが、いくつかのX値を示します。

ISim Windowsenter image description here

参考のためにVHDL

を修正し、ここでシミュレーション出力にUさんとXの問題を解決する修正VHDLです。しかし、PCM_DIN出力には機能的な問題があります。遅れている(BCLK)サイクルのようです。私はADAT_WDCLKがENABLEの後に初めてハイになるとすぐに '1'にな​​ると予想しました。しかし、後でBLCKサイクルまで「1」にはならない。

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity TestHarness1 is 
port (
    ADAT_WDCLK : in std_logic; 
    ADAT_BCLK: in std_logic; 
    ADAT_OUT12: in std_logic; 
    ENABLE: in std_logic; 

    PCM_FS : out std_logic; 
    PCM_CLK : out std_logic; 
    PCM_DIN : out std_logic 
); 
end TestHarness1; 

architecture Behavioral of TestHarness1 is 
    --type state is (STOPPED, RUNNING); 
    signal tmp : std_logic; 
    signal myState : std_logic; 
begin 
    PCM_DIN <= tmp; 

    -- State management process 
    process (ENABLE, ADAT_WDCLK) begin -- Eval on input changes 
     if (ENABLE = '0') then 
      myState <= '0'; --STOPPED; 
     else 
      if (myState = '0' and rising_edge(ADAT_WDCLK)) then 
       -- Move to running state only at start of a frame 
       myState <= '1'; --RUNNING; 
      end if; 
     end if; 
    end process; 

    -- Output process 
    process (ADAT_WDCLK, ADAT_BCLK, myState) variable counter: integer := 0; begin 
     -- Only do something if we are in running state 
     if (myState = '0') then 
      PCM_FS <= '0'; -- All outputs muted 
      PCM_CLK <= '0'; 
      tmp <= '0'; 
     elsif (myState = '1') then 
      -- Pass the clocks through, inverting the bit clock 
      PCM_FS <= ADAT_WDCLK; 
      PCM_CLK <= not ADAT_BCLK; 

      if rising_edge(ADAT_BCLK) then -- Generate fixed serial bit pattern 
       if counter = 0 or counter = 1 or counter = 5 or counter = 7 then 
        tmp <= '1'; 
       else 
        tmp <= '0'; 
       end if; 
       if (counter = 7) then 
        counter := 0;  -- Reset counter 
       else 
        counter := counter + 1; -- Just inc counter 
       end if; 

      end if; 
     end if; 
    end process; 

end Behavioral; 

上記のISim(内部myState信号を含む)...なぜPCM_DINは1つのBCLKサイクルを遅延させるのですか?

あなたが解決することができなくシミュレータで結果信号PCM_FS、複数のプロセスからPCM_CLKtmpを、運転している:「X」(不明強制)あなたが見ている値に関する

enter image description here

+0

複数のドライバを修復しても、コードは合成対象にはなりません。 1クロックの両エッジでカウンタをクリアし、別のクロックでカウントアップすることはできないようです。 – user1155120

+0

WDCLKのエッジでカウンタをクリアするのは、とにかく冗長で、8ビットごとにラップされ、ワー​​ドクロック周期で送信される整数バイト数があります(したがって、クロックサイクルの開始/終了時には常にゼロです)。だから私はそれらのステートメントを削除します。 – user3191192

答えて

0

その値は駆動される。 1つのプロセスからのみ駆動されるように修正するか、使用していないときに'Z'を駆動する必要があります。

「U」の値は、信号の初期値がないために存在します。初めて信号を書き込むと(イネーブルの後)、初めて信号が割り当てられます。

+0

ああ、それはコンビナトリアルロジックのブロックのようなプロセスだと思うし、明らかに高いZに設定されていない限り、同じ回路ノードを駆動することはできません。Uについてはまだわかりませんが、再構成されたコードはもう(ENABLEの前でも)。 更新されたコードを投稿しています。 U'xやXはありませんが、なぜPCM_DIN出力が1クロックサイクル遅れているのかわかりません... ENABLEの後に初めてWDCLKがハイになったときは '1'にな​​ります。 – user3191192

関連する問題