上次 ,我在Verilog中介绍了N位加法器设计,这是我今天将介绍的16位ALU设计的一部分。 16位ALU是处理器中处理单元的核心组合组件。 协处理器 我在上一篇文章中进行了介绍。
此VHDL项目中将提供16位ALU的完整VHDL代码以及测试平台。

16位ALU的指令集如下:
1.添加:ABUS + BBUS-> ALUOUT2. SUB:ABUS-BBUS- > ALUOUT
3. AND:ABUS& BBUS -> ALUOUT
4.或:ABUS | 巴士- > ALUOUT
5. XOR:ABUS ^ BBUS- > ALUOUT
6.不:〜ABUS- > ALUOUT
7. MOV:ABUS- > ALUOUT
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 : 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位加法器 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" => <= tmp_out1; -- ADD when "0001" => <= tmp ;-- SUB when "0010" => <= ABUS and BBUS; -- AND when "0011" => <= ABUS or BBUS; -- OR when "0100" => <= ABUS xor BBUS; -- XOR when "0101" => <= not ABUS; -- NOT when "0110" => <= ABUS; -- MOVE when others => <= tmp_out1; end case; end process; end Behavioral;
用于16位ALU的Testbench VHDL代码:
-- fpga4student.com: FPGA projects, Verilog projects, VHDL项目 -- 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); : 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 signal : std_logic_vector(15 downto 0); BEGIN -- Instantiate the 16-bit ALU uut: ALU PORT MAP ( ABUS => ABUS, BBUS => BBUS, ALUctrl => ALUctrl, => ); 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之后,该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和VHDL :通过示例解释
20. FPGA上时钟分频器的VHDL代码
21. 如何生成时钟使能信号而不是创建另一个时钟域
22 VHDL代码,用于反跳FPGA上的按钮
23。 交通信号灯控制器的VHDL代码
24 用于简单2位比较器的VHDL代码
25岁 单端口RAM的VHDL代码
22 VHDL代码,用于反跳FPGA上的按钮
23。 交通信号灯控制器的VHDL代码
24 用于简单2位比较器的VHDL代码
25岁 单端口RAM的VHDL代码
26 使用FSM的停车场系统的VHDL代码
27。 VHDL编码与软件编程
没意见:
发表评论