Verilog HDL基础

合集下载

Verilog HDL基本结构

Verilog HDL基本结构

Verilog HDL基本结构
1.Verilog HDL程序是由模块构成的。

每个模块嵌套在module和endmodule声明语句中。

模块是可以进行层次嵌套的。

2.每个Verilog HDL源文件中只准有一个顶层模块,其他为子模块。

3.每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑描述。

4.程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。

5.除了endmodule语句、begin_end语句和fork_join语句外,每个语句和数据定义的最后必须有分号。

6.可用/*.....*/和//...对程序的任何部分作注释。

加上必要的注释,以增强程序的可读性和可维护性。

Verilog HDL的表述特点
语法结构上的主要特点:
1.形式化地表示电路的行为和结构;
2.借用C语言的结构和语句;
3.可在多个层次上对所设计的系统加以描述,语言对设计规模不加任何限制;
4.具有混合建模能力:一个设计中的各子模块可用不同级别的抽象模型来描述;
5.基本逻辑门、开关级结构模型均内置于语言中,可直接调
用;
6.易创建用户定义原语(UDP,User Designed Primitive)。

可以使用元件和模块的例化可以使一个设计好的Verilog文件(即一个设计模块)在其他设计文件(顶层设计模块)使用。

VerilogHDL语法基础

VerilogHDL语法基础

VerilogHDL语法基础⼀个复杂电路的完整Verilog HDL模型是由若个Verilog HDL 模块构成的,每⼀个模块⼜可以由若⼲个⼦模块构成。

利⽤Verilog HDL语⾔结构所提供的这种功能就可以构造⼀个模块间的清晰层次结构来描述极其复杂的⼤型设计。

每个模块的内容都是嵌在module和endmodule两个语句之间,每个模块实现特定的功能,模块是可以进⾏层次嵌套的。

每个模块⾸先要进⾏端⼝定义.并说明输⼊(input)和输出(output),然后对模块的功能进⾏逻辑描述。

Verilog HDL程序的书写格式⾃由,⼀⾏可以写⼏个语句,⼀个语句也可以分多⾏写。

除了endmodule语句外,每个语句的最后必须有分号。

⼀个模块是由两部分组成的,⼀部分描述接⼝;另⼀部分描述逻辑功能,即定义输⼊是如何影响输出的。

模块(block)的组成Verilog HDL结构完全嵌在module和endmodule声明语句之间,每个Verilog程序包括4个主要部分:端⼝定义,I/O说明,信号类型声明和功能描述。

module<模块名>(<端⼝列表>);端⼝说明(input,output,inout)参数定义(可选)数据类型定义连续赋值语句(assign)过程块(initial 和 always)⾏为描述语句低层模块实例任务和函数延时说明块endmodule模块声明模块声明包括模块名和端⼝列表。

其格式如下:module 模块名(端⼝1,端⼝2,端⼝3,…);模块结束的标志为关键字:endmodule。

端⼝定义input(输⼊端⼝),output(输出端⼝)和inout(双向端⼝)。

格式如下:input 端⼝名1,端⼝名2,………,端⼝名N; //输⼊端⼝output 端⼝名1,端⼝名2,………,端⼝名N; //输出端⼝inout 端⼝名1,端⼝名2,………,端⼝名N; //输⼊输出端⼝也可以写在端⼝声明语句⾥,其格式如下(为了代码的可读性,⼀般不这么写):module module_name(input port1,input port2,…output port1,output port2… );信号类型说明信号可以分为端⼝信号和内部信号;1. 所有信号都必须进⾏数据类型的定义,如寄存器类型(reg等),连线类型(wire等);2. 如果信号没有定义数据类型,则综合器将其默认为wire型;3. 端⼝的位宽最好定义在端⼝定义中,不要放在数据类型定义中;4. 不能将input和inout类型声明为reg型;模块的端⼝表⽰的是模块的输⼊和输出⼝名,也就是说,它与别的模块联系端⼝的标识。

Verilog-HDL中的基本语法

