【例3-12】PROCESSBEGINWait until CLK='T'--利用wait语句Q<=D;ENDPROCESS;【例3-13】PROCESS (CLK)BEGINIF CLK='1'--利用进程的启动特性产生对CLK的边沿检测THEN Q<=D;END IF;ENDPROCESSCLKDQ【例3-14】PROCESS (CLK. D))BEGINIF CLK='1'--电平触发型寄存器THEN Q<=D;END IF;END PROCESS ;CLKDQ图3-8例3-14的时序波形全加器的VHDL描述3.3半加器描述3.3.16
6 【例 3-12】 . PROCESS BEGIN wait until CLK = '1' ; -利用 wait 语句 Q <= D ; END PROCESS; 【例 3-13】 . PROCESS (CLK) BEGIN IF CLK = '1' THEN Q <= D ; -利用进程的启动特性产生对 CLK 的边沿检测 END IF; END PROCESS 图 3-7 例 3-13 的时序波形 【例 3-14】 . PROCESS (CLK,D) BEGIN IF CLK = '1' -电平触发型寄存器 THEN Q <= D ; END IF; END PROCESS ; 图 3-8 例 3-14 的时序波形 3.3 全加器的 VHDL 描述 3.3.1 半加器描述
u1or2a8h_adderh adderdain囍CoutCoutf_adderfainbinAAXOCCcCsumu3EinebinBBSCsumsCu2Ein图3-9全加器f_adder电路图及其实体模块bine=sol=aind=col=ain·binso2= so1cin=ain bin cincout=col+ co2=ain·bin+ sol·cin=ainbin+(ainbin)cinain bin cin cout0000001000011011So=a.b+a.b00011101110111113.3.1半加器描述COS0Ico00and2?0soCbnotxnor2图3-10半加器hadder电路图及其真值表【例3-15】--半加器描述(1):布尔方程描述方法LIBRARYIEEE:USEIEEE.STD LOGIC 1164.ALL:ENTITY h adder ISPORT (a, b : IN STD LOGIC;cO, SO :OUT STD_LOGIC);ENDENTITY h_adder,ARCHITECTUREfhlOFhadderisBEGIN7
7 图 3-9 全加器 f_adder 电路图及其实体模块 e=so1=ain bin d=co1=ain•bin so2= so1 cin= ain bin cin cout= co1+ co2=ain•bin + so1•cin = ain•bin + (ain bin )cin ain bin cin cout 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 3.3.1 半加器描述 图 3-10 半加器 h_adder 电路图及其真值表 【例 3-15】 LIBRARY IEEE; -半加器描述(1):布尔方程描述方法 USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT (a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END ENTITY h_adder; ARCHITECTURE fh1 OF h_adder is BEGIN I113 co a so b 0 1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 a b so co not xnor2 and2 so a b a b I113 ain cout cout ain bin sum cin bin sum cin f_adder or2a f e d u3 u2 u1 b a c co B so co B so h_adder A h_adder A
So<=NOT(aXOR (NOT b);co <= aAND b ;END ARCHITECTURE fh1;【例3-16】LIBRARYIEEE:--半加器描述(2):真值表描述方法USE IEEE.STD LOGIC_1164.ALL;ENTITY h adder ISPORT (a, b : IN STD_ LOGIC;CO, SO : OUT STD_LOGIC);END ENTITY h_adder,ARCHITECTUREfhlOFhadderisSIGNALabc:STDLOGICVECTOR(1DOWNTOO):--定义标准逻辑位矢量数据类型BEGINabc<=a&b;--a相并b,即a与b并置操作PROCESS(abc)BEGINCASEabc IS--类似于真值表的CASE语句WHEN"00"=>SO<=0';co<=0';WHEN "01" => s0<=1'; co<-'0';WHEN "10" => SO<=1'; cO<='0' ;WHEN"11"=>SO<=0';CO<="I';WHENOTHERS=>NULL;END CASE;ENDPROCESS:END ARCHITECTURE fh1 ;【例3-17】LIBRARY IEEE:--或门逻辑描述USEIEEE.STDLOGIC_1164.ALL;ENTITY or2aISPORT(a,b :IN STD LOGIC:C : OUT STD_LOGIC),ENDENTITY or2a;ARCHITECTUREoneOFor2aISBEGINc<=aOR b;ENDARCHITECTUREone;【例3-18】IEEE:--1位二进制全加器顶层设计描述LIBRARYUSEIEEE.STD LOGIC1164.ALL,ENTITYf adderISPORT(ain,bin,cin:INSTDLOGIC;:OUTSTDLOGIC)cout,sumEND ENTITY f_adder,ARCHITECTUREfdIOFfadderIS8
8 so <= NOT(a XOR (NOT b)) ; co <= a AND b ; END ARCHITECTURE fh1; 【例 3-16】 LIBRARY IEEE; -半加器描述(2):真值表描述方法 USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT (a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END ENTITY h_adder; ARCHITECTURE fh1 OF h_adder is SIGNAL abc : STD_LOGIC_VECTOR(1 DOWNTO 0) ; -定义标准逻辑位矢量数 据类型 BEGIN abc <= a & b ; -a 相并 b,即 a 与 b 并置操作 PROCESS(abc) BEGIN CASE abc IS -类似于真值表的 CASE 语句 WHEN "00" => so<='0'; co<='0' ; WHEN "01" => so<='1'; co<='0' ; WHEN "10" => so<='1'; co<='0' ; WHEN "11" => so<='0'; co<='1' ; WHEN OTHERS => NULL ; END CASE; END PROCESS; END ARCHITECTURE fh1 ; 【例 3-17】 LIBRARY IEEE ; -或门逻辑描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2a IS PORT (a, b :IN STD_LOGIC; c : OUT STD_LOGIC ); END ENTITY or2a; ARCHITECTURE one OF or2a IS BEGIN c <= a OR b ; END ARCHITECTURE one ; 【例 3-18】 LIBRARY IEEE; -1 位二进制全加器顶层设计描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_adder IS PORT (ain,bin,cin : IN STD_LOGIC; cout,sum : OUT STD_LOGIC ); END ENTITY f_adder; ARCHITECTURE fd1 OF f_adder IS
COMPONENThadder--调用半加器声明语句PORT( a, b: INSTD_LOGIC;OUT STD_LOGIC);co,so:ENDCOMPONENT;COMPONENT or2aPORT (a, b : IN STD LOGIC;C : OUT STD_LOGIC);END COMPONENT;SIGNALd,e,fSTDLOGIC;--定义3个信号作为内部的连接线。BEGINul:h adder PORTMAP(a=>ain,b=>bin,co=>d,so=>e);--例化语句b=>cin,co=>f, so=>sum);u2:h adderPORTMAP(a=>e,b=>f,u3:or2aPORT MAP(a=>d,c=>cout);END ARCHITECTURE fd1;3.3.2CASE语句1.CASE语句CASE<表达式>ISWhen<选择值或标识符>=><顺序语句>...<顺序语句>;When<选择值或标识符>=><顺序语句>;.;<顺序语句>;WHENOTHERS=><顺序语句>;ENDCASE ;2.标准逻辑矢量数据类型B:OUTSTD_LOGIC_VECTOR(7DOWNTO0);或 SIGNALA :STD_LOGIC_VECTOR(1 TO4)B<="01100010";--B(7)为'OB(4 DOWNTO 1)<="1101";-- B(4)为"TB(7 DOWNTO 4) <= A :--B(6)等于A(2)SIGNAL C : BIT_VECTOR(3 DOWNTO 0):3.并置操作符SIGNAL a : STD LOGIC VECTOR (3 DOWNTO O);SIGNALd:STD LOGIC_VECTOR(1DOWNTOO);a<TQ"d()元素与元素并置,并置后的数组长度为4IF a.d="101011"THEN..--在IF条件句中可以使用并置符例化语句3.3.3COMPONENT元件名ISPORT(端口名表);ENDCOMPONENT文件名:COMPONENT h_adderPORT c, d: IN STD_LOGIC;9
9 COMPONENT h_adder -调用半加器声明语句 PORT ( a,b : IN STD_LOGIC; co,so : OUT STD_LOGIC); END COMPONENT ; COMPONENT or2a PORT (a,b : IN STD_LOGIC; c : OUT STD_LOGIC); END COMPONENT; SIGNAL d,e,f : STD_LOGIC; -定义 3 个信号作为内部的连接线。 BEGIN u1 : h_adder PORT MAP(a=>ain,b=>bin,co=>d,so=>e); -例化语句 u2 : h_adder PORT MAP(a=>e, b=>cin, co=>f,so=>sum); u3 : or2a PORT MAP(a=>d, b=>f, c=>cout); END ARCHITECTURE fd1; 3.3.2 CASE 语句 1. CASE 语句 CASE <表达式> IS When <选择值或标识符> => <顺序语句>; . ; <顺序语句> ; When <选择值或标识符> => <顺序语句>; . ; <顺序语句> ; . WHEN OTHERS => <顺序语句>; END CASE ; 2. 标准逻辑矢量数据类型 B : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ; 或 SIGNAL A :STD_LOGIC_VECTOR(1 TO 4) B <= "01100010" ; - B(7)为 '0' B(4 DOWNTO 1) <= "1101" ; - B(4)为 '1' B(7 DOWNTO 4) <= A ; - B(6)等于 A(2) SIGNAL C :BIT_VECTOR(3 DOWNTO 0); 3. 并置操作符 SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ; SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ; . a <= '1' '0' d(1) '1' ; - 元素与元素并置,并置后的数组长度为 4 . IF a d = "101011" THEN . –- 在 IF 条件句中可以使用并置符 3.3.3 例化语句 COMPONENT 元件名 IS PORT (端口名表) ; END COMPONENT 文件名 ; COMPONENT h_adder PORT ( c,d : IN STD_LOGIC;
e,f:OUTSTD LOGIC);例化名:元件名PORTMAP([端口名=>】连接端口名..);【例3-19】ENTITYCNT4ISPORT(CLK : IN BIT :Q:BUFFERINTEGERRANGE15DOWNTO0);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS (CLK)BEGINIFCLK'EVENTANDCLK='ITHENQ<=Q+ 1 :END IF;ENDPROCESS:END bhv,注意:1、Q的端口模式BUFFERQ<=Q+1:Q出现在“<=”两边,说明Q具有输入和输出两种模式;输入应该是输出信号的反馈方式。2、VHDL规定:加、减等算术操作符对应的操作数类型只能是INTEGER。3、时序电路描述中采用了不完整的IF语句。3.4计数器设计1.程序说明表式Q<=Q+1的右项与左项并非处于相同的时刻内,对于时序电路,除了传输延时外,前者的结果出现于当前时钟周期:后者,即左项要获得当前的Q+1,需等待下一个时钟周期。2.数据类型说明Q:BUFFERINTEGERRANGE15DOWNTO0:1十进制整数0十进制整数35十进制整数10E3十进制整数,等于进制整数100016#D9#十六进制整数,等于十六进制整数D9H8#720#八进制整数,等于八进制整数7200二进制整数,等于二进制整数11010010B2#11010010#Q:BUFFERNATURALRANGE15DOWNTOO:与BIT、BITVECTOR一样,数据类型INTEGER、NATURAL、POSITIVE都定义在标准程序包STANDARD中。是默认打开的。整数、自然数和正整数数据类型(1)INTEGER在VHDL中的取值范围:-2147483647~2147483647(232/2)。即32位有符号数表示。仿真器作为有符号处理。综合器作为无符号处理。(2)VHDL综合器要求使用RANGE子句为所定义的数限定范围。10
10 e,f : OUT STD_LOGIC); 例化名 : 元件名 PORT MAP( [端口名 =>] 连接端口名,.); 【例 3-19】 ENTITY CNT4 IS PORT ( CLK : IN BIT ; Q : BUFFER INTEGER RANGE 15 DOWNTO 0 ) ; END ; ARCHITECTURE bhv OF CNT4 IS BEGIN PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q <= Q + 1 ; END IF; END PROCESS ; END bhv; 注意: 1、Q 的端口模式 BUFFER Q<=Q+1:Q 出现在“<=”两边,说明 Q 具有输入和输出两种模式;输 入应该是输出信号的反馈方式。 2、VHDL 规定:加、减等算术操作符对应的操作数类型只能是 INTEGER。 3、时序电路描述中采用了不完整的 IF 语句。 3.4 计数器设计 1.程序说明 表式 Q <= Q + 1 的右项与左项并非处于相同的时刻内,对于时序电路,除了 传输延时外,前者的结果出现于当前时钟周期;后者,即左项要获得当前的 Q + 1,需等待下一个时钟周期。 2.数据类型说明 Q : BUFFER INTEGER RANGE 15 DOWNTO 0; 1 十进制整数 0 十进制整数 35 十进制整数 10E3 十进制整数,等于十进制整数 1000 16#D9# 十六进制整数,等于十六进制整数 D9H 8#720# 八进制整数,等于八进制整数 720O 2#11010010# 二进制整数,等于二进制整数 11010010B Q : BUFFER NATURAL RANGE 15 DOWNTO 0; 与 BIT、BIT_VECTOR 一样,数据类型 INTEGER、NATURAL、POSITIVE 都定 义在标准程序包 STANDARD 中。是默认打开的。 整数、自然数和正整数数据类型 (1)INTEGER 在 VHDL 中的取值范围:-2147483647~2147483647(232/2)。即 32 位有符号数表示。 仿真器作为有符号处理。综合器作为无符号处理。 (2)VHDL 综合器要求使用 RANGE 子句为所定义的数限定范围