07模块化设计之top_down
一设计功能:(一)用两个分频模块,实现16分频,且让输入a 和b在16个系统时钟内,相与一次。
|
|
(二)模块化设计思想(结构化思维)
拆分,即把一个系统划分成多个功能模块,控制模块,组合模块。然后从功能模块开始,循序渐进一个个设计好,再把所有的模块连接起来,实现系统功能。
|
二设计输入
(一)顶层模块:定义输入输出端口,实现各个模块的连接通过例化
|
//顶层模块 module top( input wire Clk, input wire Rst_n, input wire a, input wire b, output wire c ); wire p_flag;//connect po_flag0 to pi_flag0 wire flag;//connect po_flag to pi_flag //例化 div_clk2 div_clk2m0( .clk(Clk), .rst_n(Rst_n), .po_flag0(p_flag) ); div_clk1 div_clk1m0( .clk(Clk), .rst_n(Rst_n), .pi_flag0(p_flag), .po_flag(flag) ); a_and_b a_and_bm0( . clk(Clk), . rst_n(Rst_n), . pi_flag(flag), . pi_a(a), . pi_b(b), . po_c(c) ); endmodule |
(二)分频模块:两个分频模块实现16分频
|
//分频模块2实现四分频并输出一个分频标志信号 module div_clk2( input wire clk, input wire rst_n, output reg po_flag0 ); wire rst; reg [1:0] div_cnt; assign rst = ~rst_n; //div cnt always @(posedge clk)begin if(rst == 1'b1 )begin div_cnt <= 'd0; end else if (div_cnt == 'd3) begin div_cnt <= 'd0; end else div_cnt <= div_cnt + 1'b1; end //po_flag0 always @(posedge clk) begin if (rst == 1'b1 ) begin po_flag0<= 1'b0; end else if(div_cnt== 'd2)begin po_flag0 <= 1'b1; end else begin po_flag0 <= 1'b0; end end endmodule //分频模块1在分频模块2的基础上,实现16分频并输出对应的分频标志信号 module div_clk1( input wire clk, input wire rst_n, input wire pi_flag0, output reg po_flag ); wire rst; assign rst = ~rst_n; //div_cnt under the pi_flag0 reg [1:0]div_cnt; always@(posedge clk) if(rst) div_cnt<=0; else if(div_cnt==2'd3) div_cnt<=0; else if(pi_flag0) div_cnt<=div_cnt+1'b1; else div_cnt<=div_cnt; //po_flag always@(posedge clk) if(rst) po_flag<=0; else if(div_cnt==2'd3 & pi_flag0)//lack & pi_flag0 is error po_flag<=1'b1; else po_flag<=0; endmodule |
(三)相与模块
|
//相与模块,在16分频的标志信号下,相与 module a_and_b( input wire clk, input wire rst_n, input wire pi_flag, input wire pi_a, input wire pi_b, output reg po_c ); wire rst; assign rst = ~rst_n; always@(posedge clk) if(rst==1'b1) po_c<=1'b0; else if(pi_flag==1'b1) po_c<=pi_a & pi_b; else po_c<=0; endmodule |
三总结
(一)常见疑问及答案
1.在不同模块的信号,通过传输线连在一起,那这些信号会有延时嘛(即变化实际不一样)?
实际上,在不同模块的同一信号如po_flag, pi_flag,flag,他们通过flag信号连在一起,是同时变化的。
2.在什么情况下存在延时?
存在延时一个时钟的会是在时序逻辑的always里,如下面的赋值语句中
|
else if(div_cnt== 'd2)begin po_flag <= 1'b1; po_flag在仿真中,实际为高电平在分频计数值为3. else if (pi_flag == 1'b1) begin po_c <= pi_a & pi_b; end 而在相与模块里,发生相与操作是在po_flag为高后,再延迟一个时钟,故相与在分频计数值为2后,延迟了两个时钟周期, |
3.注意下面这句易出错
else if(div_cnt==2'd3 & pi_flag0)//lack & pi_flag0 is error
po_flag<=1'b1;
若缺少后面的与条件,会持续四个时钟周期,由于div_cnt每四个时钟更新。
(二)设计注意点
1.sublime列编辑:shift+鼠标右键。
2.赛灵思要求为同步复位,故开发板是异步复位,则程序设计为
wire rst;
assign rst = ~rst_n;
3.在例化,模块的接口是输入,可以连接wire或reg型变量。但模块的接口是输出,必须连接wire型。
4.基本语法准则:即always赋值的输出信号,只能为reg型。而assign赋值的输出信号,只能为wire型。
(三)仿真
|
`timescale 1ns/1ns `define clk_period 20 module top_tb(); reg clk; reg rst_n; reg a; reg b; wire c; top top_m0( .Clk(clk), .Rst_n(rst_n), .a(a), .b(b), .c(c) ); initial clk =1; always#(`clk_period/2) clk = ~clk; initial begin rst_n =0; a=0; b=0; #(`clk_period*2); rst_n =1; #(`clk_period*40); rst_n = 0; #(`clk_period*12); $stop; end always#(`clk_period*2) a = {$random}; always#(`clk_period*2) b= {$random}; endmodule //波形:
|
07模块化设计之top_down的更多相关文章
- iOS程序模块化设计
一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和 ...
- PHP--进行模块化设计
PHP--进行模块化设计 [来源] 达内 [编辑] 达内 [时间]2012-10-30 导航模块可以简单列为一个关于三级页面链接的HTML文件.通常你可以通过用另一种颜色来标明对当前区域的链 ...
- 深入浅出百度地图API开发系列(3):模块化设计
在前面两张简单介绍了百度地图API的基础知识和使用之后,我们来分析一下百度地图API的基本架构,了解一下基本架构可以帮助我们更清晰的了解API的功能和调用过程,也就可以帮助我们在实际开发中可以更方便的 ...
- AngularJs学习笔记7——四大特性之模块化设计
模块化设计 1.引用自定义模块并调用 自定义模块中,如果有一些服务.封装好笑模块,在另外一个模块中(声明的时候,在依赖列表中加入要引入的模块) var app02 = angular.module(' ...
- C51的模块化设计方法
一个大的单片机程序往往包含很多模块,我是这样组织的: 1.每一个C源文件都要建立一个与之名字一样的H文件(头文件),里面仅仅包括该C文件的函数的声明,其他的什么也不会有,比如变量的定义啊等等不应该有. ...
- thinkphp学习笔记5—模块化设计
原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...
- App 组件化/模块化之路——使用SDK的思路进行模块化设计接口
在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...
- 基于layui的框架模版,采用模块化设计,接口分离,组件化思想
代码地址如下:http://www.demodashi.com/demo/13362.html 1. 准备工作 编辑器vscode,需要安装liveServer插件在前端开启静态服务器 或者使用hbu ...
- Swift之xib模块化设计
一.解决问题 Xib/Storybarod可以方便.可视化的设置约束,在开发中也越来越重要.由于Xib不能组件化,使得封装.重用都变得不可行.本文将介绍一种解决方案,来实现Xib组件化. 二.模型块原 ...
随机推荐
- 《PHP程序员面试笔试宝典》——如何处理与面试官持不同观点这个问题?
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 在面试的过程中,求职者所持有的观点不可能与面试官一模一样,在对某个问题的看法上,很有可能两个人相去甚远.当与面试官持不同 ...
- 天啦,从Mongo到ClickHouse我到底经历了什么?
前言: 在实现前端监控系统的最初,使用了 Mongo 作为日志数据存储库.文档型存储,在日志字段扩展和收缩上都能非常方便.天生的 JSON 格式和 NodeJs 配合也非常贴合.就这样度过了几个月的蜜 ...
- JVM学习——类加载机制(学习过程)
JVM--类加载机制 2020年02月07日14:49:19-开始学习JVM(Class Loader) 类加载机制 类加载器深入解析与阶段分解 在Java代码中,类型的加载.连接与初始化过程中都是在 ...
- k8s-cka考试题库
本次测试的所有问题都必须在指定的cluster配置环境中完成.为尽量减少切换,系统已对问题进行分组,同一cluster内的所有问题将连续显示. 开启TAB补全 做题前先配置k8s自动补齐功能,否则无法 ...
- jenkins pipeline构建项目
以前用的jenkins自由风格发布代码.界面丑陋,出现问题位置不够清晰.今天改进一下流程使用jenkins pipeline构建项目. 学习使我快乐 步骤一.安装pipeline插件 点击系统管理-& ...
- [LeetCode]LCP 06. 拿硬币
桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释:第一堆力扣 ...
- [c语言]运算符的优先级与结合性
c语言中运算符的优先级和结合性常常被人混淆一谈,本文目的在于简单谈谈两者的区别.本文举几个简单的例子说明,这些运算符也特别常用. 首先要明白的是:优先级决定表达式中各种不同的运算符起作用的优先次序:而 ...
- 可视化里程碑:可拖拽使用的可视化BI工具
在数据量越来越大的今天,如何利用好数据,更好的为人类社会服务,成为人们所关心的话题,而其中数据可视化作为最后一个环节,也是人们最为直观的感受,自然而然备受重视.同质化的应用越来越多,应用开发者也开始在 ...
- C语言中puts()和printf()区别
puts的功能更加单一,只能输出字符串:printf的功能更加广,可以格式化数据,输出多种类型的数据. puts()函数用来向标准输出设备(屏幕)写字符串并换行. 调用方式为puts(string): ...
- Java笔记——循环语句
Java笔记--循环语句 1. while语句 规律: 1. 首先计算表达式的值. 2. 若表达式为真,则执行循环语法,直至表达式为假,循环结束. while(表达式) 语句; 例如: i ...

