电子工程师的网站
首 页 |  新闻资讯 | 最新产品 | 解决方案 | 技术参数
设计应用
电路图 | 技术资料 | 芯片资料 | 技术论坛
  现在位置: 首页 > 设计应用 > EDA/PLD > 详细信息
EDA/PLD:VHDL语言中信号设置的不同方式及注意事项
来源:   时间: 2007-5-25 10:49:25    
摘要:通过一个偶同位产生器逻辑功能的实现过程,介绍了VHDL语言中信号设置的不同方 式及注意事项,并给出了完整的程序代码。

关键词:VHDL;程序

中图分类号:TP312 文献标识码:A 文章编号:1003-353X(2002)03-0045-03

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.

Key words: VHDL;Program
1概述
VHDL是一种快速的电路设计工具,功能涵盖 了电路描述、电路合成、电路仿真等三大电路设计工作。目前广泛使用的软件有Altera公司出品的 MAX+PLUSII,Xinlinx公司的Foundation等。

VHDL语言中有两种基本的语句命令:并行同 时语句命令以及顺序语句命令。两者之间最大的不同点是,并行同时语句命令就像是电路板的动作方 式,不论几个命令,是一次且同时执行,产生结果;顺序语句命令类似一般的程序语言,如Basic 等的执行方式,是一次一个命令,且依书写方式由上而下地执行。

并行同时语句命令主要有以下几种表达方式: 直接设置语句(使用<=运算符)、条件式信号设置语句(When-Else)与选择式信号设置语句 (With-Select-When)等;

顺序语句命令主要有以下几种表达方式:Pro cess(过程)、If-Else(判断比较)、Wait Until(等待)、Case-Is-When(描述选择)等。

熟练而灵活地使用上述两类命令,可以节省大 量的工作量,使程序简单直观、可读性增强而且有利于提高程序的编译执行效率。

在数据通信过程中,同位器与同位检查器常用 于数据纠错。本文就以一个简单偶同位产生器(Even Parity Bit Generator)真值表功能的实现方法来探讨上述表达方式选择问题,以及编程 过程中的注意事项。

2编程举例
例:试设计VHDL程序完成如表1偶同位器的 真值表功能:

输入
输出
S2
S1
S0
Z
0
0
0
0
0
0
1
1
0
1
0
1
0
1
1
0
1
0
1
1
1
0
1
1
1
1
0
0
1
1
1
0
分析:由真值表可以看出,所要实现的是一个由三个数据位、一个同位位组成的偶同位产生器功 能。不难得出各位之间的简单逻辑关系:P=S0S1S2 。但是本文的主要目的在于通过此例阐述如何灵活运用不同的基本表达式设置信号,因此 某些可能更加简单的方法以及比较高级一点语句本文不予详细讨论。

解: (注:VHDL语言中使用“--”作为注释符号)
library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.

all;

ENTITY hf is --假设建立的芯片电路名称以及保存后的文件名为“hf”;

Port (
s: in std_logic_vector(2 downto 0);
z: out std_logic  --最后一个管脚定义命令后面,不可加分号;
);

end hf; --应该保证电路单元名称与存盘的文件名一致,否则编译时 出错;

ARCHITECTURE a OF hf IS
Begin --以上是本例题解答过程中的公共部分,其后分别接各解法语句。
--******************************

--解法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;

--解法2:使用揥ith -Select -When表达方式:
With s Select
z<=‘0’ when "000", --注意:除了最后一句的语句结束标志是分号外,其余各句均是逗号;

‘0’ when "011",

‘0’ when "110",

‘0’ when "111", -- when后选择信号的值也只能分别列出,不可写成组合条件形式。
‘1’ when others;
End a;

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

z<=‘0’;
else
z<=‘1’;
end if;
end process;
End a;

--解法4:使用“Case-Is-When”表达方式:
Process --“Case-Is-When”也只能与“Process”配合使用;
Begin
case s is
when "000"|"011"|"110"|"111" =>
--此处不能将“|”改成“or”但可以像解法1或解法1或解法2那样将不同信号值分开写;
when others=> --When句末尾是“=>”而不是逗号或者分号。
z<=‘1’;
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 is
Begin
z<=0; --就算z的初、终值通过两个常量信号(如c=‘0’,d=‘1 ’)传递
Process --也不行,因为z不能规定两个状态。否则编译时出错;
Begin
wait 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年出生,本科,研究方向为硬件描述语言设计,嵌入式系统开发。

