内容:
两个输入IO,a,b可以为高/低电平
输入按键按下时,LED灯与a端口状态保持一致。
输入按键释放时,LED灯与b端口状态保持一致。
从图2可知,当按键按下时,接地,为低电平;当按键放开时,为高电平。
module led_test(a,b,key_in,led_out);
input a;//输入端口A
input b;//输入端口B
//也可写成input a.b; 这样不直观
input key_in;//输入按键key_in,实现输入通道的选择
output led_out;//led 控制输出端口
//当key_in==0时,led_out = a
//assign 连续赋值语句,设计的是组合逻辑; assign 待赋值信号
assign led_out = (key_in == 0)? a : b; //key_in==0是否满足
endmodule
仿真程序如下(在testbench文件夹下):
`timescale 1ns/1ps //数字1,撇是键盘左上角的撇 定义仿真精度 仿真步径/仿真精度
//如#100,则为100ns,如果为10ns,则为100x10ns=1000ns
module led_test_tb;//tb就是test bench文件
//激励信号定义,对应连接到待测试模块的输入端口
reg signal_a;
reg signal_b;
reg signal_c;
//待检测信号定义,对应连接到待测试模块的输出端口
wire led;
//例化待测试模块
led_test led_test0(
.a(signal_a),
.b(signal_b),
.key_in(signal_c),
.led_out(led)
);//只需要看led状态即可
//led_test led_test1(a,b,key_in,led_out); 一个模块设计好后,可多次使用
//产生激励
initial begin
signal_a = 0;signal_b = 0;signal_c = 0;
#100;//延时100ns
signal_a = 0;signal_b = 0;signal_c = 1;
#100;//延时100ns
signal_a = 0;signal_b = 1;signal_c = 0;
#100;//延时100ns
signal_a = 0;signal_b = 1;signal_c = 1;
#100;//延时100ns
signal_a = 1;signal_b = 0;signal_c = 0;
#100;//延时100ns
signal_a = 1;signal_b = 0;signal_c = 1;
#100;//延时100ns
signal_a = 1;signal_b = 1;signal_c = 0;
#100;//延时100ns
signal_a = 1;signal_b = 1;signal_c = 1;
#200;//延时100ns
$stop;//将仿真停止,如果不写,仿真会一直运行
end
endmodule
在前仿真(RTL simulation)的过程中, 仿真不存在问题,当按键按下时,即signal_c=0时,输出led与signal_a保持一致;当按键释放时,即signal_c=1时,输出led与signal_b保持一致。波形如下图所示:
点击后仿真(Gate Level Simulation)如下图:
Timing model分为慢速和快速。其中-8代表速度等级为8;1.2V代表内核电压为1.2V;85度代表运行在温度为85度的极限情况下。
后仿真后,发现有尖尖角,其中,当signal_c=0时,led应该与signal_a保持一致,但是与signal_b保持一致了,这并不是所想要的,后续需要寻找办法解决掉,在后仿真中,还可以看到有延迟现象出现,并没有前仿真那么完美,波形如图所示: