Verilog模块语法
1、Verilog的基本设计单元是模块(block)。一个模块是有两部分组成的 ,一部分描述接口,另一部分描述逻辑功能,及定义输入时如何影响输出的。下图为模块结构的组成。
模块特点
Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间。每个模块实现特定的功能。模块可以进行层次嵌套。
每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。
Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。
除了endmodule语句外,每个语句和数据定义的最后必须有分号。
可以用/…../和//…….对Verilog HDL程序的任何部分作注释。一个好的,有使
用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。
模块的结构
module <模块名> (<端口列表>)
<I/O说明>
<内部信号声明>
<功能定义>
endmodule
模块的端口定义:
模块的端口声明了模块的输入输出口。格式:
module 模块名(口1,口2,口3,口4,......)
- 1
模块的内容:
I/O说明
输入口(input 端口名1,端口名2,……端口名n)
输出口(output 端口名1,端口名2,……端口名n)
I/O\说明也可以卸载端口声明语句中: module module_name(input port1,input port2,…output port1,output port2…)
内部信号说明
在模块内用到的和与端口有关的wire和reg变量的声明,比如:reg[width-1:0] R1,R2…; wire[width-1:0] W1,W2…
功能定义
模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑:
用“assign”声明语句
“assign”,后面再加一个方程式即可
assign a = b & c;//两个输入的与门
“assign”语句是描述组合逻辑最常用的方法之一
用实例元件
and and_inst( q, a, b );
采用实例元件的方法象在电路图输入方式下,调入库元件一样。键入元件的名字和相连的引脚即可,
表示在设计中用到一个跟与门(and)一样的名为and_inst的与门,其输入端为a, b,输出为q。要求
每个实例元件的名字必须是唯一的,以避免与其他调用与门(and) 的实例混
模块(module)是Verilog 的基本描述单位,用于描述某个设计的功能或结构及与其他模块通信的外部端口。
模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计数器、ALU、CPU)等,因此,一个模块可在另一个模块中调用。
一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次设计,模块设计可采用多种建模方式。
过程块
- always过程块
模板:
always @(<敏感信号表达式>)
begin//过程赋值//if语句 //case语句//while、repeat、for语句//task、function调用
end
当敏感信号表达式的值改变时候,就执行一遍块内语句。同时always过程块是不能够嵌套使用的。
关键字posedge
与negedge
关键字分别是上升沿以及下降沿
例如:同步时序电路的时钟信号为clk,clear为异步清零信号。敏感信号可写为:
//上升沿触发,高电平清0有效
always @(posedge clk or posedge clear)//上升沿触发,低电平清0有效
always @(posedge clk or negedge clear)
例如当negedge clear
表示当clear==0
时
always @(posedge clk or negedge clear)beginif(!clear)//当clear==0时候,always会由事件驱动qout=0;elseqout=in;end
- initial过程块
initial模板:
initial
begin语句1;语句2;......
end
对变量和存贮器初始化
initial
beginreg1=0;for(addr=0;addr<size;addr=addr+1)memory[addr]=0;
end
initial语句主要面向功能模拟,通常不具有可综合性。
模拟0时刻开始执行,只执行一次
同一模块内的多个initial过程块,模拟0时刻开始并行执行。
initial与always语句一样,是不能嵌套使用的。即在initial语句中不能再次嵌套initial语句块。
连续赋值
用连续赋值语句表达的是: assign val=newval;
任何一个输入的改变都将立即导致输出更新;
module orand(out,a,b,c,d,e);input a,b,c,d,e;output out;assign out=3&(a|b)&(c|d);
endmodule
过程赋值语句
过程赋值语句常用于对reg变量进行赋值。一般分为两种,阻塞赋值与非阻塞赋值
阻塞与非阻塞赋值
赋值的类型选择取决于建模的逻辑类型。
在时序块的RTL代码中使用非阻塞赋值
<=
。非阻塞赋值在块结束后才完成赋值操作。此赋值方式可以避免在仿真出现魔仙和竞争现象。在组合的RTL代码中使用阻塞赋值
=
。使用阻塞赋值方式对一个变量进行赋值时,此变量的值在赋值语句执行完后之后就立即改变。
compare
使用非阻塞赋值方式进行赋值时,各个赋值语句同步执行;因此通常在一个时钟沿对临时变量进行赋值,而在另一个时钟沿对其进行采样。因为在相同的时钟沿采样赋值,采样的还是原来的值,赋值操作是在块结束时进行。
- 阻塞赋值
下面模块会综合成为触发器
module block(clk,a,b);
input clk,a;
output b;
reg b;
always @(posedge clk)beginy=a;b=y;end
endmodule
- 非阻塞赋值
下面的模块会综合成两个触发器
module block(clk,a,b);
input clk,a;
output b;
reg b;
always @(posedge clk)beginy<=a;b<=y;end
endmodule
上图左侧是阻塞赋值的综合结果,右侧则为非阻塞赋值。相比左侧,右侧的例子会造成一个时钟周期的延迟
小程序
加法器
module addr(a,b,cin,count,sum);input [2,0]a;input [2,0]b;input cin;output count;output [2,0]sum;assign {count,sum}=a+b+cin
endmodule
上面的程序描述的是一个3位加法器,可以看出来,程序从module开始,以endmodule结束。
input [2,0]a
表示声明一个3bit的输入变量,命名为a
assign {count,sum}=a+b+cin
表明为线网类型赋值,{}
是连接符号,count是1bit,sum是3bit,所以连接之后是4bit,最高位是count。等式右边是2个3bit相加,再加上一个1bit的,实现的全加器。
比较器
module compare (equal,a,b);
input [1:0] a,b; // declare the input signal ;
output equare ; // declare the output signal;
assign equare = (a == b) ? 1:0 ;
/ * if a = b , output 1, otherwise 0;*/
endmodule
逻辑部分是一个三目运算符号,有C语言基础的都可以看懂。
三态驱动器
module mytri (din, d_en, d_out);input din;input d_en;output d_out;// -- Enter your statements here -- //assign d_out = d_en ? din :'bz;
endmodulemodule trist (din, d_en, d_out);input din;input d_en;output d_out;// --statements here -- //mytri u_mytri(din,d_en,d_out);
endmodule
全加器
一位全加器
如上图是一位全加器
这里先说明下什么是全加器,并说下全加器半加器的区别:
半加器不考虑低位过来的进位,只计算2个一位二进制数相加。产生一个本位和,还有一个向高位的进位信号。
全加器考虑低位过来的进位,计算2个一位二进制数相加。产生一个本位和,还有一个向高位的进位信号。
即半加器有二个输入,二个输出。全加器有三个输入,2个输出。
module FA_struct (A, B, Cin, Sum, Count);input A;input B;input Cin;output Sum;output Count;wire S1, T1, T2, T3;// -- statements -- //xor x1 (S1, A, B);xor x2 (Sum, S1, Cin);and A1 (T3, A, B );and A2 (T2, B, Cin);and A3 (T1, A, Cin);or O1 (Cout, T1, T2, T3 );
endmodule
该实例显示了一个全加器由两个异或门、三个与门、一个或门构成。S1、T1、T2、T3则是门与门之间的连线。代码显示了用纯结构的建模方式,其中xor 、and、or 是Verilog HDL 内置的器件。以 xor x1 (S1, A, B) 该例化语句为例:
xor 表明调用一个内置的异或门,器件名称xor ,代码实例化名x1(类似原理图输入方式)。括号内的S1,A,B 表明该器件管脚的实际连接线(信号)的名称,其中 A、B是输入,S1是输出。其他同。
两位全加器
两位的全加器可通过调用两个一位的全加器来实现。该设计的设计层次示意图和结构图如下:
module Four_bit_FA (FA, FB, FCin, FSum, FCout ) ;parameter SIZE = 2;input [SIZE:1] FA;input [SIZE:1] FB;input FCin;output [SIZE:1] FSum;output FCout;wire FTemp;FA_struct FA1(.A (FA[1]),.B (FB[1]),.Cin (FCin) ,.Sum (FSum[1]),.Cout (Ftemp));FA_struct FA2(.A (FA[2]),.B (FB[2]),.Cin (FTemp) ,.Sum (FSum[2]),.Cout (FCount ));
endmodule
除了低位的进位Fcin,输入FA与FB都是两位,将输入的两位分别放到两个一位全加器上面,就好像我们在做两位数加法时,也是将个位、十位分别相加,再加上进位。
该实例用结构化建模方式进行一个两位的全加器的设计,顶层模块Four_bit_FA 调用了两个一位的全加器 FA_struct 。在这里,以前的设计模块FA_struct 对顶层而言是一个现成的器件,顶层模块只要进行例化就可以了。注意这里的例化中,端口映射(管脚的连线)采用名字关联,如 .A (FA[2]) ,其中.A 表示 调用器件的管脚A,括号中的信号表示接到该管脚A的电路中的具体信号。wire 保留字表明信号Ftemp 是属线网类型(下面有具体描述)。
Verilog建模
Verilog有三种建模方式,分别是
结构化描述方式
数据流描述方式
行为描述方式
其中数据流描述方式经常使用连续赋值语句,某个值被赋给某个网线变量。
assign [delay] net_name = expression;
注意在各assign 语句之间,是并行执行的,即各语句的执行与语句之间的顺序无关。
行为描述方式经常使用always、initial语句赋值。使用reg进行寄存器的声明。always是指一直在重复运行,由always后面括号的变量变化时触发。在always以及end之间是串行顺序执行的。
Verilog模块语法相关推荐
- (16)Verilog模块例化-基本语法(四)(第4天)
(16)Verilog模块例化-基本语法(四)(第4天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Verilog模块例化-基本语法(四)(第4天) 5)技术 ...
- Verilog初级教程(7)Verilog模块例化以及悬空端口的处理
博文目录 写在前面 正文 按顺序排列的端口连接 按名称排列的端口连接 未连接/悬空端口处理 关于模块端口的说明 参考资料 交个朋友 写在前面 此系列相关博文: Verilog初级教程(6)Verilo ...
- verilog always语法_Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使用呢? 例如:一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件 ...
- b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一...
1.一个完整版实例 上一次Verilog学习笔记中,我通过几个小例子,较为直观的对Verilog编程有了一些了解.这次笔记,我开始着重的系统学习Verilog编程语法基础.在我系统学习语法之前,我先用 ...
- 【正点原子FPGA连载】 第七章 Verilog HDL语法 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- verilog always语法_Verilog 最全经验总结(建议收藏)
关注.星标公众号,直达精彩内容 公众号:ZYNQ ID :FreeZynq 1.不使用初始化语句: 2.不使用延时语句: 3.不使用循环次数不确定的语句,如:forever,while等: 4.尽量采 ...
- 【正点原子FPGA连载】第七章Verilog HDL语法 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- Verilog HDL 语法整理 (一)
目录 导读 一.模块结构 1.模块的端口定义 2.模块内容 二.数据类型 1.常量 2.参量 3.变量 1.寄存器数据类型 2.线网型数据类型 参考声明 导读 本篇博文主要介绍Verilog HDL ...
- Verilog HDL 语法学习笔记
今天给大侠带来Verilog HDL 语法学习笔记,话不多说,上货. 关于详细的VHDL语法以及Verilog HDL语法可参见往期文章. 一周掌握 FPGA VHDL Day 7 暨汇总篇 一周掌握 ...
- 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块
Chisel模块详解(五)--Chisel中使用Verilog模块 上一篇文章讲述了用函数实现轻量级模块的方法,可以大幅度提升编码效率.Chisel中也提供了一些好用的函数,方便我们编写代码,也方便C ...
最新文章
- python判断英文
- Pricing debug - update
- linux卸载gd,linux下 安装GD
- HTML+CSS+JS实现 ❤️圆圈倒计时间❤️
- teamview修改id
- using namespace cocos2d;
- 多台web服务器之间共享session
- Redis Manager 如何查看监控
- pycharm搭建第一个django项目
- array 删除指定的元素的方法
- SQL删除重复数据,仅保留(最新/有效的)一条数据
- 独立按键与蜂鸣器的c语言编写,生产实习报告--单片机电子琴.doc
- Python功能使用学习笔记(4)--链接数据库
- 新浪微博Python登陆
- 学科前沿讲座课程总结与感悟
- 附加支付和统筹支付_上海市医疗保险,请问账户支付和统筹支付是什...
- java中List 的Stream常用的几种用法
- 如何在浏览器中直接打开Word/Excel等Office文档?
- matlab学习笔记(一):清除命令
- Unity自定义字体 包括中文
热门文章
- qq音乐网络异常获取音乐失败_QQ音乐无法播放_为什么qq音乐总是提示歌曲无效或网络连接失败?...
- 关于elementplus 的:suffix-icon=“Search不显示问题记录
- 百度地图API和2D/3D地图的转换
- 3541. 代码查重
- 基于区块链的数字藏品管控方案
- 8G的U盘变成4M解决方法
- pyimagesearch-5 霍比特人和直方图 - 使用Python构建您的第一个图像搜索引擎的操作指南
- VSCode更改默认浏览器
- 获取所有权_住房所有权经济学深入研究
- 红米(RedmiBook)笔记本无线网卡QCA6174在Linux下wifi异常解决方法