相关信息
发表评论
打印本页 关闭本页
BQ2002PN的技术参数
  产品型号:BQ2002PN化学特性:NiCd,NiMH控制类型:电流限制终止充电方式:(-)dV,PVD充电定时器:Yes温度监控:Yes充电状态输出:1封装/温度(℃):8PDIP/0~70描述:快速充电IC价格/1片(套):¥16.40
>>详细内容
NCS2002SN2T1G的技术参数
  产品型号:NCS2002SN2T1G工作电压Min.(V):0.9,±0.45工作电压Max.(V):7.0,±3.5带宽GBW(典型值)(MHz):0.800转换速率(典型值)(V/us):1.200输入失调电压(25℃,Max.)(mV):6输入偏置电流(Max.)(nA):10pA最大工作电流ID(mA):0.800共模抑制比(Min.)(dB):82噪声电压(典型值)(nV/rtHz):100通道数:1电源供电方式:单/双封装/温度(℃):TSOP-6/-40~105描述:单轨对轨运算放大器价格/1片(套):¥3.20
>>详细内容
NCS2002SN1T1G的技术参数
  产品型号:NCS2002SN1T1G工作电压Min.(V):0.9,±0.45工作电压Max.(V):7.0,±3.5带宽GBW(典型值)(MHz):0.800转换速率(典型值)(V/us):1.200输入失调电压(25℃,Max.)(mV):6输入偏置电流(Max.)(nA):10pA最大工作电流ID(mA):0.800共模抑制比(Min.)(dB):82噪声电压(典型值)(nV/rtHz):100通道数:1电源供电方式:单/双封装/温度(℃):TSOP-6/-40~105描述:单轨对轨运算放大器价格/1片(套):¥3.20
>>详细内容
亚瑟莱特推出AX2002/AX2003系列PWM LED驱动IC
    亚瑟莱特科技推出AX2002(2A)/AX2003(3A)系列PWM LED驱动IC。AX2002/2003系列为一颗脉波宽度调变输出的非同步直流降压转换器,利用反馈电阻来控制LED的电流,反馈电压只有0.25V,可大幅减小反馈电阻的功率。其输入电压范围可由最低3.6伏特到最高23伏特,输出最高可串接7个LED,非常适合于液晶电视/萤幕,手电筒,杯灯等装置。   AX2002/2003应用上可提供高转换效能及稳定的工作电压,其...
>>详细内容
亚瑟莱特发布PWM LED驱动IC AX2002/AX2003系列
    亚瑟莱特科技推出AX2002(2A)/AX2003(3A)系列PWM LED驱动IC。AX2002/2003系列为一颗脉波宽度调变输出的非同步直流降压转换器,利用反馈电阻来控制LED的电流,反馈电压只有0.25V,可大幅减小反馈电阻的功率。其输入电压范围可由最低3.6伏特到最高23伏特,输出最高可串接7个LED,非常适合于液晶电视/萤幕、手电筒、杯灯等装置。   AX2002/2003应用上可提供高转换效能及稳定的工作电压...
>>详细内容
CX系列CX20023集成电路实用检测数据
    CX20023是单片录/放音集成电路,为24脚双列直插式塑料封装,在普及型录/放音机上的正常工作电压典型检测数据如表1所列,用MF14型三用表测得(DC挡)。  表1 CX20023在普及型录/放音机上的检测数据
>>详细内容
已有(
)位对此新闻感兴趣的网发发表了看法 >>更多评论
内 容:
     
 
热点新闻
一周排行
关于我们 | 服务项目 | 付款方式 | 广告服务 | 联系我们 | 友情链接 | 投诉 建议 合作 | 网站地图 | 加入收藏
Copyright © 2007-2008 WEEQOO.COM Corp.All Rights Reserved. 版权所有 经营许可证编号:浙B2-20050339 法律声明
维库电子旗下网站:维库电子市场网 | ChinaICMart | 维库电子开发网 | 维库电子人才网
总部:杭州市下城区朝晖路182号国都发展大厦1号楼80A
电话:0571-85889139-8007 QQ:303939539 | MSN:zh1226@hotmail.com |  邮箱:laz8258@163.com dzsc51@163.com