首页 AHDL

AHDL

举报
开通vip

AHDL第五章AHDL语言及其应用AHDL语言概述AHDL(AlteraHardwareDescriptionLanguage)语言是一种支持Altera公司器件的硬件描述语言,它是一种模块化的高级语言,集成于MAX+PLUSII系统中,适合描述复杂的组合逻辑、状态机和真值表。用户可以使用AHDL语言建立一个完整的层次结构,也可以在一个层次结构的设计中混合使用AHDL文本设计和其他类型的设计文件,但在存储、编译等环节其文件的扩展名一定是TDF(*.tdf)。5.1AHDL设计的基本结构一个简单的示例:AHDL语言的规则及结...

AHDL
第五章AHDL语言及其应用AHDL语言概述AHDL(AlteraHardwareDescriptionLanguage)语言是一种支持Altera公司器件的硬件描述语言,它是一种模块化的高级语言,集成于MAX+PLUSII系统中,适合描述复杂的组合逻辑、状态机和真值表。用户可以使用AHDL语言建立一个完整的层次结构,也可以在一个层次结构的设计中混合使用AHDL文本设计和其他类型的设计文件,但在存储、编译等环节其文件的扩展名一定是TDF(*.tdf)。5.1AHDL设计的基本结构一个简单的示例:AHDL语言的 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 及结构特点:1)在ADHL语言中字符不区分大小写,即大小写的含义相同。2)同一类型多个输入、输出或变量之间可以用逗号(“,”)分隔,每一个完整的语句都以分号(“;”)结束。3)AHDL语言中的语句不依赖描述的前后顺序。4)AHDL设计文件通常是由段和一些语句组成。5)AHDL程序段中,有两个段是每个AHDL文件所必须包含的,它们是子设计段和逻辑设计段。6)关键字SUBDESIGN之后的TAND2是子设计段的名称,也是AHDL语言文本文件的文件名,在MAX+PLUSII系统中使用时,要求其扩展名为TDF(*.TDF)。5.2节点和数组节点和数组的定义:(1)节点节点就是电路的连接点,是在AHDL语言中使用最广泛的一种类型。输入、输出端口、VCC、GND等内部没有记忆功能的变量都可以看成节点。(2)数组数组是节点或触发器等类型的组合。按照结构特点可分为十进制数组和序列数组两种。十进制数组与序列数组1)十进制数组。其名称为一个符号(或端口名)跟一个方括号(定义数组的长度)组成,例如a[3..0],在这类数组名后跟一个域,符号名或端口名加上[]引导的域,域中最长的数字的总长度不能超过32个字符。2)序列数组。其名称由一组符号名、端口名或数组组成,它们之间以逗号分隔,并被括在圆括号中如(a,b,c);十进制数组名也可以放在这个括号中,例如(a,b,c[5..1])。关于数组的注意事项1)如果要表示一个数组中的部分单元,只需写出起止单元序列号如A[2..1]。2)如果一个数组等于VCC或GND,数组中的每一个成员都将被置成VCC或GND。3)如果一个数组等于一个常数,则将常数扩展成与数组同等长度的二进制数后再赋值。4)如果一个数组被连接到一个单节点,则该数组所有的节点都与单节点b相连。5)一个数组最多包括256个变量。AHDL中的数字在AHDL中可以单独或组合方式使用十进制、二进制、八进制和十六进制,其中十进制是AHDL语言中的默认方式。5.3布尔等式布尔等式在逻辑段中用来代表节点之间的连接以及输入及输出的逻辑关系。在布尔等式右边可以是数组、数据、节点之间逻辑运算或算术运算。下面请看一个具体的示例:用AHDL语言描述下面的组合逻辑电路:可用下面程序描述:SUBDESIGNboole1--SUBDESIGN段,boole1标识程序名。(a0,a1,b:INPUT;--在()内定义输入、输出的引脚。out1,out2:OUTPUT;)BEGIN--描述开始。out1=a1&!a0;--out1为输入信号a0取反后与a1相与的结果out2=out1#b;--out2为out1与输入信号b相或后的结果。END;--用END表示程序结束。逻辑运算符逻辑运算符基本规则是按位操作如:!a[5..1]被解释为(!a4,!a3,!a2,!a1);!B“1001”的结果是对每一位求反后为B“0110”;a[3..1]&a[5..2]被解释为(a3&a4,a2&a3,a1&a2)。如果两个操作数的长度不同,扩展规则如下:1)单个节点(包括VCC与GND)与数组进行逻辑运算,则该节点与数组逐位进行运算。2)一个数组与一个常数进行逻辑运算,则将常数扩展成与数组同等长度的二进制数后再与数组逐位运算。算术运算符1.一元运算符的使用一元加号(+)运算符对操作数没有影响,只是明确表示一个正数。一元减号(-)运算符对后面的操作数进行求补运算。2.二元运算符的使用二元运算符算术运算规则有如下要求:1)如果两个操作数都是组节点,两组的长度必须相同。2)如果操作数都是数值,短的数值将扩展至位数最长的操作数长度。3)如果一个操作数是数值而另一个是节点数组,那么这个数值将被截至或扩展至节点数组的长度。赋值语句的两侧节点数组长度不同,遵循如下规则进行扩展:①数组前面加0可以多位补0扩展②数组的后面加一个0仅实现一位补0扩展关系运算符关系运算符可以被用于对单独节点、数组进行比较。双等号(==)为布尔表达式中的使用最多的比较符。表示符号两边的变量是否相等,而(=)表示将比较后的结果赋给等号左边的变量。比较符只能用来对节点数组与节点数组之间或节点数组与数值进行比较,如果比较符是在节点数组之间进行,节点数组的长度必须相同。比较符的返回结果为“1”或“0”,成立则为“1”,否则为“0”。运算符的优先级在表达式中,运算是按照运算的优先级进行的,“-”和“!”的优先级最高,“#”和“!#”优先级最低。如果在一个表达式中运算符较多时,为了防止出错最好采用“()”分隔的方式。5.4AHDL中的关键字和保留标示符在AHDL语句的开始、结束及中间过程都要用到关键字,编程时应避免使用关键字和保留标示符作为节点名、常量名。如AND、FUNCTION、OUTPUT、GND等在AHDL语言中保留标示符(ReservedIdentifiers)有特别的用处,不能被用户定义。如CARRY、JKFF、SRFF等注意:当保留关键字被加上单引号时可以被用来作为用户定义的标示符;然而保留标示符却不能被这样使用。5.5AHDL设计的常用语法结构常用语法结构:(1)条件逻辑语句(IF,ELSE,ELSIF)(2)CASE逻辑语句(3)真值表TABLE的用法(4)FOR…GENERATE、CONSTANT及DEFAULT语句的用法(5)FUNCTION符号名(…)RETURN(…)及INCLUDE语句的用法(6)PARAMETERS语句的用法条件逻辑语句(IF,ELSE,ELSIF)IF语句中可以有一个或多个布尔表达式,如果其中某个表达式结果为真,那么该表达式后面的行为语句将被执行。基本语法结构如下:IF条件1THEN执行操作1;ELSE执行操作2;ENDIF;在条件1成立下,执行操作1;否则执行操作2。IF条件1THEN执行操作1;ELSIF条件2THEN执行操作2;ELSE执行操作3;ENDIF;在条件1成立下,执行操作1,否则判断条件2,若条件成立,执行操作2,否则执行操作3。CASE逻辑语句CASE语句列出几种不同的操作,根据CASE后面的变量或表达式的值执行相应的操作。CASE语句的基本结构:CASE状态变量ISWHEN状态1=>执行操作1;WHEN状态2=>执行操作2;WHEN状态3=>执行操作3;┇WHENOTHERS=>执行操作n;ENDCASE;CASE语句中不同的状态由状态变量的值决定,状态的变化由变量控制,根据不同的变量值执行相应的操作。CASE语句没有优先级的问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 ,只要条件成立则相应的操作马上被执行。IFTHEN和CASE比较(1)相同点IF…THEN和CASE语句有相似之处,在通常的情况下,可以用任意一种中结构达到相同的结果。(2)不同点1)IF…THEN语句可以描述带优先级的算法,如优先编码器、优先译码器的描述等;而CASE…WHEN语句的各个状态的优先级相同,因此不能进行优先编码器、优先译码器等含有优先级的描述。2)在两者都能实现的描述中,CASE…WHEN语句层次清楚,使用简单真值表TABLE的用法AHDL中的TABLE引导的真值表与数字电路中的功能是一致的,只是书写方式不同。在AHDL中真值表由表头和表体两部分组成。表头由关键字TABLE、一组由逗号分开的真值表输入项、一个箭头符号(=>)以及一组由逗号分开的输出项组成。格式如下:TABLE输入项=>输出项;表体部分是具体逻辑关系的描述,其的格式与表头相似,但应注意表体中的数据或状态与表头中输入项(或输出项)的一一对应关系。注意:真值表各行中被逗号分开的项数一定要与表头中被逗号分开的项目数量相同。FOR…GENERATE语句FOR语句的语法规则如下:FOR(符号名)IN循环变量TO循环次数范围GENERATE<操作语句>;ENDGENERATE;For后的循环变量是一个临时变量而且是局部变量,不必事先定义。该变量不能在操作语句中赋值和修改。它由循环语句自动定义。使用时应当注意,在FOR…GENERATE语句范围内不能再有其它变量与此循环变量同名。循环次数:每执行完一个循环后循环变量递增1,直至达到循环次数范围最大值。循环次数范围一般是常数,或常数表达式CONSTANT语句CONSTANT语句利用CONSTANT语句可以定义一个字符常量,如:CONSTANTNUM_OF_ADDERS=8;在其后的使用中,都可以用NUM_OF_ADDERS表示常量8,提高了程序的可读性,程序的修改也比较方便。注意CANSTANT语句的描述应放在SUBDESIGN语句之前。例题:用FOR…GENERATE语句和CANSTANT语句配合实现任意长度的全加器。程序如下:CONSTANTNUM_OF_ADDERS=8;定义一个常量NUM_OF_ADDERSSUBDESIGN4gentst(a[NUM_OF_ADDERS..1],b[NUM_OF_ADDERS..1],cin:INPUT;c[NUM_OF_ADDERS..1],cout:OUTPUT;)VARIABLEcarry_out[(NUM_OF_ADDERS+1)..1]:NODE;BEGINcarry_out[1]=cin;FORiIN1TONUM_OF_ADDERSGENERATEc[i]=a[i]$b[i]$carry_out[i];%FullAdder%carry_out[i+1]=a[i]&b[i]#carry_out[i]&(a[i]$b[i]);ENDGENERATE;cout=carry_out[NUM_OF_ADDERS+1];END;当i从1到NUM_OF_ADDERS依次增加,对应的C[i]、a[i]、b[i]、carry_out[i]也依次从C[1]、a[1]、b[1]、carry_out[1]变化并执行相应的操作,直到i=8。DEFAULT语句Default语句在AHDL语言中可以指定输出或变量的初值,在if…then、case…when、table…语句中,若变量所表达的范围没有全部指定,则变量没有指定部分的值即为default语句所指定的值。如果没有default语句,一般默认为“0”或GND。Default语句是具体行为语句,应放在逻辑段中,其格式如下:DEFAULTS具体行为语句;ENDDEFAULTS;Default语句还可以解决对同一变量多次赋值的仲裁(决断),对变量的多次赋值实际是将多个信号通过“线与”(wired-AND)或“线或”(wired-OR)的方式与变量连在一起。如果在default语句中指定为VCC,实现“线与”功能,指定为GND实现线或的功能。FUNCTION符号名(…)RETURN(…)的用法前面已介绍了在MAX+PLUS下采用createdefaultsymbol创建一个符号,以便进行层次电路设计的方法。在AHDL语言中也可以采用同样的方法设计。设计的步骤如下:1)将设计通过仿真验证的电路形成符号(在MAX+PLUSS下通过createdefaultsymbol形成符号,如果是用AHDL语言描述的程序可以不用形成符号)。2)在subdesignsection之前,通过function符号名(…)return(…)方式引用。3)在variablesection定义一个该符号的变量,则该变量即具有符号所有属性。4)在logicsection设置该变量的属性,并具体使用。INCLUDE用法Include语句的用法与functionreturn语句的用法很相似,其四个步骤如下:1)将设计通过仿真验证的电路形成include文件(在MAX+PLUSS下通过createdefaultincludefile)。2)在subdesignsection之前,通过include“fulladd5.inc”;方式引用。3)在variablesection定义一个该符号的变量,则该变量即具有符号所有属性。4)在logicsection设置该变量的属性,并具体使用。PARAMETERS语句的用法使用Parameters语句可以定义一个或几个参数,以便实现参数化模块(符号SYMBOL)的设计,如存储器“ROM”设计中的数据宽度、地址深度、字节个数等。Parameters语句的定义格式如下:PARAMETERS(FILENAME=“myfile.mif”,--“=“后面的部分是默认值(可选项)WIDTH,AD_WIDTH=8,NUMWORDS=2^AD_WIDTH);Parameters的定义语句有如下特性:1)以关键字PARAMETERS开始,后面是以”()”括起来的参数列表,以及可选的默认值。2)表中的参数以逗号“,”隔开,“=“后面是可选的默认值,但数据宽度WIDTH不能有默认值。3)参数的名称可以是用户自己定义的符号,也可以是Altera预定义的参数。双引号括起来的字符参数,作为字符串处理;否则按算术表达式处理,如果处理失败,仍按照字符串处理。4)该定义以分号“;”结束。参数的定义及使用中应注意的几个问题1)参数表的定义应放在subdesignsection之前。参数一旦定义就可以在整个TDF文件中使用,使用次数不受限制。2)参数应先定义后使用,参数名称在整个文件中是唯一的。3)参数名称中不能包含空格,但可以用“_”以提高程序的可读性。4)参数的定义中引用了其它参数,则该参数必须是已经定义过的参数。切忌不要循环定义,5.6其他语句的用法在AHDL语言中还有一些语句如if…generate语句、assert语句、report语句、title语句、SEVERITY等。这些语句对具体电路的形成、电路的参数没有实质的影响,但用好这些语句对程序的调试、排错、器件的使用会有很大的帮助。if…generate语句if…generate的格式如下:If(表达式)generate行为语句列表1;elsegenerate行为语句列表2;endgenerate;如果表达式成立(不为0),执行行为语句列表1;否则,执行行为语句列表2。IfGenerate语句与IfThen相比较有如下特点:1)IfGenerate语句可以用在Variable段和Logic段,而IfThen语句只能用在Logic段。2)IfThen语句的判断条件是布尔表达式,而IfGenerate语句的判断条件是算术表达式的超集,一般是预定义的参数或字符串组成的表达式。3)IfGenerate语句与IfThen语句的另一个重要的区别是:IfThen判断条件是在硬件电路中实现的,而IfGenerate的判断条件是在编译系统进行编译时根据该条件决定编译哪一部分程序,以便形成不同的电路。Assert、Report、Severity语句Assert、Report、Severity这三条语句一般情况下是一起使用的,使用顺序为ASSERT(表达式)REPORT“Detectedcompilationfor%family”DEVICE_FAMILYSEVERITYerror;ASSERT(断言)语句ASSERT语句根据括号的表达式决定后面的REPORT语句和SEVERITY语句是否激活。如果表达式成立,则跳过REPORT语句和SEVERITY语句,而执行后面的语句;表达式不成立将激活后面的REPORT语句和SEVERITY语句。如果ASSERT语句后面没有表达式,则ASSERT及其后的REPORT语句和SEVERITY语句总是处于激活状态。REPORT语句REPORT语句一般由关键字REPORT所引导的双引号括起来的字符串和信息参数(informationparameters)两个部分组成,以 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 编译器的在不同条件下的编译信息。字符串中用“%”可以替代信息参数的具体内容。SEVERITY语句SEVERITY语句一般只跟三个参数:INFO、WARNING、ERROR。INFO参数将REPORT语句后面的字符串作为一般信息处理,不影响编译的继续处理。WARNING参数,在编译界面的MESSAGE框中将REPORT语句后面的字符串作为警告,也不影响编译的继续处理。ERROR参数,在编译界面的MESSAGE框中将REPORT语句后面的字符串作为错误信息处理,终止编译,等候错误处理。5.7时序逻辑电路时序电路中所用的存储单元主要有锁存器LATCH和触发器两种,其中触发器又有D触发器(DFF)、含使能端的D触发器(DFFE)、含使能端的JK触发器(JKFFE)、RS触发器(RSFF)、含有使能端的RS触发器(RSFFE)、T触发器(TFF)、含有使能端的T触发器(TFFE)等类型。所有的边沿触发器均为上升沿触发,带使能控制端(ENA)的触发器,其ENA为高电平有效。触发器和锁存器的各个信号名称CLK——触发器时钟CLOCK(输入),上升沿有效CLRN——清零端CLEAR(输入),低点平有效D,J,K,R,S,T——触发器信号输入端ENA——锁存或脉冲波输入使能端控制,高点平有效PRN——置”1”控制端,低点平有效Q——输出信号端VARIABLE段(variablesection)它是时序电路中必不可少的部分,因为触发器、节点、锁存器等定义是在该段中进行的。Variablesection与subdesignsection结构很相似,都是由标识符、冒号(:)、变量类型组成;其中subdesignsection的类型为INPUT、OUTPUT、BIDIR。而Variablesection的变量类型为NODE、DFF、DFFE、SRFF等。在Variablesection中,NODE类型与其他触发器类型还有区别,NODE类型在电路中只相当于一个连接点,起到中间变量的作用。它没有存储功能,其值瞬间变化。而触发器具有数据存储功能,一般情况下需要与时钟配合才能工作计数器设计异步计数器异步计数器就是利用计数中的各触发器的时钟相对独立,下面以T触发器串联分频计数器为例介绍异步计数器的用法。SUBDESIGN4asycnt(clk,en,rst:INPUT;--定义时钟、使能、复位输入端口q[3..0]:OUTPUT;--数组q[]为数据输出)VARIABLEff[3..0]:TFF;--定义变量ff[3..0]为T触发器BEGINq[]=ff[].q;--触发器的q端接数据输出ff[].t=en;ff[].clrn=rst;--触发器的清零端接rst端ff0.clk=clk;ff1.clk=ff0.q;ff2.clk=ff1.q;ff3.clk=ff2.q;END;将程序输入存盘编译进行波形仿真,仿真波形如下分频器的设计在CPLD/FPGA的系统设计中往往多个频率相互配合工作,因此分频器的设计在时序电路设计中也是一个重要的环节。下面我们以一个例子说明分频器的设计方法。例:6分频的电路描述。SUBDESIGNfp(inclk:INPUT;F:OUTPUT;)VARIABLEcount[3..0],f:DFF;BEGINcount[].clk=inclk;F.clk=inclk;IFcount[]==2THENcount[]=0;F=!F;ELSEcount[]=count[]+1;F=F;ENDIF;END;数字钟设计举例12归1计数器程序设计。subdesigntwelveto1(inclk:input;outa[3..0]:output;outb[3..0]:output;)variableva[3..0]:dff;vb[3..0]:dff;--计数器变量beginva[3..0].clk=inclk;vb[3..0].clk=inclk;--设置时钟if(va[]==2andvb[]==1)then--如果为12,则低位置1,高位清0;--否则跳到elsifva[]=1;vb[]=0;elsifva[]==9then--不为12,判断低位是否为9,为9成立va[]=0;--低位清0vb[]=vb[]+1;--高位加1else--不为12,低位也不等于9va[]=va[]+1;--低位加1vb[]=vb[];--高位保持endif;outa[]=va[];outb[]=vb[];end;5.8状态机的描述状态机的结构状态机就是一组触发器的输出状态随着时钟和输入信号按照一定的规律变化的一种过程。状态机一般情况可分为摩尔机和梅利机两种,以适用不同的设计和化简方法。但状态机在AHDL可以直接用if…then、case…when、table等结构描述,具体的化简可以由max+plus软件实现,因此这两种状态机在AHDL语言中的设计没有多大区别,在后续的介绍中不在区分摩尔机和梅利机。状态机的定义在VARIABLE段由MACHINEWITHSTATES引导,后面由括号组成的状态,如定义ss为状态机的状态变量,其格式如下:ss:MACHINEWITHSTATES(s0,s1,s2,s3);ss定义为状态机的状态变量后,ss即具有时钟(CLK)、复位(RESET)和使能(ENA)信号输入端,CLK是状态机的同步时钟,RESET可以强迫状态机回到初时状态状态机举例:设计一个逻辑电路,其输入信号为:时钟信号CLK、复位信号RESET、输入Y;输出信号为Z。输入信号与输出信号之间的逻辑关系用图5-10所示的状态机来描述。输入信号与输出信号状态机的描述图中的输出状态一共有S0、S1、S2、S3共4种状态,其不同的输入信号决定不同的状态,不同的状态又决定不同的输出信号。对应的参考程序如下:SUBDESIGNmealy(clk:INPUT;reset:INPUT;y:INPUT;z:OUTPUT;)VARIABLEss:MACHINEWITHSTATES(s0,s1,s2,s3);BEGINss.clk=clk;ss.reset=reset;TABLE%currentcurrentcurrentnext%%stateinputoutputstate%ss,y=>z,ss;s0,0=>0,s0;--当y=0时,S0→S0s0,1=>1,s1;--当y=1时,S0→S1s1,0=>1,s1;--当y=0时,S1→S1s1,1=>0,s2;--当y=1时,S1→S2s2,0=>0,s2;--当y=0时,S2→S2s2,1=>1,s3;--当y=1时,S2→S3s3,0=>0,s3;--当y=0时,S3→S3s3,1=>1,s0;--当y=1时,S3→S0ENDTABLE;END;非同步状态输出的状态机电路的设计输出,仅由状态机决定,但状态机的状态并不作为电路的输出。设计者不用关心需要多少个触发器来定义状态机,只要在VARIABLE中定义状态机,在逻辑描述中只要描述状态机的转换关系即可。编译器能自动设定最小的触发器数量和合适的状态值,设计者不用为每个状态设定状态变量和状态值。。带同步状态输出的状态机如果一个状态机的状态作为电路的输出,应在状态机的MACHINEOFBITS()的括号中指定与输出引脚对应的状态变量,并在WITHSTATES后的()中具体指定状态的数值,以形成状态与输出的对应关系。单热点编码状态机单热点编码状态机(one-hotencodingstatemachine)就是在每个状态的编码中,只有一个状态变量为1,其余的都为0。如状态变量为q[3..0],状态为S0、S1、S2、S3,则编码S0=0001,S1=0010,S2=0100,S3=1000。这种编码方式的优点是:有几个状态变量,就对应几个状态编码,没有冗余状态,不需要处理无效状态,因此设计和使用都相对简单。无效状态的处理如果状态机设计成非“单热点”(one-hot)编码的状态机,而且状态变量所能表达的状态总数多于实际使用的状态数,状态机中就有无效的状态(这种状态也称为非法状态)。由于状态机的各个变量建立时间(setuptime)或保持时间(holdtime)的不一至,有可能进入无效状态。状态机在进入无效状态后,由于没有明确的指示下一个状态的值,因此结果很难预料。要从非法状态恢复到正常状态,必须在状态机中为所有的非法状态命名。如三个状态变量,共有8种状态,明确使用的有5种,还有三种没有使用,这三种即为无效状态,要想从三个无效状态返回,必须对这三个无效状态一一命名,并对其处理(在case…when语句中可以用whenothers=>对无效状态统一处理,但无效状态的命名是不能省略的)。状态机的导入与导出在Subdesign段,可以定义输入、输出为MACHINEINPUT或MACHINEOUTPUT类型。在顶层文件中通过functionreturn语句将底层的状态机导入或导出,但MACHINEINPUT或MACHINEOUTPUT类型的输入、输出必须在functionreturn中具体指定,在状态机的导入与导出的使用中注意事项如下:1)在subdesign段中有MACHINEINPUT和MACHINEOUTPUT类型的输入、输出时,该文件在层次设计中只能作为底层文件使用,但仍然可以使用”ProjectSave&Check”工具进行语法和设计规则检查,并能创建IncludeFile文件。2)可以在Variable段创建别名以代替原文件名。隐含状态机的定义在时序电路中,状态机几乎到处可见,有的使用statemachine语句明确定义,有的没有明确定义,但实际起到状态机的作用,没有明确定义的状态机称为隐含状态机。下面的例子说明隐含状态机的用法。设计六十进制,12归1同步数字钟。输出采用动态扫描的共阴极数码管显示,如图5-13所示,4个数码管的7段并联接在一起用outa[6..0]驱动,4个公共端分别接到bitout0,bitout1,bitout2,bitout3上,4个数码管采用分时复用的方法。如果扫描频率大于100Hz,数码管的显示没有闪烁,若扫描频率过低将会出现闪烁现象。动态扫描显示电路具体程序如下:5.9漏极开路及双向I/O的用法三态总线的描述三态(门)总线在AHDL语言中是以函数的方式描述的,其原形为FUNCTIONTRI(in,oe)RETURNS(out);其中in为三态总线的输入,oe为三态总线的输出使能端。out是三态的返回值,若oe=VCC,out=in;oe=GND,out=“Z”,其中“Z”表示高阻。SUBDESIGNtri_bus(in[3..1],oe[3..1]:INPUT;out1:OUTPUT;)VARIABLEtnode:TRI_STATE_NODE;BEGINtnode=TRI(in1,oe1);tnode=TRI(in2,oe2);tnode=TRI(in3,oe3);out1=tnode;END;漏极开路输出的描述:漏极开路输出与三态门的描述相似,也是以函数的形式调用的,其函数原形为FUNCTIONOPNDRN(in)RETURNS(out);其中in是漏极开路的输入,out是漏极开路的输出。若in=VCC,out=“Z”;in=GND,out=GND。subdesignconcurent(a,b,c:input;m,n:output;)beginm=a&b;n=opndrn(c,m);end;双向I/O口的描述在电路的设计中双向I/O口的使用是非常广泛的,特别是描述存储器、A/D转换、CPU等接口。虽然双向I/O口的引脚物理上只有一个实体,但在编程时可以理解为两部分,一个是输入部分,另一个是输出部分。如在SUBDESIGN段定义io为双向I/O(io:BIDIR;),则可以将io分为输入io和输出io两个部分,在MAX+PLUS的软件仿真中也是按照这种方式处理的。在使用时要与三态门结合起来。双向I/O使用示意图5.10AHDL语言综合应用设计举例例1:32位除法器的设计。程序如下:例2:十六进制数到十进制BCD的转换。将要转换的输入值先赋予中间变量ma[25..0],然后对该值进行循环减一,同时对转换寄存器moutx[31..0]采用十进制的方式加以,直至ma[25..0]减到0为止,此时moutx[31..0]就得到相应的十进制数,并赋给输出端口mout[31..0]。程序如下:例3:32位开平方程序。程序如下:例4:键盘扫描、去抖动、编码程序上图所示,采用4×4矩阵排列的16个键盘,p120~p131是CPLD实际I/O引脚,在键盘扫描中,p120~p125为输出,p126~p131为输入,outrsult[3..0]是得到编码的输出结果,OE指示输出结果稳定。只要将本例中的个别参数修改即可得到其他矩阵方式的键盘扫描程序。程序描述如下:
本文档为【AHDL】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
夕夕资料
拥有专业强大的教研实力和完善的师资团队,专注为用户提供合同简历、论文写作、PPT设计、计划书、策划案、各类模板等,同时素材和资料部分来自网络,仅供参考.
格式:ppt
大小:329KB
软件:PowerPoint
页数:0
分类:工学
上传时间:2021-03-25
浏览量:13