【问题标题】:8 bit ALU for microprocessor用于微处理器的 8 位 ALU
【发布时间】:2013-04-18 08:59:59
【问题描述】:

我有一个项目,我应该开发一个 RISC 微处理器。这涉及在行为模型中创建 ALU。但是在模拟设计时似乎存在问题/错误/警告。 除以下操作外,大多数操作都可以正常工作:

比较两个输入:当数字相等时,没有设置零标志。 (不等数正常工作)。

警告:算术操作数中有一个 'U'|'X'|'W'|'Z'|'-',结果将是 'X'(es)。

(这个每1ps出现一次,大概是由于进程中的wait语句)

我希望使用 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;

【问题讨论】:

  • 我无法重现您的问题。我使用一个为 ALU 提供所有输入的测试台。检查您的输入向量是否定义正确。如果还是不行,请将您的测试台代码添加到问题中!
  • TMP 似乎您使用它更像是一个变量而不是信号。 Id 还建议了该过程的敏感度列表。

标签: vhdl processor modelsim alu


【解决方案1】:

很遗憾,这段代码没有达到你的预期:

CONTROL = "111-11--"

它实际上比较了 CONTROL 以查看它是否将第 4、第 6 和第 7 位设置为 -,而不是将它们用作“无关”匹配!令人难以置信,但这就是它多年来被指定工作的方式:(

你想要的是

 std_match(CONTROL, "111-11--")

这会像您期望的那样进行无关比较。

【讨论】:

    【解决方案2】:

    问题在于 CONTROL = "111-11--" 形式的语句以及 'U'|'X'|'W'|'Z'|'- 的方式' 在您使用的库函数中处理。

    1. CONTROL = "111-11--" 从 std_logic_unsigned 调用 '=' 函数(比较两个 std_logic_vectors)...
    2. 这会从 std_logic_arith 调用“=”函数(比较两个无符号值)...
    3. 这会从 std_logic_arith 调用 CONV_UNSIGNED...
    4. 这会从 std_logic_arith 调用 MAKE_BINARY...
    5. 最后,这个函数检查一个位是否设置为'U'|'X'|'W'|'Z'|'-'。如果是这样,它会给出您看到的警告

    --> 长答案的短消息:避免使用'U'|'X'|'W'|'Z'|'-'。改为使用“0”和“1”位的显式比较

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      相关资源
      最近更新 更多