第四阶段实验 Verilog HDL简介 1 Verilog描述的一般结构 2 Verilog HDL基础知识 3 设计举例 4 层次化设计方法举例
1 Verilog描述的一般结构 (1) Verilog HDL的组成部分 Verilog HDL PLI SDF 编程语言接口(PLI)是Verilog仿真器和一种编程语言(如C语言)之间路径和数据结构的接口; 标准延时格式(SDF:standard delay format)是模型反标延时信息用的文件格式。
Verilog程序由关键词module和endmodule进行定义。 module name (ports); port declarations data type declarations functionality timing specification endmodule Verilog HDL 大小写敏感
Verilog程序的组成部分 这5个组件的排列顺序是任意的,可以选择其中的一个或几个组件构成一个Verilog程序 endmodule module Name, port list, port declarations(if ports present) parameters(optional), Declarations of wires, regs and other variables Data flow statements ( assign ) Instantiation of lower level modules Tasks and functions Always and initial blocks, All behavioral statements go in these blocks.
简单Verilog实例: module gate1(F,A,B,C,D); input A,B,C,D; output F; assign F=~(A & B)|(B & C & D); endmodule
2 Verilog HDL基础知识 空白符:空格、TAB键、换行符及换页符 注释行:单行注释、多行注释 标识符取名规则: 必须是由字母或下划线开头,长度小1024字符 后续部分可以是字母、数字、下划线 以反斜杠“\”开头,以空白符结尾的任何字符序列 标识符区分大、小写 关键词:Verilog HDL 内部已使用的词。关键词都是小写。
四种逻辑状态: 逻辑零、逻辑非、低电平 1 逻辑1、逻辑真、高电平 x或X 不确定的逻辑状态 z或Z 高阻态
常量及其表示方法 三类常量:整数、实数、字符串 1.整数 基数格式表示: +/-< 位宽><基数符号><按基数表示的数值> 0~9, a~f, A~F, x, X, z, Z, ?, _ H or h 十六进制 0~9, _ D or d 十进制 0~7, x, X, z, Z, ?, _ O or o 八进制 0, 1, x, X, z, Z, ?, _ B or b 二进制 合法的表示值 基数符号 数制
2.实数 两种表示方法:十进制记数法 例:10.2 科学记数法 例:3.1e2 3.字符串:为两个双引号“ ”之间的字符, 字符串不允许跨行
变量的数据类型 1.连线类型(Net-type) 2.寄存器类型( Register-type) 3.标量与矢量 标量:线宽只有一条的连线,位数只有一位的寄存器 矢量:线宽大于一条的连线,位数大于一位的寄存器 4.标量类矢量与矢量类矢量 标量类矢量:可以按位、或部分位赋值的矢量 矢量类矢量:不能按位、或部分位赋值的矢量,只 能作为一个统一的整体进行赋值
运算符(9类) +, -, *, /, % ~, &, |, ^, ^~ or ~^ &, ~&, |,~|, ^,^~ or ~^ ?: 条件运算符 { } 连接运算符 <<, >> 逻辑移位运算符 ==, !=, ===, !== 相等与全等运算符 <, >, <=, >= 关系运算符(双目) !, &&, || 逻辑运算符 &, ~&, |,~|, ^,^~ or ~^ 缩位运算符(单目) ~, &, |, ^, ^~ or ~^ 位运算符 +, -, *, /, % 算术运算符 所含运算符 运算符分类
运算符的优先级 ! ~ 最高优先级 * / % + - << >> < <= > >= ! ~ * / % + - << >> < <= > >= == != === !== & ~& ^ ~^ | ~| && || ?: 最高优先级 最低优先级
Verilog 基本门级元件 多输入门:and、nand、or、nor、xor、xnor 只有单个输出,1个或多个输入 多输出门:not、buf 允许有多个输出,但只有一个输入 三态门:bufif0、bufif1、notif0、notif1 有一个输出,一个数据输入和一个控制输入
Verilog 基本门级元件(原型) 在VerilogHDL语言中已预定义了门级原型 buf n-output buffer and n-input AND gate nand n-input NAND gate or n-input OR gate nor n-input NOR gate xor n-input exclusive OR gate xnor n-input exclusive NOR gate buf n-output buffer not n-output inverter bufif0 tri-state buffer; Io enable bufif1 tri-state buffer; hi enable notif0 tri-state inverter; notif1 tri-state inverter;
3 Verilog的设计举例 例1 用Verilog HDL语言描述一个上升沿D触发器。 module dff (q,clk,data); output q; input clk,data; reg q; always @(posedge clk) q = data; endmodule 句尾分号 模块名 端口类型说明 数据类型说明 功能描述 (行为描述)
Verilog HDL行为描述方法 过程块的组成: 过程语句@(事件控制敏感表) begin (:块名) 块内局部变量说明 一条或多条过程赋值或高级程序语句 end
在always下面使用的高级程序语句 (1)if-else 条件语句 if (条件表达式) 块语句1 …….. else if (条件表达式n) 块语句n else 块语句n+1
(2)case 语句 case (敏感表达式) 值1:块语句1 值2:块语句2 …… 值n: 块语句n default:块语句n+1 endcase (3)for循环语句 for (表达式1;表达式2;表达式3)块语句
例2 用Verilog HDL语言描述2选1的数据选择器。 module mux2_1(out1, a, b, sel) ; output out1; input a, b; input sel; assign out1= sel ? b : a; endmodule 数据流描述 例2 用Verilog HDL语言描述2选1的数据选择器。 module mux2_1(out1, a, b, sel) ; output out1; input a, b; input sel; assign out1=(sel & b) | (~sel & a); endmodule 数据流描述 a b sel out1
行为描述 module mux2_1(out1, a, b, sel) ; output out1; input a, b; input sel; reg out1; always @(sel or a or b) begin case (sel) 1’b0 : out1 = a; 1’b1 : out1 = b; endcase end endmodule module mux2_1(out1, a, b, sel) ; output out1; input a, b; input sel; reg out1; always @(sel or a or b) begin if (sel) out1 = b; else out1 = a; end endmodule
module mux2_1(out1,a,b,sel); output out1; input a,b,sel; not (sel_, sel); and (a1, a, sel_); and (b1, b, sel); or (out1, a1, b1); endmodule 结构描述
小结: 行为描述方式: 数据流描述方式: 结构描述方式: 一般使用下述语句描述,可以对组合、时序逻辑电路建模。 1)initial 语句 2)always 语句 数据流描述方式: 一般使用assign语句描述,主要用于对组合逻辑电路建模。 结构描述方式: 一般使用Primitive(内部元件)、自定义的下层模块对电路描述。主要用于层次化设计中。
4 层次化设计方法举例 例3 请用层次化的方法设计一个4位全加器,框图如下: 实现方案如下: 4-bit Adder (add4.v) (addbit.v)
1. 底层模块——1位全加器实例: module addbit (a, b, ci, sum, co); input a, b, ci; output sum, co; wire a, b, ci, sum, co, n1, n2, n3; xor (n1, a, b,); xor (sum, n1, ci); and (n2, a, b); and (n3, n1, ci); or (co, n2, n3); endmodule 一些Verilog原型(Primitive) 列出结构化的元件 并按网表连接
模块的调用方法 基本方式: 模块名 调用名(端口名表项) 调用方式一:位置对应调用方式 调用方式二:端口名对应调用方式 基本方式: 模块名 调用名(端口名表项) 调用方式一:位置对应调用方式 调用方式二:端口名对应调用方式 调用方式三:存在不连接端口的调用方式 (未连PORT允许用(,)号空出其位置)
2. 顶层模块调用底层模块实例-通过位置关联 Order must match exactly models add4 (result, carry, r1, r2, ci); output [3:0] result; output carry; input [3:0] r1, r2; input ci; wire [3:0] r1, r2, result; wire ci, carry, c1, c2, c3; addbit u1 (r1[0], r2[0], ci, result[0], c1); addbit u2 (r1[1], r2[1], c1, result[1], c2); addbit u3 (r1[2], r2[2], c2, result[2], c3); addbit u4 (r1[3], r2[3], c3, result[3], carry); endmodule module addbit (a, b, ci, sum,co); input a, b, ci; output sum, co; endmodule Structural or behavioral model
here names must match exactly 3. 顶层模块调用底层模块实例-通过名字关联 module add4 (result, carry, r1, r2, ci); output [3:0] result; output carry; input [3:0] r1, r2; input ci; wire [3:0] r1, r2 , result; wire ci, carry, c1, c2 c3; addbit u0 (.co(c1) , .sum(result[0]), .ci(ci),.b(r2[0]),.a(r1[0])); addbit u1 (.co(c2) , .sum(result[1]), .ci(c1),.b(r2[1]),.a(r1[1])); addbit u2 (.co(c3) , .sum(result[2]), .ci(c2),.b(r2[2]),.a(r1[2])); addbit u3 (.co(carry), .sum(result[3]), .ci(c3),.b(r2[3]),.a(r1[3])); endmodule here names must match exactly 注意:该描述应严格保持名字的一致!
PORT连接的规则 module top; *input:符号内部总是net,外部可连net和reg数据类型 *output:其内部可为net或reg,而外部必须连各种net数据类型 *inouts:它的内外都用net且只能连各种net数据类型 module top; module dev (a, b, c); inputs outputs net reg or net net reg or net c b a z y x inouts
例4 四位异步二进制计数器的设计 (原理图+Verilog混合设计) 4-bit counter (asy_count4.v) T触发器 (T_FF.v) D触发器 (D_FF.v) 反相器 (not)
例4 四位异步二进制计数器的设计 (原理图+Verilog混合设计)
Ripple Carry Counter Top-level Design Block module ripple_counter (q, clk, reset); output [3:0] q; input clk,reset; T_FF tff0 (q[0], clk, reset); T_FF tff1 (q[1], q[0], reset); T_FF tff2 (q[2], q[1], reset); T_FF tff3 (q[3], q[2], reset); endmodule
Flip-flop T-FF module T_FF (q, clk, reset); output q; input clk, reset; wire d; D_FF dff0(q, d, clk, reset); not n1(d, q); endmodule
Flip-flop D-FF module D_FF (q, d, clk, reset); output q; input d, clk, reset; reg q; always @(posedge reset or negedge clk) if (reset) q=1'b0; else q=d; endmodule