【FPGA】多功能ALU

目录

实验要求

源代码

        顶层模块

        数据输入模块

        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.mfbz.cn/a/10494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot基础学习之(十八):通过shiro框架使用Mybatis实现用户的认证完整的认证流程

在上几篇文章的基础上&#xff0c;实现本次案例 注意&#xff1a;本篇文章的实现代码在几篇文章都已经详细的讲过了&#xff0c;所以在此篇文章&#xff0c;将不再有理论知识的陈述&#xff0c;更过的流程&#xff0c;如何通过代码实现连接数据库进行认证 添加本次案例所需要的…

00后也太卷了吧!进厂起薪18K,原来面试时候都说了这些......

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该牛的还是牛。 这不&#xff0c;前段时间公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽起薪18K。本来还以为是个年少有为的技术大牛呢&#xff0c;结果相处一个月下来发现技术也就那样。 问起他是如何做到和老…

NumPy 数组学习手册:6~7

原文&#xff1a;Learning NumPy Array 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 六、性能分析&#xff0c;调试和测试 分析&#xff0c;调试和测试是开发过程的组成部分。 您可能熟悉单元测试的概念。 单元测试是程序员编写的用于测试其代码的自动测试。 例如&…

android jetpack Navigation的使用(java)

简介 Navigation通过图形化的方式管理配置页面的切换。 基本使用 添加依赖 implementation androidx.navigation:navigation-fragment:2.5.3implementation androidx.navigation:navigation-ui:2.5.3创建xml文件&#xff08;添加导航图&#xff09;——nav_graph.xml nav_…

六个阶段形成CRM销售漏斗,优点有哪些

CRM销售漏斗是反映机会状态以及销售效率的重要的销售管理模型。对企业来说&#xff0c;CRM销售漏斗是一个必不可少的工具。通过销售漏斗&#xff0c;企业可以跟踪和分析客户旅程的每个阶段&#xff0c;并制定相应的销售战略。下面来说说&#xff0c;什么是CRM销售漏斗&#xff…

Nginx

文章目录一、目录结构二、多进程模型和请求基本流程三、基础配置3.1 最小配置文件3.2 servername的多种匹配方式3.2.1完整匹配3.2.2通配符匹配3.2.3通配符结束匹配3.2.4正则匹配四、反向代理4.1 反向代理到外网与内网主机的配置4.2 负载均衡配置五、动静分离六、URLRewrite 伪静…

C-关键字(下)

文章目录循环控制switch-case-break-defaultdo-while-forgetchar()break-continuegotovoidvoid*returnconstconst修饰变量const修饰数组const修饰指针指针补充const 修饰返回值volatilestruct柔型数组union联合体联合体空间开辟问题利用联合体的性质,判断机器是大端还是小端enu…

运行时内存数据区之虚拟机栈——动态链接、方法返回地址与一些附加信息

动态链接&#xff08;Dynamic Linking&#xff09;——指向运行时常量池的方法引用 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)。比如&#xff1a;invokedynamic指令。…

( “树” 之 DFS) 101. 对称二叉树 ——【Leetcode每日一题】

101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a…

聚焦元宇宙赋能产业,打造数字世界,“OFweek2023广州元宇宙产业发展高峰论坛”圆满落幕!

2023年4月12日下午&#xff0c;由广东潮域科技有限公司、OFweek维科网共同主办&#xff0c;OFweek人工智能网承办的“OFweek 2023 广州元宇宙产业发展高峰论坛”在广州保利世贸博览馆1号馆盛大举办。 元宇宙产业相关技术及设备&#xff0c;包括VR&#xff0f;AR、虚拟现实、物联…

springboot配置跨域问题

近期自己搭建项目时&#xff0c;遇到一个跨域问题。我们以前项目解决跨域是在controller上加一个跨域注解CrossOrigin(allowCredentials "true")&#xff0c;很方便。但是在我自己搭建的项目中&#xff0c;启动时竟然报错了&#xff0c;错误如下&#xff1a; When …

不会写代码也能做自动化?推荐一款自动化测试神器

在软件测试这条道路上&#xff0c;大部分的职业技能发展道路都会是纯业务手工测试→自动化测试→性能测试→安全测试/测试开发。 但是却有着一部分人起初进入软件测试这一行看重的就是软件测试属于IT行业&#xff0c;门槛比较低&#xff0c;不需要代码基础。 这就导致了这一部…

第07章_面向对象编程(进阶)

第07章_面向对象编程(进阶) 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 关键字&#xff1a;this 1.1 this是什么&#xff1f; 在Java中&#xff0c;this关键字不算难理解…

<数据结构> 链表 - 单链表(c语言实现)

B.最简单结构的链表——不带哨兵位单链表的实现&#xff08;关于哨兵位结点&#xff09; 一、不带哨兵位单链表结点的创建1.1 typedef 链表的数据类型 1.2 结点的结构体创建 二、单链表要实现的功能 三、需要包含的头文件四、函数接口一览为什么有些函数参数传递的是二级指针&a…

【大数据之Hadoop】十一、MapReduce之Shuffle、MapTask、ReduceTask工作机制

1 Shuffle机制 对于排序而言分为两个阶段&#xff0c;MapTask后和ReduceTask前。 2 MapTask工作机制 MapTask并行度由切片个数决定&#xff1b;切片个数由切片大小&#xff08;切片大小取决于块大小、maxsize&#xff08;Long的最大值&#xff09;和minsize&#xff08;默认为…

设计模式之模板模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、模板模式是什么&#xff1f; 模板模式是一种行为型的软件设计模式&#xff0c;在父类中定义了一个模板算法&#xff0c;只实现…

Android---MVC/MVP/MVVM的演进

目录 一个文件打天下 一个文件--->MVC MVC--->MVP MVP--->MVVM 6大设计原则 完整demo 我们通过"#字棋"游戏来展现MVC-->MVP-->MVVM 之间的演进 一个文件打天下 数据、视图以及逻辑都放在一个 class 里面。而一个 class 里最多 500 行代码&…

GPT-4 和ChatGPT API的定价分析

OpenAI发布了他们的ChatGPT新机器学习模型GPT-4。GPT-4是GPT-3的一大进步&#xff0c;GPT-3是当前ChatGPT免费版本(GPT 3.5 Turbo)所运行的模型的基础&#xff0c;今天我们也来凑个热点&#xff0c;研究一下它们的定价 GPT-4新的功能 GPT-4可以在对话中使用图像&#xff0c;并…

Mybatis(七)Mybatis的日志体系

在介绍Mybatis日志实现前&#xff0c;我们先了解下java的日志体系以及日志框架的发展&#xff0c;目前比较常用的日志框架有下面几个&#xff1a; 而JCL和SLF4J属于日志接口&#xff08;没有日志具体实现&#xff09;&#xff0c;提供统一的日志操作规范&#xff0c;而日志的实…

NumPy 秘籍中文第二版:四、将 NumPy 与世界的其他地方连接

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们将介绍以下秘籍&#xff1a; 使用缓冲区协议使用数组接口与 MATLAB 和 Octave 交换数据安装 RPy2与 R 交互安装 JPype将 NumPy 数组发送到 J…