练习十. 通过模块之间的调用实现自顶向下的设计目的:学习状态机的嵌套使用实现层次化、结构化设计。
现代硬件系统的设计过程与软件系统的开发相似,设计一个大规模的集成电路的往往由模块多层次的引用和组合构成。层次化、结构化的设计过程,能使复杂的系统容易控制和调试。 在Verilog HDL中,上层模块引用下层模块与C语言中程序调用有些类似,被引用的子模块在综合时作为其父模块的一部分被综合,形成相应的电路结构。在进行模块实例引用时,必须注意的是模块之间对应的端口,即子模块的端口与父模块的内部信号必须明确无误地一一对应,否则容易产生意想不到的后果。
下面给出的例子是设计中遇到的一个实例,其功能是将并行数据转化为串行数据送交外部电路编码,并将解码后得到的串行数据转化为并行数据交由CPU处理。显而易见,这实际上是两个独立的逻辑功能,分别设计为独立的模块,然后再合并为一个模块显得目的明确、层次清晰。
// ---------------- p_to_s.v ---------------------------------
module p_to_s(D_in,T0,data,SEND,ESC,ADD_100);
output D_in,T0; // D_in是串行输出,T0是移位时钟并给
// CPU中断,以确定何时给出下个数据。
input [7:0] data; //并行输入的数据。
input SEND,ESC,ADD_100; //SEND、ESC共同决定是否进行并到串
//的数据转化。ADD_100决定何时置数。
wire D_in,T0;
reg [7:0] DATA_Q,DATA_Q_buf;
assign T0 = ! (SEND & ESC); //形成移位时钟。.
assign D_in = DATA_Q[7]; //给出串行数据。
always @(posedge T0 or negedge ADD_100) //ADD_100下沿置数,T0上沿移位。
begin
if(!ADD_100)
DATA_Q = data;
else
begin
DATA_Q_buf = DATA_Q<<1; //DATA_Q_buf作为中介,以令综合器
DATA_Q = DATA_Q_buf; //能辨明。
end
end
endmodule
在p_to_s.v中,由于移位运算虽然可综合,但是不是简单的RTL级描述,直接用DATA_Q<=DATA_Q<<1的写法在综合时会令综合器产生误解。另外,在该设计中,由于时钟T0的频率较低,所以没有象以往那样采用低电平置数,而是采用ADD_100的下降沿置数。
//--------------------- s_to_p.v ---------------------------
module s_to_p(T1, data, D_out,DSC,TAKE,ADD_101);
output T1; //给CPU中断,以确定CPU何时取转化
//得到的并行数据。
output [7:0] data;
input D_out, DSC, TAKE, ADD_101; //D_out提供输入串行数据。DSC、TAKE
//共同决定何时取数。
wire [7:0] data;
wire T1,clk2;
reg [7:0] data_latch, data_latch_buf;
assign clk2 = DSC & TAKE ; //提供移位时钟。
assign T1 = !clk2;
assign data = (!ADD_101) ? data_latch : 8'bz;
always@(posedge clk2)
begin
data_latch_buf = data_latch << 1; //data_latch_buf作缓冲
data_latch = data_latch_buf; //,以令综合器能辩明。
data_latch[0] = D_out;
end
endmodule
将上面的两个模块合并起来的sys.v的源代码:
//------------------- sys.v ---------------------------
`include "./p_to_s.v"
`include "./s_to_p.v"
module sys(D_in,T0,T1, data, D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101);
input D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101;
inout [7:0] data;
output D_in,T0,T1;
p_to_s p_to_s(.D_in(D_in),.T0(T0),.data(data),
.SEND(SEND),.ESC(ESC),.ADD_100(ADD_100));
s_to_p s_to_p(.T1(T1),.data(data),.D_out(D_out),
.DSC(DSC),.TAKE(TAKE),.ADD_101(ADD_101));
endmodule
测试模块源代码:
//-------------Top test file for sys.v ------------------
`timescale 1ns/100ps
`include "./sys.v"
module Top;
reg D_out,SEND,ESC,DSC,TAKE,ADD_100,ADD_101;
reg[7:0] data_buf;
wire [7:0] data;
wire clk2;
assign data = (ADD_101) ? data_buf : 8'bz;
//data在sys中是inout型变量,ADD_101
//控制data是作为输入还是进行输出。
assign clk2 =DSC && TAKE;
initial
begin
SEND = 0;
ESC = 0;
DSC = 1;
TAKE = 1;
ADD_100 = 1;
ADD_101 = 1;
end
initial
begin
data_buf = 8'b10000001;
#90 ADD_100 = 0;
#100 ADD_100 = 1;
end
always
begin
#50;
SEND = ~SEND;
ESC = ~ESC;
end
initial
begin
#1500 ;
SEND = 0;
ESC = 0;
DSC = 1;
TAKE = 1;
ADD_100 = 1;
ADD_101 = 1;
D_out = 0;
#1150 ADD_101 = 0;
#100 ADD_101 =1;
#100 $stop;
end
always
begin
#50 ;
DSC = ~DSC;
TAKE = ~TAKE;
end
always @(negedge clk2) D_out = ~D_out;
sys sys(.D_in(D_in),.T0(T0),.T1(T1),.data(data),.D_out(D_out),
.ADD_101(ADD_101), .SEND(SEND),.ESC(ESC),.DSC(DSC),
.TAKE(TAKE),.ADD_100(ADD_100));
endmodule
仿真波形:[[wysiwyg_imageupload:255:]]
练习:设计一个序列发生器。要求根据输入的8位并行数据输出串行数据,如果输入数据在0—127之间则输出一位0,如果输入数据在128—255之间则输出一位1,同步时钟触发;并且和范例8的序列检测器搭接,形成一个封闭系统。编写测试模块,并给出仿真波形。
通过模块之间的调用实现自顶向下的设计
- 模块(45781)
- 状态机(26929)
相关推荐
Linux系统调用的具体实现原理
文我将基于 ARM 体系结构角度,从 Linux 应用层例子到内核系统调用函数的整个过程来梳理一遍,讲清楚linux系统调用实现原理,这里我们以open系统调用为例来讲解。
2023-09-05 17:16:46492
Linux内核中系统调用详解
Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。
2023-08-23 10:37:22171
干货分享 | TSMaster标定模块自动化控制应用指南
、标定自动化控制场景与TSMaster实例2.1C脚本实现控制标定模块的启动与关闭的设计2.2C脚本代码实现2.3测试与验证C脚本的标定功能三、通过python调用
2023-06-21 17:45:40260
Linux系统调用的实现与应用
在计算机科学中,系统调用(System Call)是一种操作系统提供的服务,它允许应用程序通过软件中断的方式访问操作系统内核中的函数。这些函数提供了一系列与硬件相关的服务,例如文件系统访问、进程管理、网络通信等。应用程序通过系统调用接口来调用这些函数,以便实现各种功能。
2023-06-14 11:46:37209
Linux内核模块间通讯方法
Linux内核模块间通讯方法非常的多,最便捷的方法莫过于函数或变量符号导出,然后直接调用。默认情况下,模块与模块之间、模块与内核之间的全局变量是相互独立的,只有通过`EXPORT_SYMBOL`将模块导出才能对其他模块或内核可见。
2023-06-07 16:23:11762
自顶向下的语法分析器—采用递归下降方法
在之前已经通过手写的方式实现了一个词法分析器,现在,我将利用之前手写的词法分析器,使用递归下降的方式,实现一个简单的语法分析器。
2023-05-23 11:24:021044
eda自顶向下的设计方法 eda自顶向下设计优点
EDA(Electronic Design Automation,电子设计自动化)自顶向下的设计方法是一种常见的电子电路设计方法。该方法将电路设计分为多个模块,从系统级别出发,逐步分解成较低层次的模块,直到达到设计细节的层次,最终将每个模块进行详细的设计。
2023-04-10 16:49:221381
计算机网络:自顶向下
本文档包含Jim Kurose和Keith Ross编写的《计算机网络:自顶向下方法(第7版)》复习题和问题的参考答案。这些答案只对指导老师有效。请不要复制或者分发给其他人(即使是其他指导老师)。请
2023-03-13 14:23:081
模块化程序设计案例DCIM-3
在设计较复杂的程序时,一般采用自顶向下的方法,将问题划分为几个部分,各个部分再进行细化,直到分解为较好解决问题为止。利用函数,不仅可以实现程序的模块化,使得程序设计更加简单和直观,而且还可以把程序中经常用到的一些计算或操作编写成通用函数,以供随时调用。
2023-02-21 16:23:06565
Linux中的系统调用是怎样实现
系统调用和普通的函数调用没有本质区别,普通的函数调用一般调用的是我们自己编写的函数或者其它库函数,而系统调用调用的则是内核中的函数,更学术一点的说法是这样的,所谓系统调用是指用户态程序请求操作系统提供的服务。
2023-02-15 11:40:52665
变电站屏顶小母线的线连接器与监控模块设计方案
变电站保护屏在屏顶有多路小母线,用于实现各个屏之间的电气转接和连接。有了小母线,继电保护屏和测控屏的交流和直流电源各个屏之间得以共享小母线,降低了各个屏之间敷设的二次电缆数量,简化了二次回路。
2023-02-02 10:46:37711
基于FPGA的实时图像边缘检测系统设计(附代码)
在本系统设计过程中,我以自顶向下的层次化设计思想为主进行系统的顶层架构设计,明确各模块的功能以及各模块之间的握手关系,之后分模块编写代码并加以验证,调试代码使得各模块功能得以实现,最后基于顶层模块
2022-11-03 10:42:14713
CanTrcv_SetOpMode被哪个模块调用?在什么场景下调用?
CanTrcv模块在上电后的初始状态配置,一般配置初始状态为SLEEP状态。而后,CanTrcv模块的状态通过其他模块调用CanTrcv_SetOpMode来切换。
2022-10-31 10:58:091350
汇编语言模块调用C++函数实例
现在编写一个简单的应用程序,提示用户输入整数,通过移位的方式将其与 2 的幕 (2¹〜2ⁿ) 相乘,并用填充前导空格的形式再次显示每个乘积。输入-输出使用 C++。汇编模块将调用 3 个 C++ 编写的函数。程序将由 C++ 模块启动。
2022-10-11 09:52:20550
基于全局特征的自顶向下分类的混合锚系统
车道检测是自动驾驶和高级驾驶辅助系统(ADAS)的基本组成部分,用于识别和定位道路上的车道标记。虽然深度学习模型已经取得了巨大的成功,但仍有一些重要和具有挑战性的问题有待解决。
2022-10-09 15:16:362305
基于自顶向下威廉希尔官方网站 的工程机械Digital Prototyping设计方法及应用
阅卷系统;3.实施操作考试,收集考试文档,用自行编写的计算机自动阅卷系统进行评分并改进这个系统;4.通过团体合作和积累,进一步开发智能组卷、防作弊、学习情况分析等…【关键词】:职业教育;;操作考试
2010-04-24 09:20:41
Linux内核系统调用概述及实现原理
本文介绍了系统调用的一些实现细节。首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系。然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入
2022-05-14 14:11:461666
汇顶科技首款NFC芯片通过权威NFC Forum认证
近日,汇顶科技首款NFC(近场通信)芯片正式通过业界最为权威的NFC Forum认证,标志着该产品的互操作性和射频性能已达到商用标准,拉开汇顶科技进军NFC应用市场的序幕。
2022-04-28 10:44:3812827
系统调用具体是如何实现的
系统调用就是调用操作系统提供的一系列内核功能函数,因为内核总是对用户程序持不信任的态度,一些核心功能不能直接交由用户程序来实现执行。用户程序只能发出请求,然后内核调用相应的内核函数来帮着处理,将结果
2021-09-29 11:10:562902
探讨VHDL和Verilog模块互相调用的问题
再 VHDL的模块就是通过声明一个元件(component)来调用这个Verilog模块,将元件声明提出来讲,如下图: 对比这个Veril
2021-04-30 14:06:047675
基于FPGA的简易电子琴的实现
本系统是采用EDA威廉希尔官方网站
设计的一个简易的八音符电子琴,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,它可以通过按键输入来控制音响。多功能电子琴的设计是在原有普通电子琴的基础上
2021-04-28 11:16:0841
系统调用是如何实现的?
这张图画了挺久的,主要是想让大家可以从全局角度,看下linux内核中系统调用的实现。 在讲具体的细节之前,我们先根据上图,从整体上看一下系统调用的实现。 系统调用的实现基础,其实就是两条汇编指令
2021-02-20 16:46:453285
使用VHDL语言和FPGA设计一个多功能数字钟的论文免费下载
本设计采用EDA威廉希尔官方网站
,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在QUARTUSII工具软件环境下, 采用自顶向下的设计方法, 由各个基本模块共同构建了一个基于FPGA的数字钟。
2020-08-28 09:36:0018
如何使用FPGA实现八位RISC CPU的设计
从CPU的总体结构到局部功能的实现采用了自顶向下的设计方法和模块化的设计思想, 利用Xilinx 公司的Spartan II 系列FPGA, 设计实现了八位CPU软核。在FPGA 内部不仅实现了
2020-08-19 17:43:195
基于FPGA器件实现UART适应自顶向下的设计
UART(通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。专用的UART集成电路如8250,8251,NS16450等已经相当复杂,有些含有许多辅助的模块(如
2020-08-04 17:25:00646
使用FPGA实现CPU设计的毕业论文总结
从CPU的总体结构到局部功能的实现采用了自顶向下的设计方法和模块化的设计思想,利用Xilinx 公司的Spartan II 系列FPGA,设计实现了八位CPU软核。在FPGA内部不仅实现了CPU必需
2020-08-03 17:58:5613
Linux的系统调用是什么
所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口获得操作系统内核提供的服务。例如,用户可以通过进程控制相关的系统调用来创建进程、实现进程之间的通信等。
2020-06-11 09:33:031935
EDA设计一般采用自顶向下的模块化设计方法
三方面的电子设计工作,即集成电路设计、电子电路设计以及PCB设计。总之,EDA威廉希尔官方网站
的基本特征是采用具有系统仿真和综合能力的高级语言描述。它一般采用自顶向下的模块化设计方法。但是由于所设计的数字系统的规模大小不一,且系统内部逻辑关系复杂,如何划分逻辑功能模块便成为设计数字系统的最重要的任务。
2020-01-21 16:50:008081
.NET应用程序可以直接调用WebAssembly模块了
WebAssembly Runtime现已添加.NET Core API,开发者可直接在.NET应用程序中调用WebAssembly模块。
2019-12-10 11:35:382057
S71200 CPU通过ETHERNET与S7300 PN口之间TCP通信的方式
S7-1200与S7-300PN口之间的以太网通信可以通过TCP协议来实现,使用的通信指令是在双方CPU 调用T-block(TSEND_C,TRCVC,TCON,TDISCON,TSEND,TRCV)指令来实现。
2019-12-02 08:00:004
实现原理图模块化调用原理图的具体步骤
我们如何原理图模块实现模块化调用原理图,原理图实现多通道的设计从而一次性影响到我们的 PCB 多通道,这样比我们使用片段调用,拷贝 room 还有更加方便和便捷。
2019-09-02 16:47:069991
你知道Linux系统调用的原理
系统调用是应用程序与操作系统内核之间的接口,它决定了程序如何与内核打交道的。无论程序是直接进行系统调用,还是通过运行库,最终还是会到达系统调用这个层面上
2019-05-16 16:21:311214
小梅哥和你一起深入学习FPGA之数码钟(下)
的内部结构这里小梅哥不做过多介绍,详细请参看代码。 五、 代码组织方式 本实验主要学习由顶向下的设计流程,代码均为常见风格,这里不多做介绍。希望读者能够通过代码架构,学习领会这种自顶向下的设计结构的优势。 六、 关键代码解读 本设计中,顶层模块
2018-09-26 07:59:02168
基于linux系统实现的vivado调用VCS仿真教程
VCS-MX的版本,可以混合编译Verilog和VHDL语言 由于在linux系统中个人用户各种权限被限制,导致很多地方无法正常使用软件之间的协调工作。 为了以防万一,在此以个人用户去实现vivado调用VCS仿真。
2018-07-05 03:30:0010449
通过无线通信收发模块实现单片机之间通信的解决方案
与有线数据传输相比,无线数据传输以成本低廉、适应性好、扩展性好、组网简单方便、设备维护简单等特点在工业生产、抄表系统、离散环境下的监控系统、点菜系统等众多领域得到广泛的运用。下面通过无线通信收发模块D21DL来实现两个单片机之间的通信。
2018-02-28 09:01:048520
自顶向下和逐步求精
分治法是计算机科学中很重要的一种思想。英文为Divide and Conquer,直译即为分治,或者分而治之。直观的理解就是将一个大而难的问题分解为一些小而易的问题,先解决这些易于解决的小问题,再合并这些小问题的解(合并可以是分别求出小问题的解再合并,或者是直接将相同的小问题合并只求解一次),从而得到大问题的解。
2017-11-25 12:52:462288
基于FPGA的数字下变频器的设计与实现
设计和实现了基于FPGA的可编程数字下变频器(DDC),用于宽带数字中频软件无线电接收机中,主要完成了数字下变频、数据抽取等功能。采用自顶向下的模块化设计方法,将整个下变频器划分为基本单元,实现这些
2017-11-22 09:09:565484
LED显示模块工作原理及基于FPGA的LED显示控制系统的设计
的霓虹灯和部分传统光源必将逐步被具有节能、环保、寿命长、可靠性高及可实现全彩变化的LED 光源所取代。本:设计使用FPGA威廉希尔官方网站
实现对LED 显示系统的控制,采用自顶向下的设计方法,用模块调用实现任意字符和图案的动态[1,2]显示。
2017-11-07 16:08:567
一种新型的LCD驱动电路IP核的总体设计
本文介绍了LCD的通用驱动电路IP核设计,采用自顶向下的设计方法将其划分为几个主要模块,分别介绍各个模块的功能,用VHDL语言对其进行描述,用FPGA实现并通过了仿真验证。该IP核具有良好的移植性,可驱动不同规模的LCD电路。
2014-05-13 10:09:351833
基于FPGA的MSK调制器设计与实现
介绍了MSK信号的优点,并分析了其实现原理,提出一种MSK高性能数字调制器的FPGA实现方案;采用自顶向下的设计思想,将系统分成串/并变换器、差分编码器、数控振荡器、移相器、乘
2012-04-12 14:40:4065
调用DLL实现LabVIEW数据采集
介绍了在LabVIEW 中调用外部程序代码的方法。详细探讨了DLL 文件的调用方法,并通过实例介绍了基于非NI 公司的数据采集卡的数据采集的实现.
2012-03-26 15:30:05152
Wishbone总线实现UART IP核设计
该设计采用了自顶向下的模块化划分和有限状态机相结合的方法,由于其应用了标准的Wishbone总线接口,从而使微机系统与串行设备之间的通信更加灵活方便。验证结果表明,这种新的架构
2011-10-19 15:01:5427
FPGA设计与应用培训课件
FPGA的常用设计方法包括自顶向下和自下而上,目前大规模FPGA设计一般选择自顶向下的设计方法。 所谓自顶向下设计方法, 简单地说,就是采用可完全独立于芯片厂商及其产品结构的描述语
2011-09-06 15:08:50361
FPGA实现OFDM调制器设计
提出一种 OFDM 高性能数字调制器的FPGA实现方案;采用自顶向下的设计思想,将系统分成FIR滤波器、数控振荡器、移相器、乘法电路和加法电路等5大模块,重点论述了FIR滤波器、数控振
2011-08-15 11:15:5362
ARM linux系统调用的实现原理
大家都知道linux的应用程序要想访问内核必须使用系统调用从而实现从usr模式转到svc模式。下面咱们看看它的实现过程。
2011-05-30 11:24:362108
用VHDL设计有限状态机的方法
现代数字系统的设计一般都采用自顶向下的模块化设计方法。即从整个系统的功能出发,将系统分割成若干功能模块。在自顶向下划分的过程中,最重要的是将系统或子系统按计算机组
2011-05-28 13:44:598976
一种利用FPGA的CPU设计
基于现场可编程(FPGA)威廉希尔官方网站
和硬件描述语言VHDL的设计和综合,通过自顶向下的设计方法和模块化设计思想,在Quartus II环境下能定制、仿真、下载验证和实现CPU功能。通过VHDL语言定制了运算器ALU模块和调用宏模块定制了RAM模块,介绍了基于FPGA的CPU设计方法,
2011-03-15 17:39:19177
VLIW处理器的设计与实现
VLIW处理器的设计与实现 摘要! 介绍了基于FPGA 实现VLIW微处理器的基本方法# 对VLIW微处理器具体划分为C 个 主要功能模块$ 依据FPGA的设计思想#采用自顶向下和文本与原理图相结合的流水线方式的设计方 法# 进行VLIW微处理器的5 个模块功能设计# 从而最终实现
2011-01-25 19:05:1121
基于FPGA的MDIO接口逻辑设计
本文介绍了一种基于FPGA 的用自定义串口命令的方式实现MDIO 接口逻辑设计的方法,并对系统结构进行了模块化分解以适应自顶向下的设计方法。所有功能的实现全部采用VHDL 进行描
2009-12-26 16:48:44103
虚拟仪器调用MessageBox函数的实现
虚拟仪器软件设计中以图形化语言LABVIEW为主,但在遇到LABVIEW不易实现的功能时,可通过在LABVIEW中调用其他函数来实现。本文介绍了在LABVIEW中调用Win32 APIMessageBox的方法和配置CLF
2009-09-14 15:07:3623
基于FPGA的UART控制器的设计和实现
文章介绍了一种在现场可编程门阵列(FPGA)上实现UART 的方法。UART 的波特率可设置调整,工作状态可读取。系统结构进行了模块化分解,使之适应自顶向下(Top-Down)的设计
2009-08-21 11:35:0352
基于FPGA的UART电路设计与仿真
文章介绍了一种采基于FPGA 实现UART电路的方法,并对系统结构进行了模块化分解以适应自顶向下的设计方法。采用有限状态机对接收器模块和发送器模块进行了设计,所有功能的
2009-08-15 09:27:5546
ASM51无参数化调用C51函数的实现
【摘 要】利用汇编模块对C51模块进行“无参数”式调用,从根本上避开了传统汇编模块和C51模块之间调用时的繁琐接口编程问题,本文以实例验证了该方法的优越性和有效性。
2009-05-18 22:01:001104
应用CPLD 实现交通控制系统芯片设计
介绍可编程逻辑器件的结构和开发软件MAX+PLUSII 主要特点,以交通控制系统电路芯片设计为例, 叙述自顶向下的设计方法。
2009-05-14 14:46:4823
应用CPLD实现交通控制系统芯片设计
介绍可编程逻辑器件的结构和开发软件MAX+PLUSII 主要特点,以交通控制系统电路芯片设计为例, 叙述自顶向下的设计方法。
2009-04-16 14:14:4226
评论
查看更多