动态显示之顶层搭建与测试
这几天我们依次分享了数码管动态显示的几个子模块。今天,我们一起来搭建个顶层、写个测试文件,实现我们最初的构想。首先根据我们的设计架构搭建顶层实体,其中包括四个端口:clk(时钟)、rst_n(复位)、sel(位选)、seg(段选)。
我们把端口声明一下;
把所包含的3个子模块例化进顶层;
最后声明一下中间连线
这样,顶层就搭建完成了。
源代码:
00 module seg_driver(clk, rst_n, sel, seg);
01
02 //端口声明
03 input clk;
04 input rst_n;
05
06 output sel;
07 output seg;
08
09 //定义中间连线
10 wire date;
11 wire clk_out;
12
13 //3个子模块例化
14
15 //分频模块
16 freq freq_inst(
17 .clk(clk),
18 .rst_n(rst_n),
19 .clk_out(clk_out)
20 );
21
22 //移位模块
23 seg_run #(.cnt_num(4)) seg_run_inst( //#(.cnt_num(4)) 仿真记得传参!!
24 .clk(clk),
25 .rst_n(rst_n),
26 .date_in(date)
27 );
28
29 //显示模块
30 seg7 seg7_inst(
31 .clk_out(clk_out),
32 .rst_n(rst_n),
33 .date(date),
34 .sel(sel),
35 .seg(seg)
36 );
37
38 endmodule
然后就是测试文件的编写了。之所以要编写测试文件,就是要给工程模拟一个输入,而由架构图可知:这个工程的端口共有四个,两个输入、两个输出。
我们要模拟输入,就是要模拟时钟clk和复位rst_n就可以了。今后遇到所有输入端口只有时钟clk和复位rst_n的工程,都可以直接调用本次的测试文件。
测试源代码:
00 `timescale1ns/1ps //时间标线“单位/精度”
01
02 module seg_driver_tb;//端口名
03
//端口声明:输入定义成reg(寄存器)型,输出定义成wire(线型)型
04 reg clk;
05 reg rst_n;
06
07 wire sel;
08 wire seg;
09
//初始赋值
10 initial
11 begin
12 clk =0; //初始时,给时钟clk一个低电平“0”
13 rst_n =0; //初始时,给复位rst_n一个低电平“0”,表示复位
14 #160 //延时160 纳秒
15 rst_n =1; //让rst_n=1,表示复位结束
16 end
17
18 always#10 clk =~clk; //时钟clk总是延时10纳秒取反一次,从而产生一个周期为20纳秒的时钟
19
//端口实例化
20 seg_driver seg_driver_inst(
21 .clk(clk),
22 .rst_n(rst_n),
23 .sel(sel),
24 .seg(seg)
25 );
26
27 endmodule
至此,数码管滚动显示字符“HELLO.”的工程我们就做完了。无论您是仿真还是下板都可以实现了。
下板的实验现象,前几天已经给大家看过了。明天的话我们来分享一下仿真波形,看一下仿真出来的波形具体是个什么样子,也可以分析分析为什么是那样。
动态显示之顶层搭建与测试
页:
[1]