Verilog-HDL中的基本语法
⑤ 可以用/*……*/或//……对Verilog HDL程序的任 何部分作注释。
一个完整的源程序都应当加上需要的注释, 以加强程序的可读性。
2.2 Verilog HDL的语法
2.2.1 空白符和注释
Verilog HDL的空白符包括空格、tab符号、换行 和换页。
空白符如果不是出现在字符串中,编译源程序 时将被忽略。
8. 条件操作符(Conditional operators)
条件操作符为:?:
条件操作符的操作数有3个,其使用格式为
操作数 = 条件 ? 表达式1:表达式2;
即当条件为真(条件结果值为1)时,操作数 = 表达式1;为假(条件结果值为0)时,操作数 = 表达 式2。
9. 位并接操作符(Concatenation operators) 并接操作符为:{} 并接操作符的使用格式: {操作数1的某些位,操作数2的某些位,…,操作数n 的某些位};
位运算操作符包括:~(按位取反)、&(按位与)、 |(按位或)、^(按位异或)、^~或~^(按位同或)。
在进行位运算时,当两个操作数的位宽不同时, 计算机会自动将两个操作数按右端对齐,位数少的操 作数会在高位用0补齐。
4. 关系操作符(Pelational operators)
关系操作符有:
<(小于)、<=(小于等于)、>(大于)、>=(大 于等于)。
② 每个模块首先要进行端口定义,并说明输入 (input)、输出(output)或双向(inouts),然 后对模块的功能进行逻辑描述。
③ Verilog HDL程序的书写格式自由,一行可以一 条或多条语句,一条语句也可以分为多行写。
④ 除了endmodule语句外,每条语句后必须要有 分号“;”。

VerilogHDL入门教程

VerilogHDL入门教程

VerilogHDL入门教程第一部分:Verilog HDL概述(约200字)Verilog HDL是一种硬件描述语言,用于描述和建模数字电路和系统。

它是一种被广泛使用的硬件设计语言,特别适合用于逻辑设计和验证。

Verilog HDL提供了一种形式化的方式来表示数字电路和系统的行为和结构,使得工程师可以更轻松地进行硬件设计和验证。

第二部分:Verilog HDL基础(约400字)在Verilog HDL中,最基本的组成单元是模块。

模块是Verilog HDL中的一个独立的、可重用的单元,可以由其他模块实例化和连接。

每个模块由端口(输入和输出)和内部功能(如逻辑代码和信号声明)组成。

module and_gate(input a, input b, output y);assign y = a & b;endmodule这个模块表示一个与门,它有两个输入a和b,一个输出y。

使用assign语句,我们将输出y连接到输入a和b的逻辑与操作。

第三部分:Verilog HDL高级特性(约400字)除了基本的模块和连接之外,Verilog HDL还提供了一些高级特性,用于更复杂的电路建模和验证。

一种特殊的构造是always块。

always块用于描述模块内的行为,基于一个条件或时钟信号的变化。

例如,下面是一个使用always块的模块示例:module counter(input clk, input enable, output reg count);if (enable)count = count + 1;endendmodule这个模块表示一个简单的计数器,在时钟上升沿时根据enable信号增加计数器的值。

Verilog HDL还支持层次化的建模,允许将模块层次化地组织起来,以便更好地管理和复用代码。

层次化建模通过使用模块的层次命名和连接来实现。

例如,我们可以将上面的计数器模块实例化为另一个模块,如下所示:module top_module(input clk, input enable, output reg count);countercounter_inst(.clk(clk), .enable(enable), .count(count));endmodule这个模块实例化了上面定义的计数器模块,并将其内部信号和端口连接到外部接口。

Verilog HDL基础知识

