一、配置环境
1、Quartus 18.1安装教程
软件:Quartus | 版本:Quartus 18.1 |
语言:英文 | 大小:5.78G |
安装环境:Win11/Win10/Win8/Win7 | 硬件要求:CPU@2.0GHz 内存@4G(或更高) |
下载通道①百度网盘丨64位下载链接: http://pan.baidu.com/s/1wYcHJkh2POLfLR7oohWzBw 提取码:h123 |
软件介绍
Quartus 是一款综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
安装步骤
下载安装文件之后,点击文件中的setup,进入安装界面,稍等一会儿。
选择【I accept the agreement】,点击Next。
修改路径地址中的首字符C可更改软件的安装位置
后面直接点Next,进入安装,等待时间会比较长.
1.1创建 Quartus 项目
-
打开 Quartus 软件。
-
点击
File -> New Project Wizard
。 -
设置项目路径和项目名称(例如
four_bit_adder
)。 -
选择目标器件:
-
在
Family
中选择Cyclone IV E
。 -
在
Device
中选择EP4CE115F29C7
(DE2-115 的 FPGA 型号)。
-
-
完成项目创建。
就欧克了
2、ModelSim安装教程
软件:ModelSim | 版本:ModelSim-Intel FPGA Starter Edition 10.5b |
语言:英文 | 大小:1.11G |
安装环境:Win11/Win10/Win8/Win7 | 硬件要求:CPU@2.0GHz 内存@4G(或更高) |
下载通道①百度网盘丨64位下载链接: http://pan.baidu.com/s/1wYcHJkh2POLfLR7oohWzBw 提取码:h123 |
软件介绍
ModelSim 是一种功能强大的硬件描述语言 (HDL,Hardware Description Language) 仿真和验证工具,可以单独仿真,也可以联合Quartus/ViIvado等软件联合仿真,仿真速度快,广泛应用于数字电路设计和验证领域。
安装步骤
下载安装文件之后,点击exe文件进入安装
点击Next,
点击Next,
accept后,点击Next,
修改路径地址中的首字符C可更改软件的安装位置(如:将C改为D表示安装到D盘),点击Next
完成安装之后退出,即可使用。
二、实现4位全加器
1、项目创建
-
打开 Quartus 软件。
-
点击
File -> New Project Wizard
。 -
设置项目路径和项目名称(例如
four_bit_adder
)。 -
选择目标器件:
-
在
Family
中选择Cyclone IV E
。 -
在
Device
中选择EP4CE115F29C7
(DE2-115 的 FPGA 型号)。
-
-
完成项目创建。
2. 编写 Verilog 代码
-
在 Quartus 中,点击
File -> New
,选择Verilog HDL File
,然后点击OK
。 -
编写 4位全加器的 Verilog 代码。
4位全加器代码如下,
// 1-bit 全加器模块
module full_adder_1bit (
input A,
input B,
input Cin,
output Sum,
output Cout
);
assign Sum = A ^ B ^ Cin; // 和输出
assign Cout = (A & B) | (Cin & (A ^ B)); // 进位输出
endmodule
// 按键消抖模块
module debounce (
input clk, // 50MHz 时钟
input key_in, // 按键输入(KEY0)
output reg key_out // 消抖后的稳定信号
);
reg [19:0] counter; // 20ms 延时计数器(50MHz → 1_000_000 计数)
always @(posedge clk) begin
if (counter == 20'd1_000_000) begin
key_out <= key_in; // 采样稳定后的按键值
counter <= 0;
end else begin
counter <= counter + 1;
end
end
endmodule
// 4-bit 全加器顶层模块
module four_bit_adder (
input clk, // 时钟信号
input [3:0] A, // 输入 A(SW3-SW0)
input [3:0] B, // 输入 B(SW7-SW4)
input Cin_raw, // 原始按键输入(KEY0)
output [3:0] Sum, // 和输出(LEDR3-LEDR0)
output Cout // 进位输出(LEDR4)
);
wire Cin_stable;
debounce debounce_inst (
.clk(clk), // 时钟信号
.key_in(Cin_raw),
.key_out(Cin_stable)
);
wire [3:0] carry;
full_adder_1bit fa0 (A[0], B[0], Cin_stable, Sum[0], carry[0]);
full_adder_1bit fa1 (A[1], B[1], carry[0], Sum[1], carry[1]);
full_adder_1bit fa2 (A[2], B[2], carry[1], Sum[2], carry[2]);
full_adder_1bit fa3 (A[3], B[3], carry[2], Sum[3], carry[3]);
assign Cout = carry[3];
endmodule
3. 编译和综合
-
在 Quartus 中,点击
Processing -> Start Compilation
,开始编译。
左下角是编译过程,
编译结果如下,
4. 引脚分配
-
打开引脚分配工具:
-
点击
Assignments -> Pin Planner
。
-
-
根据 DE2-115 开发板的引脚定义,分配输入输出信号到具体的引脚。
-
Cout
分配到另一个 LED(LEDR4)。 -
Sum[3:0]
分配到 4 个 LED(LEDR3-LEDR0)。 -
Cin
分配到一个按钮(KEY0)。 -
B[3:0]
分配到另外 4 个拨码开关(SW7-SW4)。 -
A[3:0]
分配到 4 个拨码开关(SW3-SW0)。
-
以下是具体的引脚分配表:
信号 | 引脚名称 | 硬件对应 | 方向 | I/O 标准 |
---|---|---|---|---|
clk | PIN_Y2 | 50MHz 时钟 | Input | 3.3-V LVTTL |
A[0] | PIN_AB28 | 拨码开关 SW0 | Input | 3.3-V LVTTL |
A[1] | PIN_AC28 | 拨码开关 SW1 | Input | 3.3-V LVTTL |
A[2] | PIN_AC27 | 拨码开关 SW2 | Input | 3.3-V LVTTL |
A[3] | PIN_AD27 | 拨码开关 SW3 | Input | 3.3-V LVTTL |
B[0] | PIN_AB26 | 拨码开关 SW4 | Input | 3.3-V LVTTL |
B[1] | PIN_AD26 | 拨码开关 SW5 | Input | 3.3-V LVTTL |
B[2] | PIN_AC26 | 拨码开关 SW6 | Input | 3.3-V LVTTL |
B[3] | PIN_AB25 | 拨码开关 SW7 | Input | 3.3-V LVTTL |
Cin_raw | PIN_M23 | 按键 KEY0 | Input | 3.3-V LVTTL |
Sum[0] | PIN_G19 | LEDR0 | Output | 3.3-V LVTTL |
Sum[1] | PIN_F19 | LEDR1 | Output | 3.3-V LVTTL |
Sum[2] | PIN_E19 | LEDR2 | Output | 3.3-V LVTTL |
Sum[3] | PIN_F21 | LEDR3 | Output | 3.3-V LVTTL |
Cout | PIN_F18 | LEDR4 | Output | 3.3-V LVTTL |
保存引脚分配。
5、4位全加器在DE2-115开发板的实现
下载程序到 FPGA
-
连接硬件:
-
使用 USB-Blaster 线连接 DE2-115 的 JTAG 接口。
-
打开开发板电源(电源开关位于右上角)。
-
-
打开编程工具:
-
点击 Tools -> Programmer。
-
-
配置编程文件:
-
点击 Add File,选择生成的
.sof
文件(路径:output_files/four_bit_adder.sof
)。 -
确保 Program/Configure 选项被勾选。
-
-
下载程序:
-
点击 Start,等待进度条完成并显示 Programming Succeeded。
-
DE2115开发板上实现4位全加器前的基础测试
基础测试
基础测试-CSDN直播
测试用例
输入组合 | 预期输出 | 硬件验证方法 |
---|---|---|
A=0011 , B=0101 , Cin=0 | Sum=1000 , Cout=0 | SW3-SW0: 0011;SW7-SW4: 0101;KEY0弹起 → LEDR3亮,其余灭;LEDR4灭。 |
A=1111 , B=0001 , Cin=0 | Sum=0000 , Cout=1 | SW3-SW0: 1111;SW7-SW4: 0001;KEY0弹起 → LEDR0-LEDR3全灭;LEDR4亮。 |
A=1010 , B=0101 , Cin=1 | Sum=0000 , Cout=1 | SW3-SW0: 1010;SW7-SW4: 0101;KEY0按下 → LEDR0-LEDR3全灭;LEDR4亮。 |
DE2115开发板上实现4位全加器
对于第一组组合在开发板上进行验证
DE2115实现4位全加器
DE2115实现4位全加器-CSDN直播
三、实现3-8译码器
1、项目创建
-
打开 Quartus 软件。
-
点击
File -> New Project Wizard
。 -
设置项目路径和项目名称(例如 decoder_3to8 )。
-
选择目标器件:
-
在
Family
中选择Cyclone IV E
。 -
在
Device
中选择EP4CE115F29C7
(DE2-115 的 FPGA 型号)。
-
-
完成项目创建。
2. 编写 Verilog 代码
在 Quartus 中,点击 Processing -> Start Compilation
,开始编译。
代码如下,
module decoder_3to8 (
input [2:0] in, // 3-bit input
output reg [7:0] out // 8-bit output
);
always @(*) begin
case (in)
3'b000: out = 8'b00000001;
3'b001: out = 8'b00000010;
3'b010: out = 8'b00000100;
3'b011: out = 8'b00001000;
3'b100: out = 8'b00010000;
3'b101: out = 8'b00100000;
3'b110: out = 8'b01000000;
3'b111: out = 8'b10000000;
default: out = 8'b00000000; // Default case
endcase
end
endmodule
3. 编译和综合
在 Quartus 中,点击 Processing -> Start Compilation
,开始编译。
如果没有语法错误,编译会成功完成。
编译结果如下,
4. 引脚分配
-
打开引脚分配工具:
-
点击
Assignments -> Pin Planner
。
-
-
根据 DE2-115 开发板的引脚定义,分配输入输出信号到具体的引脚。
-
例如:
-
in[2:0]
分配到 3 个拨码开关(SW2-SW0)。 -
out[7:0]
分配到 8 个 LED(LEDR7-LEDR0)。
-
-
以下是具体的引脚分配表:
信号 | 引脚名称 | 功能说明 |
---|---|---|
in[0] | PIN_AB28 | SW0 |
in[1] | PIN_AC28 | SW1 |
in[2] | PIN_AC27 | SW2 |
out[0] | PIN_G19 | LEDR0 |
out[1] | PIN_F19 | LEDR1 |
out[2] | PIN_E19 | LEDR2 |
out[3] | PIN_F21 | LEDR3 |
out[4] | PIN_F18 | LEDR4 |
out[5] | PIN_E18 | LEDR5 |
out[6] | PIN_J19 | LEDR6 |
out[7] | PIN_H19 | LEDR7 |
保存引脚分配。
5、3-8译码器在DE2-115开发板的实现
下载程序到 FPGA
-
连接硬件:
-
使用 USB-Blaster 线连接 DE2-115 的 JTAG 接口。
-
打开开发板电源(电源开关位于右上角)。
-
-
打开编程工具:
-
点击 Tools -> Programmer。
-
-
配置编程文件:
-
点击 Add File,选择生成的
.sof
文件(路径:output_files/
decoder_3to8.sof
)。 -
确保 Program/Configure 选项被勾选。
-
-
下载程序:
-
点击 Start,等待进度条完成并显示 Programming Succeeded。
-
功能验证
输入(SW2-SW0) | 预期输出(LEDR7-LEDR0) | 现象 |
---|---|---|
000 | 11111110 | LED0 亮,其余灭 |
001 | 11111101 | LED1 亮,其余灭 |
010 | 11111011 | LED2 亮,其余灭 |
011 | 11110111 | LED3 亮,其余灭 |
100 | 11101111 | LED4 亮,其余灭 |
101 | 11011111 | LED5 亮,其余灭 |
110 | 10111111 | LED6 亮,其余灭 |
111 | 01111111 | LED7 亮,其余灭 |
在DE2115开发板上完成功能验证,如下。
DE2115实现3-8译码器
DE2115实现3-8译码器-CSDN直播
四、心得体会
1、理论复习与实践结合
通过本次作业,我深刻体会到理论知识与实践操作的紧密关联。在复习组合逻辑电路设计时,我重新梳理了逻辑表达式化简(如卡诺图法、公式法)的重要性。
关键收获:
-
组合逻辑电路设计需从问题抽象出发,明确输入输出关系,再通过真值表、逻辑表达式进行优化。
2、Logisim与Verilog的对比
在对比Logisim与Verilog实现3-8译码器的过程中,我发现了以下差异:
设计方法:
Logisim:图形化界面设计,适合快速验证逻辑功能,但难以直接映射到硬件。
Verilog:基于硬件描述语言(HDL),通过代码生成RTL电路,可直接适配FPGA硬件。
仿真与实际硬件:
Logisim仿真结果仅验证逻辑正确性,而Verilog需考虑时序、信号传播延迟等实际硬件问题。
灵活性与扩展性:
Verilog支持参数化设计和模块化复用,更适合复杂系统开发。
3、DE2-115开发板实验
四位全加器实现
在开发板上实现四位全加器时,我遇到了以下挑战与解决方案:
-
挑战1:LED显示异常(全灭或错误亮起)。
-
原因:未考虑DE2-115的LED为低电平有效。
-
解决:在代码中对输出信号取反(
assign Sum = ~sum_raw;
)。
-
-
挑战2:按键输入不稳定(抖动)。
-
解决:添加消抖模块(
debounce
),通过延时采样稳定信号。
-
3-8译码器实现
在3-8译码器实验中,我结合八段数码管实现了动态显示:
-
挑战:数码管显示需将二进制码转换为七段码。
-
解决:编写七段译码器模块,将3位输入映射到数码管段选信号。
-
4、经验总结
硬件设计的严谨性:
引脚分配、电平标准(如3.3V LVTTL)、信号方向需严格匹配开发板规格。实际硬件需考虑信号抖动、传播延迟等仿真中忽略的问题。
代码与硬件的协同:
Verilog代码需兼顾功能正确性和硬件适配性(如低电平有效、消抖处理)。