zxopenljx 发表于 2020-5-3 13:44:55

动态显示之顶层搭建与测试

这几天我们依次分享了数码管动态显示的几个子模块。今天,我们一起来搭建个顶层、写个测试文件,实现我们最初的构想。

首先根据我们的设计架构搭建顶层实体,其中包括四个端口: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.”的工程我们就做完了。无论您是仿真还是下板都可以实现了。
下板的实验现象,前几天已经给大家看过了。明天的话我们来分享一下仿真波形,看一下仿真出来的波形具体是个什么样子,也可以分析分析为什么是那样。

zxopenljx 发表于 2023-8-22 16:47:22

动态显示之顶层搭建与测试
页: [1]
查看完整版本: 动态显示之顶层搭建与测试