名称:基于FPGA的16位ALU设计VHDL代码ISE仿真
软件:ISE
语言:VHDL
代码功能:
用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
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=779
835