- FPGA学习笔记—第二课
- 本篇将给出完整的工程创建过程,另外给出所有的代码,其中包含必要的注释,可以用于学习Verilog HDL语法。
1. 创建工程
(1)使用向导创建,找到对应的芯片...
(2)选择第一个 空项目
(3)因为目前没有写好的模块,这里直接next
(4)选择器件
(5)选择EDA仿真软件
(6)点击完成 finish
(7)新建Verilog HDL文件
(8)这时候点击另存为,放到code文件夹里面,后面写起代码来随时保存就可以了
- 逻辑模块代码 decoder.v
/*
3-8译码器
*/
module decoder(a,b,c,out); // 括号里面是端口列表 ABC三个输入 一个输出
input a; // 输入端口A
input b;
input c;
output reg [7:0]out; // 定义8位位宽的数据
// 逻辑设计
always@(a,b,c)begin // 括号里面是敏感列表 其中任意一个发生变化,就会执行里面的内容
case({a,b,c}) // 花括号 位拼接 生成一个三位的信号
3'b000:out = 8'b0000_0001; // 3表示信号的位宽 b 表示二进制 只有0 or 1,三位就对应abc的信号 在此列出所有8种情况
3'b001:out = 8'b0000_0010;
3'b010:out = 8'b0000_0100;
3'b011:out = 8'b0000_1000;
3'b100:out = 8'b0001_0000;
3'b101:out = 8'b0010_0000;
3'b110:out = 8'b0100_0000;
3'b111:out = 8'b1000_0000; //default: // 没有被完全包含的情况
endcase
end
endmodule
(9)
创建testbench,步骤同上
不过建议testbench单独建立一个和文件夹存放代码。
完成后 Ctrl+k 查看语法有无错误...
- testbench代码文件里面写入如下代码
/*
testbench
一张桌子 信号源-》模块-》输出
*/
`timescale 1ns/1ns // 时间单位/分辨率
module decoder_tb;
// 定义接口
// 激励信号
reg a;
reg b;
reg c;
// 输出信号 8位
wire [7:0] out;
// 把模块名和端口复制过来 注意,这里类似于“实例化” 其次端口也需要例化 在前面加. 在后面加小括号填入信号
decoder u1(
.a(a),
.b(b),
.c(c),
.out(out)
);
// 开启信号变化 用于仿真
initial begin
a = 0; b = 0; c = 0;
#200; // 延时200ns
a = 0; b = 0; c = 1;
#200;
a = 0; b = 1; c = 0;
#200;
a = 0; b = 1; c = 1;
#200;
a = 1; b = 0; c = 0;
#200;
a = 1; b = 0; c = 1;
#200;
a = 1; b = 1; c = 0;
#200;
a = 1; b = 1; c = 1;
#200;
$stop;
end
endmodule
(10)设置EDA准备仿真,添加
(11)下面的代码文件,最后点击OK
(12)开始(前)仿真
(13)查看仿真结果
(14)Ctrl+L 全编译
(15)
门级仿真 Gate level Simulation 。
此时考虑器件延时
-
这里就需要一些数电基础,才能理解逻辑器件实际为什么会产生门级仿真的现象。在此就不贴图了,现象是输出端会有尖峰波形,放大观察会发现输出按照格雷码变化。这种跳变在输出端电路灵敏的情况下会导致逻辑错误。怎么解决?后面讲时序逻辑电路再议。
-
注意,如果不关闭仿真界面就继续编译,会报错…
参考&致谢
小梅哥FPGA
–ti–wai–hua–
…… 最近感觉很是落魄…意义何在?…可能一个人呆的太久了……与世隔绝……