大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
今天给大侠带来“FPGA学习系列 altera"系列,持续更新。此学习心得是本人之前所写,所用设计软件为Quartus II 13.1,现Quartus II 新版本已更新到19 ,以下仅供初学者学习参考。后续会更新其他系列,敬请关注。话不多说,上货。
在数字电路中,二选一多路选择器具备组合逻辑电路的简单性和经典性的特征,我们的第一个设计就从“它”开始。
工程名称为“mux2_1”,架构图如下:
端口描述:
输入:a、b、s。
输出:c。
功能描述:
当“s”为高电平时,“c”等于“a”;当“s”为低电平时,“c”等于“b”;
Verilog代码实现:
代码语言:javascript复制/*
模块名称:mux2_1
模块功能:当“s”为高电平时,“c”等于“a”;当“s”为低电平时,“c”等于“b”;
作者:郝旭帅
邮箱:746833924@qq.com
*/
module mux2_1 (a, b, s, c);
input a;
input b;
input s;
output reg c;
always @ (*)
begin
if (s)
begin
c = a;
end
else
begin
c = b;
end
end
endmodule
这段代码很简单,相信小伙伴们自己能理解。如果有问题的话,可以发邮件到我的邮箱或者在“QQ交流群173560979”里面询问,我会及时回复大家。
写完了“二选一多路选择器”的代码,我们可以去检查一下代码是否有语法错误,点击:,快捷键是:Ctrl K。
如果出现语法错误,我们要去修改代码并且再一次检查语法,直到不再有错误。虽然语法错误没有了,但是逻辑是否正确呢?这些还是不得而知的。写上一段激励,通过modelsim来查看我们的波形是否正确。
首先新建一个verilog文件,名称为“mux2_1_tb”(在复杂设计中有很多的设计文件,并且都需要去测试。笔者建议:对那个模块测试,激励的名称就叫做“<测试模块名称>_tb”)。
激励的代码如下:
代码语言:javascript复制/*
模块名称:mux2_1_tb
模块功能:为mux2_1提供输入信号
作者:郝旭帅
邮箱:746833924@qq.com
*/
`timescale 1ns/1ps
module mux2_1_tb;
reg a;
reg b;
reg s;
wire c;
initial begin
a = 1'b0;
b = 1'b1;
s = 1'b0;
# 50
a = 1'b0;
b = 1'b1;
s = 1'b1;
# 50
a = 1'b1;
b = 1'b0;
s = 1'b0;
# 50
a = 1'b1;
b = 1'b0;
s = 1'b1;
# 50
$stop;
end
mux2_1 mux2_1_dut(
.a(a),
.b(b),
.s(s),
.c(c)
);
endmodule
上述代码就是mux2_1的测试代码,大家写完之后也要去检测代码是否有语法错误。下面笔者来一一解释激励中的各个语句都是什么意思:
1. 时标:`timescale 1ns/1ps
1) 前面的”`”是Esc键下面的键(和波浪线为同一键)。
2) “/”前面的1ns 为时间单位。
3) “/”后面的1ps为时间精度。
深入理解时标的意义:在激励中,有很多的 “# xx“,代表的意思是:延时xx ns。那么时间精度是什么呢?这个我们可以看看自己的存款余额,例如:100.21元。单位是:元,精度是:0.01元(也可以理解为:分)。对比一下,是不是一下子就理解了呢。但是,要注意,精度不能比单位大。
2. 模块开始和结束
代码语言:javascript复制module mux2_1_tb;
endmodule
激励是不需要有端口的,所有的信号自己内部产生,然后连接到我们要测试的设计上。
3. 定义的变量
代码语言:javascript复制reg a;
reg b;
reg s;
wire c;
将设计的输入定义成reg的类型(在initial模块中赋值必须是reg类型),我们在激励当中对它们赋值,然后传输到设计当中。
将设计的输出定义成wire的类型,连接到设计的输出端口,在modelsim中查看输出波形是否正确。
4.上电过程
代码语言:javascript复制initial begin
a = 1'b0;
b = 1'b1;
s = 1'b0;
# 50
a = 1'b0;
b = 1'b1;
s = 1'b1;
# 50
a = 1'b1;
b = 1'b0;
s = 1'b0;
# 50
a = 1'b1;
b = 1'b0;
s = 1'b1;
# 50
$stop;
end
initial 模块是顺序执行的。我们通过延时将输入在不同的时间段赋不同的值。”1’b1”:前面的“1“代表1bit,”‘b“代表用二进制表示(这个” ’“是单引号,一定要和`tiemscale的”`“区分开),后面的”1“代表高电平。$stop 是仿真的停止命令,具体的意思:当运行这个地方的时候,仿真自动停止(如果有不明白的小伙伴,可以查看后续章节)。
5. 设计例化并连线
代码语言:javascript复制mux2_1 mux2_1_dut(
.a(a),
.b(b),
.s(s),
.c(c)
);
例化方式笔者在《FPGA学习系列 altera 系列 第五篇 verilog基础语法》中有介绍。
上述就是二选一多路选择器激励的分析,如果还是有不明白的小伙伴可以发邮件到我邮箱或者加群询问。
END
制作人:郝旭帅