EDA技术实用教程PPT教学课件-第5章_VHDL设计进阶.ppt_第1页
EDA技术实用教程PPT教学课件-第5章_VHDL设计进阶.ppt_第2页
EDA技术实用教程PPT教学课件-第5章_VHDL设计进阶.ppt_第3页
EDA技术实用教程PPT教学课件-第5章_VHDL设计进阶.ppt_第4页
EDA技术实用教程PPT教学课件-第5章_VHDL设计进阶.ppt_第5页
免费预览已结束,剩余96页可下载查看

下载本文档

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

文档简介

eda技术实用教程,第5章 vhdl设计进阶,第5章 vhdl设计进阶,教学内容: 5.1 数据对象 5.2 vhdl设计实例及其语法内涵 5.3 顺序语句归纳 5.4 并行赋值语句讨论 5.5 if语句概述 *5.7 仿真延时 *5.8 vhdl的rtl表述,教学要求:,通过对vhdl电路示例分析学习,进一步了解用vhdl表达和设计电路的方法,更深入理解vhdl语言现象和语句规则的特点。,5.1 数据对象data objects vhdl语言中,可以赋予一个质的对象就称为数据对象或客体。 数据对象主要包括以下三种: 常量(constant) 变量(variable) 信号(signal),常数就是对某一常数名赋予一个固定的值。 定义一个常数主要是为了使设计实体中的某些量易于阅读和修改。通常在程序开始前进行赋值,该值的数据类型在说明语句中说明。常数的数据类型和赋值定义后,在程序中不能改变,是全局量。 常数定义的一般表述如下: constant 常数名:数据类型 := 表达式 ; 例如: constant fbt : std_logic_vector := “010110“ ; - 标准位矢类型 constant datain : integer := 15 ; - 整数类型,5.1.1 常数(constant),常量的可视性规则:常量使用范围取决于它被定义的位置 常量定义语句所允许的设计单元有程序包、实体、结构体、块、进程和子程序。,变量只能在进程和子程序中用,是一个局部量,不能将信息带出对它做出定义的当前设计单元。变量的赋值是理想化数据传输,其赋值是立即生效的,不存在任何的延时行为(与信号不同)。 定义变量的一般表述: variable 变量名 : 数据类型 := 初始值 ; 例如: variable a : integer range 0 to 15 ; variable d : std_logic ; 变量赋值语句: 目标变量名 :=表达式,赋值语句 “:=” 右边的表达式必须与目标变量具有相同的数据类型,这个表达式可以是一个运算表达式也可以是一个数值。变量赋值语句左边的目标变量可以是单值变量,也可以是变量的集合。 如:位矢量类型的变量 variable x,y : integer range 15 downto 0 ; variable a,b : std_logic_vector(7 downto 0) ; x := 11 ; y := 2 + x ; - 运算表达式赋值,y 也是实数变量 a := b a (0 to 5) := b (2 to 7) ;,5.1.2 变量(variable),变量作为局部量,其适用范围仅限于定义了变量的进程或子程序的顺序语句中,信号是电子电路内部硬件连接的抽象。它可以作为设计实体中的并行语句模块间交流信息的通道。信号及其相关的延时语句明显地体现了硬件系统的特征。 信号定义语句的格式为: signal 信号名: 数据类型 := 初始值 ; 信号赋值语句表达式为: 目标信号名 = 表达式 ;,signal a,b,c,y,z: integer; . process (a,b,c) begin y = a + b ; z = c a ; y = b ; end process ;,5.1.3 信号(signal),信号的使用和定义范围是实体、结构体和程序包。 在进程和子程序中不允许定义信号。,符号 “=” 表示赋值操作,即将数据信息传入。数据信息传入时可以设置延时过程,这与器件的实际传播延时十分接近。因此信号值的代入采用“=”代入符,而不是像变量赋值时那样用“:”。 但信号定义时初始赋值符号“:”,即仿真的时间坐标是从赋初始值开始的。,信号signal 变量variable 基本用法 用于作为电路中的信号连线 用于作为进程中局部数据存储单元 适用范围 在整个结构体内的任何地方都能适用 只能在所定义的进程中使用 行为特性 在进程的最后才对信号赋值 立即赋值,表5-1 信号与变量赋值语句功能的比较,5.1.4 进程中的信号与变量赋值语句,变量赋值:局部特征,延时为零局部的、暂时性的数据对象,信号赋值:全局特性,有某种延时。(实体单元间数据传输载体),(6)信号赋值和变量赋值分别使用不同的赋值符号“=”和“:=”,信号类型和变量类型可以完全一致,也允许两者之间相互赋值,但要保证两者的类型相同。,信号与变量的区别,(1)信号赋值至少有延时,而变量赋值没有延时。,(2)信号除当前值外有许多相关的信息,而变量只有当前值。,(3)进程对信号敏感而对变量不敏感。,(4)信号可以是多个进程的全局信号;而变量只在定义它们的顺序域中可见(共享变量除外)。,(5)信号是硬件中连线的抽象描述,它们的功能是保存变化的数据和连接子元件,信号在元件的端口连接元件。变量在硬件中没有类似的对应关系,它们用于硬件特性的高层次建模所需要的计算中。,变量、常量、信号三者的比较:,()从硬件电路系统来看,常量相当于电路中的恒定电平如gnd或vcc接口,而变量和信号则相当于组合电路系统中门与门间的连接及其连线上的信号值。 ()从行为仿真和vhdl语句功能上看,变量和信号二者的区别主要表现在接受和保持信号的方式和信息保持与传递的区域大小上。例如信号可以设置延时量,而变量则不能;变量只能作为局部的信息载体,而信号则可作为模块间的信息载体。变量的设置有时只是一种过渡,最后的信息传输和界面间的通信都靠信号来完成 ()从综合后所对应的硬件电路结构来看,信号一般将对应更多的硬件结构,但在许多情况下,信号和变量并没有什么区别。例如在满足一定条件的进程中,综合后它们都能引入寄存器。这时它们都具有能够接受赋值这一重要的共性,而vhdl综合器并不理会它们在接受赋值时存在的延时特性。 ()虽然vhdl仿真器允许变量和信号设置初始值,但在实际应用中,vhdl综合器并不会把这些信息综合进去。因为实际的fpga/cpld芯片在上电后,并不能确保其初始状态的取向。因此,对于时序仿真来说,设置的初始值在综合时是没有实际意义的。,信号与变量的区别 请比较下面两个进程:,-第一个进程 signal a: integer :=5; signal b: integer :=10; process(a,b) begin a=b; b=a; end process; -第二个进程 process variable a: integer :=5; variable b: integer :=10; begin a:=b; b:=a; end process;,第一个进程执行后a=10,b=5 第二个进程进程执行后a=10,b=10,library ieee ; use ieee.std_logic_1164.all ; entity dff3 is port ( clk,d1 : in std_logic ; q1 : out std_logic); end ; architecture bhv of dff3 is begin process (clk) variable qq : std_logic ; begin if clkevent and clk = 1 then qq := d1 ; end if; q1 = qq; end process ; end ;,【例5-1】d触发器 使用变量赋值的时序电路设计,. . . architecture bhv of dff3 is signal qq : std_logic ; begin process (clk) begin if clkevent and clk =1 then qq = d1 ; end if; q1 = qq; end process ; end ;,【例5-2】d触发器 使用信号赋值的时序电路设计,library ieee ; use ieee.std_logic_1164.all ; entity dff3 is port ( clk,d1 : in std_logic ; q1 : out std_logic); end ; architecture bhv of dff3 is signal a,b : std_logic ; begin process (clk) begin if clkevent and clk = 1 then a = d1; b = a; q1 =b; end if; end process ; end ;,【例5-3】d触发器,library ieee ; use ieee.std_logic_1164.all ; entity dff3 is port ( clk,d1 : in std_logic ; q1 : out std_logic); end ; architecture bhv of dff3 is begin process (clk) variable a,b : std_logic ; begin if clkevent and clk =1 then a:= d1; b := a; q1 = b; end if; end process ; end ;,【例5-4】d触发器,【例5-5】 signal in1,in2,e1, . : std_logic ; . process(in1,in2, . . .) variable c1,. . . : std_logic_vector(3 downto 0) ; begin if in1 = 1 then . - 第 1 行 e1 = “1010“ ; - 第 2 行 . if in2 = 0 then . . . - 第 15+n 行 . c1 := “0011“ ; - 第 30+m 行 . end if; end process;,-信号与变量赋值的区别,信号的行为特性,*信号赋值需一个时间延时. *在进程中,所有赋值语句(包括变量赋值),都必须在一个时间中完成。 变量赋值语句在进程启动的瞬间立即完成更新。 信号赋值语句在进程启动的瞬间执行赋值,但是在一个延时后完成赋值(更新),并且必须在遇到“end process”语句发生。 *在进程中存在同一个信号有多个赋值源时,完成赋值,赋值对象的值更新的信号是最接近“end process”语句的信号,library ieee; use ieee.std_logic_1164.all; entity mux4 is port (i0, i1, i2, i3, a, b : in std_logic; q : out std_logic); end mux4; architecture body_mux4 of mux4 is signal muxval : integer range 7 downto 0; begin process(i0,i1,i2,i3,a,b) begin muxval q q q q null; end case; end process; end body_mux4;,错误!,【例5-6】 muxval定义为信号 设计4选1多路选择器,library ieee; use ieee.std_logic_1164.all; entity mux4 is port (i0, i1, i2, i3, a, b : in std_logic; q : out std_logic); end mux4; architecture body_mux4 of mux4 is begin process(i0,i1,i2,i3,a,b) variable muxval : integer range 7 downto 0; begin muxval := 0; if (a = 1) then muxval := muxval + 1; end if; if (b = 1) then muxval := muxval + 2; end if; case muxval is when 0 = q q q q null; end case; end process; end body_mux4;,【例5-7】 muxval定义为变量 设计4选1多路选择器,例5-6的rtl电路,例5-7的rtl电路,图5-3 例5-6中错误的工作时序,图5-4 例5-7中正确的工作时序,5.2 vhdl设计实例及其语法内涵 5.2.1 含同步并行预置功能的8位移位寄存器设计,工作时序,接下页,【例5-9】移位寄存器 library ieee; use ieee.std_logic_1164.all; entity shift is port (clk,c0:in std_logic; -时钟和进位输入 md:in std_logic_vector(2 downto 0); -移位模式控制字 d:in std_logic_vector(7 downto 0); -待加载移位的数据 qb:out std_logic_vector(7 downto 0); -移位数据输出 cn:out std_logic); -进位输出 end entity;,5.2.2 移位模式可控的8位移位寄存器设计,接上页,architecture behav of shift is signal reg : std_logic_vector(7 downto 0); signal cy : std_logic ; begin process (clk,md,c0) begin if clkevent and clk = 1 then case md is when “001“ = reg(0) reg(0) reg(7) reg(7) reg(7 downto 0) reg = reg ; cy = cy ; -保持 end case; end if; end process; qb(7 downto 0) = reg(7 downto 0); cn = cy; -移位后输出 end behav;,图5-6 例5-9中带进位循环左移仿真波形(md=“001“),md=“101“ 加载待移数,md=“001“ 带进位循环左移,md=“001”带进位循环左移 reg(0) = c0 ;-进位输入赋值reg最低位 reg(0)=1 reg(7 downto 1) = reg(6 downto 0);- reg=00110101 cy = reg(7); -cy=1,md=“101“加载待移数 reg(7 downto 0) = d(7 downto 0) -reg=d=10011010,5.2.3 位矢中1码个数统计电路设计,loop语句的常用表达方式有两种:,(1)单个loop语句,(2)for_loop语句,双向电路和三态控制电路设计,三态控制电路实现方法: 利用std_logic数据类型的z对变量赋值,即会引入三态门,并在控制下使其呈高阻态等效为三态门的禁止输出。,双向端口设计方法: 用inout端口模式设计双向端口,【例5-12】 library ieee;-8位三态控制门,使用高阻态数据z use ieee.std_logic_1164.all; entity tri_s is port (enable : in std_logic; datain : in std_logic_vector(7 downto 0); dataout : out std_logic_vector(7 downto 0); end tri_s ; architecture bhv of tri_s is begin process (enable , datain) begin if enable = 1 then dataout = datain ; else dataout =“zzzzzzzz“ ; end if ; end process; end bhv;,图5-13 8位3态控制门电路,5.2.4 三态门设计,【例5-13】 library ieee; use ieee.std_logic_1164.all; entity tri_state is port ( control: in std_logic; in1: in std_logic_vector(7 downto 0); q : inout std_logic_vector(7 downto 0); x : out std_logic_vector(7 downto 0); end tri_state; architecture body_tri of tri_state is begin process(control,q,in1) begin if (control = 0) then x = q ; else q = in1; x=“zzzzzzzz“ ; end if; end process; end body_tri;,5.2.5 双向端口设计方法,用inout模式设计双向端口必须考虑三态的使用:双向端口在完成输入功能时需使原来呈输出模式的端口呈高阻态。否则无法实现”双向“功能,?,输出,输入,图5-10 例5-13的仿真波形图,图5-9 例5-13的综合结果,control=0: x = q control=1: q = in1 , x = “z“;,?,【例5-14】 (以上部分同上例) process(control,q,in1) begin if (control=0) then x = q ; q = “zzzzzzzz“; else q = in1; x =“zzzzzzzz“; end if; end process; end body_tri;,图5-12 例5-14的仿真波形图,图5-11 例5-14的综合结果,control=0: x = q , q = “z“; control=1: q = in1 , x = “z“;,【例5-15】 -8位4通道的三态总线驱动器 library ieee; use ieee.std_logic_1164.all; entity tristate2 is port ( input3, input2, input1, input0 : in std_logic_vector (7 downto 0); enable:in std_logic_vector(1 downto 0); output:out std_logic_vector (7 downto 0); end tristate2 ;,5.2.6 三态总线电路设计,architecture multiple_drivers of tristate2 is begin process(enable,input3, input2, input1, input0 ) begin if enable = “00“ then output z); end if ; if enable = “01“ then output z); end if ; if enable = “10“ then output z); end if ; if enable = “11“ then output z); end if ; end process; end multiple_drivers;,*在同一进程中最好只放一个if语句结构(可包含嵌入的if语句),图5-13 例5-15错误的综合结果,建议: 同一进程中最好只放入一个if语句结构(可以包含嵌套的if的语句),【例5-16】 -8位4通道的三态总线驱动器(注:maxplusii不支持本例) library ieee; use ieee.std_logic_1164.all; entity tri2 is port (ctl : in std_logic_vector(1 downto 0); datain1, datain2,datain3, datain4 : in std_logic_vector(7 downto 0); q : out std_logic_vector(7 downto 0) ); end tri2; architecture body_tri of tri2 is begin q z) ; q z) ; q z) ; q z) ; end body_tri;,要设计能产生独立控制的多通道电路结构,必须使用并行语句,图5-14 例5-16正确的综合结果,5.2.7 双边沿触发时序电路设计讨论,process语句结构的一般表达格式: 进程标号: process ( 敏感信号参数表 ) is 进程说明部分 begin 顺序描述语句 end process 进程标号;,5.3 顺序语句归纳 进程语句在vhdl中使用最频繁、最能体现vhdl风格。 在一个结构体中可有任意多个进程语句,进程语句属于并行语句,进程语句内部是由顺序语句构成。 5.3.1 进程语句格式,process语句结构,进程说明,顺序描述语句,敏感信号参数表,信号赋值语句,变量赋值语句,进程启动语句,子程序调用语句,顺序描述语句,进程跳出语句,5.3.2 进程结构组成,进程说明: 定义局部量:包括数据类型、常数、变量、属性、子程序,不容许定义信号和共享变量,敏感信号参数表: 多数vhdl综合器要求在敏感信号参数表中列出本进程的所有输入信号名。,顺序描述语句:,信号赋值语句:在进程中计算或处理的结果向信号赋值 变量赋值语句:在进程中以变量的形式存储计算中间结果 进程启动语句:无敏感信号时通过wait语句启动进程 顺序描述语句:包括if、case、loop、null语句等 子程序调用语句:对已定义的过程和函数进行调用并参与计算 进程跳出语句:包括next、exit语句,用于控制进程运行方向,1. process为一无限循环语句,5.5.3 进程要点,进程的功能和执行情况: *基于cpu的纯软件的行为仿真运行方式 *基于vhdl综合器的综合结果所可能实现的运行方式 *基于最终实现的硬件电路的运行方式,对进程的认识和设计过程中应注意的方面:,进程的运行状态: 执行状态 等待状态,等待状态执行状态停止执行,返回起始 process等待状态,end process,敏感信号的变化,process(abc) begin case abc is when “0000“ = so so so so so null ; end case; end process;,process执行运行周期(启动执行到遇到end process停止执行): 从行为仿真角度看是一个时间 从综合和硬件执行角度看是0秒,2. process中的顺序语句具有明显的顺序/并行运行双重性,【例5-17】-信号是多个进程间的通信线 entity mul is port (a, b, c, selx, sely : in bit; data_out : out bit ); end mul; architecture ex of mul is signal temp : bit; begin p_a : process (a, b, selx) begin if (selx = 0) then temp = a; else temp = b; end if; end process p_a; p_b: process(temp, c, sely) begin if (sely = 0) then data_out = temp; else data_out = c; end if; end process p_b; end ex;,3. 进程语句本身是并行语句 4. 信号可以是多个进程间的通信线,5. 一个进程中只允许描述对应于一个时钟信号的同步时序逻辑,5.4 并行赋值语句讨论,(1) if 条件句 then 顺序语句 end if ;,(2) if 条件句 then 顺序语句 else 顺序语句 end if ;,5.5 顺序语句概述,是非完整性条件语句,通常用于产生时序电路,具有条件分支功能,是一种完整性条件语句,通常用于产生组合电路,if语句中的条件结果必须是boolean布尔类型值,if语句的类型:,(3) if 条件句 then if 条件句 then . end if end if,(4) if 条件句 then 顺序语句 elsif 条件句 then 顺序语句 . else 顺序语句 end if,多重if语句嵌套式条件语句,产生组合电路、时序电路、或两者的混合电路。,多重if语句嵌套式条件语句,产生组合电路、时序电路、或两者的混合电路。 任一分支顺序语句的执行条件是以上各分支所确定条件的相与。,【例5-19】-if语句使用举例 library ieee; use ieee.std_logic_1164.all; entity control_stmts is port (a, b, c: in boolean; output: out boolean); end control_stmts; architecture example of control_stmts is begin process (a, b, c) variable n: boolean; begin if a then n := b; else n := c; end if; output = n; end process; end example;,表5-2 8线-3线优先编码器真值表 输 入 输 出 din0 din1 din2 din3 din4 din5 din6 din7 output0 output1 output2 x x x x x x x 0 0 0 0 x x x x x x 0 1 1 0 0 x x x x x 0 1 1 0 1 0 x x x x 0 1 1 1 1 1 0 x x x 0 1 1 1 1 0 0 1 x x 0 1 1 1 1 1 1 0 1 x 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 注:表中的“x”为任意,类似vhdl中的“”值。,8线-3线优先编码器,library ieee; use ieee.std_logic_1164.all; entity coder is port ( din : in std_logic_vector(0 to 7); output : out std_logic_vector(0 to 2) ); end coder; architecture behav of coder is signal sint : std_logic_vector(4 downto 0); begin process (din) begin if (din(7)=0) then output = “000“ ; elsif (din(6)=0) then output = “100“ ; elsif (din(5)=0) then output = “010“ ; elsif (din(4)=0) then output = “110“ ; elsif (din(3)=0) then output = “001“ ; elsif (din(2)=0) then output = “101“ ; elsif (din(1)=0) then output = “011“ ; else output = “111“ ; end if ; end process ; end behav;,任一分支顺序语句的执行条件是以上各分支所确定条件的相与,【例5-20】-8线-3线优先编码器,5.6 半整数与奇数分频电路设计,接下页,接上页,5.7.1 固有延时,z = x xor y after 5ns ;-延时5ns,z = x xor y ;-延时,5.7 仿真延时,延时是vhdl仿真需要的重要特性,为设计而建立的精确的延时模型,可使vhdl仿真器得到接近实际的精确结果。 行为仿真延时模型:固有延时、传输延时,固有延时也称惯性延时,是任何电子器件存在的延时特性,其主要的物理机制是分布电容。 输入信号的持续时间必须大于器件的惯性延时,才能使器件对输入信号的变化产生响应。 在vhdl仿真货物综合器中固有延时是默认的延时,在数学上是一无穷小量,称为延时或仿真。 固有延时的形式:,after为延时的关键词,5.7.2 传输延时,传输延时语句的表达: z = transport x after 10 ns;,信号在传输过程中产生的推迟或延迟了一个时间段。 表示的是输入与输出之间的一种绝对延时。,transport为传输延时的关键词,5.7.3 仿真 ,x = 9 ; y = x ; z = x after 5ns ;,vhdl为仿真器和综合器为系统中的信号赋值配置的一足够小又能满足逻辑排序的延时量。即仿真软件的最小分辨时间-仿真或延时。从而使并行语句和顺序语句中的并列赋值逻辑的以正确执行。,延时是由eda工具自动引入,vhdl语言是通过结构体具体描述整个设计实体的逻辑功能。通常结构体有四种不同的描述方式:行为描述方式(behavior)、寄存器传输级(rtl描述)方式或数据流描述方式(dataflow)、结构化描述方式(structural)以及混合描述方式。vhdl通过这四种不同的描述方式从不同的侧面描述结构体的功能。前三种是最基本的描述方式,他们组合起来就成为混合描述方式。,5.8 vhdl的rtl表述,通常:把一个完整的、可综合的hdl程序设计构建为设计实体(独立的电路功能结构),而其程序代码称为rtl(register transport level)描述。 rtl描述可看成可综合的硬件描述语言的代名词。,5.8.1 行为描述方式,行为描述方式是指对系统数学模型的抽象描述,其抽象程度比寄存器传输描述方式和结构化描述方式的更高。因此,行为描述有时被称为高级描述。 在行为描述方式的程序中,大量采用了算术运算、关系运算、惯性延时、传输延时等难于进行逻辑综合和不能进行逻辑综合的vhdl语句,一般来说,采用行为描述方式的vhdl程序主要用于系统层数学模型的仿真或者系统工作原理的仿真。我们这里涉及到的行为级描述仍在算法层。 行为级描述只描述设计电路的功能或电路的行为,而没有指明或实现这些行为的硬件结构;或者说行为级描述只表示输入输出之间的转换行为,它不包含任何结构信息。 行为级描述通常指顺序语句描述,即含有进程的非结构化的逻辑描述。 行为级描述的设计模型定义了系统的行为,通常由一个或多个进程构成,每一个进程又包含了一系列的顺序语句。 在vhdl中一些专门用于描述系统行为的语句有:延时语句、决断函数、 generic语句、 guarded block语句等。,举例同步清零的模10计数器,entity cnt10 is port(reset,clk : in std_logic; q : out std_logic_vector(3 downto 0); end cnt10; architecture behav of cnt10 is signal qo : integer range 0 to 15; begin process (clk,reset,qo) begin if (clkevent and clk=1) then if (reset=0 or qo=9) then qo=0; else qo=qo+1; end if; end if; q=conv_std_logic_vector(qo,4); - 数据类型转换函数 end process; end behav;,它对计数器时钟信号的触发要求作了明确而详细的描述,对时钟信号特定的行为方式所产生的信息后果作了准确的定义。这充分展现了vhdl最为闪光之处。 在应用vhdl进行程序设计时,行为描述方式是最重要 的描述方式,它是vhdl编程的核心,可以说,没有行为描述就没有vhdl。,library ieee; use ieee.std_logic_1164.all; entity full_adder is generic(tpd : time := 10 ns);-类属语句 port(x,y,c_in : in std_logic; sum, c_out : out std_logic); end full_adder; architecture behav of full_adder is begin process (x, y, c_in) variable n: integer; constant sum_vector: std_logic_vector (0 to 3) := “0101”; constant carry_vector: std_logic_vector (0 to 3) := “0011”;,全加器框图,例:基于全加器真值表采用行为描述方式设计的全加器(1位二进制数全加),begin n := 0; if x = 1 then n := n+1; end if; if y = 1 then n:=n+1; end if; if c_in = 1 then n:=n+1; end if; - (0 to 3) sum = sum_vector (n) after 2*tpd; - - sum_vector初值为“0101” c_out = carry_vector (n) after 3*tpd; - - carry_vector初值为“0011” end process; - (0 to 3) end behav;,输入 输出 c_in x y c_out sum 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1,对照真值表解释程序,abel-hdl语言描述,verilog语言描述,5.8.2 数据流描述 -寄存器传输级rtl描述,寄存器传输级(rtl)的描述方式,是一种以规定设计的各种寄存器形式为特征的描述方法 。它可以采用寄存器硬件一一对应的直接描述,或者采用寄存器之间的功能描述。 由于rtl描述方式是建立在并行信号赋值语句描述的基础上,描述了数据流的运动路径、运动方向和运动结果,故又称为数据流描述。 rtl描述方式是真正可以进行逻辑综合的描述方式。 rtl描述方式既可以描述时序电路,又可以描述组合电路;既含有逻辑单元的结构信息,也隐含表示某种行为。,全加器的输入输出关系,输入 输出 c_in x y c_out sum 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1,全加器框图,举例,对于全加器,用布尔方程描述其逻辑功能如下: s = x xor y sum = s xor c_in c_out = (x and y) or( s and c_in),library ieee; use ieee.std_logic_1164.all; entity full_adder is generic(tpd : time := 10 ns);-类属语句 port(x,y,c_in : in std_logic; sum, c_out : out std_logic); end full_adder; architecture dataflow of full_adder is begin s = x xor y after tpd; sum = s xor c_in after tpd; c_out = (x and y) or( s and c_in) after 2* tpd; end dataflow;,例:采用数据流描述方式的全加器,5.8.3 结构描述,构造体的结构描述方式是描述该设计单元的硬件结构,即该硬件是如何构成的。 在多层次的设计中,常采用结构描述方式在高层次的设计模块中调用低层次的设计模块,或者直接用门电路设计单元构造一个复杂的逻辑电路。 编写结构描述程序的直观方法,可模仿逻辑图的绘制方法:即用框图来表示当前设计单元的组成和内部联结关系,而后对照该框图编制出所需的vhdl程序。 结构描述方式通常采用元件例化语句和生成语句编写程序。,结构化描述方式就是在多层次的设计中,高层次的设计可以调用低层次的设计模块,或直接用门电路设计单元来构成一个复杂逻辑电路的方法。利用结构化描述方法将已有的设计成果方便地用于新的设计中,能大大提高设计效率。在结构化描述中,建模的焦点是端口及其互连关系。,结构化描述的建模步骤如下: (1)元件说明:描述局部接口。 (2)元件例化:相对于其他元件放置元件。 (3)元件配置:指定元件所用的设计实体。,编写结构描述程序的主要步骤:,1) 绘制框图。先确定当前设计单元中需要用到的子模块的种类和个数。对每个子模块用一个图符(称为实例元件)来代表,只标出其编号、功能(可用图符区别或文字注记)和接口特征(端口及信号流向),而不关心其内部细节。 2) 元件说明。每种子模块分别用一个元件声明语句来说明。 3) 信号说明。为各实例元件之间的每条连接线都起一个单独的名字,称为信号名。利用signal语句对这些信号分别予以说明。 4) 元件例化。根据实例元件的端口与模板元件的端口之间的映射原理,对每个实例元件均可写出一个元件例化语句。 5) 添加必要的框架,完成整个设计文件。,对于上图给出的全加器端口结构,可以认为它是由两个半加器和一个或门组成的 。,举例-全加器,对于一个复杂的电子系统,可以将其分解为若干个子系统,每个子系统再分解成模块,形成多层次设计。这样,可以使更多的设计者同时进行合作。在多层次设计中,每个层次都可以作为一个元件,再构成一个模块或系统,可以先分别仿真每个元件,然后再整体调试。所以说结构化描述不仅是一种设计方法,而且是一种设计思想,是大型电子系统高层次设计的重要手段。,结语 :对一个设计进行结构化描述,就是描述它是由那些子元件构成以及各子元件之间的互连关系。具体地说,由实体说明元件、端口与信号,由结构体描述元件之间的连接关系及端口与元件中信号的对应关系。其中,元件是硬件的描述,即门、芯片或者电路板,主要由component语句说明;端口是元件与外界的连接点,数据通过端口进入或流出元件;而信号则是硬件连线的一种抽象表示,它既能保持变化的数据,又可以连接各个子元件对应端口。端口信号和信号都由port语句说明。 总之,结构体的结构描述方式,就是在多层次的设计中,高层次的设计模块调用底层次的设计模块,或者直接用门电路设计单元来构成一个复杂的逻辑电路的描述方法。这种描述方法,其结构非常清晰,且能做到与电路原理图中所画的器件一一对应,当然,如要采用结构描述方法,则要求设计人员应具有较多的设计知识。,在实际设计工作中,可以采用上述三种描述方式的任意组合,这就是混合描述。同样还是图所给出端口结构的全加器模型,其混合描述方式如下。,例:全加器的混合描述 library ieee; use ieee.std_logic_1164.all; entity xor_gate is generic(tpd:time:=10 ns);-类属语句 port(in1,in2: in std_logic; out1: out std_logic); end xor_gate;,*混合描述风格,architecture behavioral of xor_gate is begin out1 = in1 xor in2 after tpd; end behavioral; library ieee; use ieee.std_logic_1164.all; entity full_adder is generic(tpd:time:=10 ns); port(x,y,c_in: in std_logic; sum, c_out: out std_logic); end full_adder;,architecture mix of full_adder is component xor_gate port(in1, in2: in std_logic; out1: out std_logic); end component; signal s :std_logic; for all: xor_gate use entity work. xor_gate (behavioral

温馨提示

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

评论

0/150

提交评论