VHDL设计方法-用VHDL语言实现可编程数字系统设计.ppt

上传人:yyf 文档编号:5021396 上传时间:2020-01-29 格式:PPT 页数:136 大小:1.04MB
返回 下载 相关 举报
VHDL设计方法-用VHDL语言实现可编程数字系统设计.ppt_第1页
第1页 / 共136页
VHDL设计方法-用VHDL语言实现可编程数字系统设计.ppt_第2页
第2页 / 共136页
VHDL设计方法-用VHDL语言实现可编程数字系统设计.ppt_第3页
第3页 / 共136页
VHDL设计方法-用VHDL语言实现可编程数字系统设计.ppt_第4页
第4页 / 共136页
VHDL设计方法-用VHDL语言实现可编程数字系统设计.ppt_第5页
第5页 / 共136页
点击查看更多>>
资源描述

《VHDL设计方法-用VHDL语言实现可编程数字系统设计.ppt》由会员分享,可在线阅读,更多相关《VHDL设计方法-用VHDL语言实现可编程数字系统设计.ppt(136页珍藏版)》请在三一文库上搜索。

1、VHDL设计方法,用VHDL语言实现可编程数字系统设计,VHDL设计方法,VHDL概述 VHDL的设计单元 VHDL的基本语法结构,第一部分,VHDL 概述,VHDL的含义,VHSIC (Very High Speed Integrated Circuit) Hardware Description Language,VHDL历史,1982年, 诞生于美国国防部赞助的VHSIC项目 1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言 ,即IEEE-1076(简称87版) 1993年,IEEE对VHDL进行了修订,公布了新版本的VHDL,即IEEE标准的1076-1993(116

2、4)版本 1996年,IEEE-1076.3成为VHDL综合标准,VHDL特点,与其他的硬件描述语言相比,VHDL具有更强的行为描述能力 VHDL丰富的仿真语句和库函数,使得在设计的早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟 VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能 对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表 VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计,VHDL与其他HDL比较,VH

3、DL “告诉我你想要电路做什么,我给你提供能实现这个功能的硬件电路” Verilog 和VHDL类似 ABEL、AHDL “告诉我你想要什么样的电路,我给你提供这样的电路”,典型的综合流程,典型的仿真流程,第二部分,VHDL的设计单元,VHDL的设计单元,Entity(实体) 用来说明模型的外部输入输出特征 Architecture(构造体) 用来定义模型的内容和功能 每一个构造体必须有一个实体与它相对应,所以两者一般成对出现,实体,类似一个“黑盒”,实体描述了“黑盒”的输入输出口,实体举例,ENTITY black_box IS Generic ( constant width : inte

4、ger := 7;); PORT ( clk, rst: IN std_logic; d: IN std_logic_vector(width DOWNTO 0); q: OUT std_logic_vector(width DOWNTO 0); co: OUT std_logic); END black_box;,Generic,类属参量 一种端口界面常数,用来规定端口的大小、实体中子元件的数目等 与常数不同,常数只能从内部赋值而类属参量可以由实体外部赋值 数据类型通常取Integer或Time 综合器仅支持数据类型为整数的类属值。,PORTS,端口(PORT)是实体的一部分 PORT 类似

5、于器件的管脚,主要用于信号的传输 PORT 一般有 Name, Mode, 和 Type 端口说明格式 PORT (SIGNAL Name:Mode Type BUS :=表达式 , ),端口类型,IN: 数据只能从端口流入实体 OUT: 数据只能从端口流出实体 INOUT: 数据从端口流入或流出实体 BUFFER: 数据从端口流出实体,同时可被内部反馈,数据类型,BIT :位类型,其值只能为 0或 1 BIT_VECTOR :位矢量类型,包含一组位类型 BOOLEAN:布尔类型,其值可为 TRUE或FALSE INTEGER:整型,范围为-214783647到214783647(232),综

6、合时,要对范围加以限制。常用于循环语句的循环次数、常量、数学函数或模式仿真 Natural:自然数类型,整型的子类型,含零和正整数 Positive:正整数类型,整型的子类型,含非零和非负整数 REAL:浮点类型,范围为:-1.0E38到1.0E38很多综合器不支持该类型,数据类型,枚举类型:用户定义的数据类型 例: TYPE traffic_light IS (red, yellow,green ) TYPE int IS RANGE 0 TO 100 数组类型:分一维数组和二维数组,限定性和非限定性数组 例: TYPE Bit_Vector IS ARRAY (Natural RANGE)

