VHDL语言中信号的不同形式设置_第1页
VHDL语言中信号的不同形式设置_第2页
VHDL语言中信号的不同形式设置_第3页
VHDL语言中信号的不同形式设置_第4页
VHDL语言中信号的不同形式设置_第5页
已阅读5页,还剩1页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

VHDL语言中信号的不同形式设置

摘要:通过一个偶同位产生器逻辑功能的实现过程,介绍了VHDL语言中信号设置的不同方式及注意事项,并给出了完整的程序代码。关键词:VHDL;程序1概述VHDL是一种快速的电路设计工具,功能涵盖了电路描述、电路合成、电路仿真等三大电路设计工作。目前广泛使用的软件有Altera公司出品的MAX+PLUSII,Xinlinx公司的Foundation等。VHDL语言中有两种基本的语句命令:并行同时语句命令以及顺序语句命令。两者之间最大的不同点是,并行同时语句命令就像是电路板的动作方式,不论几个命令,是一次且同时执行,产生结果;顺序语句命令类似一般的程序语言,如BASIC等的执行方式,是一次一个命令,且依书写方式由上而下地执行。并行同时语句命令主要有以下几种表达方式:直接设置语句(使用<=运算符)、条件式信号设置语句(When-Else)与选择式信号设置语句(With-Select-When)等;顺序语句命令主要有以下几种表达方式:Process(过程)、If-Else(判断比较)、WaitUntil(等待)、Case-Is-When(描述选择)等。熟练而灵活地使用上述两类命令,可以节省大量的工作量,使程序简单直观、可读性增强而且有利于提高程序的编译执行效率。在数据通信过程中,同位器与同位检查器常用于数据纠错。本文就以一个简单偶同位产生器(EvenParityBitGenerator)真值表功能的实现方法来探讨上述表达方式选择问题,以及编程过程中的注意事项。2编程举例例:试设计VHDL程序完成如表1偶同位器的真值表功能:输入输出S2S1S0Z00000011010101101011101111001110

分析:由真值表可以看出,所要实现的是一个由三个数据位、一个同位位组成的偶同位产生器功能。不难得出各位之间的简单逻辑关系:P=S0S1S2。但是本文的主要目的在于通过此例阐述如何灵活运用不同的基本表达式设置信号,因此某些可能更加简单的方法以及比较高级一点语句本文不予详细讨论。解:(注:VHDL语言中使用“--”作为注释符号)libraryieee;①useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;ENTITYhfis--假设建立的芯片电路名称以及保存后的文件名为“hf”;Port(

s:instd_logic_vector(2downto0);

z:outstd_logic--最后一个管脚定义命令后面,不可加分号;

);endhf;--应该保证电路单元名称与存盘的文件名一致,否则编译时出错;ARCHITECTUREaOFhfISBegin--以上是本例题解答过程中的公共部分,其后分别接各解法语句。--******************************--解法1:使用“hen-Else”表达方式②z<=‘0’when(s="000")else--此语句只能将s的各个值分开写,而不能写成如下形式:0’when(s="011")else--z<=‘0’when(s="000"ors="011"ors="110"ors="111")0’when(s="110")else--else‘1’;‘0’when(s="111")else‘1’when(s="001")else‘1’when(s="001")else‘1’when(s="001")else‘1’;Enda;--解法2:使用揥ith-Select-When表达方式:WithsSelectz<=‘0’when"000",--注意:除了最后一句的语句结束标志是分号外,其余各句均是逗号;‘0’when"011",‘0’when"110",‘0’when"111",--when后选择信号的值也只能分别列出,不可写成组合条件形式。

‘1’whenothers;

Enda;--解法3:使用“If-Else”表达方式:Process--If-Else语句必须要与process配合使用;Begin--Process中此句必不可少,否则编译时出错;ifs="000"ors="011"ors="110"ors="111"then--If后若为组合条件可用括号也可不用;z<=‘0’;

else

z<=‘1’;

endif;

endprocess;

Enda;--解法4:使用“Case-Is-When”表达方式:Process--“Case-Is-When”也只能与“Process”配合使用;Begincasesiswhen"000"|"011"|"110"|"111"=>--此处不能将“|”改成“or”但可以像解法1或解法1或解法2那样将不同信号值分开写;whenothers=>--When句末尾是“=>”而不是逗号或者分号。z<=‘1’;

endcase;

endprocess;

Enda;备注:(1)VHDL语言对所有字母的大小写状态不敏感,关键在于语句要正确规范。(2)在VHDL语言中,所使用的标点符号均是英文标点符号。凡是设置单个的信号值均需使用单引号,而设置序列信号值必须使用双引号。(3)请参看相关资料。3讨论3.1本例能否使用“WaitUntil”表达方式很遗憾,类似此例的情况不能使用这个语句。起码笔者经过多次尝试之后均没有通过编译检查。但是在使用此语句时应该注意以下事项:(1)WaitUntil后面紧接的语句中不能出现序列信号的值,例如不能写成如下形式:WaitUntils="000"也不能写成组合条件形式(无论是否使用括号):WaitUntils="000"ors="011"ors="110"ors="111"(2)使用此表达方式编写程序代码时,不能设定输出引脚的初始值(通过第三方信号传递也不行,但是在进行仿真时可以设定初始输出值),不能写成如下形式:……s:instd_logic;……ArchitectureaofhfisBeginz<=0;--就算z的初、终值通过两个常量信号(如c=‘0’,d=‘1’)传递Process--也不行,因为z不能规定两个状态。否则编译时出错;Beginwaituntils=‘0’;--此处也不可以写成序列信号形式,更不能使用逻辑运算符将其z<=1;--写成组合条件形式。WaitUntil语句不支持组合条件。Endprocess;

ENDa;3.2更简单的实现方法顺序语句除了前文所叙的几种基本表达方式以外,还有一种循环语句:For-Loop;而并行同时语句也还有方块语句(Block)、组件定义(Component)与组件映像(PortMap)等多个模块化语法。而使用“For-Loop”编写此类有重复动作需求的代码无疑是最简单直观的:……

ArchitectureaOFhfIS

Begin

Process(s)

VariableTmp:Std_Logic;

Begin

Tmp:=‘0’;

ForIIn0to2Loop

Tmp:=TmpXORs(I);

EndLoop;

Z<=s&Tmp;

EndProcess;

Enda;其他更加简单的方法,限于篇幅与本文主旨,在此就不予深究了。4结束语从以上不同解法可以看出,各种基本的表达方式均有各自的特点:采用“When-Else”表达式(解法1)与“When-Else-When”表达式(解法2)编写编写代码的优点是直观,但是代码很多,欲实现复杂的功能时工作量将会很大;采用“IF-Else”表达式(解法4)编写代码的优点是直观与简单并举,尤其是允许使用由逻辑运算符(And、Or等等)写成的组合条件更是精简了不少代码。另外,在编写VHDL程序的过程中,不同的表达式中,表示语句结束的符号是不同的,这一点在我们学习和使用VHDL的过程中值得特别

温馨提示

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

评论

0/150

提交评论