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

算术逻辑单元(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 =左侧左右移动;
6.逻辑转移右转
alu._OUT =右右逻辑移位;
7.左转
alu_out =左侧旋转1;
8.右转
Alu_out =右侧旋转1;
9.逻辑和
alu_out = a和b;
10。逻辑或
alu_out = a或b;
11. 逻辑XOR.
alu_out = xor b;
12.逻辑也是逻辑的
alu_out = a nor b;
13。逻辑NAND
alu_out = nand b;
14。逻辑Xnor.
alu_out = xnor b;
15。更大的比较
alu_out = 1如果是> B else 0;
16。相等的比较
alu_out = 1 a = b else 0;

alu.的VHDL代码:

-- fpga4student.com: FPGA项目, Verilog projects, VHDL项目 
-- VHDL code for ALU
-- @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 Projects, Verilog projects, VHDL projects 
-- Testbench VHDL code for ALU
-- @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 vs vhdl.:通过示例解释
20。 FPGA时钟分频器的VHDL代码
21。 如何生成时钟使能信号而不是创建另一个时钟域
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。 VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
26。 使用FSM的停车系统VHDL码
27。 VHDL编码VS软件编程
FPGA Verilog VHDL课程

7评论:

  1. 在这一行" ALU_Result <= std_logic_vector(to_unsigned((to_integer(unsigned(a))* to_integer(unsigned(b))),8));"
    我们为什么不能做* B?

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

      删除
  2. 是其中一个功能不是一个

    回复删除
  3. 我的讲座让我以2种不同的方式写下alu代码,我可以使用数据流或结构模型来写吗?或者我只需要分成2个过程?谢谢你

    回复删除
  4. 在Basys3板上可以实现这种设计是什么?我们要使用引脚选择吗?

    回复删除
    答案
    1. 您需要读取BasyS3 FPGA板XDC引脚位置,并在FPGA上运行时决定哪些引脚。

      删除

趋势FPGA项目