7、 OF Bit; TYPE Word IS ARRARY (31 downto 0) OF Bit; SUBTYPE:子类型,一般用来对其父类型加以限制 例: SUBTYPE Std_Logic IS resolved Std_Ulogic TIME:时间类型,范围和整型一样,表达时要包括数值和单位两部分。单位包括:fs、ps、ns、us、ms、sec、min、hr。一般用于仿真,数据类型,记录类型 TYPE Month_Name IS (Jan,Fab,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); TYPE date IS RECORD day : In

8、teger RANGE 1 TO 31; month : Month_Name; year : Integer RANGE 0 to 3000; END RECORD; VARIABLE today : date; today : =(15, may, 1995);,Std_Logic数据类型,IEEE 1164中定义的一种数据类型,它包含9种取值分别为: U 未初始化 用于仿真 X 强未知 用于仿真 0 强0 用于综合与仿真 1 强1 用于综合与仿真 Z 高阻 用于综合与仿真 W 弱未知 用于仿真 L 弱0 用于综合与仿真 H 弱1 用于综合与仿真 _ 忽略 用于综合与仿真,Std_Logi

9、c数据类型,它是数字电路设计的工业标准逻辑类型 它增加了VHDL语言编程、综合和仿真的灵活性 在多值逻辑系统中STD_LOGIC和 STD_LOGIC_VECTOR 用于取代 BIT 和 BIT_VECTOR 若电路中有三态逻辑(Z) 必须用STD_LOGIC 和 STD_LOGIC _VECTOR 要使用这种类型代码中必须申明库和程序包说明语句 LIBRARY ieee; USE ieee.std_logic_1164.ALL;,练习一,编写包含以下内容的实体代码 端口 D 为12位输入总线 端口 OE 和 CLK 都是1位输入 端口 AD 为 12位双向总线 端口 A为12位输出总线 端口

10、 INT 是1位输出 端口 AS 是一位输出同时被用作内部反馈,练习一答案,LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY my_design IS PORT ( d: IN std_logic_vector(11 DOWNTO 0); oe, clk: IN std_logic; ad: INOUT std_logic_vector(11 DOWNTO 0); a: OUT std_logic_vector(11 DOWNTO 0); int: OUT std_logic; as: BUFFER std_logic); END my_des