Verilog HDL基础知识
task time tran tranif0 tranif1
tri tri0 tri1 triand trior trireg unsigned vectored wait wand weak0 weak1 while wire wor xnor xor
第3章 Verilog HDL基础知识
3.2 数 据 类 型
Verilog HDL支持两种形式的注释符:/*……*/与//。其中, /*……*/为多行注释符,用于对多行语句注释;//为单行注释符, 只对注释符所在的行有效。下面是一个使用注释符对1位加法器 进行说明的例子。
第3章 Verilog HDL基础知识
【例3-2】注释符的例子。
/* 该例利用一位加法器来说明单行注释符与多行注释符的
第3章 Verilog HDL基础知识
1. 字符串变量的声明 Verilog HDL中采用寄存器变量来存储字符串,寄存器变量的 位数要大于字符串的最大长度。需要注意的是,Verilog HDL中并 不需要特殊位来存储终止符。 【例3-6】字符串变量的声明。
reg [8*12:1] stringvar; initial
'<base_format><number> 符号“'”为基数格式表示的固有字符,该字符不能省略,否 则为非法表示形式;参数<base_format>用于说明数值采用的进制 格式;参数<number>为相应进制格式下的一串数字。这种格式未 指定位宽,其缺省值至少为32位。
第3章 Verilog HDL基础知识
第3章 Verilog HDL基础知识
module addbit (a,b,ci,sum,co);
input

硬件描述语言Verilog HDL

硬件描述语言Verilog HDL
8
6.2 Verilog HDL 入门 6.2.1 Verilog HDL 的基本结构 6.2.2 简单 Verilog HDL 实例
9
6.2.1 Verilog HDL的基本结构
Verilog 使用大约100个预定义的关键词定义该语言的结构 1. VerilogHDL 程序由模块构成。每个模块的内容都是嵌在关键词module和 endmodule两个语句之间。每个模块实现特定的功能。 2. 每个模块先要进行端口的定义,并说明输入(input) 、输出(output)和 双向(inout),然后对模块功能进行描述。 3. 除了endmodule语句外,每个语句后必须有分号。 4. 可以用/* --- */和//…..,对VerilogHDL程序的任何部分做注释。
例 2选1数据选择器的程序实例
a
0 out
b
1
sel
13
module mux2_1(out, a, b, sel) ;
output out;

input a, b; input sel;
assign out= sel ? b : a;
据 流 描 述
endmodule
module mux2_1(out, a, b, sel) ;
VHDL 和Verilog 的功能较强,属于行为(功能)描述语言。两种HDL均为IEEE标准。 特别是Verilog HDL的语法来源于C语言,它较 VHDL 好用好学。
7
6.1 概 述 6.2 Verilog HDL入门 6.3 Verilog HDL基本语法规则 6.4 Verilog HDL结构级建模 6.5 Verilog HDL数据流建模 6.6 Verilog HDL行为级建模 6.7 数字钟电路设计

Verilog语言编程基础

Verilog语言编程基础
• /* $d i s p l a y 系统任务在新的一行中显示。* /
• $t i m e • / /该系统任务返回当前的模拟时间。
第十五页,共48页。
Verilog的语言要素-编译指令
• 以`〔反引号〕开场的某些标识符是编译器指令。 • 在Verilog 语言编译时,特定的编译器指令在整个编译过程中有
效〔编译过程可跨越多个文件〕,直到遇到其它的不同编译程 序指令。
• 完好的标准编译器指令如下:
• `define, `undef • `ifdef, `else, `endif • `default_nettype
• `include • `resetall • `timescale
• `unconnected_drive, `nounconnected_drive • `celldefine, `endcelldefine
的语句都是注释语句,因此可扩展到多行。如: • /* statement1 ,
• statement2,
• .. ...
• statementn */ • 以上n个语句都是注释语句。
• 是以 // 开头的语句,它表示以 // 开场到本行完毕都 属于注释语句。
第十三页,共48页。
Verilog的语言要素-格式
HDL:硬件描绘语言 (Hardware Description Language)
目前通用的 HDL 语言有VHDL和Verilog两种。目前多 数 FPGA 厂商都有自己的逻辑综合工具,或者采用第 三方的设计综合工具来支持自己的器件开发。这是由于 HDL完成的设计具有可移植、易维护、好理解的性能。

{expr1, expr2, . . .,exprN}

硬件描述语言VerilogHDL基础

硬件描述语言VerilogHDL基础

