讲数字集成电路设计与硬件描述语言.ppt_第1页
讲数字集成电路设计与硬件描述语言.ppt_第2页
讲数字集成电路设计与硬件描述语言.ppt_第3页
讲数字集成电路设计与硬件描述语言.ppt_第4页
讲数字集成电路设计与硬件描述语言.ppt_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六讲 数字集成电路设计 与硬件描述语言,浙大微电子 韩雁 ,2019/9/20,浙大微电子,2/86,大纲,数字IC设计方法 两种HDL语言 Verilog HDL简介 VHDL简介,2019/9/20,浙大微电子,3/86,当前的数字IC设计分可分成以下几个层次: 1. 算法级设计:利用高级语言(如C语言)及其他一些系统分析工具(如MATLAB)对设计从系统的算法级进行描述。算法级不需要包含时序信息。 2. RTL级设计:用信号在寄存器间传输的模式来对设计进行描述。 3. 门级设计:用逻辑门及门级之间的连线对设计进行描述。 4. 开关级设计:用晶体管及其连线来对设计进行描述。,2019/9/20,浙大微电子,4/86,数字IC一般采用自顶向下(TOP-DOWN)的设计方法 在系统级(顶层)进行功能的划分和架构设计 在功能级进行仿真、纠错,并用硬件描述语言对功能进行描述 用综合工具将设计转化为具体门级电路网表 物理级可以是FPGA器件或专用集成电路(ASIC) TOP-DOWN 设计思想,门级,功能级,系统级,TOP-DOWN 设计方法,2019/9/20,浙大微电子,5/86,电子设计规模越来越大(百万/千万门的量级),复杂度越来越高,只能用高级语言来描述其功能,在设计初期隐藏其具体的细节实现。 可读性强,易修改。 提高逻辑设计的效率,降低设计成本,更重要的是缩短设计周期。 HDL追求对硬件的描述,而将该描述在目标器件上实现则由EDA工具的综合器完成。 受限于目标器件,并不是所有HDL语句均可被综合。,2019/9/20,浙大微电子,6/86,VHDL和Verilog HDL是目前世界上流行最广的两种硬件描述语言,都是在20世纪80年代中期开发出来的。均为IEEE标准。 VHDL语法严谨,易于学习;逻辑综合能力强。在欧洲使用较多。 Verilog HDL语法灵活(类似C语言,较难掌握)底层综合出色。美国使用较多。,2019/9/20,浙大微电子,7/86,Verilog HDL是一种应用广泛的硬件描述语言,是IC硬件设计人员和EDA工具之间的桥梁。其功能为 编写设计文本(脚本) 建立电子系统行为级的仿真模型并进行仿真 自动综合生成数字逻辑网表(Netlist)及具体电路 生成某工艺条件下具体电路的延时模型并进行时序仿真 仿真验证无误后用于制造ASIC或写入FPGA器件中 常用的Verilog HDL开发软件有 Altera公司的MAX+PLUS II,Quartus II Xilinx公司的Foundation ISE,2019/9/20,浙大微电子,8/86,Verilog HDL语言的主要特征,1、语法结构上,与C语言有许多相似之处,并借鉴C语言的多种操作符 2、既包含高级程序设计语言的结构形式,同时也兼顾描述硬件线路连接的具体构件 3、通过使用结构级或行为级描述可以在不同的抽象层次上进行设计,2019/9/20,浙大微电子,9/86,4、Verilog HDL语言是并发的,即具有在同一时刻执行多任务的能力,因为在实际硬件中许多操作都是在同一时刻发生的。 而计算机编程语言往往是顺序执行的。,5、有时序概念,因为在硬件电路中从输入到输出总是有延迟存在的,2019/9/20,浙大微电子,10/86,数字电路可简单归纳为两种要素:连线和器件 Verilog HDL建模-使用硬件语言对数字电路的这两种基本要素进行描述。,2019/9/20,浙大微电子,11/86,Verilog HDL的基本结构,八位加法器的Verilog HDL源代码,module adder8 (cout, sum, ina,inb, cin); output 7:0 sum; output cout; input 7:0 ina,inb; input cin; assign cout,sum= ina+inb+cin; endmodule,准备实现的逻辑功能,简单的Verilog HDL的例子,端口列表,逻辑功能描述 -描述内部特性,模块名,2019/9/20,浙大微电子,12/86,一.模块的概念,Verilog HDL模块的结构,模块是Verilog HDL语言的基本单元,数字系统用 模块集合的形式来描述 模块描述某个设计的功能、结构和与其它模块通信的外部端口 Verilog HDL中各个模块是并行运行的 模块可以调用其它模块的实体(实例),2019/9/20,浙大微电子,13/86,二.模块的结构,module () 端口说明(input,output,inout) 参数定义 /可选 数据类型定义 /wire、reg、task、function 连续赋值语句(assign)/组合逻辑 过程块(always和initial) -行为描述语句 低层模块实例 /调用其它模块 任务和函数 延时说明块 endmodule,2019/9/20,浙大微电子,14/86,模块端口(module ports),注意模块的名称DFF,端口列表及说明 模块通过端口与外部通信,端口在模块名字后的括号中列出,端口可以说明为input, output及inout,端口等价于硬件的引脚(pin),2019/9/20,浙大微电子,15/86,模块实例化(module instances),module DFF (d, clk, clr, q, qb); endmodule module REG4( d, clk, clr, q, qb); output 3: 0 q, qb; input 3: 0 d; input clk, clr; DFF d0 (d 0, clk, clr, q 0, qb 0); DFF d1 (d 1, clk, clr, q 1, qb 1); DFF d2 (d 2, clk, clr, q 2, qb 2); DFF d3 (d 3, clk, clr, q 3, qb 3); endmodule,REG4有模块DFF的四个实例,2019/9/20,浙大微电子,16/86,语言的主要特点,将模块的实例通过端口连接起来构成一个大的系统 每个实例都有自己的名字(d0, d1, d2, d3)。实例名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。 实例中端口的次序与模块定义的次序相同。 模块实例化与程序调用不同。每个实例都是模块的一个完全的拷贝,相互独立、并行。,模块实例化(module instances):,2019/9/20,浙大微电子,17/86,时延,信号在电路中传输会有传播延时,如线延时、器件延时等 assign # 2 B = A; 表示 B信号在2个时间单位后得到A信号的值 所有时延都必须根据时间单位进行定义 定义方式为在文件头添加语句: timescale 1ns /100ps 其中timescale 是Verilog HDL 提供的预编译处理命令,1ns 表示时间单位是1ns,100ps表示时间精度是100ps 根据该命令,编译工具可以认知 #2 为2ns,2019/9/20,浙大微电子,18/86,2019/9/20,浙大微电子,19/86,空白符和注释,module MUX2_1 (out, a, b, sel); / Port declarations output out; input sel, / control input b, /* data inputs */ a; /* The netlist logic selects input ”a” when sel = 0 and it selects ”b” when sel = 1. */ not (sel_, sel); and (a1, a, sel_), (b1, b, sel); or (out, a1, b1); endmodule,格式自由 一条语句可多行书写;一行可写多个语句。空白(新行、制表符、空格)没有特殊意义。 如input A;input B; 与input A; input B;是一样的。 使用空白符提高可读性Verilog忽略空白符,多行注释,在/* */内,单行注释 到行末结束,2019/9/20,浙大微电子,20/86,Verilog采用的四值逻辑系统,0, Low, False, Logic Low, Ground, 1, High, True, Logic High, Power, VDD, X Unknown: Occurs at Logic Which Cannot be Resolved Conflict HiZ, High Impedance, Tri- Stated,2019/9/20,浙大微电子,21/86,具体实例,5 O37 5位八进制数(二进制 11111 ) 4 D2 4位十进制数 (二进制0010) 4 B1x_01 4位二进制数 7 Hx 7位x (扩展的x), 即xxxxxxx 4 hZ 4 位z (扩展的z) , 即zzzz 4 d-4 非法:数值不能为负 8 h 2A 在位长和基数之间,以及基数和数值之间允许出现空格 3 b 001 非法: 和基数b 之间不允许出现空格 (2+3) b10 非法:位长不能为表达式,2019/9/20,浙大微电子,22/86,字符串(string),格式符,转义符,2019/9/20,浙大微电子,23/86,标识符(identifiers),标识符是用户在描述时给对象起的名字 标识符必须以字母(a-z, A-Z)或( _ )开头,后面可以是字母、数字、( $ )或( _ )。 最长可以是1023个字符 标识符区分大小写,sel和SEL是不同的标识符 模块、端口和实例的名字都是标识符 module MUX2_1 (out, a, b, sel); output out; input a, b, sel; not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (out, a1, b1); endmodule,Verilog标识符,2019/9/20,浙大微电子,24/86,标识符(identifiers),有效标识符举例: shift_reg_a busa_index _bus3 无效标识符举例: 34net / 开头不是字母或“_” a*b_net / 包含了非字母或数字, “$” “_” n238 /包含了非字母或数字, “$” “_” Verilog区分大小写,所有Verilog关键词使用小写字母,2019/9/20,浙大微电子,25/86,书写规范建议,A、用有意义的名字如 Sum 、CPU_addr等。 B、用下划线区分词。 C、采用一些前缀或后缀,如时钟采用Clk 前缀:Clk_50,Clk_CPU;低电平采用_n 后缀:Enable_n; D、统一缩写, 如全局复位信号 Rst。 E、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致。 F、自定义的标识符不能与保留字同名。 G、参数采用大写,如SIZE,2019/9/20,浙大微电子,26/86,主要变量类型,net (线网) : 表示器件之间的物理连接 register (寄存器) :表示存储元件 parameters(参数) : 运行时的常数,Verilog主要有三类数据类型:,2019/9/20,浙大微电子,27/86,net(线网),net需要被持续的驱动,驱动它的可以是门和模块。 当net驱动器的值发生变化时, 会自动将新值传送到net上。在例子中,线网out由or门驱动。当or门的输入信号变化时将传输到线网net上。,2019/9/20,浙大微电子,28/86,net类的类型(线网),wire类型是最常用的类型,只有连接功能。 wire常用来表示用assign语句赋值的组合逻辑信号 取值为:0,1,x(不定值),z(高阻) wire和tri类型有相同的功能。用户可根据需要将线网定义为wire或tri以提高可读性。例如,可以用tri类型表示一个net有多个驱动源,或者指示这个net可以是高阻态 Z (hign-impedance)。,2019/9/20,浙大微电子,29/86,wire型变量的定义,语法: wire 数据1,数据2,数据n; 例子: wire a,b,c/定义了三个wire型变量a,b,c wire7:0 databus/定义了八位宽wire型向量数据总线 wire20:1 addrbus /定义了20位宽wire型向量地址总线,2019/9/20,浙大微电子,30/86,寄存器类 (register),寄存器类型在赋新值以前保持原值 用行为描述结构给寄存器类型赋值(在过程块中进行) 寄存器类型大量应用于行为描述及激励描述 reg_a、reg_b、reg_sel用于施加激励给2:1多路器,2019/9/20,浙大微电子,31/86,寄存器类的类型,寄存器类有四种数据类型,2019/9/20,浙大微电子,32/86,Verilog中net和register声明语法,举例: reg a; /一个标量寄存器 reg 3: 0 v; / 从MSB到LSB的4位寄存器向量 reg 7: 0 m, n; / 两个8位寄存器 tri 15: 0 busa; / 16位三态总线 wire 0: 31 w1, w2; / 两个32位wire,MSB为bit0,2019/9/20,浙大微电子,33/86,选择正确的数据类型,输入端口可以由net/register驱动,但输入端口只能是net,输出端口可以是net/register类型,输出端口只能驱动net,in1,in2,O,A,B,Y,双向端口只能是net类型,2019/9/20,浙大微电子,34/86,操作符类型,Verilog操作符。“与”操作符的优先级总是比相同类型的“或”操作符高,最高,最低,优先级,2019/9/20,浙大微电子,35/86,相等操作符,注意逻辑等与 case等的差别,逻辑等,=,case等,=,2b1x=2b0x 值为0,因为不相等 2b1x=2b1x 值为x,因为可能不相等,也可能相等,2b1x=2b0x 值为0,因为不相同 2b1x=2b1x 值为1,因为相同,a = 2b1x; b = 2b1x; if (a = b) $display(“ a is equal to b“); else $display(“ a is not equal to b“);,a = 2b1x; b = 2b1x; if (a = b) $display(“ a is identical to b“); else $display(“ a is not identical to b“);,Case等只能用于行为描述,不能用于RTL描述。综合工具不支持,2019/9/20,浙大微电子,36/86,级联操作符,级联, ,可以从不同的矢量中选择位并用它们组成一个新的矢量。 用于位的重组和矢量构造,module concatenation; reg 7: 0 rega, regb, regc, regd; reg 7: 0 new; initial begin rega = 8b0000_0011; regb = 8b0000_0100; regc = 8b0001_1000; regd = 8b1110_0000; end initial fork #10 new = regc 4: 3, regd 7: 5, regb 2, rega 1: 0; / new = 8b11111111 #20 $finish; join endmodule,2019/9/20,浙大微电子,37/86,1、Verilog HDL语言提供了十多条的编译指令,例如: define include timescale,编译指令以(反引号)开头。 编译指令结束不需要加分号。 编译指令对同一个文件中的所有模块有效。 在进行Verilog HDL语言编译时,已定义的编译指令一直有效,直至有其它编译指令修改它或取消它,2、说明,编译预处理,2019/9/20,浙大微电子,38/86,timescale 说明时间单位及精度 格式:timescale / 如:timescale 1 ns / 100 ps timescale必须在模块之前出现 timescale 1 ns / 10 ps / All time units are in multiples of 1 nanosecond module MUX2_1 (out, a, b, sel); output out; input a, b, sel; not #1 not1( sel_, sel); and #2 and1( a1, a, sel_); and #2 and2( b1, b, sel); or #1 or1( out, a1, b1); endmodule,2019/9/20,浙大微电子,39/86,Timescale,time_precision不能大于time_unit precision的时间单位应尽量与设计的实际精度相同 precision是仿真器的仿真时间步长 若time_unit与precision_unit差别很大将严重影响仿真速度 timescale 1s / 1ps,则仿真器在1秒内要扫描其事件序列1012次;而timescale 1s/1ms则只需扫描103次。 如果没有timescale说明将使用缺省值,一般是ns,2019/9/20,浙大微电子,40/86,Verilog HDL语句模块的描述方法,2019/9/20,浙大微电子,41/86,结构型描述,术语及定义 结构描述 : 用门来描述器件的功能,是通过实例进行描述的,将预定义的基本元件实例嵌入到语言中,监控实例的输入,一旦其中任何一个发生变化便运算并输出。 primitives(基本单元) : Verilog语言已定义的具有基本逻辑功能的模型(models),2019/9/20,浙大微电子,42/86,结构描述,结构描述表示一个逻辑图 结构描述用已有的元件构造更为复杂的元件,module rs_latch (y, yb, r, s); output y, yb; input r, s; nor n1( y, r, yb); nor n2( yb, s, y); endmodule,2019/9/20,浙大微电子,43/86,Verilog基本单元(primitives),Verilog基本单元提供基本的逻辑功能,这些逻辑功能是预先定义的,用户不需要再定义这些基本功能 基本单元是Verilog 库的一部分,基本单元库是自下而上(Bottom Up)设计方法的一部分,2019/9/20,浙大微电子,44/86,调用基本单元的句法:,可以只有一个输出,语法:门类型关键字 (端口列表) 其中端口列表为: 多输入门:(输出,输入1,输入2,) 多输出门:(输出1,输出2,输入) 三态门: (输出,输入,使能输入),2019/9/20,浙大微电子,45/86,带条件的基本单元,Verilog有四种不同类型的条件基本单元 这四种基本单元只能有三种引脚:output, input, enable 这些单元由enable引脚使能。 当使能信号无效时,输出高阻态。,2019/9/20,浙大微电子,46/86,基本单元实例化,在端口列表中,先说明输出端口,然后是输入端口 实例化时实例的名字是可选项 and (out, in1, in2, in3, in4); / unnamed instance buf b1 (out1, out2, in); / named instance 延时说明是可选项。所说明的延时是固有延时。输出信号经过该延时才变化。没有说明时延时为0。 notif0 #3.1 n1 (out, in, cntrl); / delay specified,2019/9/20,浙大微电子,47/86,模块实例化(module instantiation),模块实例化时实例必须有一个名字。 使用位置映射时,端口次序与模块的说明相同。 使用名称映射时,端口次序与位置无关 没有连接的输入端口初始化值为x。,module comp (o1, o2, i1, i2); output o1, o2; input i1, i2; . . . endmodule module test; comp c1 (Q, R, J, K); / Positional mapping comp c2 (.i2(K), .o1(Q), .o2(R), .i1(J); / Named mapping comp c3 (Q, , J, K); / One port left unconnected endmodule,名称映射的语法: .内部信号(外部信号),没有连接时通常会产生警告,2019/9/20,浙大微电子,48/86,行为描述,行为级描述是对系统的高抽象级描述。 在这个抽象级,注重的是整个系统的功能而不是实现。 Verilog将高级编程语言结构用于行为描述,包括: wait, while, if then, case和forever,2019/9/20,浙大微电子,49/86,过程(procedural)块,过程块是行为描述的基础 过程块有两种: initial块,只能执行一次 always块,循环执行,2019/9/20,浙大微电子,50/86,initial过程块,(1) initial 块语句模板:,initial begin 语句1; 语句2; end,(2)例,initial begin #2 Stream = 1; #5 Stream = 0; #3 Stream = 1; #4 Stream = 0; #2 Stream = 1; #5 Stream = 0; end,(3)说明:,0时刻开始执行,只执行一次,同一模块内的多个initial过程块,0时刻开始并行执行,主要面向功能模拟,通常不具有可综合性。,initial过程块不能嵌套使用。,initial语句中的积累延时,2019/9/20,浙大微电子,51/86,always过程块,always块语句模板 always () begin /过程赋值 /if语句 /case语句 /while,repeat,for 语句 /task,function调用 end,当表达式的值改变时 就执行一遍块内语句,always过程块不能嵌套使用。,2019/9/20,浙大微电子,52/86,posedge与negedge关键字,上升沿,下降沿,例:同步时序电路的时钟信号为clk,clear为异步清0信号。 敏感信号可写为: /上升沿触发,或高电平清0时 always (posedge clk or posedge clear) Begin 。 end /上升沿触发,或低电平清0时 always (posedge clk or negedge clear) Begin 。 end,2019/9/20,浙大微电子,53/86,块语句,块语句用来将多个语句组织在一起,使得他们在语法上如同一个语句。块语句分为两类: 顺序块:置于关键字begin和end之间,块中的语句以顺序方式执行 并行块:置于关键字fork和join之间,块中语句并行执行。,Fork和join语句常用于test bench描述。这是因为可以一起给出矢量及其绝对时间,而不必描述所有先前事件的时间。,2019/9/20,浙大微电子,54/86,块语句(续),在顺序块中,语句一条接一条地计算执行。 在并行块中,所有语句在各自的延迟之后立即计算执行。,begin #5 a = 3; #5 a = 5; #5 a = 4; end,fork #5 a = 3; #15 a = 4; #10 a = 5; join,上面的两个例子在功能上是等价的。Fork-join例子里的赋值故意打乱顺序是为了强调顺序是没有关系的。 注意fork-join块是典型的不可综合语句,并且在一些仿真器时效率较差。,2019/9/20,浙大微电子,55/86,循环(looping)语句,有四种循环语句: repeat:将一块语句循环执行确定次数。 repeat (次数表达式) while:在条件表达式为真时一直循环执行 while (条件表达式) forever:重复执行直到仿真结束 forever for:在执行过程中对变量进行计算和判断,在条件满足时执行 for(赋初值;条件表达式;计算) ,2019/9/20,浙大微电子,56/86,循环(looping)语句,语法: for ( ; ; ) 循环体语句或语句块; 执行过程: (1)执行“变量赋初值语句” (2)判断“条件表达式”, 真:执行“循环体语句或语句块”,继续执行第(3)步 假:循环结束,退出。 (3)执行“变量增值语句”,转到(2)继续执行。,2019/9/20,浙大微电子,57/86,例 数据选择器的数据流型描述。,module mux2x1_df (A, B, select, OUT); input A, B, select; output OUT; assign OUT = select ? B : A; endmodule,数据流型描述,条件运算符,是一种描述组合逻辑功能的方法,用assign连续赋值语句来实现,连续赋值语句完成如下的组合功能:等式右边的所有变量受持续监控,每当这些变量中有任何一个发生变化,整个表达式被重新赋值并送给等式左端,数据流型建模,2019/9/20,浙大微电子,58/86,语句的顺序执行与并行执行,assign语句之间:并行执行(同时执行) 过程块之间( always, initial ):并行执行 assign语句与过程块之间:并行执行 模块中的门的实例、模块实例语句:并行执行 过程块( always, initial )内部,2019/9/20,浙大微电子,59/86,混合描述的1位全加器,module full_add5(a,b,cin,sum,cout); input a,b,cin; output sum,cout; reg cout,m1,m2,m3; /在always块中被赋值的变量应定义为reg型 wire s1; xor x1(s1,a,b); /调用门元件 always(a or b or cin) /always块语句 begin m1=a /assign持续赋值语句 endmodule,2019/9/20,浙大微电子,60/86,可综合设计,可综合指的是所设计的指令和代码能转化为具体的电路网表结构。综合过程就是将Verilog HDL语言描述的行为级或数据流电路模型转化为RTL级功能块或门级电路网表的过程。而不可综合的设计主要用于设计的仿真验证。,行为级或数据流电路建模,RTL级功能块,逻辑优化,优化后的门级网表,RTL级综合,门级综合,RTL级综合得到由功能模块构成的电路结构 逻辑优化器以用户设定的面积和时间约束为目标优化电路网表 针对目标工艺产生优化后的电路门级网表结构,2019/9/20,浙大微电子,61/86,设计准则,1、将硬件的行为以合理的方式映射为一些进程。 2、对于每个进程完成的操作,尽量选择最有效的算法。 3、了解综合器的性能,特别是了解综合工具支持的Verilog HDL可综合子集。以合理的代码风格引导综合工具生成硬件 4、对于固定值的信号要用常量代替。 5、尽量共享复杂运算,可以共享的数据处理用函数和过程定义 6、明确指出过程的无关态,引导综合器进行优化。 7、使用能够满足需要的最小数据宽度。 8、用组合逻辑实现的电路和用时序逻辑实现的电路要分配到不同的进程中。,2019/9/20,浙大微电子,62/86,9、不要使用枚举类型的属性。 10、Integer应加范围限制。 11、通常的可综合代码应该是同步设计。 12、除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 13、不使用初始化语句;不使用带有延时的描述;不使用循环次数不确定的循环语句,如forever,while等。 14、用always过程描述组合逻辑,应在敏感信号列表中列出块中出现的所有输入信号。 15、所有的内部寄存器都应该能够被复位。在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位,因为该引脚的驱动功能最强,到所有逻辑单元的延时也基本相同,同样的道理,应尽量使用器件的全局时钟端作为系统外部时钟输入端。,设计准则(续),2019/9/20,浙大微电子,63/86,4、VHDL介绍,VHDL程序的基本单元与构成 例1. 多路选择器 entity mux is generic(m:TIME:=1ns); port(A,B,T: in BIT;Z: out BIT); end mux; 当条件T成立时, 输出A路信号; 当条件T不成立时, 输出B路信号,MUX,2019/9/20,浙大微电子,64/86,architecture connect of mux is begin Cale:process(A,B,T) variable tmpl,tmp2,tmp3:BIT; begin tmp1:=A and T; tmp2:=B and (not T); tmp3:=tmp1 or tmp2; Z=tmp3 after m; end process; end connect:,2019/9/20,浙大微电子,65/86,例2. 半加器,- The entity declaration entity Half_adder is port ( X Half_ Sum X: in Bit ; Y adder Carry Y: in Bit ; Sum : out Bit ; Carry : out Bit ) ; end Half_adder ;,2019/9/20,浙大微电子,66/86,- The architecture body : architecture Behavioral_description of Half_adder is begin process begin Sum = X xor Y after 5 Ns ; Carry = X and Y after 5 Ns ; wait on X , Y ; end process ; end Behavioral_description,Sum = X Y Carry = XY,2019/9/20,浙大微电子,67/86,例3,用半加器构造全加器,entity Full_adder is port ( A : in Bit ; B : in Bit ; Carry_in : in Bit ; S : out Bit ; Carry_out : out Bit ) ; end Full_adder ;,2019/9/20,浙大微电子,68/86,architecture Structure of Full_adder is - signal declarations signal Temp_sum : Bit ; signal Temp_carry_1 : Bit ; signal Temp_carry_2 : Bit ; - local component declarations component Half_adder port ( X : in Bit ; Y : in Bit ; Sum : out Bit ; Carry : out Bit ) ; end component ;,2019/9/20,浙大微电子,69/86,component Or_gate port (In1 : Bit : In2 : Bit ; Out1 : out Bit ) ; end component ; - component instantiation statements U0 : Half_adder port map ( X = A, Y = B, Sum = Temp_sum, Carry = Temp_carry_1 ) ; U1 : Half_adder port map ( X = Temp_sum , Y = Carry_in Sum = S , Carry = Temp _Carry_2 ) ; U2 : Or_gate port map ( In1 = Temp_carry_1, In2 = Temp_carry_2 , Out1 = Carry_out ) ; end structure ;,2019/9/20,浙大微电子,70/86,VHDL 结构 (实体+结构体),entity 实体名 is 说明语句; begin 实体语句部分; end 实体名; Architecture 结构体名 of 实体名 is 说明语句; begin 并行处理语句; end 结构体名;,说明模块的外观,说明模块的内部功能或结构 功能:多路选择器 结构:全加器,2019/9/20,浙大微电子,71/86,一个实体可以有多个不同的结构体 (比如有的速度快,有的硬件少) 所以:对应于同一实体的结构体不允许同名, 而对应于不同实体的结构体可以同名。 entity Full_adder is architecture Structure of Full_adder is architecture Structure1 of Full_adder is entity mux is architecture Structure of mux is,2019/9/20,浙大微电子,72/86,包(Package)、库(Library)、 配置(Configuration),在实体说明和结构体中说明的数据类型、常量和子程序等只对相应的结构体可见,而不能被其他设计实体使用。为了提供一组可被多个设计实体共享的类型、常量和子程序说明,VHDL提供了包(Package) 包用来单纯的罗列要用到的信号定义、常数定义、数据类型,元件语句、函数定义和过程定义等,它是一个可编译的设计单元,也是库结构中的一个层次,2019/9/20,浙大微电子,73/86,包(Package ),包分为包说明和包体两部分 包说明的一般形式是, Package包名 is 说明语句; end 包名; 包体的一般形式是: Package body包名 is 说明语句; end 包名;,包说明和相应包体的名称必须一致 包说明定义数据类型, 给出函数的调用说明 包体具体描述实现该函数功能的语句(即函数定义)和数据的赋值 这种分开描述的好处是,当函数的功能需要作某些调整时,只要改变包体的相关语句就行了,使重新编译的单元数目尽可能少,2019/9/20,浙大微电子,74/86,可见性,包体中的内容不能被其它VHDL元件引用,只对相应的包说明可见,而包说明中的内容才是通用的和可见的(当然还必须用use子句才能提供这种可见性)。 下面即为一个包说明及其相应包体的例子: Package Logic is type Three_level_logic is (0,1,z); function lnvert (input:Three_1evel_logic) return Three_1evel_logic; end logic;,函数说明(对外可见),2019/9/20,浙大微电子,75/86,package body Logic is function invert( input:Three_level_1ogic) return Three_level_logic is begin case lnput is when0 return1; when1 return0; whenz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论