深入理解Top-Down设计原理

系统顶层架构图


模块功能介绍


模块名功能描述
Freq时钟分频模块,用来分频产生慢时钟
LED_DriverLED驱动,控制LED灯切换
Led_flow系统顶层模块,负责子模块级联

顶层模块端口介绍


端口名端口说明
Clk_sys系统50MHz时钟输入
Rst_n系统复位
Pio_ledLED驱动端口

4.1.3.4 系统内部连线介绍


连线名连线说明
Clk_slow分频得到的慢时钟信号

4.1.3.5 代码解释

LED_Driver 模块代码


/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:流水灯驱动模块 *****************************************************/ 01 module led_learn( 02 clk, //系统时钟输入 03 rst_n, //系统复位 04 pio_led//LED驱动输出 05 ); 06 //系统输入 07 input clk; //系统时钟输入 08 input rst_n; //系统复位 09 //系统输出 10 output reg [3:0]pio_led;//LED驱动输出 11 //中间寄存器定义 12 reg [1:0]state;//状态寄存器定义 13 14 //LED驱动逻辑 15 always@(posedge clk or negedge rst_n) 16 begin 17 if(!rst_n) 18 begin 19 pio_led<=4'b1111;//LED全部熄灭 20 state<=0;//寄存器赋初值 21 end 22 else begin 23 case(state) 24 0:begin 25 pio_led<=4'b0111;//第一个灯点亮 26 state<=1;//状态跳转 27 end 28 1:begin 29 pio_led<=4'b1011;//第二个灯点亮 30 state<=2;//状态跳转 31 end 32 2:begin 33 pio_led<=4'b1101;//第三个灯点亮 34 state<=3;//状态跳转 35 end 36 3:begin 37 pio_led<=4'b1110;//第四个灯点亮 38 state<=0;//状态跳转 39 end 40 default:state<=0; 41 endcase 42 end 43 end 44 endmodule

本模块代码就是我们之前做过的做基本状态机驱动模块,每来一个驱动时钟上升沿,状态发生一次跳转,LED值随之发生改变。

Freq 模块代码


/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:时钟分频模块 *****************************************************/ 01 module freq(clk,rst_n,clk_slow); 02 input clk;//系统50MHz时钟输入 03 input rst_n;//系统复位 04 05 output reg clk_slow;//慢时钟定义 06 07 reg [40:0]counter;//计数器定义 08 09 //时钟分频电路 10 always@(posedge clk or negedge rst_n) 11 begin 12 if(!rst_n) 13 begin 14 counter<=0;//计数器赋初值 15 clk_slow<=0;//慢时钟赋初值 16 end 17 else 18 begin 19 if(counter<12) 20 counter<=counter+1; 21 else 22 begin 23 counter<=0; 24 clk_slow<=~clk_slow; 25 end 26 end 27 end 28 endmodule

该模块的作用就是利用计数器实现分频:统计一定的快时钟个数,然后驱动慢时钟寄存器值发生翻转,输出慢时钟。

Led_flow模块代码


/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:流水灯顶层模块 *****************************************************/ 01 module Led_flow(clk,rst_n,pio_led); 02 input clk;//系统50MHz时钟输入 03 input rst_n;//系统复位 04 05 output [3:0]pio_led;//LED驱动输出 06 07 wire clk_slow;//慢时钟定义 08 09 freq freq( 10 .clk(clk), //系统时钟输入 11 .rst_n(rst_n),//系统复位 12 .clk_slow(clk_slow)//慢时钟输出 13 ); 14 15 led_learn led_learn( 16 .clk(clk_slow), //驱动时钟输入 17 .rst_n(rst_n), //系统复位 18 .pio_led(pio_led)//LED驱动输出 19 ); 20 21 endmodule

该模块为系统顶层模块,负责将分频模块和LED驱动模块进行组装级联。梦翼师兄强烈建议在顶层模块只做模块级联,绝对不要编写任何逻辑。

仿真代码


/**************************************************** * Engineer : 梦翼师兄 * QQ : 761664056 * The module function:流水灯测试模块 *****************************************************/ 01 `timescale 1ns/1ps //时间单位和精度定义 02 module tb; 03 04 //系统输入 05 reg clk; //系统时钟输入 06 reg rst_n; //系统复位 07 //系统输出 08 wire [3:0]pio_led;//LED驱动输出 09 10 initial 11 begin 12 clk=0; 13 rst_n=0; 14 #1000.1 rst_n=1; 15 end 16 17 always #10 clk=~clk;//50MHz时钟 18 19 Led_flow Led_flow( 20 .clk(clk), //系统时钟输入 21 .rst_n(rst_n), //系统复位 22 .pio_led(pio_led)//LED驱动输出 23 ); 24 endmodule

查看仿真波形如下

如何查看波形呢?既然逻辑是分模块的,那么我们查看波形是否正确也应该是分模块来看的,首先我们查看 freq模块,freq模块的功能就是快时钟产生慢时钟,通过波形我们可以看到clk_slow慢时钟确实产生了,说明该模块功能正确。

接下来,我们的目标是将慢时钟作为LED驱动模块的时钟源,也就是说LED驱动模块的时钟端口“clk”频率应该和clk_slow一致,查看波形可知,条件符合,说明顶层级联关系正确。

最后查看流水灯切换,应该发生在每一个驱动时钟上升沿,由波形图可知,逻辑全部正确,设计结束。

对于层次化设计,我们可以查看RTL级视图(软件操作请查看梦翼师兄视频)

可以看到,电路生成的RTL级视图和我们所设计的架构图一致,说明系统顶层连接正确。因此通常情况下,如果是进行层次化设计,设计结束以后我们应该首先查看RTL级视图是否正确,只有确保顶层连接正确的情况下我们才进行电路仿真,查看代码时序逻辑是否正确。

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空