入zz x x x
CSLG
4、设计举例
试用Verilog语言的门级 元件描述2线-4线译码器.
E1
& Y0
//Gate-level description of a 2-to-4-
line decoder
module _2to4decoder (A1,A0,E,Y);
input A,B,E;
output [3:0] Y;
常量
格式为:<+/-><位宽>’<基数符号><数 例值如>:3’b101、5’o37、8’he3,8’b1001_0011
实数型常量 十进制记数法 如: 0.1、2.0、5.67
科学记数法 如: 23_5.1e2、5E-4
23510.0、 0.0005
CSLG
❖Verilog允许用参数定义语句定义一个标识 符来代表一个常量,称为符号常量。
CSLG
CSLG
用Verilog HDL描述组合逻辑电路
用VerilogHDL描述组合逻辑电路
❖用VerilogHDL描述组合逻辑电路有三种不 同抽象级别:
▪ 门级描述 ▪ 数据流描述 ▪ 行为级描述
❖VerilogHDL描述的电路就是该电路的 VerilogHDL模型。
CSLG
•门级描述:
一般使用Primitive(内部元件)、自定义的下层模块对电 路描述。主要用于层次化设计中。
多输入端的或非门
多输入端的异或非门
多输出端的反相器
控制信号高电平有效的 三态反相器
控制信号低电平有效的 三态反相器
CSLG
Verilog 基本门级元件
and n-input AND gate
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
module decode(A,F) parameter IN_Width=4,OUT_Width=16; … endmodule;
4.4 变量--数据类型

wire型

用assign赋值的组合逻辑信号,输入输出信号 默认为wire型,取值为0、1、x和z 在always块内被赋值的任何信号都必须定义成 reg型 注意:reg型并表示触发器的输出信号 通过reg型变量建立数组对存储器建模,如 reg[7:0] mem[255:0];
模块名 模块输入 模块输出 信号的类型 中间信号
模块功能 描述 模块结束
4.3 模块的端口

模块由两部分组成

模块的接口 模块的功能 module 模块名(口1,口2,口3,…)
输入口:input 输出口:output 双向口(输入/输出口):inout input[信号宽度-1 : 0] 端口名1,端口名2;
always@(a or b or c or d) begin tmp1 = a&b; tmp2 = ~(c&d); F = ~(tmp1 | tmp2); end; endmodule;
endmodule;
4.6.2例子程序的结构化描述—元件例化
// TestMod is a …… module TestMod(a, b, c, d, F) input a, b, c, d; output F; wire tmp1, tmp2; and u1(tmp1, a, b); //assign tmp1 = a&b; nand u2(tmp2, c, d); //assign tmp2 = ~(c&d); nor u3(F, tmp1, tmp2); //assign F = ~(tmp1 | tmp2);

为了表示数字逻辑电路的逻辑状态,Verilog语言规 定了4种基本的逻辑值:

0、1、X和Z
4.3 Verilog基本结构
//test module is a …… module TestMod(a, b, c, d, F); input a, b, c, d; output F; wire a, b, c, d, F; wire tmp1, tmp2; assign tmp1 = a&b; assign tmp2 = ~(c&d); assign F = ~(tmp1 | tmp2); endmodule 注释
4.7 移位寄存器(4)
always @ (posedge clk) begin q2<=q1; q1<=d; q3<=q2; end;
4.7 移位寄存器(5)
always @ (posedge clk) q3<=q2; always @ (posedge clk) q2<=q1; always @ (posedge clk) q1<=d;
4.7 移位寄存器(1)
always @ (posedge clk) begin q1=d; q2=q1; q3=q2; end;
4.7 移位寄存器(2)
always @ (posedge clk) begin q3=q2; q2=q1; q1=d; end;
4.7 移位寄存器(3)
always @ (posedge clk) begin q3<=q2; q2<=q1; q1<=d; end;

reg型



memo



算术运算符:+、-、*、/、% 赋值运算符:<=、= 关系运算符:>、<、>=、<= 等式运算符:==、!=、===、!== 逻辑运算符:&&、||、! 位运算符: &、|、~、^(异或)、^~(同或) 缩减运算符:&、~&、|、~|、^、~^ 条件运算符:? 移位运算符:<<、>>,用0来填补空出的位。 拼接运算符:{},将多个信号拼接起来进行操 作 优先级别
//TestMod is a …… module TestMod(a, b, c, d, F) input a, b, c, d; output F; wire a, b, c, d, F; wire tmp1, tmp2; assign tmp1 = a&b; assign tmp2 = ~(c&d); assign F = ~(tmp1 | tmp2) endmodule; 注释
always @ (a or b) y=a &b; always @ (posedge clk or negedge rst) begin if(!rst) q<=0; else q<=y; end;
4.7 赋值语句使用的原则




