【FPGA】多功能ALU

news2025/1/13 9:47:08

目录

实验要求

源代码

        顶层模块

        数据输入模块

        ALU运算模块

        结果处理模块

        扫描数码管模块

                扫描数码管顶层

                分频器

                数码管显示

仿真代码

结构层图

管脚配置


实验板卡:xc7a100tlc sg324-2L,共20个开关

实验要求

通过高低位控制,实现32位数据A、B及运算方式的输入,通过8个数码管显示ALU的十六进制运算结果, 通过4个led灯显示4个运算信号ZF SF CF OF(判零、符号、进位、判溢)

 

源代码

        顶层模块

`timescale 1ns / 1ps

module TOP(
    input CLK_100M,
    input[15:0] in_data,
    input ctrl_in,
    input rst_,
    input CLK_A,
    input CLK_B,
    input CLK_OP,
    input ShowA,
    input ShowB,
    output[7:0] AN,
    output[7:0] SEG,
    output[3:0] out_flags
    );
    
    wire[31:0] a;
    wire[31:0] b;
    wire[31:0] res;
    wire[31:0] alu_f;
    wire[3:0] in_flags;
    reg[31:0] out_data;
    
    DataInput A(in_data, ctrl_in, CLK_A, rst_, a);
    DataInput B(in_data, ctrl_in, CLK_B, rst_, b);  //数据输入
    ALU alu(a, b, in_data[3:0], res, in_flags);
    ALU_F f(res, in_flags, CLK_OP, rst_, alu_f, out_flags);
    LED led(CLK_100M, rst_, out_data, AN, SEG);
    
    
    always@(ShowA or ShowB)
    begin
        if(!ShowA)
            out_data = a;
        else if(!ShowB)
            out_data = b;
        else
            out_data = alu_f;
    end
    
endmodule

        数据输入模块

`timescale 1ns / 1ps

