第六章VHDL中的语句_第1页
第六章VHDL中的语句_第2页
第六章VHDL中的语句_第3页
第六章VHDL中的语句_第4页
第六章VHDL中的语句_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章VHDL中的语句主要内容主要内容顺序语句顺序语句If语句、语句、case语句、语句、Loop语句语句并行语句并行语句进程、元件例化、并行信号赋值语句进程、元件例化、并行信号赋值语句描述风格描述风格行为描述、数据流描述、结构描述行为描述、数据流描述、结构描述一、顺序语句一、顺序语句1 1、if if语句语句u If语句执行一序列的语句,其语句执行一序列的语句,其次序依赖于一个或多个条次序依赖于一个或多个条件的值。件的值。u一般表达形式一般表达形式IF 条件条件 THEN 顺序语句;顺序语句;END IF ;IF 条件条件 THEN 顺序处理语句;顺序处理语句;ELSE 顺序处理语句;顺序处

2、理语句;END IF;IF 条件条件 THEN 顺序处理语句;顺序处理语句;ELSIF 条件条件 THEN 顺序处理语句;顺序处理语句; ELSE 顺序处理语句;顺序处理语句;END IF;一、顺序语句(续一、顺序语句(续1 1)u计数器的设计计数器的设计例例1:Entity CNT4 IS PORT(CLK : IN BIT; Q: BUFFER INTEGER RANGE 15 DOWNTO 0 );END;ARCHITECTURE ONE OF CNT4 IS BEGIN PROCESS(CLK) BEGIN IF CLKEVENT AND CLK=1 THEN Q=Q+1; END I

3、F; END PROCESS; END;定义整数需要定义整数需要限定取值范围限定取值范围思考:整数类型的数据规范?思考:整数类型的数据规范?1、定义时需要限定取值范、定义时需要限定取值范围,否则会采用围,否则会采用32位,造位,造成浪费成浪费2、整数的表达不加引号、整数的表达不加引号一、顺序语句(续一、顺序语句(续2 2)例例2:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT4 IS PORT (CLK : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR

4、(3 DOWNTO 0);END;ARCHITECTURE ONE OF CNT4 IS SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(CLK) BEGIN IF CLKEVENT AND CLK=1 THEN Q1=Q1+1; END IF; END PROCESS;Q=Q1;END;思考:思考:1、是否可以不定义信号、是否可以不定义信号Q1?直接使用直接使用Q0); ELSIF CLKEVENT AND CLK=1 THEN IF EN=1 THEN IF CQI0); END IF; END IF; END IF; CQ=CQ

5、I; END PROCESS; END;CQI:=“0000”;异步异步清零清零同步同步使能使能一、顺序语句(续一、顺序语句(续4 4)RTL电路电路一、顺序语句(续一、顺序语句(续5 5)波形仿真波形仿真时序仿真时序仿真功能仿真功能仿真一、顺序语句(续一、顺序语句(续6 6)u省略赋值操作符省略赋值操作符优点:简化赋值表达,与矢量长度无关优点:简化赋值表达,与矢量长度无关例:例: d11,4=1,others=0); d2e(3),3=1,others=e(1);u同步和异步的概念同步和异步的概念 不依赖于时钟而有效的信号称为异步信号,否则称为同不依赖于时钟而有效的信号称为异步信号,否则称为

6、同步信号。步信号。uIf语句的嵌套语句的嵌套 注意注意END IF的数量的数量 IF 条件条件 THEN IF 条件条件 THEN END IF; END IF;一、顺序语句(续一、顺序语句(续7 7)u不完整不完整if语句语句-产生时序电路的关键产生时序电路的关键例例1:entity comp2 is port(a1,b1:in bit; q1 :out bit);end;architecture one of comp2 is begin process(a1,b1) begin if a1b1 then q1=1; else q1b1 then q1=1; elsif a1b1 then

7、 q1=0; end if; end process; end;不不完整完整if语句语句一、顺序语句(续一、顺序语句(续9 9) 完整条件语句只能构成组合逻辑电路完整条件语句只能构成组合逻辑电路。因此,在利用条件语句设计纯组合电路设计时,如果没有因此,在利用条件语句设计纯组合电路设计时,如果没有充分考虑所有可能出现的条件,将导致不完整条件语句的充分考虑所有可能出现的条件,将导致不完整条件语句的出现,从而综合出不希望的组合与时序电路的混合体。出现,从而综合出不希望的组合与时序电路的混合体。u整数的使用整数的使用 使用使用RANGE 子句定义取值范围子句定义取值范围u运算符重载运算符重载一、顺序语

8、句(续一、顺序语句(续1010)2 2、casecase语句语句u一般表达形式一般表达形式CASE IS WHEN =; WHEN =; WHEN OTHERS =;END CASE;计算表达式的值,根据计算表达式的值,根据WHEN条件句中与之相同的条件句中与之相同的,执行对应顺序语句,执行对应顺序语句选择值在表达式取值范围内,数据类型必须匹配,且只能出现选择值在表达式取值范围内,数据类型必须匹配,且只能出现一次一次当选择值不能完整覆盖表达式取值时,最后必须加上当选择值不能完整覆盖表达式取值时,最后必须加上WHEN OTHERSWHEN OTHERS只能出现只能出现一次一次,作为最后一种条件取

9、值,作为最后一种条件取值相当于相当于THEN,于,于是是一、顺序语句(续一、顺序语句(续1111)u例例1:library ieee;use ieee.std_logic_1164.all;entity mux21a isport(a,b,c,d: in std_logic; ctl : in std_logic_vector(1 downto 0); q : out std_logic);end;architecture one of mux21a isbeginprocess(a,b,c,d,ctl)begincase ctl iswhen 00 =qqqqreg(0)=c0; reg(7

10、 downto 1)=reg(6downto0);cyreg(0)=reg(7);reg(7 downto 1)reg(7)=reg(0);reg(6 downto 0)reg(7)=c0;reg(6 downto 0)=reg(7 downto1);cyreg(7 downto 0)reg=reg;cy=cy; end case; end if;end process;q=reg;cn=cy;end;思考:思考:1、语句顺序是否有影响?会覆盖原值否?将、语句顺序是否有影响?会覆盖原值否?将reg、cy改改成变量可以吗?成变量可以吗?reg(0)=c0;reg(7 downto 0)=reg(

11、6 downto 0);cy cywhen “001”= cy:=reg(7); reg(7 downto 1)=reg(7); reg(7 downto 1):=reg(6 downto 0); reg(0)=reg(6 downto 0); reg(0):=c0; =c0; 带进位左移带进位左移保持保持When others=NULL;一、顺序语句(续一、顺序语句(续1414)3 3、looploop语句语句u循环语句循环语句,使一组顺序语句循环执行,使一组顺序语句循环执行u一般表达形式一般表达形式 单个单个looploop语句语句 标号标号 :LOOP 顺序语句顺序语句; END LOO

12、P标号标号;单个单个loop语句需要语句需要引入其他语句进行循环控制引入其他语句进行循环控制,如:,如:EXIT、NEXT、WAIT;For_loop语句由语句由循环变量范围决定循环次数循环变量范围决定循环次数标号:标号: FOR 循环变量循环变量 IN 循环范围循环范围LOOP 顺序语句;顺序语句;END LOOP标号标号;FOR_LOOPFOR_LOOP语句语句一、顺序语句(续一、顺序语句(续1515)例例1:单个:单个loop语句语句L2 : LOOPa := a+1; EXIT L2 WHEN a10;END LOOP L2;循环标号,用于循环标号,用于多个循环语句多个循环语句条件为真

13、时,条件为真时,跳出循环语句跳出循环语句EXIIT语句格式:语句格式:EXIT;EXIT LOOP 语句;语句;EXIT LOOP 标号标号 WHEN 条件表条件表达式;达式;直接跳出循环直接跳出循环NEXT语句格式:语句格式:NEXT;NEXT LOOP 语句;语句;NEXT LOOP 标号标号 WHEN 条件条件表达式;表达式;跳出循环,跳转跳出循环,跳转到到循环结束处循环结束处跳出循环,跳转跳出循环,跳转到到循环开始处循环开始处NEXT L2 WHEN a10;一、顺序语句(续一、顺序语句(续1515)例例2: FOR_LOOP语句语句library ieee;use ieee.std_

14、logic_1164.all;use ieee.std_logic_unsigned.all;entity cntc isport(din : in std_logic_vector(7 downto 0); cnt : out std_logic_vector(3 downto 0) );end ;architecture one of cntc isbeginprocess(din)variable q : std_logic_vector(3 downto 0);beginq:=0000;FOR n in 0 to 7 LOOPif (din(n)=1) then q:=q+1;end

15、if; end loop; cnt=q;end process;end;循环循环变量变量循环变量:循环变量:1、临时变量(局部变、临时变量(局部变量);量);2、不需要事先定义,由、不需要事先定义,由LOOP语句自动定义;语句自动定义;3、在、在LOOP语句的范围语句的范围内不能再使用同名的标识内不能再使用同名的标识符符循环次数,循环次数,以常数表示以常数表示功能:计算功能:计算“1”码码个数个数一、顺序语句(续一、顺序语句(续1717)仿真波形仿真波形一、顺序语句(续一、顺序语句(续1818)例例3:library ieee;use ieee.std_logic_1164.all;use i

16、eee.std_logic_unsigned.all;entity andc isport(a : in std_logic_vector(3 downto 0); b : in std_logic_vector(3 downto 0); c : out std_logic_vector(3 downto 0);end;architecture one of andc isbeginprocess(a,b)beginfor n in 0 to 3 loopc(n)=b(n) AND a(n);end loop;end process;end;缺点:每次循环都将产生一个硬件模缺点:每次循环都将产

17、生一个硬件模块,硬件资源大量耗用块,硬件资源大量耗用二、并行语句二、并行语句u进程语句、元件例化语句、信号赋值语句进程语句、元件例化语句、信号赋值语句1、简单信号赋值语句、简单信号赋值语句uVHDL并行语句结构中最基本的单元并行语句结构中最基本的单元u一般表达格式:一般表达格式: 赋值目标赋值目标=表达式;表达式;u赋值目标和表达式数据类型一致;赋值目标和表达式数据类型一致;信号赋值语句信号赋值语句简单信号赋值语句简单信号赋值语句条件信号赋值语句条件信号赋值语句选择信号赋值语句选择信号赋值语句ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT; BEG

18、IN d = a AND (NOT S) ; e = b AND s ; y = d OR e ; END ARCHITECTURE one ;二、并行语句(续二、并行语句(续1 1)2、条件信号赋值语句、条件信号赋值语句u一般语法格式一般语法格式赋值目标赋值目标=表达式表达式 WHEN WHEN 赋值条件赋值条件 ELSEELSE 表达式表达式 WHENWHEN 赋值条件赋值条件 ELSEELSE 表达式;表达式;u要执行的表达式是要执行的表达式是第一个满足布尔条件值为第一个满足布尔条件值为true的表达的表达式式u当所有条件都不满足时,执行最后一条表达式当所有条件都不满足时,执行最后一条表

19、达式,最后一条最后一条表达式没有条件子句表达式没有条件子句u功能与功能与if语句相同语句相同注意:注意:此处没此处没有分号有分号条件子句条件子句二、并行语句(续二、并行语句(续2 2)例:例:ENTITY MUX ISPORT(A,B,C : IN BIT; P1,P2 :IN BIT; Z : OUT BIT);END;ARCHITECTURE ONE OF MUX IS BEGIN Z=A WHEN P1=1 ELSE B WHEN P2=1 ELSE C;END;思考:思考:1、如果、如果P1和和P2同时为同时为1,执行哪,执行哪条语句?条语句?Z是多少?是多少?2、如果改用、如果改用i

20、f语语句?句?二、并行语句(续二、并行语句(续3 3)3、选择信号赋值语句、选择信号赋值语句u一般语法格式一般语法格式 WITH WITH 选择表达式选择表达式 SELECTSELECT 赋值目标信号赋值目标信号=表达式表达式 WHENWHEN 选择值选择值, , 表达式表达式 WHENWHEN 选择值选择值, , 表达式表达式 WHEN WHEN 选择值选择值 表达式表达式 WHEN OTHERSWHEN OTHERS;u当选择表达式的值发生变化,就启动语句,对选择值进行测试对比当选择表达式的值发生变化,就启动语句,对选择值进行测试对比u选择值覆盖选择表达式的所有取值,如不能覆盖,最后加上选

21、择值覆盖选择表达式的所有取值,如不能覆盖,最后加上WHEN OTHERS子句子句u选择值不能重复选择值不能重复u与与case语句功能相同语句功能相同二、并行语句(续二、并行语句(续4 4)例:例:ENTITY DECODER IS PORT(A , B, C : IN STD_LOGIC; DATA1,DATA2:IN STD_LOGIC; DATAOUT : OUT STD_LOGIC);END;ARCHITECTURE ONE OF DECODER IS SIGNAL CQI:STD_LOGIC_VECTOR(2 DOWNTO 0); CQI=A&B&C; WITH CQI

22、 SELECT DATAOUT=DATA1 AND DATA2 WHEN”000”, DATA1 OR DATA2 WHEN”001”, DATA1 NAND DATA2 WHEN”010”, Z WHEN OTHERS; END; 三、一些程序示例三、一些程序示例1、数码管扫描显示、数码管扫描显示在数码管上显示在数码管上显示1、2、3、4、5、6、7、8共阴数码管共阴数码管共阳数码管共阳数码管显示显示dpdpg gf fe ed dc cb ba a十六进制十六进制0 0001111113f3f1 10000011006062 2010110115b5b三、一些程序示例(续三、一些程序示例(

23、续1 1)静态扫描:静态扫描:每位数码管的每位数码管的8位段选信号都必须接位段选信号都必须接8个数据端个数据端动态扫描:动态扫描:每位数码管的每位数码管的8位段选信号都连在一起,通过增加公共端位段选信号都连在一起,通过增加公共端com作为位选信号,在任一个时刻只选择一位数码管显示作为位选信号,在任一个时刻只选择一位数码管显示数据。通过调节合适的扫描频率,数据。通过调节合适的扫描频率,利用发光二极管的余辉利用发光二极管的余辉和人眼视觉暂留作用,使人感觉各位数码管同时在显示和人眼视觉暂留作用,使人感觉各位数码管同时在显示。思考:思考:8位数码管采用静态扫描形式需要多少位数码管采用静态扫描形式需要多

24、少位位I/O口?动态扫描呢?口?动态扫描呢?三、一些程序示例(续三、一些程序示例(续2 2)程序示例程序示例library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity scan1 isport( clk:in std_logic; seg:out std_logic_vector(7 downto 0); dig:out std_logic_vector(7 downto 0);End;扫描时钟扫描时钟 段选信号段选信号三、一些程序示例(续三、一些程序示例(续3 3)architecture o

25、ne of scan1 issignal ain: integer range 0 to 9;signal abc :std_logic_vector(2 downto 0); begin p0:process(clk) begin if clkevent and clk=1 then abcdig=11111110;aindig=11111101;aindig=11111011;aindig=11110111;aindig=11101111;aindig=11011111;aindig=10111111;aindig=01111111;ainnull; end case; end proce

26、ss p1;产生产生扫描扫描计数计数信号信号动态动态扫描扫描数码数码管管打开最低位数打开最低位数码管,显示数码管,显示数字字1三、一些程序示例(续三、一些程序示例(续4) 4)p2:process(ain)begincase ain is when 0 = seg seg seg seg seg seg seg seg segnull; end case;end process p2;end;译码译码三、一些程序示例(续三、一些程序示例(续5) 5)2、设计一个、设计一个同步并行同步并行置数,置数,串行右移移出串行右移移出的的移位寄存器移位寄存器library ieee;use ieee.st

27、d_logic_1164.all;entity shift isport(clk,load:in std_logic; din :in std_logic_vector(7 downto 0); q :out std_logic);end;architecture one of shift isbeginprocess(load)variable reg8:std_logic_vector(7 downto 0); begin if clkevent and clk=1 then if load=1 then reg8:=din; else reg8(6 downto 0):=reg8(7 d

28、ownto 1); end if; end if;q=reg8(0);end process;end;三、一些程序示例(续三、一些程序示例(续6) 6)波形仿真结果波形仿真结果三、一些程序示例(续三、一些程序示例(续7) 7)3、数控分频器的设计、数控分频器的设计 分频器设计的基础分频器设计的基础计数器计数器u计满全计满全1后,产生进位信号后,产生进位信号cout,cout的频率是计数时钟的频率是计数时钟频率的频率的16分之一,称分之一,称cout是是clk的十六分频。的十六分频。u如果有一个预置数如果有一个预置数d3.0,从从d开始计数计到全开始计数计到全1,这时,这时进位信号进位信号cou

29、t与与clk的频率关系是什么呢?的频率关系是什么呢?u如果是一个减法计数器呢?如果是一个减法计数器呢?4 4位二进制加法计数器位二进制加法计数器分频比R=“1111”-d3.0+1三、一些程序示例(续三、一些程序示例(续8) 8)library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity pulse is port(clk : in std_logic; d : in std_logic_vector(7 downto 0); fout : out std_logic); end; 分频后

30、结果,分频后结果,连接到蜂鸣器,连接到蜂鸣器,观察发声情况观察发声情况计数器计数脉计数器计数脉冲信号,同时冲信号,同时也是分频前的也是分频前的原始信号原始信号分频预置数分频预置数d三、一些程序示例(续三、一些程序示例(续9) 9) architecture one of pulse is signal full : std_logic; begin p0:process(clk) variable cnt8 :std_logic_vector(7 downto 0); begin if clkevent and clk=1 then if cnt8=11111111 then cnt8:=d;

31、 full=1; else cnt8:=cnt8+1;full=0; end if; end if; end process; p1:process(full) variable cnt2 :std_logic; begin if fullevent and full=1 then cnt2:=not cnt2; end if; if cnt2=1 then fout=1; else fout=0; end if; end process; end;思考:思考:1、信号、信号full的频率是多少?的频率是多少?2、可否定义变量来替代信号、可否定义变量来替代信号full?3、信号、信号fout的

32、频率是多少?的频率是多少?4、为什么要将信号、为什么要将信号full二分频产二分频产生生fout输出到扬声器,直接使用信输出到扬声器,直接使用信号号full连接到扬声器可以吗?连接到扬声器可以吗?进进程程p0进进程程p1作为敏感参数,作为敏感参数,在两个进程中在两个进程中传递信息传递信息三、一些程序示例(续三、一些程序示例(续10)10)思考:思考:1、分频波形从、分频波形从12.8us开始的原因?开始的原因?2、clk时钟频率为时钟频率为20MHz,预置数,预置数d=252,则信号,则信号full的频率?的频率?信号信号fout的频率?的频率?3、如果预置数是、如果预置数是238呢?呢?计计

33、数数寄寄存存器器cnt8从零开始计从零开始计数,记到全数,记到全1时才时才进行第一次初值置进行第一次初值置入,然后才开始分入,然后才开始分频频思考:采用此方法能够设计的分频器的特点?思考:采用此方法能够设计的分频器的特点? 偶次分频?奇次分频?占空比?偶次分频?奇次分频?占空比?三、一些程序示例(续三、一些程序示例(续11)11)4、任意占空比是、任意占空比是50%的奇数分频电路的设计的奇数分频电路的设计设计一个占空比为设计一个占空比为50%的三分频电路的三分频电路library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsig

34、ned.all;entity pulse isport( clk : in std_logic; c1,c2 : out std_logic_vector(2 downto 0); q ,q1,q2 : out std_logic);end;三、一些程序示例(续三、一些程序示例(续12)12)architecture one of pulse issignal cnt1,cnt2 : std_logic_vector(2 downto 0);signal cout1,cout2: std_logic;beginprocess(clk)beginif clkevent and clk=1 the

35、n if cnt1=010 then cnt1=000;else cnt1=cnt1+1;end if;if cnt1=001 then cout1=not cout1; elsif cnt1=010 then cout1=not cout1;end if;end if;end process;process(clk)beginif clkevent and clk=0 thenif cnt2=010 then cnt2=000;else cnt2=cnt2+1;end if;if cnt2=001 then cout2=not cout2;elsif cnt2=010 then cout2=

36、not cout2;end if;end if;end process;c1=cnt1;c2=cnt2;q1=cout1;q2=cout2;q=cout1 or cout2;end;占占空空比比非非50%的的奇奇数数N次次分分频频三、一些程序示例(续三、一些程序示例(续13)13)总结:如何设计占空比为总结:如何设计占空比为50%的任一奇数的任一奇数N次分频电路?次分频电路?上升沿上升沿触发模触发模N计数,选定计数到某一个值输出时钟翻转,然后经过计数,选定计数到某一个值输出时钟翻转,然后经过(N-1)/2次计数后再次进行翻转得到一个次计数后再次进行翻转得到一个占空比非占空比非50%奇数奇数N分

37、频时钟分频时钟下降沿下降沿触发模触发模N计数,选定和上升沿触发输出时钟翻转相同的值,同样经过计数,选定和上升沿触发输出时钟翻转相同的值,同样经过(N-1)/2次计数后再将输出时钟再次翻转,得到一个占空比非次计数后再将输出时钟再次翻转,得到一个占空比非50%的奇数的奇数N分频分频两个占空比非两个占空比非50%的的N分频时钟分频时钟相或相或运算,得到占空比为运算,得到占空比为50%的奇数的奇数N分频时钟分频时钟四、四、VHDLVHDL的描述方式的描述方式u相同的逻辑行为,可以有不同的语句表达方式相同的逻辑行为,可以有不同的语句表达方式。u在在VHDL模块中,不同的描述方式可以分为三类:模块中,不同的描述方式可以分为三类:行为描行为描述、数据流描述、结构描述述、数据流描述、结构描述。1、行为描述、行为描述u只描述了只

温馨提示

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

评论

0/150

提交评论