一、模块和端口信号划分


二、新建工程
1.是这个新建的工程的位置,选择到 led 文件夹下的 prj 文件夹; 2.是这个工程的名字,也取名为 led; 3.整个工程设计顶层的文件名,这个名字保持和 2 中的命名一致即可。


我们使用的芯片具体型号—— EP4CE10F17C8。全部选择好后,点击“Next”
三、编写RTL代码
module led(
input wire key_in,
output wire led_out
);
// 将输入的按键信号直接连接到LED输出
assign led_out = key_in;
endmodule四、编写Testbench代码
编写 Testbench 进行测试的过程如下:
1. 产生模拟激励(输入波形);
2. 将产生的激励加入到被测试模块并观察其输出响应;
3. 将输出响应与期望进行比较,从而判断设计的正确性。
`timescale 1ns/1ns
module tb_led();
reg key_in;
wire led_out;
//初始化输入信号
initial key_in <= 1'b0; //按键信号初始化为低电平
//key_in 产生输入随机,模拟按键的按下和释放
always #10 key_in <= {$random} % 2; //每10ns随机改变一次按键信号
led led_inst (
.key_in(key_in),
.led_out(led_out)
);
endmodule五、仿真波形

六、引脚约束
真结束后即验证了代码设计的正确性,也就是说可以进行上板验证了,但是在上板之前还需要进行引脚约束,就是根据硬件原理图确定按键和 led 分别与 FPGA 芯片的哪个引脚对应。由原理图知上板上一共有四个普通按键和四个 led 灯我们选择其中一对按键和led 灯,按键选择连接的 FPGA 管脚为 M2, led 灯选择连接的 FPGA 管脚为 L7。

七、全编译

八、下载

下载完成后即可按下管脚绑定的按键,会发现同时被绑定的 led 随着按键的按下会被点亮,而按键松开时又熄灭,实现了我们最初预想的设计
九、程序的固化
FPGA 芯片是基于 SRAM 的结构,即下载后的网表存储在FPGA 内部的 SRAM 中,我们也知道 SRAM 有掉电易失的特性,这也就是我们为什么掉电后功能就消失的原因。所以我们要想使网表重新上电后仍然存在就需要将网表存储到片外的 flash 中, flash 芯片型号为 WinBond 25Q16,存储容量为 16Mbit(2M 字节),采用 SPI协议和 FPGA 进行通信,可做为 FPGA 的配置芯片(完全兼容 EPCS16 芯片),以保证FPGA 在重新上电后仍能继续工作。