module DataInput(
    input[15:0] data_in,
    input ctrl_in,
    input clk,
    input rst_,
    output reg[31:0] data_out
    );
    
    always@(negedge clk or negedge rst_)
    begin
        if(!rst_)
            data_out <= 32'b0;
        else
        begin
            if(ctrl_in == 1'b0)
                data_out[15:0] <= data_in;
            else
                data_out[31:16] <= data_in;
        end
    end
    
endmodule

        ALU运算模块

`timescale 1ns / 1ps

module ALU(
    input[31:0] a,
    input[31:0] b,
    input[31:0] op,
    output reg[32:0] res,
    output reg[3:0] flags
    );
    // flags: ZF    SF    CF   OF (高位->低位)
    //        判零  符号  进位  判溢
    
    always@(*)
    begin
        case(op)
            4'b0000:
            begin
                res <= a + b;
                flags[1] = res[32];
                flags[0] = a[31] ^ b[31] ^ res[31] ^ res[32];
            end
            4'b0001: res <= a << b;
            4'b0010: res <= ($signed(a) < $signed(b)) ? 1 : 0;
            4'b0011: res <= (a < b) ? 1 : 0;
            4'b0100: res <= a ^ b;
            4'b0101: res <= a >> b;
            4'b0110: res <= a | b;
            4'b0111: res <= a & b;
            4'b1000:
            begin
                res <= a - b;
                flags[1] = res[32];
                flags[0] = a[31] ^ b[31] ^ res[31] ^ res[32];
            end
            4'b1001: res <= $signed(a) >>> b;
        endcase
        flags[3] = (res == 32'd0) ? 1 : 0;
        flags[2] = res[31];
    end

endmodule

        结果处理模块

`timescale 1ns / 1ps

module ALU_F(
    input[32:0] res,
    input[3:0] in_flags,
    input clk,
    input rst_,
    output reg[32:0] alu_f,
    output reg[3:0] out_flags
    );
    
    always@(negedge clk or negedge rst_)
    begin
        if(!rst_)
            begin
                alu_f <= 32'b0;
                out_flags <= 4'b1000;
            end
        else if(clk)
            begin
                alu_f <= res;
                out_flags <= in_flags;
            end
    end
    
endmodule

        扫描数码管模块

                扫描数码管顶层

                

`timescale 1ns / 1ps

module LED(
    input clk_100M,
    input rst_,
    input[31:0] data,
    output[7:0] AN,
    output[7:0] SEG
);
    wire clk_ref; //数码管刷新频率:500hz
    wire clk_inc; //数字刷新频率:10hz
     
    Fdiv fdiv(clk_100M,32'd100000,clk_ref);
    Scanner scanner(data,rst_,clk_ref,AN,SEG);
endmodule

                分频器

`timescale 1ns / 1ps

module Fdiv(
    input clk_in,
    input [31:0] count,
    output reg clk_out
    );
    reg[31:0] num;
    
    always@(posedge clk_in)
    begin
        if(num == count)
            begin
                clk_out <= ~clk_out;
                num <= 1'b0;
            end
        else
            num <= num + 1'b1;
    end
    
endmodule

                数码管显示

`timescale 1ns / 1ps

module Scanner(
    input[31:0] data,
    input rst_,
    input clk_ref,
    output reg[7:0] AN,
    output reg[7:0] SEG
    );
reg[3:0] data_x;
reg[2:0] bit;

always@(negedge rst_ or posedge clk_ref)
begin
    if(!rst_)
        bit <= 3'd0;
    else
        bit <= bit + 1'b1;
end

always@(*)
    begin
        case(bit)
            3'b000: begin AN <= 8'b1111_1110; data_x <= data[3:0]; end
            3'b001: begin AN <= 8'b1111_1101; data_x <= data[7:4]; end
            3'b010: begin AN <= 8'b1111_1011; data_x <= data[11:8]; end
            3'b011: begin AN <= 8'b1111_0111; data_x <= data[15:12]; end
            3'b100: begin AN <= 8'b1110_1111; data_x <= data[19:16]; end
            3'b101: begin AN <= 8'b1101_1111; data_x <= data[23:20]; end
            3'b110: begin AN <= 8'b1011_1111; data_x <= data[27:24]; end
            3'b111: begin AN <= 8'b0111_1111; data_x <= data[31:28]; end
         endcase
         
         case(data_x)
            4'b0000: SEG <= 8'b0000_0011;
            4'b0001: SEG <= 8'b1001_1111;
            4'b0010: SEG <= 8'b0010_0101;
            4'b0011: SEG <= 8'b0000_1101;  
            4'b0100: SEG <= 8'b1001_1001;
            4'b0101: SEG <= 8'b0100_1001;
            4'b0110: SEG <= 8'b0100_0001;
            4'b0111: SEG <= 8'b0001_1111;
            4'b1000: SEG <= 8'b0000_0001;
            4'b1001: SEG <= 8'b0000_1001;
            4'b1010: SEG <= 8'b0001_0001;
            4'b1011: SEG <= 8'b1100_0001;
            4'b1100: SEG <= 8'b0110_0011;
            4'b1101: SEG <= 8'b1000_0101;
            4'b1110: SEG <= 8'b0110_0001;
            4'b1111: SEG <= 8'b0111_0001;
        endcase
     end
endmodule

仿真代码

`timescale 1ns / 1ps

module ALU_top_sim();
    reg[31:0] a;
    reg[31:0] b;
    reg[3:0] op;
    wire[32:0] res;
    wire[3:0] flags; //顺序:ZF、SF、CF、OF

initial
        begin
            a = 32'h8000_0003;
            b = 32'h0000_0001;
    
            #100
            op = 4'b0000;   //加法
           
            #100
            op = 4'b0001;   //逻辑左移
            
            #100
            op = 4'b0010;   //有符号数比较          

            #100
            op = 4'b0011;   //无符号数比较            

            #100
            op = 4'b0100;   //异或
            
            #100
            op = 4'b0101;   //逻辑右移
            
            #100
            op = 4'b0110;   //按位或
            
            #100
            op = 4'b0111;   //按位与
           
            #100
            op = 4'b1000;   //减法
            
            #100
            op = 4'b1001;   //算术右移
        end    
    ALU alu_sim(a,b,op,res,flags);

endmodule

结构层图

管脚配置

set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN E3} [get_ports CLK_100M]

set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V5} [get_ports in_data[15]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T4} [get_ports in_data[14]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V6} [get_ports in_data[13]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T5} [get_ports in_data[12]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T6} [get_ports in_data[11]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V7} [get_ports in_data[10]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R8} [get_ports in_data[9]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U9} [get_ports in_data[8]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T9} [get_ports in_data[7]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V10} [get_ports in_data[6]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R10} [get_ports in_data[5]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U11} [get_ports in_data[4]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R11} [get_ports in_data[3]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U12} [get_ports in_data[2]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T13} [get_ports in_data[1]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V14} [get_ports in_data[0]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T14} [get_ports ctrl_in]

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets rst_]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CLK_A]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CLK_B]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CLK_OP]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN N17} [get_ports rst_]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN P18} [get_ports CLK_A]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN P17} [get_ports CLK_B]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R18} [get_ports CLK_OP]

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets ShowA]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets ShowB]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U18} [get_ports ShowA]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U17} [get_ports ShowB]

