算术逻辑单元(ALU)的VHDL代码

算术逻辑单元(ALU)是CPU中最重要的数字逻辑组件之一。它通常执行逻辑和算术运算,例如加法,减法,乘法,除法等。

在这个 VHDL项目,ALU是在VHDL中设计和实现的。完整显示了ALU的VHDL代码。

ALU的VHDL代码


ALU中实现的逻辑和算术运算如下:

1.算术加法
ALU_Out = A + B;
2.算术减法
ALU_Out = A-B;
3.算术乘法
ALU_Out = A * B;
4.算术除法
ALU_Out = A / B;
5.逻辑左移
ALU_Out =逻辑左移1;
6.逻辑右移
ALU_Out =逻辑右移1;
7.向左旋转
ALU_Out =向左旋转1;
8.向右旋转
ALU_Out =向右旋转1;
9.逻辑与
ALU_Out = A和B;
10。逻辑或
ALU_Out = A或B;
11。逻辑异或
ALU_Out = A XOR B;
12逻辑或非
ALU_Out = A NOR B;
13逻辑与非
ALU_Out = A NAND B;
14。逻辑XNOR
ALU_Out = A XNOR B;
15更大的比较
如果A则ALU_Out = 1> B else 0;
16。平等比较
ALU_Out = 1 A = B否则为0;

ALU的VHDL代码:

-- fpga4student.com: FPGA项目, Verilog projects, VHDL项目 
-- ALU的VHDL代码
-- @fpga4student
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.NUMERIC_STD.all;
-----------------------------------------------
---------- ALU 8-bit VHDL ---------------------
-----------------------------------------------
entity ALU is
  generic ( 
     constant N: natural := 1  -- number of shited or rotated bits
    );
  
    Port (
    A, B     : in  STD_LOGIC_VECTOR(7 downto 0);  -- 2 inputs 8-bit
    ALU_Sel  : in  STD_LOGIC_VECTOR(3 downto 0);  -- 1 input 4-bit for selecting function
    ALU_Out   : out  STD_LOGIC_VECTOR(7 downto 0); -- 1 output 8-bit 
    Carryout : out std_logic        -- Carryout flag
    );
end ALU; 
architecture Behavioral of ALU is

signal ALU_Result : std_logic_vector (7 downto 0);
signal tmp: std_logic_vector (8 downto 0);

begin
   process(A,B,ALU_Sel)
 begin
  case(ALU_Sel) is
  when "0000" => -- AdditionALU_Result<= A + B ; 
  when "0001" => -- SubtractionALU_Result<= A - B ;
  when "0010" => -- MultiplicationALU_Result<= std_logic_vector(to_unsigned((to_integer(unsigned(A)) * to_integer(unsigned(B))),8)) ;
  when "0011" => -- DivisionALU_Result<= std_logic_vector(to_unsigned(to_integer(unsigned(A)) / to_integer(unsigned(B)),8)) ;
  when "0100" => -- Logical shift leftALU_Result<= std_logic_vector(unsigned(A) sll N);
  when "0101" => -- Logical shift rightALU_Result<= std_logic_vector(unsigned(A) srl N);
  when "0110" => --  Rotate leftALU_Result<= std_logic_vector(unsigned(A) rol N);
  when "0111" => -- Rotate rightALU_Result<= std_logic_vector(unsigned(A) ror N);
  when "1000" => -- Logical and ALU_Result<= A and B;
  when "1001" => -- Logical orALU_Result<= A or B;
  when "1010" => -- Logical xor ALU_Result<= A xor B;
  when "1011" => -- Logical norALU_Result<= A nor B;
  when "1100" => -- Logical nand ALU_Result<= A nand B;
  when "1101" => -- Logical xnorALU_Result<= A xnor B;
  when "1110" => -- Greater comparison
   if(A>B) then
 ALU_Result<= x"01" ;
   else
 ALU_Result<= x"00" ;
   end if; 
  when "1111" => -- Equal comparison   
   if(A=B) then
 ALU_Result<= x"01" ;
   else
 ALU_Result<= x"00" ;
   end if;
  when others => ALU_Result <= A + B ; 
  end case;
 end process;
 ALU_Out <= ALU_Result; -- ALU out
 tmp <= ('0' & A) + ('0' & B);
 Carryout <= tmp(8); -- Carryout flag
