可编程ASIC设计及应用核心语法与基础电路设计课件.ppt
可编程ASIC,核心语法与基础电路设计学时分配:4,电子科技大学,可编程ASIC核心语法与基础电路设计电子科技大学,进度,1.绪论 。2.设计流程 。3.模块化硬件与进程模型 。4.信号传输模型 。5.核心语法与基础电路设计 。6.状态机设计 。7.可靠设计与高速设计 。8. 可编程逻辑器件。9.数字信号处理的fpga实现。10.数字系统的RTL设计。,电子科技大学,进度1.绪论 。电子科技大学,程序结构,Library ;- 库,包等的说明Entity ;- 实体说明Architecture;- 结构体描述,电子科技大学,程序结构Library ;- 库,包等的说明电子科技大学,程序例子,a,b,c,Library ieee;Use ieee.std_logic_1164.all;Entity u1 isPort( a : in std_logic; b : in std_logic; c : out std_logic);End u1;Architecture behv of u1 isBegin c = a and b;End behv;,u1,电子科技大学,程序例子abcLibrary ieee;u1电子科技大学,程序例子,a,b,c,Library ieee;Use ieee.std_logic_1164.all;Entity u1 isPort( a : in std_logic; b : in std_logic; c : out std_logic);End u1;Architecture behv of u1 isBegin c = a and b;End behv;,u1,表示使用 ieee库。这是最常用的库说明,绝大多数的VHDL代码都使用这个库。,电子科技大学,程序例子abcLibrary ieee;u1表示使用 iee,程序例子,a,b,c,Library ieee;Use ieee.std_logic_1164.all;Entity u1 isPort( a : in std_logic; b : in std_logic; c : out std_logic);End u1;Architecture behv of u1 isBegin c = a and b;End behv;,u1,表示使用 ieee库中的std_logic_1164包。最常用的包说明:use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-或 USE IEEE.STD_LOGIC_SIGNED.ALL;,电子科技大学,程序例子abcLibrary ieee;u1表示使用 iee,关于unsigned与signed库,如果use IEEE.STD_LOGIC_UNSIGNED.ALL;则矢量被看作无符号整数;如果use IEEE.STD_LOGIC_SIGNED.ALL;则矢量被看作带符号整数。对于前者,有 (“1001” “0000”)成立;对于后者,有(“1001” “0000”)成立;,电子科技大学,关于unsigned与signed库如果use IEEE.S,程序例子,a,b,c,Library ieee;Use ieee.std_logic_1164.all;Entity u_and2 isPort( a : in std_logic; b : in std_logic; c : out std_logic);End u_and2;Architecture behv of u_and2 isBegin c = a and b;End behv;,u1,声明元件的实体。语法:Entity is.End ;,电子科技大学,程序例子abcLibrary ieee;u1声明元件的实体。,程序例子,a,b,c,Library ieee;Use ieee.std_logic_1164.all;Entity u_and2 isPort( a : in std_logic; b : in std_logic; c : out std_logic);End u_and2;Architecture behv of u_and2 isBegin c = a and b;End behv;,u1,元件的外部端口。语法:端口名 : 信号方向 数据类型;,注意最后一个端口说明语句不要加分号!,电子科技大学,程序例子abcLibrary ieee;u1元件的外部端口。,程序例子,a,b,c,Library ieee;Use ieee.std_logic_1164.all;Entity u_and2 isPort( a : in std_logic; b : in std_logic; c : out std_logic);End u_and2;Architecture behv of u_and2 isBegin c = a and b;End behv;,u1,元件的结构体说明。语法:Architecture of isBeginEnd ;,电子科技大学,程序例子abcLibrary ieee;u1元件的结构体说明,程序例子,a,b,c,Library ieee;Use ieee.std_logic_1164.all;Entity u_and2 isPort( a : in std_logic; b : in std_logic; c : out std_logic);End u_and2;Architecture behv of u_and2 isBegin c = a and b;End behv;,u1,结构体描述。绝大多数情况下由process构成;一条“光秃”的信号赋值实际上就是一个process,其敏感信号为右边所有信号。,电子科技大学,程序例子abcLibrary ieee;u1结构体描述。电子,程序例子,a,b,c,Library ieee;Use ieee.std_logic_1164.all;Entity u_and2 isPort( a : in std_logic; b : in std_logic; c : out std_logic);End u_and2;Architecture behv of u_and2 isBegin c = a and b;End behv;,u1,电子科技大学,程序例子abcLibrary ieee;u1电子科技大学,关于信号方向,IN,IN,IN,OUT,BUFFER,INOUT,OUT,电子科技大学,关于信号方向INININOUTBUFFERINOUTOUT电,VHDL常用数据类型,Std_logic, std_logic_vector;Integer。,电子科技大学,VHDL常用数据类型Std_logic, std_logic,常用的语法1: if条件判断,IF 条件THEN 顺序处理语句;ELSE 顺序处理语句;END IF ;,注意,if语句只能用在process,函数,子过程之中!,电子科技大学,常用的语法1: if条件判断IF 条件THEN 注意,if语,If的例子,Process( a )Begin if( a = 1 ) then b = 0; else b = 1; end if;End process;,电子科技大学,If的例子Process( a )电子科技大学,常用的语法2:case分支判断,CASE 表达式 IS WHEN 条件表达式 =顺序处理语句 END CASE;,注意,if语句只能用在process,函数,子过程之中!,电子科技大学,常用的语法2:case分支判断CASE 表达式 IS注意,i,Case的例子,Process( a )Begin case a is when 1 = b b = 1; end case;End process;,注意,case的分支必须包含a的所有取值。所以一般最后一个分支往往用others来包含。,A的声明:Signal a : std_logic;,电子科技大学,Case的例子Process( a )注意,case的分支必,CASE语句和IF语句的比较,CASE语句和IF语句都可以完成多选择控制,但是在功能上还是有所区别的。1、在IF语句中,多条件是有优先级区别的。总是先处理最起始的条件,如果不满足再依次处理后面的条件;在CASE语句里所有条件是并行处理的,不存在优先级关系。2、CASE语句应将表达式的所有可能值全部列出来,否则在语法认为是错的。CASE语句中的WHEN OTHERS,即可以使它包含表达式的所有缺省值。,电子科技大学,CASE语句和IF语句的比较CASE语句和IF语句都可以完成,由于CASE语句和IF的特点,它们在某些场合下是可以互换的,例如38译码器的例子。但是对于下面这个例子就不能使用CASE语句。例:,电子科技大学,由于CASE语句和IF的特点,它们在某些场合下是可以互换的,上表是一个优先级编码器的真值表,4个输入之间优先级的大小关系是b0b1b2b3,即当b0、b1同为0时,输出编码为00。换言之,当b00时,其余3个输入任意值该编码器的输出均为”00“。因为CASE语句没有对输入为任意的表示法,故不能使用下面的语句:即:WHEN “XX01“=y=“01”是错误的。所以要正确描述输入之间的这种优先级关系就应选用IF语句。程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;,电子科技大学,上表是一个优先级编码器的真值表,4个输入之间优先级的大小关,ENTITY encoder IS PORT (input:IN STD_LOGIC_VECTOR(3 DOWNTO 0); y :OUT STD_LOGIC_VECTOR(1 DOWNTO 0);)END encoder;ARCHITECTURE rtl OF encoder ISBEGIN PROCESS (input) BEGIN IF (input(0)=0) then y=“00”:; ELSIF (input(1)=0) then y=“01”; ELSIF (input(2)=0) then y=“10”; ELSE y=“11”; END IF; END PROCESS;END rtl;,电子科技大学,ENTITY encoder IS电子科技大学,在IF语句中首先判断的是input(0),其次是input(1)这正好体现了input(0)的优先级最高,只要input(0)0就优先对它编码。,电子科技大学,在IF语句中首先判断的是input(0),其次是input,常用语法3:时钟沿判断,上升沿:If( clkevent and clk = 1 ) then 或者 if( rising_edge( clk ) ) then 下降沿:if( clkevent and clk = 0 ) then 或者 if( falling_edge( clk ) ) then ,电子科技大学,常用语法3:时钟沿判断上升沿:If( clkevent a,时钟沿的例子,Process( clk )Begin if( clkevent and clk = 1 ) then dout = din; end if;End process;,电子科技大学,时钟沿的例子Process( clk )电子科技大学,常用语法4:port map,语法: InstanceName: componentName port map ( 端口影射表 );例子(位置影射法): u1:u_and2 port map ( din1, din2, dout);,电子科技大学,常用语法4:port map语法:电子科技大学,或者(名称影射法),U1: u_and2 port map ( a = din1, b= din2, c= dout );,din1,din2,dout,a,b,c,电子科技大学,或者(名称影射法)U1: u_and2 port mapdi,其他内容,Vhdl的数据类型Vhdl的运算(逻辑运算,算术 运算,关系运算,并置运算)Vhdl的信号类属性等等。,电子科技大学,其他内容Vhdl的数据类型电子科技大学,基础电路设计,描述风格;基础组合电路设计; 二选一电路,三八译码器,缓冲器,加法器。基础时序电路设计:寄存器计数器,电子科技大学,基础电路设计描述风格;电子科技大学,基础组合电路设计,电子科技大学,基础组合电路设计电子科技大学,例1: 二选一电路设计,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MUX2to1 IS PORT (S: IN STD_LOGIC; Zero: IN STD_LOGIC; One: IN STD_LOGIC; Y: OUT STD_LOGIC);,电子科技大学,例1: 二选一电路设计ZeroOneSY电子科技大学,ARCHITECTURE behavior OF MUX2to1 ISBeginProcess(S, Zero, One )Begin - 下一页讲述End processEND behavior;,电子科技大学,ARCHITECTURE behavior OF MUX2t,方法1:直接逻辑运算,Process( S, Zero, One )Begin Y = (not S and Zero ) or ( S and One );End process;,电子科技大学,方法1:直接逻辑运算Process( S, Zero, On,方法2:if语句,Process( S, Zero, One )Begin if( S = 0) then Y = Zero; else Y = One; end if;End process;,电子科技大学,方法2:if语句Process( S, Zero, One,方法3: case语句,Process( S, Zero, One )Begin case S is when 0 = Y Y = One; end case; end process;,电子科技大学,方法3: case语句Process( S, Zero, O,三种方法对比,第一种方法(逻辑运算式)是硬件一一对应的方法,要求设计者对具体硬件电路比较熟悉。后两种方法利用条件分支,比较符合人的常规思维,利于加快设计及减轻维护负担。一般情况下推荐使用后两种的风格。,电子科技大学,三种方法对比第一种方法(逻辑运算式)是硬件一一对应的方法,要,例2:3-8译码器,LIBRARY IEEE;USE IEEE.std_logic_1164.all;ENTITY dec3to8 IS PORT ( sel : IN STD_LOGIC_VECTOR (2 DOWNTO 0); en : IN STD_LOGIC; Y : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END dec3to8;ARCHITECTURE behavior OF dec3to8 ISBEGIN,电子科技大学,例2:3-8译码器LIBRARY IEEE;电子科技大学,PROCESS(sel,en) BEGIN IF (en=1) THEN CASE sel IS WHEN 000 = Y Y Y Y Y Y Y Y = “01111111”; END CASE;ELSE Y = “11111111”;END IF; END PROCESS;END behavior;,注意不要漏掉此句,电子科技大学,PROCESS(sel,en)注意不要漏掉此句电子科技大,例3 三态门,三态门电路,电子科技大学,例3 三态门三态门电路电子科技大学,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY rei_gate IS PORT (din,en:IN STD_LOGIC; dout:OUT STD_LOGIC); END tri_gate;ARCHITECTURE tri_gate OF tri_gate IS BEGIN tri_gate1:PROCESS(din,en) BEGINIF (en = 1) THEN dout = din;ELSE dout = Z; END IF; END PROCESS; END tri_gate;,电子科技大学,LIBRARY IEEE;电子科技大学,例4:四位全加器设计,dina,dinb,dout,cin,cout,Dina和dinb为两路4 bit的输入,cin为进位输入;Dout为4bit的输出,cout为进位输出。,4,4,4,电子科技大学,例4:四位全加器设计dinadinbdoutcincoutD,则描述为:Architecture behav of u_FullAdder isSignal atemp, btemp, tempout : std_logic_vector( 4 downto 0);Begin Process( cin, dina, dinb, atemp, btemp, tempout ) .End behav;,电子科技大学,则描述为:电子科技大学,Process( cin, dina, dinb, atemp, btemp, tempout)Begin atemp = 0 ,电子科技大学,Process( cin, dina, dinb, atem,代码评析,该代码用5bit半加运算来完成4bit全加,在代码上非常简洁。由综合器自己选择元件库中现成的加法部件来实现加法运算,设计者不必关心其内部电路细节。但是其弱点是,综合器会用5bit加法器来实现,容易造成资源消耗过大。,电子科技大学,代码评析该代码用5bit半加运算来完成4bit全加,在代码上,改进方法,使用1bit全加器构建,FullAdder1b,电子科技大学,改进方法使用1bit全加器构建abdcincoutFullA,1bit全加器,Process( a, b, cin )Begin d = a xor b xor cin; cout = (a and cin ) or (b and cin) or (a and b);End process;,电子科技大学,1bit全加器Process( a, b, cin )电子科,4bit全加器,cin,cout,电子科技大学,4bit全加器abdcincoutabdcincoutabd,代码实现,总框架:Entity FullAdder4b is.End FullAdder4b;Architecture struct of FullAdder4b isSignal temp1, temp2,temp3: std_logic_vector( 3 downto 0 );Begin - 此处代码下一页说明.End struct;,Port( a : in std_logic_vector( 3 downto 0 ); b : in std_logic_vector( 3 downto 0 ); cin : in std_logic; d : out std_logic_vector( 3 downto 0 ); cout : out std_logic;);,电子科技大学,代码实现总框架:Port(电子科技大学,代码实现,总框架:Entity FullAdder4b is.End FullAdder4b;Architecture struct of FullAdder4b isSignal temp1, temp2,temp3: std_logic_vector( 3 downto 0 );Begin - 此处代码下一页说明.End struct;,电子科技大学,代码实现总框架:电子科技大学,U0 : FullAdder1b port map( a(0), b(0), cin, d(0), temp1 );U1 : FullAdder1b port map( a(1), b(1), temp1, d(0), temp2 );U2 : FullAdder1b port map( a(2), b(2), temp2, d(0), temp3 );U3 : FullAdder1b port map( a(3), b(3), temp3, d(0), cout );,电子科技大学,U0 : FullAdder1b port map(电子科,由上可见,硬件描述语言配合了完善的综合工具后,可以使得设计者从烦琐的电路细节中解放出来,专心于系统的功能架构;但是由于综合工具智能化程度的局限性,有时综合工具综合出来的电路并不一定是最优的,这就需要设计者在适当的时候在较低的层次上进行描述,指导综合工具综合出性能或面积优化的代码。,电子科技大学,由上可见,硬件描述语言配合了完善的综合工具后,可以使得设计者,对比两种加法器描述方法,前一种方法便于使用并行进位逻辑,而后一种方法是串行进位,所以前者速度一般要比后者快;但是在位宽比较大的时候,并行进位的资源消耗会快速上升。实验发现,4bit的并行加法器和串行加法器的资源消耗差不多,因此工程应用中,宽bit的加法器经常采用4bit的并行加法器级联而成。,电子科技大学,对比两种加法器描述方法前一种方法便于使用并行进位逻辑,而后一,易犯错误,电子科技大学,易犯错误电子科技大学,实例分析,假设,要描述一个与门电路:有很多种描述方法。,电子科技大学,实例分析假设,要描述一个与门电路:电子科技大学,方法1:直接信号赋值,在结构体内,很直观地直接进行赋值:Architecture behav of And2 isBegin y = a and b;End behav;,电子科技大学,方法1:直接信号赋值在结构体内,很直观地直接进行赋值:电子科,方法2:进程直接信号赋值,这种方法直接等效于方法1。注意要将a和b都加入敏感信号表。Architecture behav of And2 isBegin process( a, b ) begin y = a and b; end process;End behav;,电子科技大学,方法2:进程直接信号赋值这种方法直接等效于方法1。电子科技大,方法3:进程if条件赋值,经过分析发现,实际上y大部分情况下为0,只有a和b都为1的时候,y才会输出1。所以描述如下:Architecture behav of And2 isBegin process( a, b ) begin if( a = 1 and b = 1 ) then y = 1; end if; end process;End behav;,这个描述是错误的,为什么?,电子科技大学,方法3:进程if条件赋值经过分析发现,实际上y大部分情况下为,方法4:进程if条件赋值,经过分析发现,a = 1时,y会跟踪b的变化,即 y= b。Architecture behav of And2 isBegin process( a, b ) begin if( a = 1 )then y = b; end if; end process;End behav;,这个描述还是错误的,为什么?,电子科技大学,方法4:进程if条件赋值经过分析发现,a = 1时,y会,基础时序电路设计,电子科技大学,基础时序电路设计电子科技大学,例1:基本的触发器,1、 D触发器(DFF)电路设计 例6-17: 正边沿触发器的DFF设计(寄存器) 其VHDL描述如下:,电子科技大学,例1:基本的触发器1、 D触发器(DFF)电路设计电子科技大,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff_logic IS PORT(d,clk:IN STD_LOGIC; q:OUT STD_LOGIC);END dff_logic;,电子科技大学,LIBRARY IEEE;电子科技大学,ARCHITECTURE example OF dff_logic IS BEGIN PROCESS(clk) BEGIN IF(clkEVENT AND clk=1) THEN q = d; END IF; END PROCESS;END example;,电子科技大学,ARCHITECTURE example OF dff_,例2:把上例中的clkEVENT条件去掉并把d加到进程敏感表中。,就可得到一个电平敏感D触发器(即锁存器)PROCESS(clk,d)BEGIN IF (clk =1)THEN q = d; END IF;ENF PROCESS;,你突然回忆到了什么.,电子科技大学,例2:把上例中的clkEVENT条件去掉并把d加到进程敏,在组合电路描述中注意补全所有条件,上述与门方法3的正确描述:process( a, b ) begin if( a = 1 and b = 1 ) then y = 1; else y = 0; - ! end if; end process;,电子科技大学,在组合电路描述中注意补全所有条件上述与门方法3的正确描述:,上述与门方法4的正确描述:process( a, b ) begin if( a = 1 )then y = b; else y = 0; - ! end if; end process;,电子科技大学,上述与门方法4的正确描述:电子科技大学,锁存和寄存的差别:,区别:锁存是电平起作用寄存是时钟有效沿起作用!在设计中,应该尽量避免使用锁存!因为锁存要占去大量的触发器资源,而且会对电路带来某种不稳定的隐患。在组合逻辑的组合进程中, 条件语句描述时应该指定所有条件下所有输出的状态,以避免锁存。比如if/case语句的所有分支必须定义全部的输出才可能避免出现锁存。,电子科技大学,锁存和寄存的差别:区别:电子科技大学,条件完整但仍然生成锁存器的描述,Architecture behav of And2 isBegin process( a, b ) begin if( a = 1 )then y = b; else y = y; - 保持原值,导致综合器生成锁存器! end if; end process;End behav;,电子科技大学,条件完整但仍然生成锁存器的描述Architecture be,时序电路设计中的复位/置位,异步复位:Process( clk, areset ) Begin if ( areset = 1 ) then q = 0; elsif( clkevent and clk = 1 ) then q = d; end if;End process;,异步条件判断在时钟沿判断语句之前。不管时钟沿是否到达,只要异步信号有效,则后面的q= 0将被执行。,-注意异步复/置位信号要放在敏感信号表中,电子科技大学,时序电路设计中的复位/置位异步复位:异步条件判断在时钟沿判断,时序电路设计中的复位/置位,同步复位:Process( clk )Begin if( clkevent and clk = 1 ) then if( reset = 1 ) then q = 0; else q = d; end if; end if;End process;,同步条件判断在时钟沿判断语句之后,当reset有效时, 不会立即进行复位,而是在时钟沿处复位。,电子科技大学,时序电路设计中的复位/置位同步复位:同步条件判断在时钟沿判断,异步复位(左)和同步复位(右)波形,有利于整个系统各模块的同时复位/置位(初始化),电子科技大学,异步复位(左)和同步复位(右)波形有利于整个系统各模块的同时,例3:带异步复位和异步置位的寄存器设计,PROCESS(clk,reset,preset)BEGIN IF(reset=1)THEN q=0; ELSIF(preset =1)THEN q=1;-本例中, reset的优先级高于preset ELSIF(rising_edge(clk)THEN q= d; END IF;END PROCESS;,电子科技大学,例3:带异步复位和异步置位的寄存器设计PROCESS(clk,例4:带时钟使能的寄存器设计,Process( clk ) Begin if( clkevent and clk = 1 ) then if ( en = 1 ) then q = d; end if; end if;End process;,这里是一个条件不完整,但是不会生存锁存器的例子,电子科技大学,例4:带时钟使能的寄存器设计Process( clk ) 这,例5:八位带异步清除和时钟使能的寄存器,LIBRARY IEEE;USE IEEE.std_logic_1164.all;ENTITY reg8bit ISPORT ( clk: IN STD_LOGIC; reset: IN STD_LOGIC; en: IN STD_LOGIC; din: IN STD_LOGIC_VECTOR (7 DOWNTO 0); dout: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);END reg8bit;,电子科技大学,例5:八位带异步清除和时钟使能的寄存器LIBRARY IEE,ARCHITECTURE behavior OF reg8bit ISBegin process( clk, reset ) begin if( reset = 0 ) then -这里低电平有效 dout 0 ); elsif( clkevent and clk = 1 ) then if( en = 1 ) then -时钟使能 dout = din; end if; end if;end process; END behavior;,电子科技大学,ARCHITECTURE behavior OF reg8b,沿判断后的信号赋值都是寄存器赋值,Process( clk )Begin if( clkevent and clk = 1 ) then sig1 = din; sig2 = sig1 and sig; end if;End process;,电子科技大学,沿判断后的信号赋值都是寄存器赋值Process( clk ),对比沿判断之后的变量赋值,Process( clk )Variable var : std_logic;Begin if( clkevent and clk = 1 ) then var := din; dout = var and sig; end if;End process;,电子科技大学,对比沿判断之后的变量赋值Process( clk )sigD,但是,并不是时钟沿判断后的变量赋值都不会产生寄存器,Process( clk )Varialbe var : std_logic;Begin if(clkevent and clk = 1 )then var := din; end if; dout = var;End process;,电子科技大学,但是,并不是时钟沿判断后的变量赋值都不会产生寄存器Proce,例子: 二进制同步计数器,同步计数器就是指在时钟脉冲的作用下,组成计数器的各个触发器的状态同时发生变化的一类计数器。先来看一个比较简单的计数器:四位二进制计数器,它带有异步复位控制端、同步预置控制端、同步使能端和进位输出瑞。这种四位二进制计数器的电路框图如图所示。其中:输入端口 R是异步复位控制端输入端口 S是同步预置控制端输入端口 EN是同步使能端输出瑞口 CO是进位输出端,电子科技大学,例子: 二进制同步计数器同步计数器就是指在时钟脉冲的作用下,,四位二进制计数器的电路框图,电子科技大学,四位二进制计数器的电路框图电子科技大学,四位二进制计数器的功能表,电子科技大学,四位二进制计数器的功能表电子科技大学,在功能表中,没有给出进位输出端口CO的功能描述,它的功能是:当四位二进制计数器计数为”1111”时,如果遇到时钟上升沿,它的输出为1。,电子科技大学,在功能表中没有给出进位输出端口电子科技大学,四位二进制计数器的VHDL描述,如图所示的四位二进制计数器的VHDL描述如下。源代码中的同步预置值是根据实际设计要求来定的,这里我们假定为”1010“,电子科技大学,四位二进制计数器的VHDL描述如图所示的四位二进制计数器的V,library ieee;use ieee.stdic_1164all;use ieeestd_logic_arithall;use ieee.std_logic_unsigned.all;entity counter is port( clk,areset,sset,enable: in Std_logic; cout:out std_logic; q:buffer std_logic_vector(3 downto 0) );end counter;architecure rtl of counter isbegin,电子科技大学,library ieee;电子科技大学,rocess(clk,areset) beqin if( areset=1) then q 0) ; cout = 0; elsif(clkevent and clk=1) then if(sset=1)then q =”1010”;cout = 0; elsif (enable=1) then if (q=“1111”) then计数上限。 cout=1; q=“0000”; else cout = 0; q = q+1; end if; end if; end if;end process; end rtl;,请画出cout输出1时的波形,注意cout脉冲对准的是q为“1111”时,还是q为“0000”时。,电子科技大学,rocess(clk,areset)请画出cout输出1,rocess(clk,areset,q) beqin if( areset=1) then q 0) ; elsif(clkevent and clk=1) then if(sset=1)then q =”1010”; elsif (enable=1) then q = q+1; end if; end if; end if; if (q=“1111”) then计数上限。 cout = 1; else cout = 0; end if; end process;,如果把代码改成这种形式呢,波形又如何?,注意!,电子科技大学,rocess(clk,areset,q)如果把代码改成这种,另外,注意包引用中的std_logic_unsigned:加法运算用到。q的信号方向为buffer,因为它既是输出,又是反馈回来做内部模块的输入,如q= q+1;If(q )等,电子科技大学,另外,注意包引用中的std_logic_unsigned:加,带有异步复位reset、异步预置preset信号和时钟使能信号ce的8位计数器,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; - !ENTITY asyn_load_cnt IS PORT(clk,ce,reset,preset,load: IN STD_LOGIC; d:IN STD_LOGIC_VECTOR(7 DOWNTO 0); q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END asyn_load_cnt;,电子科技大学,带有异步复位reset、异步预置preset信号和时钟使能信,ARCHITECTURE behaviora