set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U6} [get_ports out_flags[3]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R5} [get_ports out_flags[2]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U7} [get_ports out_flags[1]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R6} [get_ports out_flags[0]]

set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN C9} [get_ports AN[7]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN C10} [get_ports AN[6]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN D10} [get_ports AN[5]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN C11} [get_ports AN[4]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN M17} [get_ports AN[3]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN J14} [get_ports AN[2]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN K13} [get_ports AN[1]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN P14} [get_ports AN[0]]

set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN F14} [get_ports SEG[7]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN N14} [get_ports SEG[6]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN J13} [get_ports SEG[5]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN G13} [get_ports SEG[4]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN F13} [get_ports SEG[3]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN G14} [get_ports SEG[2]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN M13} [get_ports SEG[1]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN H14} [get_ports SEG[0]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

74-快速排序——一路快排

快速排序是影响二十世纪最伟大的排序算法之一。 JDK的双轴快速排序就是对快排的优化&#xff0c;本质还是快排。 从待排序区间选择一个数&#xff0c;作为基准值/分区点&#xff08;pivot&#xff09;&#xff0c;此时默认选择数组的第一个元素作为比较的基准值。partition&a…

【 SpringBoot 配置⽂件 】

文章目录一、配置⽂件作⽤二、配置文件格式2.1 特殊说明2.2 为配置⽂件安装提示插件三、properties 配置⽂件说明3.1 properties 基本语法3.2 读取配置⽂件3.3 解决 properties 中文乱码3.4 properties 缺点分析四、yml 配置⽂件说明4.1 yml 基本语法4.2 yml 配置读取4.3 yml 使…

前后端分离——SpringBoot+Vue——3天速成企业级项目

前后端分离——SpringBootVue使用到的技术&#xff1a;vue3&#xff08;区别vue2&#xff09;前言vue2 vs vue3双向绑定更新实例化生命周期获取props数据和方法的定义watchEffect那么什么是 watchEffect &#xff1f;组件通信注意attrs和listeners路由vue3路由写法&#xff1a;…

ROS学习——艰辛的环境安装之路一VMware

文章目录VMware 安装下载安装VMware 安装 一些没用的介绍&#xff1a; VMware Workstation中文版是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比&#xff0c;VMWare 采用了完全不同的概念。多启动系统在一…

《Web前端应用开发》考试试卷(模拟题)

一、产品搜索页面 打开“考试文件夹”中的input.html&#xff0c;完成以下步骤&#xff1a; 注意&#xff1a;本题仅能在input.html的&#xff08;1&#xff09;为产品名称所在的div添加样式属性&#xff0c;使得产品名称保持在文本框的左边&#xff1b; &#xff08;2&#xf…

PPT NO.1【用ppt如何做一张海报+字体】

PPT做得好的人&#xff0c;一定是站在观众的角度思考的人。 1、设置幻灯片尺寸大小&#xff1a; 设置完成后如下&#xff1a; 2、加载一张自己喜欢的图片进来&#xff1a;【图片越高清越好】 将图片铺满空白的地方&#xff0c;调整好自己喜欢的区域&#xff1a; 做裁剪&#xf…

数据结构修炼第一篇:时间复杂度和空间复杂度

系列文章目录 第一章 时间复杂度和空间复杂度 第二章 顺序表&#xff0c;列表 第三章 栈和队列 第四章 二叉树 第五章 排序 目录 系列文章目录 &#x1f3c6;文章目录 &#x1f3c6;前言 &#x1f3c6;一、算法的复杂度 &#x1f3c6;二、时间复杂度的概念 大0渐进 作…

【Go语言从入门到精通系列-基础篇】Go安装 + 语言特性,以及开启你人生中的第一个go程序

系列文章 【Go语言从入门到精通系列-基础篇】Go安装 语言特性&#xff0c;以及开启你人生中的第一个go程序 【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。 Go语言从入门到精通系列-基础篇系列文章前言第一章 Go语言开发基础1.1 Go语言的优势1.2 Go语…

C语言快速排序非递归实现

目录 栈的辅助&#xff08;栈的实现可以调用之前实现的数据结构&#xff09;&#xff1a; 1&#xff0c;初始状态 2&#xff0c;循环 3&#xff0c;终止 4&#xff0c;注意 小点&#xff1a; 1&#xff0c;递归的使用会造成栈空间的消耗&#xff0c;使用递归&#xff0c;…

刷题day51:重新安排行程 ***

题意描述&#xff1a; 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 …

【宝塔邮局管理器】使用教程、Email配置

1.安装宝塔邮局插件前&#xff0c;需要先安装redis服务&#xff0c;并设置redis密码。 安装完Redis服务后设置密码&#xff0c;设置密码时不要使用&%这类特殊符号 会导致负载状态显示异常&#xff0c;可使用英文数字组合密码 PS&#xff1a;邮局的反垃圾模块 rspamd服务需要…

Spring Cloud快速入门

文章目录Spring Cloud快速入门一、基础概念1、微服务架构2、微服务技术栈3、什么是Spring Cloud?4、Spring Cloud和Spring Boot的联系&#xff1f;5、比较成熟的互联网架构二、Rest环境搭建1、搭建提供者1.1、创建一个父工程1.2、创建一个springcloud-api模块1.3、创建一个spr…

SSM学习记录3:响应(注释方式 + SprigMVC项目 + 2022发布版本IDEA)

响应 ResponseBody注解的作用是将当前控制器中方法的返回值作为响应体 1.返回页面 无需在方法上进行ResponseBody注解&#xff0c;只需RequestMapping匹配地址&#xff0c;并且返回值为带后缀的页面名字符串 前面学习中除了json数据&#xff0c;所有带ResponseBody注解的方法…

iphone用什么蓝牙耳机好?和iphone适配的蓝牙耳机推荐

随着科技的不断发展&#xff0c;人们已经离不开各种智能设备。蓝牙耳机作为一种非常方便的音频设备&#xff0c;已经逐渐成为了许多人日常生活中不可或缺的一部分。然而&#xff0c;苹果产品的价格一直都是昂贵的&#xff0c;有没有与iphone适配的耳机呢&#xff1f;下面我们来…

ServletAPI详解(三)-HttpServletRequest

我们来看第二个类:HttpServletRequest HttpServletRequest HttpServletRequest表示的是一个http请求对象,是tomcat自动构造的,tomcat会实现监听端口,接收连接,读取请求,解析请求,构造请求对象等一系列操作 下面的方法可用在 Servlet 程序中读取 HTTP 头。这些方法通过 HttpS…

若依— — 快速入门【源码分析】

若依— — 快速入门 1 什么是若依 官网地址&#xff1a;http://www.ruoyi.vip/ 若依是一款优秀的开源项目&#xff0c;涉及到企业开发中大部分的管理系统&#xff0c;我们依此为模板进行二次开发&#xff0c;可以快速开发出符合大部分公司中的后台管理系统。 2 使用若依 使用开…

Spring Security --- authorizeRequests配置

目录 自定义配置类之访问权限 匹配顺序规则 访问控制包含 访问控制url匹配 访问控制方法 角色、权限判断 使用注解进行角色权限控制 自定义配置类之访问权限 http.authorizeRequests()主要是对url进行访问权限控制通过这个方法来实现url授权操作支持链式写法 匹配顺序…

【react全家桶学习】react简介

react是什么&#xff1f; react是用于构建用户界面的JS库&#xff0c;是一个将数据渲染为HTML视图的开源JS库 谁开发的&#xff1f; 由Facebook开发&#xff0c;且开源 为什么要学&#xff1f; 原生JavaScript操作DOM繁琐、效率低 ( DOM-API操作 UI)使用JavaScript直接操作…

Attention注意力机制

加粗样式通俗理解&#xff1a;你会注意什么&#xff1f; 对于一个模型而言&#xff08;CNN&#xff0c;LSTM&#xff09;&#xff0c;模型本身很难决定什么重要什么不重要&#xff0c;因此注意力机制诞生了。 注意力机制&#xff1a;我们会把焦点聚焦在比较重要的事务上 怎么…

详细聊一聊Android Apk的四代签名

简介 大部分开发者对apk签名还停留在APK v2&#xff0c;对APK v3和APK v4了解很少&#xff0c;而且网上大部分文章讲解的含糊不清&#xff0c;所以根据官网文档重新整理一份。 apk签名从APK v1到APK v2改动很大&#xff0c;是颠覆性的&#xff0c;而APK v3只是对APK v2的一次…