科学FPGA开发流程
- 设计定义:就是我们想要实现一个什么东西,例如计数器、二选一多路器等。
- 设计输入:实现我们的设计定义,可以通过画板子、硬件描述语言、现有IP核等方式来实现。
- 分析综合:检查我们的设计是否有语法错误等问题。
- 功能仿真:通过设计输入,观察输出的值是否符合我们的预期来检查设计是否正确,例如testbench。
- 布局布线:将我们的设计通过具体的元器件模型连接起来。
- 时序仿真:前面布局布线的结果是具体的器件连接,所以在实际电路中会有延迟,时序仿真就是在实际电路中检查结果是否符合预期。
- 时序约束:如果时序仿真不符合预期,就要通过时序约束来调整电路,使其达到预期。
- IO分配以及配置文件生成:将我们的设计中的输入输出和实际开发板的管脚进行一一对应,并生成相对应的配置文件。
- 配置(烧写):将生成的配置文件烧写到FPGA中。
- 在线调试: 在FPGA中进行调试、是否符合预期。
开发实例
设计定义
二选一多路器:两个输入IO分别为a和b,按下输入键时,LED灯与a状态保持一致,否则与b保持一致。
设计输入
- 设计模块
//非顶层模块,故有输入输出口
module led_test(a,b,key,out);
//输入输出信号定义
input a;
input b;
input key;
output out;
//逻辑部分
assign out = (key==1'b0) ? a : b;
endmodule
- 验证模块
//时间单位与精度定义,1ns表示单位,1ps表示精度
`timescale 1ns/1ps
//testbench模块开始,顶层模块,故没有输入输出口
module led_test_tb;
//激励信号定义,一般为reg寄存器型
reg signal_a;
reg signal_b;
reg signal_c;
//输出信号定义,一般为wire线网型
wire led;
//实例化模块,需要连接模块的输入输出口
led_test u0(
.a(signal_a),
.b(signal_b),
.key(signal_c),
.out(led)
);
//信号激励产生
initial begin
//定义信号值
signal_a=1'b0;signal_b=1'b0;signal_c=1'b0;
//表示100ns后
#100;
signal_a=1'b0;signal_b=1'b0;signal_c=1'b1;
#100;
signal_a=1'b0;signal_b=1'b1;signal_c=1'b0;
#100;
signal_a=1'b0;signal_b=1'b1;signal_c=1'b1;
#100;
signal_a=1'b1;signal_b=1'b0;signal_c=1'b0;
#100;
signal_a=1'b1;signal_b=1'b0;signal_c=1'b1;
#100;
signal_a=1'b1;signal_b=1'b1;signal_c=1'b0;
#100;
signal_a=1'b1;signal_b=1'b1;signal_c=1'b1;
#100;
//模块停止符号
$stop;
end
endmodule
- 输出波形