【FPGA】多功能ALU

news/2025/3/15 3:34:15/

目录

实验要求

源代码

        顶层模块

        数据输入模块

        ALU运算模块

        结果处理模块

        扫描数码管模块

                扫描数码管顶层

                分频器

                数码管显示

仿真代码

结构层图

管脚配置


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

实验要求

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

 

源代码

        顶层模块

`timescale 1ns / 1psmodule 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)beginif(!ShowA)out_data = a;else if(!ShowB)out_data = b;elseout_data = alu_f;endendmodule

        数据输入模块

`timescale 1ns / 1psmodule 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_)beginif(!rst_)data_out <= 32'b0;elsebeginif(ctrl_in == 1'b0)data_out[15:0] <= data_in;elsedata_out[31:16] <= data_in;endendendmodule

        ALU运算模块

`timescale 1ns / 1psmodule 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@(*)begincase(op)4'b0000:beginres <= a + b;flags[1] = res[32];flags[0] = a[31] ^ b[31] ^ res[31] ^ res[32];end4'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:beginres <= a - b;flags[1] = res[32];flags[0] = a[31] ^ b[31] ^ res[31] ^ res[32];end4'b1001: res <= $signed(a) >>> b;endcaseflags[3] = (res == 32'd0) ? 1 : 0;flags[2] = res[31];endendmodule

        结果处理模块

`timescale 1ns / 1psmodule 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_)beginif(!rst_)beginalu_f <= 32'b0;out_flags <= 4'b1000;endelse if(clk)beginalu_f <= res;out_flags <= in_flags;endendendmodule

        扫描数码管模块

                扫描数码管顶层

                

`timescale 1ns / 1psmodule LED(input clk_100M,input rst_,input[31:0] data,output[7:0] AN,output[7:0] SEG
);wire clk_ref; //数码管刷新频率:500hzwire clk_inc; //数字刷新频率:10hzFdiv fdiv(clk_100M,32'd100000,clk_ref);Scanner scanner(data,rst_,clk_ref,AN,SEG);
endmodule

                分频器

`timescale 1ns / 1psmodule Fdiv(input clk_in,input [31:0] count,output reg clk_out);reg[31:0] num;always@(posedge clk_in)beginif(num == count)beginclk_out <= ~clk_out;num <= 1'b0;endelsenum <= num + 1'b1;endendmodule

                数码管显示

`timescale 1ns / 1psmodule 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)
beginif(!rst_)bit <= 3'd0;elsebit <= bit + 1'b1;
endalways@(*)begincase(bit)3'b000: begin AN <= 8'b1111_1110; data_x <= data[3:0]; end3'b001: begin AN <= 8'b1111_1101; data_x <= data[7:4]; end3'b010: begin AN <= 8'b1111_1011; data_x <= data[11:8]; end3'b011: begin AN <= 8'b1111_0111; data_x <= data[15:12]; end3'b100: begin AN <= 8'b1110_1111; data_x <= data[19:16]; end3'b101: begin AN <= 8'b1101_1111; data_x <= data[23:20]; end3'b110: begin AN <= 8'b1011_1111; data_x <= data[27:24]; end3'b111: begin AN <= 8'b0111_1111; data_x <= data[31:28]; endendcasecase(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;endcaseend
endmodule

仿真代码

`timescale 1ns / 1psmodule 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、OFinitialbegina = 32'h8000_0003;b = 32'h0000_0001;#100op = 4'b0000;   //加法#100op = 4'b0001;   //逻辑左移#100op = 4'b0010;   //有符号数比较          #100op = 4'b0011;   //无符号数比较            #100op = 4'b0100;   //异或#100op = 4'b0101;   //逻辑右移#100op = 4'b0110;   //按位或#100op = 4'b0111;   //按位与#100op = 4'b1000;   //减法#100op = 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.ppmy.cn/news/43245.html

相关文章

早有尔闻 | 数字赋能,提质增效

01 卡奥斯牵头国家重点研发项目 助力中小企业数字化转型升级 3月24日&#xff0c;2022年国家重点研发计划“面向中小企业研发制造资源技术工业互联技术服务平台”项目正式启动。其中&#xff0c;卡奥斯COSMOPlat作为平台承建方牵头课题4“研发制造资源工业互联技术服务平台研…

面试官在线点评4份留学生简历! 这些坑你中了几个?如何写项目描述才能被大厂发面试?转专业简历该咋写 | 还有优秀简历展示!

我们给大家展示一下 从材料的准备 也就是说到底包含哪些具体的项目 为什么说这些项目是不错的 第二呢就是说在陈述上 在整个这个简历的结构 他的完备性他的准确性 他的正确性 以及最后他的具体的这种项目的描述 那讲完了这个好的简历呢 我们另外搜集了几份简历 那这些简历呢其实…

ppt文件太大怎么变小,这6种方式很简单

ppt文件太大怎么变小&#xff1f; ppt文件通常用于公司会议、教育授课和商务演讲等场合&#xff0c;由于需要实现各种文档效果并插入大量图片&#xff0c;因此文件大小要远大于普通文档文件&#xff0c;占用的存储空间也不少。如果电脑中存储了大量PPT文件&#xff0c;并且不方…

什么是雪花算法?啥原理?

1、SnowFlake核心思想 SnowFlake 算法&#xff0c;是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛&#xff0c;且 ID 引入了时间戳&#xff0c;基本上保持自增的&#xf…

能自动翻译的软件-最精准的翻译软件

批量翻译软件是一种利用自然语言处理技术和机器学习算法&#xff0c;可以快速翻译大量文本内容的工具。批量翻译软件可以处理多种格式的文本&#xff0c;包括文档、网页、邮件、PDF等等&#xff0c;更符合掌握多语言的计算机化需求。 147CGPT翻译软件特点&#xff1a; 1.批量任…

【毕业设计】基于程序化生成和音频检测的生态仿真与3D内容生成系统----程序化生成地形算法设计

2 程序化生成地形算法设计 2.1 地形曲线的生成 2.1.1 初始化高度场 struct Make2DGridPrimitive : INode {virtual void apply() override {size_t nx get_input<NumericObject>("nx")->get<int>();nx std::max(nx, (size_t)1);size_t ny has_in…

计算机组成原理——第四章指令系统(上)

提示&#xff1a;待到秋来九月八&#xff0c;我花开后百花杀 文章目录前言4.1.1 指令格式4.1.2 扩展操作码指令格式4.2.1 指令寻址4.2.2 数据寻址4.2.3 偏移寻址4.2.4 堆栈寻址汇总前言 通过第二章我们学习了运算器是如何进行加减乘除&#xff0c;移位运算操作的&#xff0c;通…

Java14新特性

一、Java14新特性 Records&#xff08;记录&#xff09;&#xff1a;Records是一种新的类类型&#xff0c;它允许您声明一个不可变的数据类&#xff0c;该类包含默认方法和构造函数。你可以使用record关键字来定义一个记录。 Switch表达式&#xff08;Switch Expressions&…