VHDL语言中信号的不同形式设置
摘要:通过一个偶同位产生器逻辑功能的实现过程,介绍了VHDL语言中信号设置的不同方 式及注意事项,并给出了完整的程序代码。
关键词:VHDL;程序
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:使用With -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
- 从信号分析的运用中回眸傅里叶算法(08-02)
- LXT384接口芯片的几种环回形式(05-09)
- 使用Java ME以流形式播放Web服务器上的音乐文件(05-04)
- 单片机中,片内ROM的配置有几种形式?(12-28)
- CC-LINK网络参数设置详解(12-19)
- PWM初始化,PWM0占空比设置函数(11-30)