现在我们就可以根据原理使用Verilog代码实验这个功能了
module mux2( //端口列表a,b,sel,out);//交代端口类型input a;input b;input sel;output out;//赋值assign out = (sel==1)?a:b;endmodule
这里可以看出没什么问题,没有报错
首先我们需要用一张图说明仿真测试的原理/意义
现在开始编写仿真代码,我们首先要知道的是
a、b、sel 共有8组取值,分别是
a | b | sel |
---|---|---|
0 | 0 | 0 |
0 | 0 | 1 |
0 | 1 | 0 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 0 | 1 |
1 | 1 | 0 |
1 | 1 | 1 |
`timescale 1ns / 1psmodule mux2_tb(//仿真中括号里不用写端口); //定义仿真文件中的变量//输入reg a;reg b;reg sel;//输出wire out;mux2 UUT( //相当于把源文件的变量映射(例化)到仿真文件,mux2是源文件的名字,必须一致.a(a), //源文件的a 对应到 仿真文件 是 a.b(b),.sel(sel),.out(out));initial begin a=0;b=0;sel=0;#200; //延迟200nsa=0;b=0;sel=1;#200; //延迟200nsa=0;b=1;sel=0;#200; //延迟200nsa=0;b=1;sel=1;#200; //延迟200nsa=1;b=0;sel=0;#200; //延迟200nsa=1;b=0;sel=1;#200; //延迟200nsa=1;b=1;sel=0;#200; //延迟200ns a=1;b=1;sel=1;#200; //延迟200nsend
endmodule
我们可以根据左边的这些值 判断功能是否能达成
通过时序仿真我们可以看到 out的变化滞后于信号的变化,这说明out的变化是有一定延迟的,这是合理的
我们还能看到毛刺,原理是(a、b、sel都在变,只要某一次变化中,其中一个的变化优先于另外两个,就会有毛刺)
首先open设计
然后分配
选择合适的管脚(要看板子)
然后ctrl+s 保存管脚约束文件
就生成了这样的约束文件
首先连接板子到电脑
然后refresh device 再 program device
图中展示的为 sel = 1 ,a = 1的情况 (out = a = 1 灯亮)