Verilog 设计进阶
- 格式:ppt
- 大小:818.50 KB
- 文档页数:34
verilog三段式
Verilog的三段式(Three-Level Hierarchy)是一种组织和设计Verilog代码的结构方法,它将代码分成三个级别,以实现模块化和可重用性。
这些级别分别是顶层(Top-level)、中层(Intermediate-level)和底层(Low-level),每个级别都有不同的功能和目的。
1.顶层(Top-level):顶层是整个设计的最高级别,它组织和
连接所有的模块,包括顶层模块和其它外部模块。
在这个层次上,你可以定义主要的模块和其它全局信号,处理模块之间的接口和通信。
通常,顶层模块是设计的入口点,在这里实例化和连接所有的子模块。
2.中层(Intermediate-level):中层是中间级别的模块,它们被
实例化在顶层模块中使用。
这些模块可以是包含顶层模块的主要子模块,也可以是一些复杂的功能模块。
在中层模块中,你可以定义局部信号和局部逻辑,用来实现特定的功能或任务。
这些模块有助于模块化和简化设计,提高代码的可读性和可维护性。
3.底层(Low-level):底层是最低级别的模块,在中层模块中
被实例化和使用。
它们通常是具体的基础模块,实现了基本的功能和操作。
这些模块可以是逻辑门、寄存器、计数器等,也可以是包含简单组合逻辑的小模块。
底层模块通常是最基本的构建块,在设计中提供了底层的功能和细节。
按照这种三段式的组织方式,可以将设计分成几个层次,使代码模块化、结构清晰,并且方便维护和重用。
每个级别都负责不同的任务和功能,遵循了"自顶向下"的设计原则,让整个设计变得更加可靠和可管理。
用verilog 进行FPGA设计第一阶段总结2007-08-23 21:34实习期间,老师叫我们做他的大课题中的一个小部分。
这个部分主要是将A/D采集的数字信号利用一个函数进行插值恢复,以便后面的作图中使用。
要求在每两个点中间均匀插入九个点,每个点与其前后80个点有关,用verilog 语言描述,在xilinx公司的开发环境ISE下完成。
对于verilog我们没有接触过,以前的课程设计都用的是VHDL,ISE也没用过,以前用的是Maxplus2开发环境,于是我们就从网上下载了一些教程开始学习。
在熟悉了verilog的语法和ISE之后,我们开始了设计。
思路是这样的:将要处理的数据先存在一个存储器中,然后每进来一个新的数据,所有的数据向前移动一个寄存器,在主时钟十分频之后的每个上升沿读取新的数据进来,然后计算插值,然后在每个主时钟的上升沿处输出插值后的数据,这样就能实现插值的过程了。
在具体的编写程序的时候,我们先用与每个插值点前后4个点有关进行设计,设计好之后再进行扩展。
对于插值的计算我们先不考虑,将其全部设置成常量,主要考虑看能否在两个点之间插值成功,这样的程序就简单多了。
很快我们的程序就写好了,编译仿真之后能实现插值。
接下来就是主要考虑插值的计算问题了,在这个部分我们走了一些弯路。
首先是乘法问题,这个课题相当于是一个FIR滤波器,其中要进行约720次的相乘累加,我们看资料书和一些发表的论文,上面好多都考虑用分布式算法DA来实现,但是要是考虑的点多了,这种方法就不可行了,因为那个表会造的很大。
在书上,我也没有看到直接用乘号来进行乘法运算的,大部分都是进行移位相加的,为此还认真的研究了一下乘法的原理。
到最后,老师说你可以直接用乘号的,不要管那些移位什么的,这些是综合器做的事情。
其次是verilog中有符号数的计算问题。
因为是新接触,不知道怎么做。
为了实现2*(-3)=-6,搞到了半夜两点。
我记得计算机组织与结构里面有一章是关于乘法的,里面讲的是用布斯算法,看了半天,觉得在程序中这样实现太麻烦,肯定有更简单的方法。
设计练习进阶EDA俱乐部整理前言:在前面九章学习的基础上,通过本章十个阶段的练习,一定能逐步掌握Verilog HDL设计的要点。
我们可以先理解样板模块中每一条语句的作用,然后对样板模块进行综合前和综合后仿真,再独立完成每一阶段规定的练习。
当十个阶段的练习做完后,便可以开始设计一些简单的逻辑电路和系统。
很快我们就能过渡到设计相当复杂的数字逻辑系统。
当然,复杂的数字逻辑系统的设计和验证,不但需要系统结构的知识和经验的积累,还需要了解更多的语法现象和掌握高级的Verilog HDL系统任务,以及与C语言模块接口的方法(即PLI),这些已超出的本书的范围。
有兴趣的同学可以阅读Verilog语法参考资料和有关文献,自己学习,我们将在下一本书中介绍Verilog较高级的用法。
练习一.简单的组合逻辑设计目的: 掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在Verilog HDL中,描述组合逻辑时常使用assign 结构。
注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。
模块源代码://--------------- compare.v -----------------module compare(equal,a,b);input a,b;output equal;assign equal=(a==b)?1:0; //a等于b时,equal输出为1;a不等于b时,//equal输出为0。
endmodule测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。
测试模块源代码:`timescale 1ns/1ns //定义时间单位。
`include "./compare.v" //包含模块文件。
verilog语法进阶模块的结构、数据类型、变量和基本运算符号3.1.模块的结构Verilog的基本设计单元是“模块”(block)。
一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。
下面举例说明:图1 模块示例m请看上面的例子: 程序模块旁边有一个电路图的符号。
在许多方面,程序模块和电路图符号是一致的,这是因为电路图符号的引脚也就是程序模块的接口。
而程序模块描述了电路图符号所实现的逻辑功能。
以上就是设计一个简单的Verilog程序模块所需的全部内容。
从上面的例子可以看出,Verilog结构位于在module和endmodule声明语句之间,每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。
3.1.1、模块的端口定义模块的端口声明了模块的输入输出口。
其格式如下:module 模块名(口1,口2,口3,口4, ………);…….endmodule模块的端口表示的是模块的输入和输出口名,也就是它与别的模块联系端口的标识。
在模块被引用时,在引用的模块中,有些信号要输入到被引用的模块中,有的信号需要从被引用的模块中取出来。
在引用模块时其端口可以用两种方法连接:1)在引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名,举例说明如下:模块名实例化名(连接端口1信号名, 连接端口2信号名,连接端口3信号名,….,,,);2)在引用时用“.”标明原模块定义时规定的端口名,举例说明如下:模块名实例化名(.端口1名( 连接信号1名),.端口2名( 连接信号2名),….,,,);这样表示的好处在于可以用端口名与被引用模块的端口对应,不必严格按端口顺序对应,提高了程序的可读性和可移植性。
3.1.2、模块内容模块的内容包括I/O说明、内部信号声明、功能定义。
3.1.2.1、I/O说明的格式如下:输入口: input [信号位宽-1 :0] 端口名1;input [信号位宽-1 :0] 端口名2;………;input [信号位宽-1 :0] 端口名i; //(共有i个输入口)输出口: output [信号位宽-1 :0] 端口名1;output [信号位宽-1 :0] 端口名2;………;output [信号位宽-1 :0] 端口名j; //(共有j个输出口)输入/输出口:inout [信号位宽-1 :0] 端口名1;inout [信号位宽-1 :0] 端口名2;………;inout [信号位宽-1 :0] 端口名k; //(共有k个双向总线端口)I/O说明也可以写在端口声明语句里。
实验九、基于verilog的PS/2键盘设计进阶一、前言及背景:说到PS/2相信大家都不会陌生,不错的,我们日常的鼠标键盘大多是基于P S/2接口设计的。
虽然USB鼠标大有取而代之之势,但是依然阻止不了我们这群IT菜鸟掌握它的强烈欲望,而使用verilog来做PS/2的解码更是需要我们把P S/2的传输协议理解的更透彻一些。
所以,下面就让特权同学带领大家一步一步掌握PS/2。
PS/2接口标准的发展过程随着计算机工业的发展,作为计算机最常用输入设备的键盘也日新月异。
19 81年IBM推出了IBM pc/XT键盘及其接口标准。
该标准定义了83键,采用5脚DIN连接器和简单的串行协议。
实际上,第一套键盘扫描码集并没有主机到键盘的命令。
为此,1984年IBM推出了IBM AT键盘接口标准。
该标准定义了84~10 1键,采用5脚DIN连接器和双向串行通讯协议,此协议依照第二套键盘扫描码集设有8个主机到键盘的命令。
到了1987年,IBM又推出了PS/2键盘接口标准。
该标准仍旧定义了84~101键,但是采用6脚mini-DIN连接器,该连接器在封装上更小巧,仍然用双向串行通讯协议并且提供有可选择的第三套键盘扫描码集,同时支持17个主机到键盘的命令。
现在,市面上的键盘都和PS/2及AT键盘兼容,只是功能不同而已。
表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。
(是不是发现它的数据传输协议和串口很像呢!呵呵)PS/2 发送数据到PC的时序键盘接口时序:(a) 键盘发送时序(b) 键盘接收时序注:在时钟的下降沿读取数据。
以下可做具体写代码设计参考:从PS/2向PC机发送一个字节可按照下面的步骤进行:(1)检测时钟线电平,如果时钟线为低,则延时50us;(2)检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);(3)检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向PS/2设备发送数据,所以PS/2设备要转移到接收程序处接收数据);(4)延时20us(如果此时正在发送起始位,则应延时40us);(5)输出起始位(0)到数据线上。