end Behavioral;

ALU的Testbench VHDL代码:

-- fpga4student.com: FPGA项目, Verilog projects, VHDL项目 
-- Testbench ALU的VHDL代码
-- @fpga4student
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use IEEE.std_logic_unsigned.all;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
 
ENTITY tb_ALU IS
END tb_ALU;
 
ARCHITECTURE behavior OF tb_ALU IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT ALU
    PORT(
         A : IN  std_logic_vector(7 downto 0);
         B : IN  std_logic_vector(7 downto 0);
         ALU_Sel : IN  std_logic_vector(3 downto 0);
         ALU_Out : OUT  std_logic_vector(7 downto 0);
         Carryout : OUT  std_logic
        );
    END COMPONENT;
       --Inputs
   signal A : std_logic_vector(7 downto 0) := (others => '0');
   signal B : std_logic_vector(7 downto 0) := (others => '0');
   signal ALU_Sel : std_logic_vector(3 downto 0) := (others => '0');

  --Outputs
   signal ALU_Out : std_logic_vector(7 downto 0);
   signal Carryout : std_logic;
 
 signal i:integer;
BEGIN
 
 -- Instantiate the Unit Under Test (UUT)
   uut: ALU PORT MAP (
          A => A,
          B => B,
          ALU_Sel => ALU_Sel,
          ALU_Out => ALU_Out,
          Carryout => Carryout
        );

 

   -- Stimulus process
   stim_proc: process
   begin  
      -- hold reset state for 100 ns.
      A <= x"0A";
  B <= x"02";
  ALU_Sel <= x"0";
  
  for i in 0 to 15 loop 
   ALU_Sel <= ALU_Sel + x"1";
   wait for 100 ns;
  end loop;
      A <= x"F6";
  B <= x"0A";
      wait;
   end process;

END;

ALU的仿真波形:

ALU的VHDL代码
推荐的 VHDL项目:
1. 什么是FPGA? VHDL如何在FPGA上工作
2. FIFO存储器的VHDL代码
3. FIR滤波器的VHDL代码
4. 8位微控制器的VHDL代码
5. 矩阵乘法的VHDL代码
6. 开关尾环计数器的VHDL代码
7. FPGA上数字闹钟的VHDL代码
8. 8位比较器的VHDL代码
9. 如何使用VHDL将文本文件加载到FPGA中
10。 D触发器的VHDL代码
11。 完整加法器的VHDL代码
12 具有可变占空比的VHDL中的PWM发生器
13 ALU的VHDL代码
14。 带测试平台的计数器的VHDL代码
15 16位ALU的VHDL代码
16。 VHDL中的移位器设计
17。 VHDL中的非线性查找表实现
18岁 VHDL中的密码协处理器设计

19 Verilog和VHDL:通过示例解释
20 FPGA上时钟分频器的VHDL代码
21 如何生成时钟使能信号而不是创建另一个时钟域
22 VHDL代码,用于反跳FPGA上的按钮
23。 交通信号灯控制器的VHDL代码
24 用于简单2位比较器的VHDL代码
22 VHDL代码,用于反跳FPGA上的按钮
23。 交通信号灯控制器的VHDL代码
24 用于简单2位比较器的VHDL代码
25岁 单端口RAM的VHDL代码
26  使用FSM的停车场系统的VHDL代码
27。 VHDL编码与软件编程
FPGA Verilog VHDL课程

7条评论:

  1. 在这条线" ALU_Result <= std_logic_vector(to_unsigned((to_integer(unsigned(A))* to_integer(unsigned(B))),8));"
    为什么我们不能只做A * B?

    回复删除
    回覆
    1. 因为VHDL中的std_logic_vector类型不支持*乘法运算符。您需要将其转换为支持乘法的整数。然后,您需要将结果转换回std_logic_vector类型。

      删除
  2. 我的讲座要求我以两种不同的方式编写ALU代码,我可以使用数据流或结构模型来编写代码吗?还是我只需要分成两个过程?谢谢

    回复删除
  3. 在Basys3板上实施此设计会有哪些限制?我们要使用图钉进行选择吗?

    回复删除
    回覆
    1. 您需要读取Basys3 FPGA板的XDC引脚位置,并确定在FPGA上运行时使用哪些引脚。

      删除

热门FPGA项目