1.3k likes | 1.51k Views
可编程逻辑器件. 华东师范大学电子系 2004 级 ( 微电子选修). 主讲:金之诚 邮箱: zcjin@ee.ecnu.edu.cn 网站: http://jinzc.chiname.cn. 硬件描述语言. 一个例子 硬件描述语言简介 Verilog HDL Verilog HDL 设计举例. 一个例子 ---- 秒表. 一个例子 ---- 秒表. 圆形金属壳多功能 2 道秒表 全金属防水、防震、防滑结构 1/100 秒计时 时间、日历显示 12/24 小时显示模式 每日响闹 大型跳字显示屏. *. 一个例子 ---- 秒表.
E N D
可编程逻辑器件 华东师范大学电子系2004级 (微电子选修) 主讲:金之诚 邮箱:zcjin@ee.ecnu.edu.cn 网站:http://jinzc.chiname.cn
硬件描述语言 • 一个例子 • 硬件描述语言简介 • Verilog HDL • Verilog HDL 设计举例
一个例子----秒表 • 圆形金属壳多功能2道秒表 • 全金属防水、防震、防滑结构 • 1/100秒计时 • 时间、日历显示 • 12/24小时显示模式 • 每日响闹 • 大型跳字显示屏 *
一个例子----秒表 • 功能 • 计时 • 时间 • 闹钟 • 外部特性 • 3个按键 • 6位数码显示
一个例子----秒表(续) • 内部电路 • 计数器(时基1/100) • BCD--〉七段码译码 • 显示扫描 • 实现方法 • 纯逻辑 • 微机(单片机) • PLD
硬件描述语言简介 • 什么是HDL? • 为什么要用HDL? • HDL的发展历史 • Verilog HDL与VHDL的比较
什么是HDL • 硬件设计人员与EDA工具之间的接口 • 用于多层次的数字系统建模 • 建立电子系统行为级的仿真模型,对复杂数字逻辑进行综合仿真 • 生成适合某工艺条件下的具体电路的延时模型 • 写入FPGA/CPLD,或制造ASIC
为什么要用HDL • 电子设计的规模越来越大,复杂度越来越高 • 市场的竞争越来越激烈 • 提高设计效率、降低设计成本 • 缩短开发周期,减少设计重复的次数 • HDL的易用性,功能的完善
HDL的发展历史 • 1962年,Iverson公司提出HDL • 多种HDL • ABEL HDL、VHDL、Verilog HDL • 1987年,VHDL成为IEEE标准,是国际上第一个标准化的HDL,称为IEEE 1076 • 1993年升级、更新成为IEEE1164标准;1996年,IEEE1076.3成为VHDL的综合标准
HDL的发展历史(续) • Verilog HDL于1983年由Gateway Design Automation公司开发 • 1989年,GDA公司被Cadence公司并构,1990年由Cadence公司发布Verilog HDL • 1995年Verilog HDL成为IEEE标准,成为IEEE std 1364-1995 • 2001年3月在原标准的基础上经过改进和补充,推出了Verilog IEEE1364-2001新标准
Verilog HDL与VHDL的比较 • 推出的过程 • VHDL偏重于标准化的考虑,语法比较严格 • Verilog HDL在C语言基础上发展起来,语法比较自由 • 功能 • VHDL适用于电路高级建模 • Verilog HDL适用于描述门级电路,易于控制资源
Verilog HDL与VHDL的比较(续) • 学习 • VHDL入门比较难,但设计效率较高 • Verilog HDL入门比较容易 • 工作量 • VHDL综合器完成的工作量大,设计者的工作相对较少 • Verilog HDL需要设计者搞清除具体电路结构,工作量较大
学习HDL的注意事项 • 用硬件电路的设计思想来编写HDL • 充分理解HDL语句与硬件电路的关系 • 编写HDL就是描述一个电路 • 了解HDL的可综合性 • HDL有两种实现:系统仿真、硬件实现 • 要硬件实现,就必须保证程序“可综合” • 所有的HDL描述都可以用于仿真,但不是所有的HDL描述都能用来硬件实现
Verilog HDL • Verilog HDL 入门 • Verilog HDL的建模 • Verilog HDL的综合 • Verilog HDL仿真和时序 • 设计实例
Verilog HDL 入门 • Verilog HDL 语言要素 • 数据类型 • 表达式
Verilog HDL 语言要素 • 标识符 • 字母、数字、$、_、 • 第一个字符为字母或_ • 区分大小写 • 转义标识符用“\”开头 • Verilog HDL定义了一系列保留字(小写) Count COUNT _R1_D2 R56_68 FIVE$ 56R_X BUF-ABC Five_<6>
Verilog HDL 语言要素(续) • 注释 • 本行注释 • // 注释语句 • 多行注释 • /*注释语句*/ • 格式 • 自由格式,可以跨行编写,也可以一行多语句 module fa_1(A,B,Cin,Sum,Cout); input A,B,Cin; output Sum,Cout; wire S1,T1,T2,T3; module fa_1(A,B,Cin,Sum,Cout); input A,B,Cin; output Sum,Cout; wire S1,T1,T2,T3;
Verilog HDL 语言要素(续) • 系统任务和函数 • 以$字符开始的标识符表示系统任务或系统函数 • $display 显示 • $time 返回当前的模拟时间 • 编译指令 • 以`(反引号)开始的标识符是编译命令 • `timescale 定义时延单位和精度
数据类型 • 物理数据类型 • 连线型(wire)、寄存器型(reg) • 抽象数据类型 • 整型、时间型、实型、参数型 integer count; integer k[1:64]; time start,stop; real stime; Parameter c=25,f=9; Integer,real,time都归为寄存器型
数据类型(续) • 数据取值 • Verilog HDL有下列四种基本取值 • 0 逻辑0(假) • 1 逻辑1(真) • x 未知 • z 高阻 • x和z不分大小写 • 在有些场合z的值通常解释成x
连线型(wire) • 连线型数据对应的是硬件电路中各种可能的物理信号连线,没有电荷保持作用(trireg除外)。 • 连线型数据必须有驱动源的驱动 • 连接到门或模块的输出 • 用assign语句赋值 • 没有驱动源驱动,将保持高阻态
连线型(wire) • Verilog HDL提供了多种连线型数据 • wire,tri 连线、三态线 • wor,trior 线或、三态线或 • wand,triand 线与、三态线与 • trireg 具有电荷保持特性 • tri1,tri0 上拉(下拉)电阻 • supply1,supply0 电源线 逻辑0(逻辑1)
连线型(wire) • wire,tri • 如果有多个驱动源驱动一个连线(三态线),则连线型的有效值由表决定
连线型(wire) • wor,trior • 如果有多个驱动源驱动一个连线(三态线),则连线型的有效值由表决定
连线型(wire) • wand,triand • 如果有多个驱动源驱动一个连线(三态线),则连线型的有效值由表决定
连线型(wire) • trireg • 存储数值,用于电容节点的建模 • tri1,tri0 • 用于线逻辑的建模 • 无驱动时tri1(tri0)为1(0) • supply1,supply0 • 用于电源(地)的建模
连线型(wire) • 未说明的连线型 • 缺省连线类型为1位连线 • 向量和标量连线 • 用vectored表示向量连线 • 用scalared表示标量连线 • 向量连线只能整体赋值 • 缺省为标量 wire vectored [3:1] a; wire scalared [3:1] b; (wire [3:1] b;)
连线型(wire) wire a1; //连线型数据 a1 tri [3:0] b; //4位三态总线 trireg store_a; //具有电荷存储的连线 Tri1 [15:0] data_bus; //16位具有上拉电阻的三态总线 wor b1; //具有线或的连线
寄存器型(reg) • 寄存器型数据对应具有状态保持作用的硬件电路元件 • 触发器、锁存器 • 若寄存器未初始化,为x状态 • 缺省值为1(位)
寄存器型(reg) • 寄存器型数据有5种 • reg 寄存器 • interger 整数 • time 时间寄存器 • real 实数寄存器 • realtime 实数时间寄存器
寄存器型(reg) • reg • 最常见的数据类型 • 存储器 • 寄存器数组 reg cnt; //1位寄存器 reg [3:0] v; //4位寄存器 reg [0:3] mymem [0:63]; //64个4位寄存器的数组 reg bog [1:5]; //5个1位寄存器的数组
寄存器型(reg) Reg a; //寄存器 reg [0:3] a1; //4位寄存器 Reg [0:3]mymem [0:63]; //64个4位寄存器的数组 reg bog [1:5]; //5个1位寄存器的数组 reg [1:5] bog; //5位寄存器
数据类型(续) • 寄存器型数据与连线型数据的区别: • 寄存器型数据保持最后一次的赋值 • 连线型数据需要持续的驱动
表达式 • 表达式是由操作数和操作运算符组成 • 可以在出现数据的任何地方使用
操作数 • 可以有参数、连线、寄存器(整型、时间型、实型)、位选择等 • 也可以有常量、变量和函数 • Verilog HDL中有三类常量: • 整型 • 实数型 • 字符串型
操作数(续) 695 //简单的十进制数格式 ‘h 87fe //缺省位宽的16进制 ‘o746 //缺省位宽的8进制 4’b1001 //4位宽度的二进制数 5’d3 //5位宽度的十进制数 12’hx //12位宽度的未知数 16’hz //16位宽度的高阻态 16’b0001_1010_1111_1000 //提高可读性 4af b001 8’b_0001_1010 4’d-4 4’haf ‘b001 8’b0001_1010 -4’d4
运算符 • Verilog HDL定义了九类运算符 • 算术运算符 • 逻辑运算符 • 关系运算符 • 相等运算符 • 按位运算符 • 规约运算符 • 移位运算符 • 条件运算符 • 连接运算符
算术运算符 • 加(+) • 减(-) • 乘(*) • 除(/) • 取模(%) module arith_test; reg [3:0] a,b; initial begin a=4’b1100; //12 b=4’b0011; //3 $display(a*b); //4’b0100 $display(a/b); //4 $display(a+b); //15 $display(a-b); //9 $display((a+1b’1)%b); //1 end endmodule
算术运算符(续) • 如果算术操作符中的任意操作数是x或z,那么整个结果为x • ‘b10x1+’b01111的结果为’bxxxxx • Verilog HDL规定:表达式中的所有中间结果应取最大的操作数长度 • 无符号数和带符号数 • 连线、一般寄存器存储无符号数 • 整数寄存器、十进制形式的整数存储带符号数
算术运算符(续) reg [0:5] bar; integer tab; …. bar =-4’d12; Tab =-4’d12; …. bar =-4’d12/4; Tab =-4’d12/4; …. bar =4-6; Tab =4-6;
逻辑运算符 • 与(&&) • 或(||) • 非(!) • 必须把操作数当作一个整体 module logical_test; reg [3:0] a,b,c; initial begin a=2;b=0;c=4’hx $display(a&&b); //0 $display(a||b); //1 $display(!a); //0 $display(a||b); //1 $display(!c); //x end endmodule
关系运算符 • 小于(<) • 大于(>) • 小于等于(<=) • 大于等于(>=) module relat_test; reg [3:0] a,b,c,d; initial begin a=2;b=5;c=2;d=4’hx $display(a<b); //1 $display(a>b); //0 $display(a>=c); //1 $display(d<=a); //x end endmodule
相等关系运算符 module equ_test; reg [3:0] a,b,c,d,e,f; initial begin a=4;b=7; c=4’b010; d=4’hx10; e=4’bx101; f=4’bxx01; $display(c); //0010 $display(d); //xx10 $display(a==b); //0 $display(c!=d); //x $display(c!=f); //1 $display(d===e); //0 $display(c!==d); //1 end endmodule • 相等(==) • 不等(!=) • 全等(===) • 不全等(!==)
按位运算符 • 与(&) • 或(|) • 非(~) • 异或(^) • 异或非(^~,~^) module bit_test; reg [3:0] a,b,c; initial begin a=4’b1100; b=4’b0011; c=4’b0101; $displayb(~a); //4’b0011 $displayb(a&c); //4’b0100 $displayb(a|b); //4’b1111 $displayb(b^c); //4’b0110 $displayb(a~^c); //4’b0110 end endmodule
归约运算符 • 与(&) • 或(|) • 与非(~&) • 或非(~|) • 异或(^) • 异或非(^~,~^) module reduct_test; reg [3:0] a,b,c; initial begin a=4’b1111; b=4’b0101; c=4’b0011; $displayb(&a); //1 $displayb(|b); //1 $displayb(^b); //0 end endmodule
移位运算符 • 左移(<<) • 右移(>>) module shift_test; reg [3:0] a; initial begin a=4’b1010; $displayb(a<<1); //4’b0100 $displayb(a>>2); //4’b0010 end endmodule
条件运算符 • 操作数1 ?操作数2:操作数3 • 操作数1的值为逻辑值 • =1,返回操作数2 • =0,返回操作数3 • 操作数1的值为x或z,则操作数2和操作数3如表所示,按位比较
连接和复制操作 module concat_test; reg a; reg [1:0] b; reg [5:0] c; initial begin a=1’b1; b=2’b00; c=6’b101001; $displayb({a,b}); //3’b100 $displayb({c[5:3],a); //4’b1011 end endmodule • Verilog HDL中用{ }实现多个表达式的连接,表达式之间用逗号(,)分隔
连接和复制操作(续) module concat_test; reg a; reg [1:0] b; reg [5:0] c; initial begin a=1’b1; b=2’b00; $displayb({4{a}}); //4’b1111 c={4{a}}; $displayb(c); //6’b001111 end endmodule • Verilog HDL还有复制运算符{{}},将第一个表达式放入双重括号中,将复制因子放在第一层括号中,用来指定复制的次数