VHDL语言中信号设置的不同方式及注意事项
扫描二维码
随时随地手机看文章
关键词:VHDL;程序
Different expression andsome advertences of VHDL for signals setting He Feng(The 34th Electronic Research Institute,Ministry of Information Industry,Guilin 541004,China)
Abstract: This paper introduces how to use different expression of VHDL to set signals based on the Even Parity Bit Generator design, and the advertences and the whole programs are given.
VHDL语言中有两种基本的语句命令:并行同 时语句命令以及顺序语句命令。两者之间最大的不同点是,并行同时语句命令就像是电路板的动作方 式,不论几个命令,是一次且同时执行,产生结果;顺序语句命令类似一般的程序语言,如Basic 等的执行方式,是一次一个命令,且依书写方式由上而下地执行。
并行同时语句命令主要有以下几种表达方式: 直接设置语句(使用<=运算符)、条件式信号设置语句(When-Else)与选择式信号设置语句 (With-Select-When)等;
顺序语句命令主要有以下几种表达方式:Pro cess(过程)、If-Else(判断比较)、Wait Until(等待)、Case-Is-When(描述选择)等。
熟练而灵活地使用上述两类命令,可以节省大 量的工作量,使程序简单直观、可读性增强而且有利于提高程序的编译执行效率。
在数据通信过程中,同位器与同位检查器常用 于数据纠错。本文就以一个简单偶同位产生器(Even Parity Bit Generator)真值表功能的实现方法来探讨上述表达方式选择问题,以及编程 过程中的注意事项。
2编程举例例:试设计VHDL程序完成如表1偶同位器的 真值表功能:
输入输出S2S1S0Z00000011010101101011101111001110分析:由真值表可以看出,所要实现的是一个由三个数据位、一个同位位组成的偶同位产生器功 能。不难得出各位之间的简单逻辑关系:P=S0S1S2 。但是本文的主要目的在于通过此例阐述如何灵活运用不同的基本表达式设置信号,因此 某些可能更加简单的方法以及比较高级一点语句本文不予详细讨论。
解: (注:VHDL语言中使用“--”作为注释符号)library ieee; ①
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.
ENTITY hf is --假设建立的芯片电路名称以及保存后的文件名为“hf”;
Port (
s: in std_logic_vector(2 downto 0);
z: out std_logic--最后一个管脚定义命令后面,不可加分号;
);
ARCHITECTURE a OF hf ISBegin --以上是本例题解答过程中的公共部分,其后分别接各解法语句。--******************************
--解法1:使用“hen -Else”表达方式②z<=‘0’when (s="000") else --此语句只能将s的各个值分开写,而不能写成如下形式:0’ when (s="011") else -- z<=‘0’when (s="000" or s="011" or s="110" or s="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’;
End a;
‘0’ when "011",
‘0’ when "110",
‘0’ when "111", -- when后选择信号的值也只能分别列出,不可写成组合条件形式。
‘1’ when others;
End a;
z<=‘0’;
else
z<=‘1’;
end if;
end process;
End a;
end case;
end process;
End a;备注:(1) VHDL语言对所有字母的大小写状态不敏感,关键在于语句要正确规范。(2) 在VHDL语言中,所使用的标点符号均是英文标点符号。凡是设置单个的信号值均需使用 单引号,而设置序列信号值必须使用双引号。(3) 请参看相关资料。
3讨论3.1本例能否使用“Wait Until”表达方式很遗憾,类似此例的情况不能使用这个语 句。起码笔者经过多次尝试之后均没有通过编译检查。但是在使用此语句时应该注意以下事项:
(1) Wait Until 后面紧接的语句中不能出现序列信号的值,例如不能写成如下形式:Wait Until s="000" 也不能写成组合条件形式(无论是否使用括号):Wait Until s="000" or s="011" or s="110" or s="111"
(2) 使用此表达方式编写程序代码时,不能设定输出引脚的初始值(通过第三方信号传递也不 行,但是在进行仿真时可以设定初始输出值),不能写成如下形式:……s: in std_logic;……Architecture a of hf isBeginz<=0; --就算z的初、终值通过两个常量信号(如c=‘0’,d=‘1 ’)传递Process --也不行,因为z不能规定两个状态。否则编译时出错;Beginwait until s=‘0’; --此处也不可以写成序列信号形式,更不能使用逻辑运算符将其z<=1; --写成组合条件形式。Wait Until语句不支持组合条件。End process;
END a;
3.2更简单的实现方法顺序语句除了前文所叙的几种基本表达方式以 外,还有一种循环语句:For-Loop;而并行同时语句也还有方块语句(Block)、组件定义(Component)与组件映像(Port Map)等多个模块化语法。而使用“For-Loop”编写此类有重复动作需求的代码无疑是最简单直观的:……
Architecture a OF hf IS
Begin
Process(s)
Variable Tmp: Std_Logic;
Begin
Tmp:=‘0’;
For I In 0 to 2 Loop
Tmp:=Tmp XOR s(I);
End Loop;
Z<=s & Tmp;
End Process;
End a;
其他更加简单的方法,限于篇幅与本文主 旨,在此就不予深究了。
4结束语从以上不同解法可以看出,各种基本的表达方式均有各自的特点:采用“When -Else”表达式(解法1)与“When -Else-When”表达式(解法2)编写编写代码的优点是直观,但是代码很多,欲实现复 杂的功能时工作量将会很大;采用“IF-Else”表达式(解法4)编写代码的优点是直观与简单并举,尤其是允许使用由逻辑运算符(And、Or等等)写成的组合条件更是精简了不少代码。另外,在编写VHDL程序的过程中,不同的 表达式中,表示语句结束的符号是不同的,这一点在 我们学习和使用VHDL的过程中值得特别留意。
参考文献 [1]卢毅、赖杰 .VHDL与数字电路设计.北京:科学出版社,2001-04[2]李广军、孟宪元 .可编程ASIC设计及应用.成都:电子科技大学出版社.2000-10[3]徐志军等.大规模可编程逻辑器件及其应用.成都:电子科技大学出版社.2000-11何锋 男,1979年出生,本科,研究方向为硬件描述语言设计,嵌入式系统开发。
来源:零八我的爱0次