DE2-115实现四位全加器与3-8译码器
一、FPGA与Verilog的关系
FPGA(现场可编程门阵列)是一种可通过编程配置的集成电路,其核心特性在于硬件逻辑的灵活重构能力。它由可配置逻辑块(CLB)、互连资源和I/O接口组成,支持用户根据需求自定义数字电路功能,兼具高性能和并行处理优势。而Verilog作为一种硬件描述语言(HDL),则是实现FPGA开发的核心工具,两者关系密切且相辅相成。
1、FPGA的核心特性与应用
硬件可编程性
FPGA通过编程改变内部逻辑电路结构,无需流片即可实现不同功能。其灵活性体现在可重复配置特性上,例如在通信协议实现、实时信号处理等领域,用户可通过修改代码快速适应新需求。
并行处理能力
与顺序执行的CPU不同,FPGA的硬件结构允许同时处理多路数据流。例如在视频编解码或金融高频交易场景中,FPGA的并行计算效率可达传统处理器的数十倍。
应用场景
原型验证:在芯片流片前用FPGA模拟ASIC功能,降低研发成本
加速计算:微软等企业利用FPGA加速深度神经网络推理
工业控制:交通灯控制器等实时系统通过FPGA实现毫秒级响应
2、Verilog的核心作用
硬件逻辑描述
Verilog通过模块化语法(如module定义、wire/reg数据类型)精确描述电路结构。例如用always @(posedge clk)块可构建同步时序逻辑,直接映射到FPGA的触发器资源。
设计流程支撑
仿真验证:通过Testbench模拟输入信号,验证逻辑正确性
综合优化:将行为级代码转换为门级网表,优化资源占用(如LUT利用率)
时序分析:约束文件(SDC)定义时钟频率,确保满足建立/保持时间
高级设计范式
有限状态机(FSM):用case语句实现状态转移,常见于通信协议控制器
IP核复用:封装已验证模块(如FFT算法),通过参数化设计提升开发效率
二、简单四位全加器实现
本次实验使用到的工具有:DE2-115开发板,Quartus 18.0,ModelSim - Intel FPGA Starter Edition 10.5b (Quartus Prime 18.0),deepseek
1、实现步骤
1、点击Quartus ,点击New Project
2、点击Next
3、选择项目存放位置,并为项目取名
4、选择empty
5、直接点next直到这个界面
注意最下面available devices一定要点并且选择与你芯片对应型号
点击后会变蓝色
6、然后一直点击next,最后finish,在finish之前注意核对芯片信息
7、进入EDA后,点击FIle,新建Verilo file
8、输入Verilog代码
点击暂停的符号,开始编译,然后会弹出来需要你保存此文件,你可以为这个文件任意取名,但是代码名就是module后面的名字必须与
第3步也就是图中左面的名一样,不然编译会报错
9、点击Pin planner,就会弹出引脚配置界面
在此界面中你可以看见对应引脚的是输入还是输出状态,然后根据引脚配置表选择你自己要用到的引脚
配置完成后又需要编译一遍。
10、下载烧录,点击Program,弹出烧录界面
选择烧录工具,这里选择的是USB烧录,若没有这个驱动,可以自行搜索如何安装USB-Blaster驱动,然后点击start,烧录是否成功会显示在progress处。
2、效果
用LEDR0-LEDR3作为四位输出,SW0-SW7作为输入 ,LEDR17作为进位输出
可以看出0011+0011=0110,符合2进制加法
当输入为1111+1111时,输出为1110与一位进位输出
二、3-8译码器
实现步骤与上述一样
下面给出实现代码
bash
module decoder38(
input [2:0] sw,
output reg [7:0] led,
output reg [6:0] hex0
);
always @(*) begin
case(sw)
3'b000: begin led = 8'b00000001; hex0 = 7'b1000000; end // 0显示
3'b001: begin led = 8'b00000010; hex0 = 7'b1111001; end // 1显示
3'b010: begin led = 8'b00000100; hex0 = 7'b0100100; end // 2显示
3'b011: begin led = 8'b00001000; hex0 = 7'b0110000; end // 3显示
3'b100: begin led = 8'b00010000; hex0 = 7'b0011001; end // 4显示
3'b101: begin led = 8'b00100000; hex0 = 7'b0010010; end // 5显示
3'b110: begin led = 8'b01000000; hex0 = 7'b0000010; end // 6显示
3'b111: begin led = 8'b10000000; hex0 = 7'b1111000; end // 7显示
default: begin led = 8'b00000000; hex0 = 7'b1111111; end // 灭灯
endcase
end
endmodule
bash
3'b000: begin led = 8'b00000001;//这段代码是显示在LED灯上
hex0 = 7'b1000000; //这段代码是显示对应数字在数码管上面
1、效果图

当输入为000时,输出为10000000,数码管输出为0,根据3-8译码器的真值表可以看出这个结果是正确的,图中这个是低电平有效,我输出是为高电平有效
当输入为100时
三、总计
此次实验让我初步了解到FPGA。由于博主也是第一次接触,所以实验过程以及相关叙述可能不会很准确,希望各位加以指正。