时序电路用非阻塞赋值; 组合逻辑时用阻塞赋值; 同时实现组合和时序逻辑时,使用非阻塞 方式 当组合逻辑复杂度较高时,可将组合逻辑 和时序分开实现 不要在同一个always块中,同时使用阻塞 和非阻塞赋值; 不能在多个always块中,同时对一个变量 进行赋值。
4.1 HDL与计算机语言的区别

运行的基础


计算机语言在CPU+RAM构建的平台上运行 HDL设计的结果是由逻辑门、触发器等组成的数 字电路 计算机语言基本上以串行的方式执行 HDL在总体上是以并行方式工作 计算机语言主要关注于变量、寄存器值的变化 HDL要实现严格的时序逻辑关系

执行方式

4.6 模块逻辑功能

有3种形式描述逻辑功能:
assign语句—数据流方式描述 assign a=b&c; 用元件例化—结构化描述 and u1(c,a,b); 用always语句—行为方式描述 always @ ( b or c) begin a = b&c; end

4.6.1 Verilog例子—(数据流方式)
(1) 初始:a=1, b=0, c=0, d=0, tmp1=0, tmp2=0, y=0 (2) b=1:tmp1=1, tmp2=0, y=0
(3) b=0:tmp1=0, tmp2=0, y=1
4.7 组合逻辑使用非阻塞赋值(2)
always @ (a or b or c or d or tmp1 or tmp2) begin tmp1 <= a & b; tmp2 <= c | d; y <= tmp1 | tmp2; end;

模块的端口


端口的I/O形式

4.4 常量--数字

整数:可用二进制、八进制、十进制和十六进 制表示,表示形式:<位宽>’<进制><数字>

如:8’b01010011,8’h53


x代表不定值,z代表高阻,每个字符所代表的 宽度取决于所用进制 下划线:用来分隔数,以提高程序可读性
4.6.2 行为描述— always
// TestMod is a …… module TestMod(a, b, c, d, F) input a, b, c, d; output F; reg tmp1, tmp2; reg F; // TestMod is a …… module TestMod(a, b, c, d, F) input a, b, c, d; output F; reg F; always@(a or b or c or d) F = ~((a&b) | (~(c&d)));
always @ (posedge clk) if(preset) begin q3<=0; q2<=1; q1<=1; end begin q3<=q2; q2<=q1; q1<=q3; end;
不需中间变量,与电路的实际结构相同
4.7组合和时序混合逻辑使用非阻塞
always @ (posedge clk or negedge rst) begin if(!rst) q<=0; else q<=a & b; end;
(1) 初始:a=1, b=0, c=0, d=0, tmp1=0, tmp2=0, y=0 (2) b=1:tmp1=1, tmp2=0, y=1 (3) b=0:tmp1=0, tmp2=0, y=0
4.7 组合逻辑使用非阻塞赋值(1)
always @ (a or b or c or d) begin tmp1 <= a & b; tmp2 <= c | d; y <= tmp1 | tmp2; end;

如16’b0011101001010001可写成 16’b0011_1010_0101_0001
4.4常量--parameter


Parameter用来定义一个标识符代表一个常量,称为 符号常量,用以提高程序的可读性,经常用于定义变 量的宽度。 还可以在模块实例引用时,改变引用模块或实例中已 定义的参数。
4.7 循环移位寄存器(1)
always @ (posedge clk) if(preset) begin q3=0; q2=1; q1=1; end begin q3=q2; q2=q1; q1=q3; end;
该程序显然不对,需要采用中间变量做过渡,与电路的实 际结构不同
4.7 循环移位寄存器(2)
4.2 Verilog基本语法—语言要素

标识符:给对象(如模块名、电路的输入与输出端 口、变量等)取名所用的字符串。以英文字母或下 划线开始,如:


关键词:是Verilog语言本身规定的特殊字符串,用来 定义语言的结构。例如:
相关文档
最新文档