Verilog学习笔记

您所在的位置:网站首页 verilog符号generate Verilog学习笔记

Verilog学习笔记

2023-06-08 07:24| 来源: 网络整理| 查看: 265

2. 概 述2.1Verilog模块的基本概念2.2Verilog用于模块的测试 3. 模块的结构、数据类型、变量和基本运算符号3.1 模块的结构3.2 数据类型及其常量和变量3.2.1 常量3.2.2 变量 4. 运算符、赋值语句和结构说明语句4.1运算符及表达式4.1.1 基本的算术运算符4.1.2 位运算符4.1.3 逻辑运算符4.1.4 关系运算符4.1.5 等式运算符4.1.6 移位运算符4.1.7 位拼接运算符4.1.8 缩减运算符(reduction operator)4.1.9 关键词 4.2 赋值语句和块语句4.2.1 赋值语句4.2.2 块语句 5. 条件语句、循环语句、块语句与生成语句5.1 条件语句(if_else语句)5.1.1 计数器中的同步复位以及异步复位 5.2 case语句5.3 循环语句5.3.1 forever语句5.3.2 repeat语句5.3.3 while 语句5.3.4 for语句 5.4 命名块的禁用5.5 生成块5.5.1 循环生成语句5.5.2 条件生成语句5.5.3 case生成语句 6. 结构语句、系统任务、函数语句和显示系统任务6.1 结构说明语句6.1.1 initial语句6.1.2 always语句 6.2 任务(task)和函数(function)说明语句6.2.1 task说明语句6.2.2 function说明语句6.2.3 函数使用举例6.2.4 task和function的特点 6.3 常用的系统任务6.3.1 $ display和$ write任务6.3.2 文件输出6.3.3 显示层次6.3.4 选通显示 7. 有限状态机设计7.1 有限状态机的优点7.2 状态机分类7.3 设计实例7.4 时间尺度 `timescale

2. 概 述 Verilog HDL是一种用于数字系统设计的语言。用Verilog HDL描述的电路设计就是该电路的VerilogHDL模型,也称为模块。VerilogHDL既是一种行为描述的语言,也是一种结构描述的语言。也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的VerilogHDL模型。 2.1Verilog模块的基本概念

Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。

//例如一个 二选一多路选择器 module muxtwo(out,a,b,sl); input a,b,sl; output out; reg out; always @(sl or a or b) //always @(sl or a or b)表示只要sl或a或b,其中若有一个变化时就执行下面的语句。 if(!sl) out=a; else out=b; endmodule module muxtwo (out,a,b,sl); input a,b,sl; output out; wire nsl,sela,selb;// not u1(nsl,sl); and #1 u2(sela,a,nsl); and #1 u3(selb,b,sl); or #2 u4(out,sela,selb); endmodule //and、or和not都是Verilog语言的保留字 //由Verilog语言的原语(primitive)规定了它们的接口顺序和用法 //分别表示与门、或门和非门,#1和#2分别表示门输入到输出的延迟为1和2个时间单位。 module compare ( equal,a,b ); output equal; //声明输出信号equal input [1:0] a,b; //声明输入信号a,b assign equal =(a = = b)?1:0; /*如果a、b 两个输入信号相等,输出为1。否则为0*/ endmodule //以上程序也可写为 module compare_2 ( equal,a,b ); output equal; //声明输出信号equal input [1:0] a,b; //声明输入信号a,b reg equal;// always @(a,b) if(a==b) equal=1; else equal=0; /*如果a、b 两个输入信号相等,输出为1。否则为0*/ endmodule

在这里插入图片描述 运用模块化的思想,分别写出与门和非门的模块代码

**与门** module and(a,b,c); input a,b; output c; assign c=a&b; endmodule **非门** module inv(a,b,c); input a,b; output c; assign c=~(a&b); endmodule

综上可实现图示电路

module test_comp(a,b,c,d,z); input a,b,c,d; output z; wire e,f; and u1(a,b,e); and u2(c,d,f); inv u3(e,f,z); //u1/u2/u3表示逻辑单元的实例名称。 endmodule

通过上面的例子可见:

• Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间。每个模块实现特定的功能。模块是可以进行层次嵌套的。因此, 大型的数字电路设计可分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。

• Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。

• 除了endmodule语句外,每个语句和数据定义的最后必须有分号。

• 可以用/…/和//…对Verilog HDL程序的任何部分作注释。一个好的、有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。

【一道关于模块的例题】:

在这里插入图片描述

module d1(a,b,h) input a,b; output h; assign h=~(a|b); endmodule module d2(h,c,d) input h,c; output d; assign d=h^c; endmodule module example(a,b,c,d) input a,b,c; output d; wire h; d1 u1(a,b,h); d2 u2(h,c,d); endmodule 2.2Verilog用于模块的测试

Verilog还可以用来描述变化的测试信号。描述测试信号的变化和测试过程的模块也叫做测试平台(testbench),它可以对上面介绍的电路模块进行动态的全面测试。通过观测被测试模块的输出信号是否符合要求,可以调试和验证逻辑系统的设计和结构正确与否,并发现问题及时修改。 在这里插入图片描述 一个很简单的测试平台

module t_lx1; wire b; reg a; initial begin a=0; #23 a=1; #96 a=0; end lx1 u1(.a(a),.b(b)); endmodule 3. 模块的结构、数据类型、变量和基本运算符号 3.1 模块的结构

Verilog结构位于module和endmodule声明语句之间,每个Verilog程序包括4个主要部分:

端口定义I/O说明内部信号声明功能定义

例:

module block1(a,b,c,d ); //端口定义 input a,b,c; // I/O说明 output d; // I/O 说明 wire x; //内部信号说明 assign d = a | x; //功能定义 assign x = ( b & ~ c ); endmodule

模块端口定义格式 module 模块名(口1,口2,口3,…) 引用模块的两种连接方法 (1)在引用时严格按模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名

mytri tri_inst(sout,sin,ena);

(2)在引用时用“.”符号,标明定义时规定的端口名不必严格按端口顺序对应

mytri tri_inst(.out(sout),.in(sin),.enable(ena))

I/O说明的格式

输入口 input[范围];输出口 output [范围];输入/输出口 inout [范围];

I/O说明也可以写在端口声明里。

module module_name(input in_port1,input in_port2,output out_port1,output out_port2);

例如

module test_width(b,a); input[6:5] a; output[3:2] b; assign b=a; endmodule

内部信号说明

reg[范围] 变量1,变量2…; wire[范围] 变量1,变量2…;

模块中实现逻辑功能的3种方法 (1)assign

assign c=a&b;

(2)用实例元件

and #2 u1(q,a,b);

(3)用always块 assign语句是描述组合逻辑最常用的方法之一。 always块既可用于描述时序逻辑,又可用于组合逻辑。

Verilog语言要点 Verilog中过程块、连续赋值语句、实例引用的关系

(1)在Verilog模块中所有过程块(如initial块、always块)、连续赋值语句、实例引用都是并行的。

(2)它们表示的是一种通过变量名互相连接的关系

(3)在同一模块中这三者出现的先后次序没有关系

(4)只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于模块的功能定义部分。

D触发器 module new_dff(q,clk,d); input clk,d; output q; reg q; always @(posedge clk) qb)&&(x>y) 可写成: a>b && x>y (a==b)||(x==y) 可写成:a==b || x==y (!a)||(a>b) 可写成: !a || a>b

为了提高程序的可读性,明确表达各运算符间的优先关系,建议使用括号。

4.1.4 关系运算符

关系运算符共有以下四种:

a < b a小于ba > b a大于ba = b a大于或等于b

在进行关系运算时,如果声明的关系是假的(flase),则返回值是0,如果声明的关系是真的(true),则返回值是1,如果某个操作数的值不定,则关系是模糊的,返回值是不定值。

4.1.5 等式运算符

在Verilog HDL语言中存在四种等式运算符:

1) == (等于) 2) != (不等于) 3) === (等于) 4) !== (不等于)

这四个运算符都是二目运算符,它要求有两个操作数。 “==”和“!=”又称为逻辑等式运算符。其结果由两个操作数的值决定。 由于操作数中某些位可能是不定值x和高阻值z,结果可能为不定值x。

而“ = = = ”和“!==”运算符则不同,它在对操作数进行比较时对某些位的不定值x和高阻值z也进行比较,两个操作数必需完全一致,其结果才是1,否则为0。“ = = = ”和“!= =”运算符常用于case表达式的判别,所以又称为“case等式运算符”。这四个等式运算符的优先级别是相同的。 在这里插入图片描述

module test_equal; reg A; initial begin A=1'bx; if(A==1'bx) $display("== two. A is x") ; if(A===1'bx) $display("=== three. A is x"); end endmodule 4.1.6 移位运算符

在Verilog HDL中有两种移位运算符: >(右移位运算符)。其使用方法如下:

a >> n 或 a


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3