私は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;