• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于FPGA的16位ALU设计VHDL代码ISE仿真

07/28 09:22
835
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-24052419191WF.doc

共1个文件

名称:基于FPGA的16位ALU设计VHDL代码ISE仿真

软件:ISE

语言:VHDL

代码功能:

VHDL语言实现一个简单的16位ALU。

1)算术逻辑部件ALU的主要功能是对二进制数据进行定点算术运算、逻辑运算和各种移位操作等。算术运算包括定点加減乘除运算;逻辑运算主要有逻辑与、逻辑或、逻辑异或和逻辑非等操作。ALU通常有两个数据输入端A和B输入操作数,一个数据输出端Y以及标志位输出结果,通过输入操作码op来确定所要进行的操作。本实验通过实现一个状态机,根据状态机状态的变化来输入操作数及操作码,并最终实现不同的运算,将结果和标志位呈现出来。

2)实验中ALU要求实现基本的算术运算、逻辑运算、移位运算等,具体功能如下表所示。合理设置每条指令的标志位,包括进位标志(CF)、溢出标志(OF)、最高位(SF)和全零标志(ZF)

16位ALU.jpg

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

  • 2-24052419191WF.doc
    下载

相关推荐