基于FPGA的16位ALU设计VHDL代码ISE 仿真
名称:基于FPGA的16位ALU设计VHDL代码ISE 仿真
软件:ISE
语言:VHDL
代码功能:
1用VHDL语言实现一个简单的16位ALU。
1)算术逻辑部件ALU的主要功能是对二进制数据进行定点算术运算、逻辑运算和各种移位操作等。算术运算包括定点加減乘除运算;逻辑运算主要有逻辑与、逻辑或、逻辑异或和逻辑非等操作。ALU通常有两个数据输入端A和B输入操作数,一个数据输出端Y以及标志位输出结果,通过输入操作码op来确定所要进行的操作。本实验通过实现一个状态机,根据状态机状态的变化来输入操作数及操作码,并最终实现不同的运算,将结果和标志位呈现出来。
2)实验中ALU要求实现基本的算术运算、逻辑运算、移位运算等,具体功能如下表所示。合理设置每条指令的标志位,包括进位标志(CF)、溢出标志(OF)、最高位(SF)和全零标志(ZF)

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件

2. 程序文件

3. 程序编译


4. RTL图

5. Testbench

6. 仿真图



部分代码展示:
--使用的库
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
USE ieee.std_logic_arith.all;
--ALU实体声明
ENTITY ALU IS
PORT (
A : IN STD_LOGIC_VECTOR(15 DOWNTO 0);--16位输入A
B : IN STD_LOGIC_VECTOR(15 DOWNTO 0);--16位输入B
op : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--4位操作码
CF : OUT STD_LOGIC;--CF,进位标志
O_F : OUT STD_LOGIC;--OF,溢出标志
SF : OUT STD_LOGIC;--SF,最高位
ZF : OUT STD_LOGIC;--ZF,全零标志
result : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)--输出ALU计算结果
);
END ALU;
--实体声明结束
ARCHITECTURE behave OF ALU IS
--定义1中间信号
SIGNAL A_ext : STD_LOGIC_VECTOR(16 DOWNTO 0):= (others => '0');--16位输入A扩展为17位
SIGNAL B_ext : STD_LOGIC_VECTOR(16 DOWNTO 0):= (others => '0');--16位输入B扩展为17位
SIGNAL B_bu : STD_LOGIC_VECTOR(16 DOWNTO 0):= (others => '0');--B的补码,便于计算减法
SIGNAL result_temp_add : STD_LOGIC_VECTOR(16 DOWNTO 0):= (others => '0');--A+B的和
SIGNAL result_temp_sub : STD_LOGIC_VECTOR(16 DOWNTO 0):= (others => '0');--A-B的差
SIGNAL result_temp : STD_LOGIC_VECTOR(15 DOWNTO 0):= (others => '0');--缓存输出ALU计算结果
SIGNAL B_int : INTEGER := 0; --B转换为int类型
BEGIN
B_int<=Conv_Integer(B);--Conv_Integer函数将B转为int
result <= result_temp;--输出ALU计算结果
A_ext <= ('0' & A);--16位输入A扩展为17位
B_ext <= ('0' & B);--16位输入B扩展为17位
B_bu <= NOT((B_ext)) + "00000000000000001";--B的补码,取反加1,便于计算减法
result_temp_add <= A_ext + B_ext;--A+B的和
result_temp_sub <= A_ext + B_bu;--A+B的补码,即A-B的差
--根据操作码进行不同运算
PROCESS (op, result_temp_add, result_temp_sub, A, B)
BEGIN
CASE op IS
WHEN "0000" =>--加法
result_temp <= result_temp_add(15 DOWNTO 0);--16位A+B的和
WHEN "0001" =>--减法
result_temp <= result_temp_sub(15 DOWNTO 0);--16位A-B的差
WHEN "0010" =>--与
result_temp <= A AND B;
WHEN "0011" =>--或
result_temp <= A OR B;
WHEN "0100" =>--异或
result_temp <= A XOR B;
WHEN "0101" =>--取非
result_temp <= NOT(A);
WHEN "0110" =>--逻辑左移B位,B_int为B转换为int类型的值
result_temp <= to_stdlogicvector( to_bitvector(A) SLL B_int );--SLL运算需要转换为bitvector类型,计算完成后转换回stdlogicvector类型
WHEN "0111" =>--逻辑右移B位
result_temp <= to_stdlogicvector( to_bitvector(A) SRL B_int );--SRL运算需要转换为bitvector类型,计算完成后转换回stdlogicvector类型
WHEN "1000" =>--算术左移B位
result_temp <= to_stdlogicvector( to_bitvector(A) SLA B_int );--SLA运算需要转换为bitvector类型,计算完成后转换回stdlogicvector类型
WHEN "1001" =>--算术右移B位
result_temp <= to_stdlogicvector( to_bitvector(A) SRA B_int );--SRA运算需要转换为bitvector类型,计算完成后转换回stdlogicvector类型
WHEN "1010" =>--循环左移B位
result_temp <= to_stdlogicvector( to_bitvector(A) ROL B_int );--ROL运算需要转换为bitvector类型,计算完成后转换回stdlogicvector类型
WHEN "1011" =>--循环右移B位
result_temp <= to_stdlogicvector( to_bitvector(A) ROR B_int );--ROR运算需要转换为bitvector类型,计算完成后转换回stdlogicvector类型
WHEN OTHERS =>--其他输出0
result_temp <= "0000000000000000";
END CASE;
END PROCESS;
--输出进位
CF <= result_temp_add(16) WHEN (op = "0000") ELSE--加法时输出result_temp_add的最高位
result_temp_sub(16) WHEN (op = "0001") ELSE--减法时输出result_temp_sub的最高位
'0';
--输出溢出标志
PROCESS (op, A_ext, B_ext, result_temp_add, B_bu, result_temp_sub)
BEGIN代码文件(付费下载):
![]()
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 基于FPGA的16位ALU设计VHDL代码ISE 仿真
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 基于FPGA的16位ALU设计VHDL代码ISE 仿真