大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
端口描述: 输入: a、b、s。 输出: c。
功能描述: 当“s”为高电平时,“c”等于“a”; 当“s”为低电平时,“c”等于“b”; Verilog代码实现:
今天给大侠带来“FPGA学习系列 altera"系列,持续更新。此学习心得是本人之前所写,所用设计软件为Quartus II 13.1,现Quartus II 新版本已更新到19+,以下仅供初学者学习参考。后续会更新其他系列,敬请关注。话不多说,上货。
在数字电路中,二选一多路选择器具备组合逻辑电路的简单性和经典性的特征,我们的第一个设计就从“它”开始。 工程名称为“mux2_1”,架构图如下:端口描述: 输入: a、b、s。 输出: c。
功能描述: 当“s”为高电平时,“c”等于“a”; 当“s”为低电平时,“c”等于“b”; Verilog代码实现:
/*模块名称: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 endendmodule
这段代码很简单,相信小伙伴们自己能理解。
如果有问题的话,可以发邮件到我的邮箱或者在“QQ交流群173560979”里面询问,我会及时回复大家。
写完了“二选一多路选择器”的代码,我们可以去检查一下代码是否有语法错误,点击:
,快捷键是:
Ctrl + K。
如果出现语法错误,我们要去修改代码并且再一次检查语法,直到不再有错误。
虽然语法错误没有了,但是逻辑是否正确呢?
这些还是不得而知的。
写上一段激励,通过modelsim来查看我们的波形是否正确。
首先新建一个verilog文件,名称为“mux2_1_tb”(在复杂设计中有很多的设计文件,并且都需要去测试。
笔者建议:
对那个模块测试,激励的名称就叫做“_tb”)。
激励的代码如下:
/*模块名称:mux2_1_tb模块功能:为mux2_1提供输入信号 作者:郝旭帅邮箱:746833924@qq.com*/`timescale 1ns/1psmodule 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. 模块开始和结束
module mux2_1_tb;endmodule
激励是不需要有端口的,所有的信号自己内部产生,然后连接到我们要测试的设计上。
3. 定义的变量
reg a;reg b;reg s;wire c;
将设计的输入定义成reg的类型(在initial模块中赋值必须是reg类型),我们在激励当中对它们赋值,然后传输到设计当中。
将设计的输出定义成wire的类型,连接到设计的输出端口,在modelsim中查看输出波形是否正确。
4.上电过程
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. 设计例化并连线
mux2_1 mux2_1_dut( .a(a), .b(b), .s(s), .c(c) );
例化方式笔者在《FPGA学习系列 altera 系列 第五篇 verilog基础语法》中有介绍。
上述就是二选一多路选择器激励的分析,如果还是有不明白的小伙伴可以发邮件到我邮箱或者加群询问。
END
制作人:郝旭帅(QQ:746833924) QQ交流群:173560979(进群备注地区+名字)大侠们,江湖偌大,继续闯荡,愿一切安好,有
缘
再见!
FPGA技术江湖广发江湖帖
无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。
FPGA技术江湖微信交流群
加群主微信,备注职业+方向+名字进群
FPGA技术江湖QQ交流群
备注地区+职业+方向+名字进群