1

私はRISCマイクロプロセッサを開発することになっているプロジェクトを持っています。これには、動作モデルで ALU を作成することが含まれます。ただし、設計のシミュレーション中に問題/エラー/警告があるようです。以下を除いて、ほとんどの操作は適切に機能します。

2 つの入力の比較: 数値が等しい場合、ゼロ フラグは設定されません。(不等号は正常に動作しています)。

警告: 算術オペランドに 'U'|'X'|'W'|'Z'|'-' があります。結果は 'X'(es) になります。

(これは 1 ps ごとに表示されます。おそらくプロセス内の wait ステートメントが原因です)

std_logic_vector が非常に乱雑であると読んでも、std_logic_vector を使用したいと考えています。

また、比較コマンド (フラグを更新するが出力レジスタに差を保存しない) を使用しようとすると問題が発生します。コマンドが VHDL で実行された場合はどうなりますか?? それらは同時に実行されますか?? または行ごとに??

以下のコード:

   LIBRARY IEEE;  
USE IEEE.STD_LOGIC_1164.ALL;  
USE IEEE.STD_LOGIC_ARITH.ALL;  
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY ALU IS
  PORT(
      INPUT1 , INPUT2: IN STD_LOGIC_VECTOR(7 DOWNTO 0 ) ; 
      CARRYIN : IN STD_LOGIC ; 
       ZERO,CARRYOUT : OUT STD_LOGIC ; 
       OUTPUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0 ) ; 
       CONTROL : IN STD_LOGIC_VECTOR(7 DOWNTO 0 )  
        ) ; 
END ALU ; 

ARCHITECTURE OPERATION OF ALU IS
SIGNAL TMP : STD_LOGIC_VECTOR( 8 DOWNTO 0 ) ; 
BEGIN
PROCESS
BEGIN
  IF( CONTROL = "00110000" OR CONTROL(7 DOWNTO 3 )  = "00001" ) THEN TMP <= CARRYIN & ( INPUT1 AND INPUT2 ) ;
  ELSIF( CONTROL(7 DOWNTO 3 ) = "00010" ) THEN TMP <= CARRYIN & ( INPUT1 OR INPUT2 ) ;
  ELSIF( CONTROL(7 DOWNTO 3 ) = "00011" ) THEN TMP <= CARRYIN & ( INPUT1 XOR INPUT2 ) ;
  ELSIF( CONTROL(7 DOWNTO 3 ) = "00100" ) THEN TMP <= CONV_STD_LOGIC_VECTOR(  ( CONV_INTEGER(INPUT1)+1 ) , 9 ) ; 
  ELSIF( CONTROL(7 DOWNTO 3 ) = "00101" ) THEN TMP <= CONV_STD_LOGIC_VECTOR(  ( CONV_INTEGER(INPUT1)-1 ) , 9 ) ; 
  ELSIF( CONTROL = "10001100" ) THEN TMP <= '0' & (NOT INPUT1) ; 
  ELSIF( CONTROL(7 DOWNTO 3 ) = "11000" OR CONTROL(7 DOWNTO 2 ) = "110010" OR CONTROL = "110-11--" ) THEN TMP <= CONV_STD_LOGIC_VECTOR(  ( CONV_INTEGER(INPUT1)+CONV_INTEGER(INPUT2) ) , 9 ) ; 
  ELSIF( CONTROL(7 DOWNTO 3 ) = "11100" OR CONTROL(7 DOWNTO 2 ) = "111010" OR CONTROL = "111-11--" OR CONTROL(7 DOWNTO 3 ) = "00000" OR CONTROL = "00111000" ) THEN TMP <= CONV_STD_LOGIC_VECTOR(  ( CONV_INTEGER(INPUT1)-CONV_INTEGER(INPUT2) ) , 9 ) ; 
  ELSIF( CONTROL(7 DOWNTO 3 ) = "11010" OR CONTROL(7 DOWNTO 2 ) = "110110" ) THEN TMP <= CONV_STD_LOGIC_VECTOR(  ( CONV_INTEGER(INPUT1)+CONV_INTEGER(INPUT2)+CONV_INTEGER(CARRYIN) ) , 9 ) ;
  ELSIF( CONTROL(7 DOWNTO 3 ) = "11110" OR CONTROL(7 DOWNTO 2 ) = "111110" ) THEN TMP <= CONV_STD_LOGIC_VECTOR(  ( CONV_INTEGER(INPUT1)-CONV_INTEGER(INPUT2)-CONV_INTEGER(CARRYIN) ) , 9 ) ;
  END IF ;
  IF ( TMP( 7 DOWNTO 0 ) = "00000000" ) THEN ZERO <= '1' ;
  ELSE ZERO <= '0' ;    
    END IF ; 
      IF( CONTROL(7 DOWNTO 3 ) = "00000" OR CONTROL = "00111000" ) THEN
      TMP( 7 DOWNTO 0 ) <= INPUT1 ; 
      END IF ;
      OUTPUT <= TMP( 7 DOWNTO 0 ) ; 
    CARRYOUT <= TMP(8) ;
      WAIT FOR 1 PS;
END PROCESS ; 
END OPERATION ; 

テストベンチ コード

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;


ENTITY test_tb IS
END test_tb;

ARCHITECTURE behavior OF test_tb IS
   COMPONENT ALU
  PORT(
      INPUT1 , INPUT2: IN STD_LOGIC_VECTOR(7 DOWNTO 0 ) ; 
      CARRYIN : IN STD_LOGIC ; 
       ZERO,CARRYOUT : OUT STD_LOGIC ; 
       OUTPUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0 ) ; 
       CONTROL : IN STD_LOGIC_VECTOR(7 DOWNTO 0 )  
        ) ; 
END COMPONENT ; 


   signal i1,i2,ctrl,opt : std_logic_vector(7 downto 0 ) := "00000000" ;
   signal cin,cout,zero : std_logic := '0';


BEGIN


   uut: alu PORT MAP ( i1,i2,cin,zero,cout,opt,ctrl ) ;


  stim_proc: process
   begin        

        i1 <= "10000000" ; 
        i2 <= "10000000" ; 
        ctrl <= "11011010" ; 
        cin <= '0' ; 
        wait for 5 ps;
        ctrl <= "00111000" ; 
        wait for 5 ps ; 
        wait;
  end process;

END;
4

2 に答える 2

0

問題は、形式CONTROL = "111-11--"のステートメントと、使用するライブラリ関数で 'U'|'X'|'W'|'Z'|'-' がどのように処理されるかにあります。

  1. CONTROL = "111-11--" は std_logic_unsigned から '=' 関数を呼び出します (2 つの std_logic_vector を比較します)...
  2. これは、std_logic_arith から「=」関数を呼び出します (2 つの符号なし値を比較します)...
  3. これは std_logic_arith から CONV_UNSIGNED を呼び出します...
  4. そして、これは std_logic_arith から MAKE_BINARY を呼び出します...
  5. 最後に、この関数はビットが 'U'|'X'|'W'|'Z'|'-' に設定されているかどうかをチェックします。もしそうなら、それはあなたが見る警告を与えます

--> 長い回答の短いメッセージ: 'U'|'X'|'W'|'Z'|'-' の使用は避けてください。代わりに「0」ビットと「1」ビットの明示的な比較を使用してください

于 2013-04-19T11:37:07.773 に答える