VerilogHDL1-2(语法)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a b d e
c
编写Verilog HDL模块的练习

请在下面的空格中填入适当的符号 使其成为右图的Verilog 模块 :
module block1(a, b, c , d, e ); input a, b, c; output d, e ; assign d = a | ( b & ~c) ; assign e = ( b & ~c ); endmodule

无论右边的操作数何时发生变化, 右边表达式都重新计算, 并且在指定的时延后赋给左边线网变量。 如果没有定义时延值, 缺省时延为0。
模块的结构
`timescale 1ns/ 1ns module Decoder2x4 (A, B, EN, Z); input A, B, EN; output [ 3:0] Z; wire Abar, Bbar; assign #1 Abar = ~ A; assign #1 Bbar = ~ B; assign #2 Z[0] = ~ (Abar & Bbar & EN) ; assign #2 Z[1] = ~ (Abar & B & EN) ; assign #2 Z[2] = ~ (A & Bbar & EN) ; assign #2 Z[3] = ~ (A & B & EN) ; endmodule
Verilog HDL模块的基本概念
/* Verilog HDL Example1*/ module sample( q, a, b, sel, clk, resetn ); input a, b, sel, clk, resetn; output q; wire reg c; q; // 模块定义 // 输入信号定义 // 输出信号定义 // 模块内信号线的定义 // 输出端子数型定义
Verilog HDL模块的基本概念
/*一个模块调用(例化)的例子*/
module trist1(out,in,enable); output out; input in, enable; mytri tri_inst(out,in,enable); //调用由mytri模块定义的实例元件tri_inst endmodule module mytri(out,in,enable); output out; input in, enable; assign out = enable? in : 'bz; endmodule

2-4解码器电路
连续赋值语句是并发执行的,也就是说各语句的执行顺序与其 在描述中出现的顺序无关。
模块的结构
行为描述方式:

用类似软件程序中的各种运算符,直接表示输入输出信号之间的关系的 描述方法称为行为描述。
2、Verilog HDL模块的基本概念
/*一个名为adder的三位加法器的例子*/
module adder ( count,sum,a,b,cin ); //模块定义开始
input [2:0] a,b; input cin; output count; output [2:0] sum;
//输入信号定义 //输入信号定义 //输出信号定义 //输出信号定义

模块的端口定义: 模块的端口声明了模块的输入输出口。其格式如下: module 模块名(端口1,端口2,端口3,………); 如:module sample ( q, a, b, sel, clk, resetn ) ;
模块的结构


I/O说明:对输入输出端口的属性进行定义,包括端口的方向、 信号位宽等。 定义端子方向有如下语句: input(输入端口) output(输出端口) 高 低 位 位 inout(双向端口) 定义信号位宽: 信号类型 [MSB:LSB] 信号名 如:input [11:0] address; output [ 0:7] data; I/O说明也可写在端口声明语句里,Verilog 2001支持下面的描 述方式。 module adder_16 (output reg [15:0] sum,output reg cout, input wire cin, input wire [15:0] a, b);
always @( posedge clk or negedge resetn ) begin // 非同步复位的F/F if( reset n == 1„b0 ) q <= 1‟b0; else q <= c; end
assign endmodule c = ( sel )? a: b; // 选择逻辑组合
assign {count,sum} = a + b + cin; //模块功能描述 endmodule //模块定义结束
Verilog HDL模块的基本概念
/*一个名为compare的比较器例子*/
module compare ( equal,a,b ); output equal; //声明输出信号equal input [1:0] a,b; //声明输入信号a,b /*如果a、b 两个输入信号相等,输出为1,否则为0*/ assign equal=(a==b)?1:0; endmodule
3、模块的结构


“模块”(block)是Verilog的基本设计单元。 一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即 定义输入是如何影响输出的。 module block (a,b,c,d); input a,b; output c,d; assign c= a | b ; assign d= a & b; endmodule
4、编写Verilog HDL模块的练习

请在下面的空格中填入适当的符号 使其成为右图的Verilog 模块 :
module block1(a, b, —, —, — ); input —, —, —; —— d, — ; assign d = a | ( b & ~c) ; assign e = ( b & ~c ); _______
module <模块名> (<输入、输出端口列表>) /*端口描述*/ output <输出端口列表>; input <输入端口列表>; /*内部信号声明*/ wire //nets型变量,通常缺省 reg //register变量 integer /*逻辑功能定义*/ /*任务或函数*/ task或 function /*使用assign语句定义逻辑功能*/ assign <结果信号名>=<表达式>; /*使用always块描述逻辑功能*/ always @(<敏感信号表达式>) begin //过程赋值 //条件语句 //循环语句 //task,function 调用 end /*元件例化*/ <module_name模块名><instance_name例化元件名>(<port_list端口列表>); endmodule
模块组成
模块开始 模块名称
module block(a,b,c,d); input a,b; 输入端口 output c,d; 输出端口
assign c = a | b; assign d = a & b; endmodule
模块结束
block
a
b
逻辑功能
c d
输出端口
1. 端口定义 模块的端口声明了模块的I/O口,其格式如下: module 模块名(端口1,端口2,端口3……); 2. 输入输出端口说明 输入输出端口说明格式如下: 输入端口:input 端口1,端口2……端口n; 输出端口:output 端口1,端口2……端口n; 双向端口:inout 端口1,端口2……端口n; 3. 内部信号说明 定义各变量或常量的类型,其格式为: wire 数据名1,数据名2,数据名3……; reg 数据名1,数据名2,数据名3……; //位宽说明
Verilog HDL模块的基本概念



Verilog HDL程序是由模块构成的。每个模块的内容都 是嵌在module和endmodule两个语句之间。每个模块实 现特定的功能。 模块是可以进行层次嵌套的。可以将大型的块分割成不 同的小模块来实现特定的功能,最后通过顶层模块调用 子模块来实现整体功能。 每个模块要进行端口定义,并说明输入输出口,然后对模 块的功能进行行为逻辑描述。 Verilog HDL区分大小写。也就是说大小写不同的标识 符是不同的。此外,Verilog HDL是自由格式的,即结 构可以跨越多行编写,也可以在一行内编写。空白(新 行、制表符和空格)没有特殊意义。 除了endmodule语句外,每个语句和数据定义的最后必须 有分号。 可以用/*.....*/和//.......对Verilog HDL程序的任何部分 作注释。
a b d e
c
5、模块的结构

内部信号说明:在模块内用到的和与端口有关的wire 和 reg 变量的声 明。 如: reg [width-1 : 0] R变量1,R变量2 。。。。; wire [width-1 : 0] W变量1,W变量2 。。。。;
module sample( q, a, clk ); input [3:0] a; input clk; output [3:0] q; wire reg wire …... endmodule a, clk; // 默认,可以省略 q; // 输出端口类型定义 c; // 模块内信号线的定义

程序模块和电路图符号是一致的,电路图符号的引脚也就是程序模块的接口。 而程序模块描述了电路图符号所实现的逻辑功能。
模块的结构
从上面的例子可以看出:

- Verilog模块结构完全嵌在module和endmodule声明语句之间;

- 每个Verilog程序包括四个主要部分:端口定义、 I/O说明、内 部信号声明、功能定义。

Module <模块名> (<输入、输出端口列表>) /*端口描述*/ output <输出端口列表>; input <输入端口列表>; /*端口和内部信号声明*/ wire //nets型变量,通常缺省 reg //register变量 integer /*逻辑功能定义*/ /*任务或函数*/ task或 function /*使用assign语句定义逻辑功能*/
模块的结构

时延: Verilog HDL模型中的所有时延都根据时间单位定义。
Assign #2 Sum = A ^ B; //# 2指2个时间单位。 使用编译指令将时间单位与物理时间相关联。编译器指令 需在模块描述前定义
` timescale 1ns /100ps 此语句说明时延时间单位为1ns并且时间精度为100ps (时间 精度是指所有的时延必须被限定在0.1ns内)。 如果此编译器指令所在的模块包含上面的连续赋值语句, #2 代表2ns。
Verilog HDL硬件描述 语言
Hardware Description Language(HDL)
第一部分
语法
1.Verilog HDL程序结构:
Fra Baidu bibliotek
Verilog HDL程序模块包括模块名、输入输出端口说明、内 部信号说明、逻辑功能定义等几个部分,内容都是嵌在module和 endmodule两个关键字之间 。程序模板如下:
模块的结构
模块的功能定义可以用采用下面的4种方式描述:

1) 数据流方式; 2) 行为方式; 3) 结构方式; 4) 混合描述方式。
模块的结构
数据流描述方式:
用连续赋值语句“assign” ,只能描述组合逻辑。

连续赋值语句的语法为: assign [delay] LHS_net = RHS_ expression







assign <结果信号名>=<表达式>; /*使用always块描述逻辑功能*/ always @(<敏感信号表达式>) begin //过程赋值 //条件语句 //循环语句 //task,function 调用 end /*元件例化*/ <module_name模块名><instance_name例化元件名> (<port_list端口列表>); endmodule
相关文档
最新文档