在VHDL中16位ALU设计

上次,我在Verilog介绍了n位加法器设计,这是我今天将展示的16位ALU设计的一部分。 16位ALU是处理单元的核心组合组件 协商师 我在上一篇文章中介绍。

在此VHDL项目中将提供16位ALU的全VHDL代码与测试台一起。 

16位ALU的VHDL代码

16位ALU的指令集如下:

1.补充:ABUS + BBUS - > ALUOUT
2.亚:ABUS - BBUS - > ALUOUT
3.和:ab& BBUS -> ALUOUT
4.或:ab ab | BBUS - > ALUOUT
5. xor:agus ^ bbus - > ALUOUT
6.不是:〜艾滋病 - > ALUOUT
7. MOV:ABUS - > ALUOUT

使用的16位ALU的添加/减法是使用该16位ALU的设计和实现的 Verilog n位加法器.

16位ALU的VHDL代码:

-- fpga4student.com: FPGA projects, Verilog projects, VHDL项目
-- VHDL project: 16位ALU的VHDL代码 
-- Top level 16位ALU的VHDL代码 
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- 16-bit ALU 
entity ALU is
 port (
   ABUS: in std_logic_vector(15 downto 0); -- ABUS data input of the 16-bit ALU
   BBUS: in std_logic_vector(15 downto 0); -- BBUS data input of the 16-bit ALU
   ALUctrl: in std_logic_vector(3 downto 0); -- ALUctrl control input of the 16-bit ALU 
   ALUOUT: out std_logic_vector(15 downto 0)  -- 16-bit data output of the 16-bit ALU 
   );
end ALU;

architecture Behavioral of ALU is
-- N-bit Adder in Verilog 
component N_bit_adder is
generic (
    N: integer:=32
   );
port( input1: in std_logic_vector(N-1 downto 0);
  input2: in std_logic_vector(N-1 downto 0);
  answer: out std_logic_vector(N-1 downto 0)
 );
end component N_bit_adder;
signal BBUS_not: std_logic_vector(16-1 downto 0);
signal tmp_out1: std_logic_vector(16-1 downto 0);
signal tmp_out2: std_logic_vector(16-1 downto 0);
signal tmp: std_logic_vector(16-1 downto 0);
begin
-- instantiate Verilog N-bit Adder in VHDL code 
u1_N_bit_adder: N_bit_adder generic map ( N => 16) -- ABUS + BBUS
     port map( input1 => ABUS, input2 => BBUS,answer => tmp_out1 ); 
u2_N_bit_adder: N_bit_adder generic map ( N => 16) -- ABUS + (~BBUS)
     port map( input1 => ABUS, input2 => BBUS_not,answer => tmp_out2 ); 
u3_N_bit_adder: N_bit_adder generic map ( N => 16) -- ABUS + (~BBUS) + 1 = ABUS - BBUS
     port map( input1 => tmp_out2, input2 => x"0001",answer => tmp ); 
BBUS_not <= not BBUS;  
-- Other instructions of the 16-bit ALU in VHDL 
process(ALUctrl,ABUS,BBUS,tmp_out1,tmp)
begin 
case(ALUctrl) is
 when "0000" => aluout. <= tmp_out1;  -- ADD
 when "0001" => aluout. <= tmp ;-- SUB 
 when "0010" => aluout. <= ABUS and BBUS; -- AND
 when "0011" => aluout. <= ABUS or BBUS; -- OR
 when "0100" => aluout. <= ABUS xor BBUS; -- XOR
 when "0101" => aluout. <= not ABUS; -- NOT
 when "0110" => aluout. <= ABUS; -- MOVE
 when others =>aluout. <= tmp_out1; 
 end case;
end process;

end Behavioral;

TestBench VHDL代码为16位ALU:

-- fpga4student.com: FPGA projects, Verilog projects, VHDL projects
-- VHDL project: 16位ALU的VHDL代码 
-- Testbench 16位ALU的VHDL代码 
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use IEEE.std_logic_unsigned.all;
-- Testbench 
ENTITY tb_ALU IS
END tb_ALU;
 
ARCHITECTURE behavior OF tb_ALU IS 
 
    -- Component Declaration for the 16-bit ALU
 
    COMPONENT ALU
    PORT(
         ABUS : IN  std_logic_vector(15 downto 0);
         BBUS : IN  std_logic_vector(15 downto 0);
         ALUctrl : IN  std_logic_vector(3 downto 0);
         ALUOUT : OUT  std_logic_vector(15 downto 0)
        );
    END COMPONENT;
   
   --Inputs
   signal ABUS : std_logic_vector(15 downto 0) := (others => '0');
   signal BBUS : std_logic_vector(15 downto 0) := (others => '0');
   signal ALUctrl : std_logic_vector(3 downto 0) := (others => '0');

  --Outputs
   signalaluout. : std_logic_vector(15 downto 0);
 
BEGIN
 
 -- Instantiate the 16-bit ALU 
   uut: ALU PORT MAP (
          ABUS => ABUS,
          BBUS => BBUS,
          ALUctrl => ALUctrl,
          ALUOUT =>aluout.
        );
   stim_proc: process
   begin  
      ABUS <= x"000A";
  BBUS <= x"0002";
  ALUctrl <= x"0";
  -- change ALU Control input
   for i in 0 to 15 loop 
  ALUctrl <= ALUctrl + x"1";
  wait for 100 ns;
   end loop;
      ABUS <= x"00F6";
  BBUS <= x"000A";
      wait;
   end process;

END;

16位ALU的模拟波形:

16位ALU的VHDL代码

仿真波形显示了16位ALU的正确操作。在完全验证VHDL 16位ALU之后,将在协处理器的处理单元中使用16位ALU 下一篇文章.

推荐的 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位比较器
25。 用于单端口RAM的VHDL代码
22。 VHDL代码用于FPGA上的Debouncing按钮
23。 交通灯控制器的VHDL码
24。  VHDL代码为简单的2位比较器
25。 用于单端口RAM的VHDL代码
26。 使用FSM的停车系统VHDL码
27。 VHDL编码VS软件编程
FPGA Verilog VHDL课程

没意见:

发表评论

趋势FPGA项目