1 / 51

Verilog HDL 数字集成电路设计原理与应用

Verilog HDL 数字集成电路设计原理与应用. 蔡觉平 西安电子科技大学微电子学院 jpcai@mail.xidian.edu.cn. 教材和参考书. 教材: 《 Verilog HDL 数字集成电路设计原理与应用 》 西安电子科技大学出版社 参考书: XXXXX. 第一章 Verilog HDL 数字集成电路设计方法概述. 多块印刷版系. 以元件为基础. 70 年代. 以单元为基础. 80 年代. 单片系统. 以 RTL 综合为基础. 90 年代. 片上系统. 以 IP 为基础. 当前. 数字集成电路的发展和设计方法的演变.

elliot
Download Presentation

Verilog HDL 数字集成电路设计原理与应用

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Verilog HDL数字集成电路设计原理与应用 蔡觉平 西安电子科技大学微电子学院 jpcai@mail.xidian.edu.cn Microelectronics School Xidian University

  2. 教材和参考书 • 教材:《Verilog HDL数字集成电路设计原理与应用》 西安电子科技大学出版社 • 参考书:XXXXX Microelectronics School Xidian University

  3. 第一章 Verilog HDL数字集成电路设计方法概述 Microelectronics School Xidian University

  4. 多块印刷版系 以元件为基础 70年代 以单元为基础 80年代 单片系统 以RTL综合为基础 90年代 片上系统 以IP为基础 当前 数字集成电路的发展和设计方法的演变 数字集成电路复杂度趋势 数字集成电路设计方法的演变 Microelectronics School Xidian University

  5. 集成电路的发展经过了三个主要阶段 • 第一次变革是在上世纪70年代:以加工制造为主导的IC(Integrated Circuit)产业发展的初级阶段,主流产品是简单微处理器(Micro Processor Unit, MPU)、存储器以及标准通用逻辑电路。 • 第二次变革是在上世纪80年代:是标准工艺加工线(Foundry)公司与IC设计公司共同发展的阶段,主流产品是MPU、微控制器(Micro Control Unit, MCU)及专用IC(Application-Specific IC, ASIC)。 • 第三次变革是在上世纪90年代:IC产业的“四业”开始分离,功能强大的通用型中央处理器(Central Processing Unit,CPU)和信号处理器(Digital Signal Processing,DSP)成为产业新的增长点。 • 第四次变革正在进行:IC产业开始以Fundry为主导,IP的使用广泛。 Microelectronics School Xidian University

  6. 硬件描述语言(HDL) • 产生基础:C、FORTRAN、Pascal等程序化设计语言,极大提高了计算机软件程序设计的效率和可靠性; • 硬件描述语言HDL(Hardware Description Language,HDL):它是一种高级程序语言,通过对数字电路和系统的语言描述,可以对数字集成电路进行设计和验证; • 主要功能:数字集成电路设计工程师可以根据电路结构的特点,采用层次化的设计结构,将抽象的逻辑功能用电路的方式进行实现。 Microelectronics School Xidian University

  7. 主要硬件描述语言 • 主要HDL语言:Gateway Design Automation公司的Verilog HDL;美国国防高级计划研究局(DARPA)设计的VHDL,美国国防部的基于面向对象的OO VHDL,美国杜克大学的DE VHDL,美国电气和电子工程师协会支持的VITAL等。 • 目前Verilog HDL和VHDL语言是目前主要的两种HDL语言,并分别在1995年和1987年被采纳为IEEE国际标准,广泛用于数字集成电路的设计和验证领域 Microelectronics School Xidian University

  8. System Verilog IEEE 1800-2005标准公开发表 Verilog-XL诞 生 80年代 2005 Verilog IEEE 1364- 2001标准公开发表 2001 Cadence公司购 买Verilog版权 1989 模拟和数字都适 用的Verilog标 准公开发表 1999 Verilog HDL 公开发表 1990 OVI提出了用来描述模拟电路的硬件描述语言Verilog-A 1996 有关Verilog HDL的全部权利移交OVI(Open Verilog International) 1990 VerilogIEEE1364-1995标准公开发表 1995 Verilog HDL发展 Microelectronics School Xidian University

  9. Verilog HDL国际标准 Microelectronics School Xidian University

  10. System Verilog VHDL 描述和抽象能力 系统级 Verilog 算法级 用VHDL建立ASIC模型库的基准 寄存器传输级 逻辑门级 VITAL 开关电路级 图1.4Verilog HDL和VHDL建模能力比较 Verilog HDL和VHDL Microelectronics School Xidian University

  11. Verilog HDL在数字集成电路设计中的优点 • 例1: 原理图方式 (b)32位总线与逻辑 (a)4位总线与逻辑 module aand32(a,b,c); input [31:0]a,b; output [31:0]c; reg [31:0] c; always @(a or b) c=a&b; endmodule module aand4(a,b,c); input [3:0]a,b; output [3:0]c; reg [3:0] c; always @(a or b) c=a&b; endmodule Verilog HDL描述方式 Microelectronics School Xidian University

  12. Verilog HDL在数字集成电路设计中的优点 module shiftregist4 (clk,din,Reset, qout); input clk,Reset,din; output [3:0] qout; reg [3:0] qout; always @(posedge clk or posedge Reset ) begin if(Reset) qout<=4’b0000; else begin qout[3]<=qout[2]; qout[2]<=qout[1]; qout[1]<=qout[0]; qout[0]<=din; end end endmodule • 例2: 4位移位寄存器 Microelectronics School Xidian University

  13. Verilog HDL在数字集成电路设计中的优点 • 例2: 8位移位寄存器 module shiftregist8 (clk,din, Reset,qout); input clk,Reset,din; output [7:0] qout; reg [7:0] qout; always @(posedge clk or posedge Reset ) begin if(Reset) qout<=8'b00000000; else begin qout[7:1]<=qout[6:0]; qout[0]<=din; end end endmodule Microelectronics School Xidian University

  14. 功能模块的可重用性 由于模块的可重用性对于硬件电路开发效率的提高至关重要。因此业界提出了数字集成电路的软核、硬核和固核的概念。 .(1)“软核”(Soft Core)一般是指经过功能验证、5000门以上的可综合Verilog HDL或VHDL 模型; (2) “固核”(Firm Core)通常是指在ASIC和FPGA器件上,经过综合验证、大于5000门以上的电路网表文件; (3) “硬核”(Hard Core)通常是指在ASIC器件上,经过验证正确的、大于5000门以上的电路结构版图掩模。 Microelectronics School Xidian University

  15. Verilog HDL数字集成电路设计流程中作用 Microelectronics School Xidian University

  16. 第二章Verilog HDL基础知识 Microelectronics School Xidian University

  17. 2.1 Verilog HDL语言要素 • 2.1.1空白符:空白符包括空格符(\b)、制表符(\t)、换行符和换页符。在编译和综合时,空白符被忽略。 例:initial begin a = 3’ b100; b = 3’b010; end 与相当 initial begin a = 3’ b100; b = 3’b010; end Microelectronics School Xidian University

  18. 2.1.2注释符 (1)单行注释:以“//”开始,Verilog HDL忽略从此处到行尾的内容。 (2)多行注释:多行注释以“/*”开始,到“*/”结束,Verilog HDL忽略其中的注释内容。 例:  单行注释 assign a=b & c; // 单行注释 多行注释 assign a[3:0]=b[3:0]&c[3:0;]; /*注释行1 注释行2 */ 非法多行注释:/*注释内容 /*多行注释嵌套多行注释*/ 注释内容*/ 合法多行注释:/*注释内容 //多行注释嵌套单行注释*/ Microelectronics School Xidian University

  19. 2.1.3标识符 在Verilog HDL中标识符(Identifier)被用来命名信号名、模块名、参数名等,它可以是任意一组字母、数字、$符号和 _(下划线)符号的组合。应该注意的是标识符的字母区分大小写,并且第一个字符必须是字母或者下划线。 例2.1-4:非法标示符 30count //标识符不允许以数字开头 out* //标识符中不允许包含字符* a+b-c //标识符中不允许包含字符+和- n@238 //标识符中不允许包含字符@ 例2.1-3:合法标示符 count COUNT //与count不同 _CC_G5 B25_78 SIX Microelectronics School Xidian University

  20. 2.1.3 转义标示符 Verilog HDL规定了转义标识符(Escaped Identifier)。采用转义标识符可以在一条标识符中包含任何可打印字符,转义标识符以“\”(反斜线)符号开头,以空白结尾(空白可以是一个空格、一个制表字符或换行符)。 例2.1-5: \ a+b=c \7400 \.*.$ \{******} \~Q \OutGate //与OutGate相同 Microelectronics School Xidian University

  21. 2.1.4关键字 Verilog HDL语言内部已经使用的词称为关键字或保留字,它是Verilog HDL语言内部的专用词,是事先定义好的确认符,用来组织语言结构,这些关键字用户不能随便使用。需注意的是,所有关键字都是小写的。 例如,ALWAYS不是关键字,它只是标识符,与always(关键字)是不同的。 关键字列表参见2.1.4节。 Microelectronics School Xidian University

  22. 2.1.5数值 • Verilog HDL有四种基本的逻辑数值状态 Microelectronics School Xidian University

  23. +/-<size>’< base_format >< number > • 整数及其表示 例2.1-7:错误的表示 4’d-4 //数值不能为负,有负号应放最左边 3’ b001 //’和基数b之间不允许出现空格 (4+4)’b11 //位宽不能是表达式形式 例2.1-6:正确的表示 8’b10001101 //位宽为8位的二进制数10001101 8’ha6 //位宽为8位的十六进制数a6 5’o35 //5位八进制数35 4’d6 //4位十进制数6 4’b1x_01 //4位二进制数1x01 Microelectronics School Xidian University

  24. 实数及其表示 (1)十进制表示法,采用十进制格式,小数点两边必须都有数字,否则为非法的表示形式。例如:3.0,4.54,0.2等等都是正确的,而5.就是错误扯,因为小数点两侧都必须要有数字。 (2)科学计数法。例如:564.2e2的值为56420.0 ,8.7E2的值为870.0(e不分大小写),3E-3的值为0.003。 例2.1-8 2.7 //十进制计数法 5.2e8 //科学计数法 3.5E-6 //科学计数法可用e或E表示,其结果相同 5_4582.2158_5896 //使用下划线提高可读性 6. //非法表示 .3e5 //非法表示 Microelectronics School Xidian University

  25. 2.2 数据类型 • 物理数据类型:连线型、寄存器型和存储器型数据类型; 信号强度表示数字电路中不同强度的驱动源,用来解决不同驱动强度存在下的赋值冲突: Microelectronics School Xidian University

  26. 2.2.1物理数据类型 • 1. 连线型 Microelectronics School Xidian University

  27. (1) wire和tri • (2) wor和trior Microelectronics School Xidian University

  28. 2.寄存器型: reg型是数据储存单元的抽象类型,其对应的硬件电路元件具有状态保持作用,能够存储数据,如触发器、锁存器等。 reg型变量常用于行为级描述,由过程赋值语句对其进行赋值。 reg型变量简单例子: reg a; //定义一个一位的名为a的reg变量 reg [3:0] b; //定义一个4位的名为b的reg型变量 reg[8:1]c,d,e; //定义了三个名称分别为c、d、e的8位的reg型变量 reg型变量一般为无符号数,若将一个负数赋给reg型变量,则自动转换成其二进制补码形式。例如: reg signed[3:0] rega; rega=-2; //rega的值为1110(14),是2的补码 Microelectronics School Xidian University

  29. 2.2.2连线型和reg型数据类型的声明 • 连线型数据类型的声明 <net_declaration><drive_strength><range><delay>[list_of_variables]; • net_ declaration包括 wire、tri、tri0、tri1、wand、triand、trior、wor中的任意一种。 • range:用来指定数据为标量或矢量。若该项默认,表示数据类型为1位的标量,超过1位则为矢量形式。 • delay:指定仿真延迟时间。 • list_of_variables:变量名称,一次可定义多个名称,之间用逗号分开。 • drive_strength:表示连线变量的驱动强度。 Microelectronics School Xidian University

  30. 寄存器型数据类型的声明 reg<range><list_of_register_variables>; • range为可选项,它指定了reg型变量的位宽,缺省时为1位。 • <list_of_register_variables>为变量名称列表,一次可以定义多个名称,之间用逗号分开。 Microelectronics School Xidian University

  31. 例2.2-2 物理数据类型声明的例子 • reg rega; //定义一个1位的寄存器型变量 • reg [7:0] regb; //定义一个8位的寄存器型变量 • tri [7:0] tribus; //定义一个8位的三态总线 • tri0[15:0] busa; //定义一个16位的连线型,处于三态时为上拉电阻 • tri1[31:0] busb; //定义一个32为的连线型,处于三态时为下拉电阻 • reg scalared[1:4]b; //定义一个4位的标量型寄存器矢量 • wire(pull1,strong0)c=a+b;//定义一个1和0的驱动强度不同的1位连线型变量c • trireg(large) storeline; //定义一个具有大强度的电荷存储功能的存储线 Microelectronics School Xidian University

  32. 2.2.3存储器型 • 存储器型变量可以描述RAM型、ROM型存储器以及reg文件。 • 存储器变量的一般声明格式为: reg <range1><name_of_register><range2>; • range1和range2都是可选项,缺省都为1。 • <range1>:表示存储器当中寄存器的位宽,格式为[msb:lsb]。 • <range2>:表示寄存器的个数,格式为[msb:lsb],即有msb-lsb+1个。 • <name_of_register>为变量名称列表,一次可以定义多个名称,之间用逗号分开。 Microelectronics School Xidian University

  33. 例2.2-3: • reg[7:0] mem1[255:0];//定义了一个有 256个8位寄存器的存储器mem1 //地址范围是0到255。 • reg [15:0]mem2[127:0],reg1,reg2; //定义了一个具有128个16位寄存器的存储器mem2 //和两个16位的寄存器reg1和reg2 • 例2.2-4: • reg[n-1:0] a; //表示一个n位的寄存器a • reg mem1[n-1:0]; //表示一个由n个1位寄存器构成的存储器mem1 Microelectronics School Xidian University

  34. 2.2.4抽象数据类型 • 抽象数据类型主要包括整型(integer)、时间型(time)、实型(real)及参数型(parameter)。 • 整型 integer<list_of_register_variables>; • 例2.2-6: • integer index; //简单的32位有符号整数 • integer i[31:0] //定义了整型数组,它有32个元素 Microelectronics School Xidian University

  35. 时间型 • 时间型数据与整型数据相类似,只是它是64位的无符号数。时间型数据主要用于对模拟时间的存储与计算处理,常与系统函数$time一起使用。 • 时间型数据的声明格式为: time<list_of_register_variables>; • 例如:time a,b; //定义了两个64位的时间型变量 Microelectronics School Xidian University

  36. 实型:实型数据在机器码表示法中是浮点型数值,可用于对延迟时间的计算。实型:实型数据在机器码表示法中是浮点型数值,可用于对延迟时间的计算。 • 实型数据的声明格式如下: real<list_of_variables>; • 例如:real stime; //定义了一个实数型数据 • 参数型(parameter):属于常量,在仿真开始之前就被赋值,在仿真过程中保持不变,以提高程序的可读性和维护性。 • 参数类型的定义格式为: parameter 参数名1=表达式1,参数名2=表达式2,…,参数名n=表达式n; • 例2.2-7: parameter length=32,weight=16; parameter PI=3.14,LOAD=4’b1101; parameter DELAY=(BYTE+BIT)/2; Microelectronics School Xidian University

  37. 2.3 运算符和表达式 Microelectronics School Xidian University

  38. 2.3.1 算术操作符 • 加法(+);减法(-);乘法(*);除法(/);取模(%)。 • (1)算术操作结果的位宽 • 算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术操作结果的长度由操作左端目标长度决定。 • 例2.3-1: reg[3:0]A,B,C; reg[5:0]D; A=B+C; //4位 D=B+C; //6位 Microelectronics School Xidian University

  39. (2)有符号数和无符号数的使用 例2.3-2: module arith_tb; reg[3:0]a; reg[2:0]b; initial begin a=4'b1111; //15 b=3'b011; //3 $display("%b",a*b); //乘法运算,结果为4'b1101,高位被舍去 //等于45的低四位 $display("%b",a/b); //除法运算,结果为4'b0101 $display("%b",a+b); //加法运算,结果为4'b0010 $display("%b",a-b); //减法运算,结果为4'b1100 $display("%b",a%b); //取模运算,结果为4'b0000 end endmodule Microelectronics School Xidian University

  40. 2.3.2 关系操作符 • 大于“>”、 小于“<”、 大于等于“>=”和小于等于“<=”。 例2.3-3: module rela_tb; reg[3:0]a,b,c,d; initial begin a=3;b=6;c=1;d=4'hx; $display(a<b); //结果为真1 $display(a>b); //结果为假0 $display(a<=c); //结果为假0 $display(d<=a); //结果为未知数x end endmodule Microelectronics School Xidian University

  41. 2.3.3 相等关系操作符 • 等于“= =”、不等于“!=”、全等“= = =”、非全等“! = =” • 比较的结果有三种,即真“1”、假“0”和不定值“x” 例2.3-4: module equal_tb; reg[3:0]a,b,c,d; initial begin a=4'b0xx1; b=4'b0xx1; c=4'b0011; d=2'b11; $display(a==b); //结果为不定值x $display(c==d); //结果为真1 $display(a===b); //结果为真1 $display(c===d); //结果为假0 end endmodule 表2.3-2 (a)“==”运算符的真值表 表2.3-2 (b)“== =”运算符的真值表 Microelectronics School Xidian University

  42. 2.3.4 逻辑运算符 • 逻辑与运算符“&&”、逻辑或运算符“||”、逻辑非运算符“!” • 例如:寄存器变量a,b的初值分别为4’b1110和4’b0000,则:!a=0,!b=1,a&&b=0;a||b=1。 • 例如:a的初值分别为4’b1100,b的初值分别为4’b01x0,则!a=0,!b=x,a&&b=x,a||b=x。操作数中存在不定态x,则逻辑运算的结果也是不定态 Microelectronics School Xidian University

  43. 2.3.5 按位运算符 • 按位取反“~”、 按位与“&”、 按位或“|”、 按位异或^、按位同或^~ 例2.3-5: module bit_tb; reg[2:0]a; reg[4:0]b; initial begin a=5'b101; //运算的时候a自动变为5’b00101 b=5'b11101; $display("%b",~a); //结果为5'b11010 $display("%b",~b); //结果为5'b00010 $display("%b",a&b); //结果为5'b00101 $display("%b",a|b); //结果为5'b11101 $display("%b",a^b); //结果为5'b11000 end endmodule 按位与真值表 Microelectronics School Xidian University

  44. 2.3.6 归约运算符(缩位运算符) • 与“&”、 或“|”、 异或“^”,以及相应的非操作“~&”、“~|”、“~^”、“^~” 例2.3-6: module cut­_tb; reg[5:0]a; initial begin a=6'b101011; $display("%b",&a); //结果为1'b0 $display("%b",|a); //结果为1'b1 $display("%b",^a); //结果为1'b0 end endmodule Microelectronics School Xidian University

  45. 2.3.7 移位操作符 • 左移位运算符“<<”、 右移位运算符“>>”。 • 运算过程是将左边(右边)的操作数向左(右)移,所移动的位数由右边的操作数来决定,然后用0来填补移出的空位。 例2.3-7: module shift_tb; reg[5:0]a,b,c,d; reg[7:0]e; initial begin a=6'b101101; b=a<<2; c=a>>3; d=a<<7; e=a<<2; $display("%b",b); //结果为6'b110100 $display("%b",c); //结果为6'b000101 $display("%b",d); //结果为6'b000000 $display("%b",e); //结果为8'b10110100 end endmodule Microelectronics School Xidian University

  46. 2.3.8 条件运算符 • 表达形式如下: <条件表达式>?<表达式1>:<表达式2> • 条件表达式的计算结果有真“1”、假“0”和未知态“x”三种,当条件表达式的结果为真时,执行表达式1,当条件表达式的结果为假时,执行表达式2。 例2.3-8: module mux2(in1,in2,sel,out); input [3:0]in1,in2; input sel; output [3:0]out; reg [3:0]out; assign out=(!sel)?in1:in2; //sel为0时out等于in1,反之out等于in2 endmodule 2选1数据选择器 Microelectronics School Xidian University

  47. 2.3.9连接和复制运算符 例2.3-9: module con_rep_tb; reg [2:0]a; reg [3:0]b; reg [7:0]c; reg [4:0]d; reg [5:0]e; initial begin a=3'b101; b=4'b1110; c={a,b}; //连接操作 d={a[2:1],b[2:0]};/ /连接操作 e={2{a}}; //复制操作符 $display("%b",c); //结果8'b01011110 $display("%b",d); //结果5'b10110 $display("%b",e); /结果6'b101101 end endmodule • 连接运算符“{}”和复制运算符“{{}}” • 连接操作符 {信号1的某几位,信号2的某几位,…,信号n的某几位} • 重复操作符{{}}将一个表达式放入双重花括号中,复制因子放在第一层括号中。 Microelectronics School Xidian University

  48. 2.4 模块的基本概念 • 2.4.1模块的基本概念 • 模块(module)是Verilog HDL语言的基本单元,它代表一个基本的功能块,用于描述某个设计的功能或结构以及与其它模块通信的外部端口。 图2.4-1 模块结构组成图 Microelectronics School Xidian University

  49. 一个模块主要包括:模块的开始与结束、模块端口定义、模块数据类型说明和模块逻辑功能描述这几个基本部分。一个模块主要包括:模块的开始与结束、模块端口定义、模块数据类型说明和模块逻辑功能描述这几个基本部分。 • (1)模块的开始与结束:以关键词module开始,以关键词endmodule结束的一段程序,其中模块开始语句必须要以分号结束。 • (2)端口定义:用来定义端口列表里的变量哪些是输入(input)、输出(output)和双向端口(inout)以及位宽的说明。 • (3)数据类型说明:数据类型在语言上包括wire、reg、memory和parameter等类型,用来说明模块中所用到的内部信号、调用模块等的声明语句和功能定义语句。 • (4)逻辑功能描述:用来产生各种逻辑(主要是组合逻辑和时序逻辑)。主要包括以下部分:initial语句、always语句、其它子模块实例化语句、门实例化语句、用户自定义原语(UDP)实例化语句、连续赋值语句(assign)、函数(function)和任务(task)。 Microelectronics School Xidian University

  50. 例2.4-1 上升沿D触发器 module dff (din,clk,q,); input din,clk; output q; reg q; always@(posedge clk) q<=din; endmodule Microelectronics School Xidian University

More Related