11、ign;,构造体,用来描述实体的内部结构和逻辑功能 必须和实体(ENTITY)相联系 一个实体(ENTITY)可以有多个构造体 构造体的运行是并发的 构造体描述方式包括: 行为描述 结构描述 混合描述,实体和构造体之间的关系,Input 1,Input n,Output 1,Output n,实体,A B C D Sel,MUX_Out,2,构造体结构图,构造体行为描述举例,2 X 8 Input AND gate: ENTITY black_box IS PORT ( a, b: IN std_logic_vector(7 DOWNTO 0); y: OUT std_logic_vector

12、(7 DOWNTO 0); END black_box; ARCHITECTURE example OF black_box IS BEGIN y = a AND b; END example;,数据对象常数,指在设计中不会变的值 改善代码可读性,便于代码修改 必须在程序包、实体、构造体或进程的说明区域加以说明 一般要赋一初始值 保留字CONSTANT 例: CONSTANT Width : Integer :=8,数据对象信号,可代表连线、内连元件、或端口 用“=”来给信号赋值 SIGNAL SIGNAL Count: Bit_Vector(3 downto 0); IF Rising_Ed

13、ge(clk) THEN Count=Count+1; END IF; 信号在Package、Entity、Architecture 中声明,数据对象信号,信号举例,LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY simp IS PORT(a, b, c, d : IN Std_Logic; g : OUT Std_Logic); END simp; ARCHITECTURE logic OF simp IS SIGNAL e,f : Std_Logic; BEGIN e = a or b; f=not(c or d); g =e and f

14、; END logic;,信号赋值,SIGNAL temp : Std_Logic_Vector (7 downto 0); 整体赋值: temp = “10101010”; temp = x”AA” ; 逐位赋值: temp(7) = 1; 多位赋值: temp (7 downto 4) = “1010”;,数据对象变量,仅用于进程和子程序 必须在进程和子程序的说明性区域说明 不能表达连线和存储元件 保留字VARIABLE VARIABLE tmp : Bit; tmp:=1;,变量赋值,整体赋值: temp := “10101010”; temp := x”AA” ; 逐位赋值: temp

15、(7) := 1; 多位赋值 temp (7 downto 4) := “1010”;,信号和变量的作用范围,ARCHITECTURE,信号和变量的区别,算术运算符,关系运算符,逻辑运算符,其他运算符,运算优先级,* ABS NOT * / MOD REM +正 -负 + - & SLL SLA SRL SRA ROL ROR = = AND OR NAND NOR XOR XNOR,高,低,运算重载,若两信号类型不同,不能将一个信号的值赋给另一信号 数据转换必须要用运算重载 一般可用IEEE .1164中的标准重载函数实现 LIBRARY IEEE; USE IEEE_Std_Logic_1

16、164.all; USE IEEE_Std_Logic_Arith.all; USE IEEE_Std_Logic_unsigned.all USE IEEE_Std_Logic_signed.all,并行语句,并行语句1,构造体,并行语句2,并行语句3,signal,signal,并行语句,VHDL语言与传统软件描述语言最大的不同 有多种语句格式,包括:并行信号赋值语句、进程语句、块语句、条件信号赋值语句、元件例化语句、生成语句、并行过程调用语句 各种并行语句在结构体中的执行是同步进行的,或者说是并行运行的,其执行方式与书写的顺序无关。 在执行中,并行语句之间可以有信息往来,也可以是互为独立

17、、互不相关、异步运行的(如多时钟情况)。 每一并行语句内部的语句运行方式可以有两种不同的方式,即并行执行方式(如块语句)和顺序执行方式(如进程语句)。,布尔表达式,VHDL支持所有的标准逻辑运算符 AND, OR, NOT, XOR, XNOR, NAND 例: x =(a AND NOT(s(1) AND NOT(s(0) OR (b AND NOT(s(1) AND s(0) OR (c AND s(1) AND NOT(s(0) OR (d AND s(1) AND s(0) ; y = a OR b OR c;,With_Select_Then选择信号语句,所有的“WHEN”子句必须是

18、互斥的 一般用 “When Others”来处理未考虑到的情况 只有一个参考信号和赋值符 (=) 每一子句结尾是逗号,最后一句是分号 WITH selection_signal SELECT signal_name = value_1 WHEN value_a, value_2 WHEN value_b, . value_n WHEN value_n, value_x WHEN OTHERS;,With_Select_Then语句举例,LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY cmpl_sig IS PORT ( a, b,c,d,s

19、: IN STD_LOGIC; x : OUT STD_LOGIC); END cmpl_sig; ARCHITECTURE logic OF cmpl_sig IS BEGIN WITH s SELECT x =a WHEN “00”, b WHEN “01”, c WHEN “10”, d WHEN OTHERS;,With_Select_Then语句举例,每个WHEN子句可以包含多个条件: WITH s SELECT x = a WHEN ”000” | “001” | “010”, b WHEN “101“ | “111“, c WHEN OTHERS;,When_Else选择信号语句

20、,根据指定条件对信号赋值,条件可以为任意表达式 根据条件的出现的先后次序隐含优先权 最后一个 ELSE子句隐含了所有未列出的条件 每一子句的结尾没有标点,只有最后一句有分号 signal_name = value_1 WHEN condition1 ELSE value_2 WHEN condition2 ELSE . value_n WHEN conditionn ELSE value_x;,When_Else语句举例,x = a when (s = “00”) else b when (s = “01”) else c when (s = “10”) else d ;,When_Else语

21、句举例,j = w when (a = 1) else x when (b = 1) else y when (c = 1) else z when (d = 1) else 0 ;,进程语句,VHDL中最重要的语句,具有并行和顺序行为的双重性 进程和进程语句之间是并行关系 进程内部是一组连续执行的顺序语句 进程语句与构造体中的其余部分进行信息交流是靠信号完成的 基本格式: 进程标号: PROCESS (信号敏感表) IS 说明区 BEGIN 顺序语句 END PROCESS 进程标号;,进程语句,信号敏感表,进程赖以启动的敏感表。对于表中列出的任何信号的改变,都将启动进程,执行进程内相应顺序

22、语句 一些VHDL综合器,综合后,对应进程的硬件系统对进程中的所有输入的信号都是敏感的,不论在源程序的进程中是否把所有的信号都列人敏感表中 为了使软件仿真与综合后的硬件仿真对应起来,应当将进程中的所有输人信号都列入敏感表中,顺序语句,每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本一致的 顺序语句只能出现在进程(Process) 、函数(Funcation)和过程(Procedure)中 顺序语句包括:赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句,LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY if_ca

23、se IS PORT ( a, b, c, d : IN Std_Logic; sel : IN Std_Logic_Vector(1 downto 0); y, z : OUT Std_Logic); END if_case; ARCHITECTURE logic OF if_case IS BEGIN if_label: PROCESS(a, b, c, d, sel) BEGIN IF sel=“00“ THEN y = a; ELSIF sel=“01“ THEN y = b; ELSIF sel=“10“ THEN y = c; ELSE y = d; END IF; END PRO

24、CESS if_label;,case_label: PROCESS(a, b, c, d, sel) BEGIN CASE sel IS WHEN “00“ =z z z z z = 0; END CASE; END PROCESS case_label; END logic;,进程语句举例,敏感表举例,latchlabel: PROCESS(oe) BEGIN IF oe=1 THEN y = a; END IF; END PROCESS if_label;,敏感表举例,latchlabel: PROCESS(oe,a) BEGIN IF oe=1 THEN y = a; END IF;

25、END PROCESS if_label;,顺序赋值语句举例,LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ttt1 IS PORT (en : in std_logic; y : OUT Std_Logic_vector(0 to 7); END ttt1; ARCHITECTURE logic OF ttt1 IS SIGNAL s1,s2 :Std_logic; SIGNAL t:Std_Logic_vector (0 to 7); BEGIN PROCESS(s1,s2,en) Variable v1,v2:Std_logic;,B

26、egin if en=1 then V1:=1; V2:=1; s1=1; s2=1; t(0)=v1; t(1)=v2; t(2)=s1; t(3)=s2; v1:=0; v2:=0; s2=0; t(4)=v1; t(5)=v2; t(6)=s1; t(7)=s2; end if; End process; y=t; end;,顺序赋值语句举例,顺序赋值语句举例,ARCHITECTURE reg1 OF reg1 IS SIGNAL a, b : BIT; BEGIN PROCESS (clk) BEGIN IF rising_edge(clk) THEN a = d; b = a; q

27、= b; END IF; END PROCESS; END reg1;,顺序赋值语句举例,ENTITY reg1 IS PORT ( d : in BIT; clk : in BIT; q : out BIT); END reg1; ARCHITECTURE reg1 OF reg1 IS SIGNAL a, b : BIT; BEGIN PROCESS (clk) BEGIN IF rising_edge(clk) THEN a = d; b = a; END IF; END PROCESS; q = b; END reg1;,顺序赋值语句举例,ENTITY reg1 IS PORT ( d

28、 : in BIT; clk : in BIT; q : out BIT); END reg1; ARCHITECTURE reg1 OF reg1 IS VARIABLE a, b : BIT; BEGIN PROCESS (clk) BEGIN IF rising_edge(clk) THEN a = d; b = a; q = b; END IF; END PROCESS; END reg1;,在时序电路中的变量赋值,变量在IF语句中被赋值,以用来表示随时钟的变化,不会产生触发器 变量只代表临时存储,不反映实际硬件 变量可用在表示一数据立即变化的表达式中,然后再将变量的值赋给信号,IF_

29、THEN_ELSE语句,只能在进程内使用 至少应有一个条件句,条件句必须由布尔表达式构成。 根据条件句产生的判断结果TRUE或FALSE,有条件地选择执行其后的顺序语句。,IF 条件句 Then 顺序语句 ENDIF,IF 条件句 THEN 顺序语句 ELSE 顺序语句 ENDIF,IF 条件句 Then 顺序语句 ELSIF 条件句 Then 顺序语句 ELSE 顺序语句 ENDIF,IF_THEN_ELSE语句,mux4_1: PROCESS (a, b, c, d, s) BEGIN IF s = “00” THEN x = a ; ELSIF s = “01” THEN x = b ;

30、 ELSIF s = “10” THEN x = c ; ELSE x = d ; END IF; END PROCESS mux4_1 ;,IF_THEN_ELSE语句,ex1: PROCESS (a, b) BEGIN IF a=1 THEN c=0; - if a and b are END IF; - both 1 then IF b=1 THEN c=1; - b has priority END IF; - so c = 1; END PROCESS ex1; ex2: PROCESS (a, b) BEGIN IF b=1 THEN c=1; - if a and b are E

31、ND IF; - both 1 then IF a=1 THEN c=0; - a has priority END IF; - so c = 0; END PROCESS ex2;,CASE_WHEN语句,表达式可以是一个整数类型或枚举类型的值,也可以是由这些数据类型的值构成的数组 条件句中的选择值必在表达式的取值范围内。 除非所有条件句中的选择值能完整覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示。 CASE语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现。 CASE语句执行中必须选中,且只能选中所列条件语句中的一条。,CASE_W

32、HEN语句,mux4_1: PROCESS (a,b,c,d,s) BEGIN CASE s IS WHEN “00“ = x x x x = d; END CASE; END PROCESS mux4_1;,LOOP语句,基本格式: LOOP标号: 重复模式 LOOP 顺序语句; END LOOP LOOP标号,WHILE LOOP 顺序语句 END LOOP;,FOR IN LOOP 顺序语句 END LOOP;,LOOP标号: LOOP 顺序语句 EXIT LOOP标号 ; END LOOP;,NEXT LOOP标号 WHEN 语句,LOOP语句示例,LIBRARY ieee; USE

33、ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY shift4 IS PORT ( shft_lft : in std_logic; d_in : in std_logic_vector(3 downto 0); q_out : out std_logic_vector(7 downto 0); END shift4; ARCHITECTURE logic OF shift4 IS BEGIN PROCESS(d_in, shft_lft) VARIABLE shft_var : std_logic_vector(

34、7 DOWNTO 0);,BEGIN shft_var(7 downto 4) := “0000“; shft_var(3 downto 0) := d_in; IF shft_lft = 1 THEN FOR i IN 7 DOWNTO 4 LOOP shft_var(i) := shft_var(i-4); END LOOP; shft_var(3 downto 0) := “0000”; ELSE shft_var := shft_var; END IF; q_out = shft_var; END PROCESS; END logic;,组合电路举例,LIBRARY ieee; USE

35、 ieee.std_logic_1164.ALL; ENTITY compare IS PORT ( a, b: IN std_logic_vector(0 TO 3); aeqb: OUT std_logic); END compare; ARCHITECTURE archcompare OF compare IS BEGIN aeqb = 1 WHEN a = b ELSE 0; END archcompare;,组合电路举例,LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY compare IS PORT ( a, b: IN std_l

36、ogic_vector(0 TO 3); aeqb: OUT std_logic); END compare; ARCHITECTURE archcompare OF compare IS BEGIN aeqb = NOT( (a(0) XOR b(0) OR (a(1) XOR b(1) OR (a(2) XOR b(2) OR (a(3) XOR b(3); END archcompare;,组合电路举例,ARCHITECTURE archcompare OF compare IS BEGIN comp: PROCESS (a, b) BEGIN IF a = b THEN aeqb =

37、1; ELSE aeqb = 0; END IF; END PROCESS comp; END archcompare;,组合电路举例,ARCHITECTURE archincomplete OF incomplete IS BEGIN im_mem: PROCESS (a,b) BEGIN IF a = 1 THEN c = b; END IF; END PROCESS im_mem; END archincomplete;,组合电路举例,ARCHITECTURE archcomplete OF complete IS BEGIN no_mem: PROCESS (a, b) BEGIN I

38、F a = 1 THEN c = b; ELSE c = 0; END IF; END PROCESS no_mem; END archcomplete;,避免引入锁存效应,用ELSE子句结束IF.THEN. 语句 在CASE语句中覆盖所有的可能条件或在CASE的最后用WHEN OTHERS子句 CASE select IS WHEN “100“ = key key key key = none; END CASE;,时序电路举例,LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff_a IS PORT ( d : in std_logic

39、; clk : in std_logic; q : out std_logic); END dff_a; ARCHITECTURE behavior OF dff_a IS BEGIN PROCESS (clk) BEGIN IF clkevent and clk = 1 THEN q = d; END IF; END PROCESS; END behavior;,时序电路举例,ARCHITECTURE behavior OF dff_clr IS BEGIN PROCESS(clk, clr) BEGIN IF clr = 0 THEN q = 0; ELSIF rising_edge(cl

40、k) THEN q = d; END IF; END PROCESS; END behavior;,时序电路举例,LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; upcount: PROCESS (clk, rst) BEGIN IF rst = 1 THEN count = x“0“ ; ELSIF rising_edge(clk) THEN IF load = 1 THEN count = data; ELSE count = count + 1; END IF; END IF; END

41、 PROCESS upcount;,时序电路举例,ARCHITECTURE logic OF count_a IS BEGIN PROCESS(rst, clk) VARIABLE tmp_q : std_logic_vector(15 downto 0); BEGIN IF rst = 0 THEN q = 0; ELSIF rising_edge(clk) THEN IF updn = 1 THEN tmp_q := tmp_q + 1; ELSE tmp_q := tmp_q - 1; END IF; q = tmp_q; END IF; END PROCESS; END logic;,

42、三态电路举例,ENTITY test_three IS PORT( oe : IN std_logic; data : OUT std_logic_vector(0 to 7); END test_three; ARCHITECTURE archtest_three OF test_three IS BEGIN PROCESS (oe) BEGIN IF (oe=1) THEN data = “01100100“; ELSE data = “ZZZZZZZZ“; END IF; END PROCESS; END archtest_three;,双向口举例,ENTITY ldcnt IS POR

43、T ( clk, ld, oe: IN std_logic; count: INOUT std_logic_vector(7 DOWNTO 0); END ldcnt; ARCHITECTURE archldcnt OF ldcnt IS SIGNAL int_count: std_logic_vector(7 DOWNTO 0); BEGIN cnt: PROCESS (clk) BEGIN IF rising_edge(clk) THEN IF ld=1 THEN int_count = count; ELSE int_count = int_count + 1; END IF; END

44、IF; END PROCESS cnt ;,双向口举例,outen: PROCESS (oe, int_count) BEGIN IF oe = 1 THEN count Z) ; END IF ; END PROCESS outen; END archldcnt;,别 名,标志一个以存在的数据对象 引用别名等效于引用原始数据对象 给别名赋值等效于给原始数据赋值 常作为标识一组数据类型 保留字:ALIAS ALIAS Bank:Bit_Vector(0 to 3) IS Address(24 to 27);,状态机设计,二进制状态机编码,状态机的每一个状态用二进制位来编码 例:实现4状态的状态

45、机,其二进制编码可为 状态1“00” 状态2“01” 状态3“10” 状态4“11” 特点 触发器使用较少,速度较慢,可能产生两位同时翻转的情况。如:“01”“10”,格雷码状态机编码,格雷码编码每次仅一个状态位的值发生变化 例:实现4状态的状态机,其格雷码编码可为 状态1“00” 状态2“01” 状态3“11” 状态4“10” 特点 触发器使用较少,速度较慢,不会产生两位同时翻转的情况。当状态位的输出被异步应用时,格雷码编码是特别有益的,ONE HOT状态机编码,ONE HOT的编码方案对每一个状态采用一个触发器,即4个状态的状态机需4个触发器。同一时间仅1个状态位处于逻辑“l”电平 例:实

46、现4状态的状态机,其ONE HOT编码可为 状态1“0001” 状态2“0010” 状态3“0100” 状态4“1000” 特点 触发器使用较多,但逻辑简单,速度快,编码方式的选择,根据状态机复杂程度 状态特别多的系统只能采用2进制编码或格雷码编码 根据器件类型 FPGA一般采用ONE HOT编码,CPLD一般采用2进制编码或格雷码编码 从非法状态中退出 在选择编码方案时,必须考虑状态机可能进入的潜在的非法状态数目。如果违反了状态位触发器的建立或保持时间,又没有定义所有可能出现的状态,则你的设计会终止在非法状态上。,状态机设计实体描述,LIBRARY ieee; USE ieee.std_lo

47、gic_1164.ALL; ENTITY state_machine IS PORT ( clock, reset: IN std_logic; timer1, timer2, timer3: IN std_logic; r, y, g: OUT std_logic); END state_machine;,状态机设计方案一,ARCHITECTURE arch_1 OF state_machine IS TYPE traffic_states IS (red, yellow, green); SIGNAL sm: traffic_states; BEGIN fsm: PROCESS (cloc

48、k, reset) BEGIN IF reset = 1 THEN sm IF timer1=1 THEN sm IF timer2=1 THEN sm = yellow; END IF;,状态机设计方案一,WHEN yellow = IF timer3=1 THEN sm sm = red; END CASE; END IF; END PROCESS fsm; r = 1 WHEN (sm = red) ELSE 0; g = 1 WHEN (sm = green) ELSE 0; y = 1 WHEN (sm = yellow) ELSE 0; END arch_1;,方案分析,状态机设计方案二,ARCHITECTURE arch_2 OF state_machine IS TYPE traffic_states IS (red, yellow, green); SIGNAL sm: traffic_states; BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = 1 THEN sm IF timer1=1 THEN sm = green

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1