2

私は非常に単純な問題を抱えていますが、何がうまくいかないのか頭に浮かびません。基本的に、シミュレートするとすべてが正常に機能しますが、ハードウェアで実行すると間違った結果が得られます。基本的に、エンティティの動作を決定する 2 つの ctrl シグナルがあります。

 GET   (ctrl = "00000000") sets register tx to input of op1
 SH1_L (ctrl = "00000001") outputs (op1 << 1) or register tx
                           shifts register tx to the right by 31 bits  (tx >> 31)


  library ieee;
  use ieee.std_logic_1164.all;

  entity test is
  port
  (
    op1    : in  std_logic_vector(31 downto 0);      -- First input operand
    ctrl   : in std_logic_vector(7 downto 0);        -- Control signal
    clk    : in  std_logic;                          -- clock
    res    : out std_logic_vector(31 downto 0)       -- Result
  );
  end;

  architecture rtl of test is

    type res_sel_type is (GET, SH1_L); 

    constant Z : std_logic_vector(31 downto 0) := (others => '0');                        

    signal res_sel  : res_sel_type;
    signal load     : std_logic := '0';
    signal shl      : std_logic := '0';

    signal tx       : std_logic_vector(31 downto 0) := (others => '0');
    signal inp1     : std_logic_vector(31 downto 0) := (others => '0');

  begin

    dec_op: process (ctrl, op1)
    begin  

        res_sel  <= GET;
      load     <= '0';
      shl      <= '0';
      inp1     <= ( others => '0');

      case ctrl is

         -- store operand 
             when "00000000" =>
                inp1    <= op1;             
                load    <= '1';          
                res_sel <= GET;

             -- 1-bit left-shift with carry 
             when "00000001" =>
              inp1    <= op1;
          shl     <= '1'; 
                res_sel <= SH1_L;

             when others =>
                -- Leave default values

             end case;                  

    end process;

    -- Selection of output
    sel_out: process (res_sel, inp1) 
    begin

      case res_sel is

       when GET => NULL;  

       when SH1_L =>
        res  <= ( inp1(30 downto 0) & '0' ) or tx;

         when others =>
            res <= (others => '0');

      end case;

    end process;

    sync: process(clk)
    begin       
     if clk'event and clk = '1' then
          if load = '1' then  
             tx <= op1;
          elsif shl = '1' then
             tx <= Z(30 downto 0) & op1(31);
          end if;      
     end if;
    end process;  

  end rtl;

テストプログラム

GET  0
SH1_L 0xfedcba90    exp. output: 0xfdb97520  act. output = 0xfdb97521
SH1_L 0x7654321f    exp. output: 0xeca8643f  act. output = 0xeca8643e
SH1_L 0x71234567    exp. output: 0xe2468ace  act. output = 0xe2468ace

ご覧のとおり、何らかの理由で最後のビットが間違っています。出力の計算で実際に使用される前に、レジスタ tx が最初に書き込まれるように、タイミングに何か問題があるに違いありません。

この問題を解決する方法を知っている人はいますか?

どうもありがとう!

4

2 に答える 2

4

txプロセス感度リストの信号を忘れませんでしたか?

SigasiHDTのスクリーンショット

于 2011-02-17T19:23:51.553 に答える
3

res組み合わせプロセスのすべての条件下で定義されるわけではありません。したがって、おそらく合成結果でロジックによってゲートされたラッチを持つことになります。決して良い考えではありません。

デフォルトの割り当てを提供して、それらを削除することから始めます。

于 2011-02-17T23:26:54.787 に答える