VHDL设计中信号与变量问题的研究

vhdl设计中信号与变量问题的研究 在vhdl程序设计中,可以充分利用信号或变量的系统默认值,来灵活实现设计目标。本文从应用的角度举例说明了vhdl设计中信号与变量的区别,以及正确的使用方法,并介绍了为信号或变量赋予初始值的技巧。
概述
随着集成电路技术的发展,用传统的方法进行芯片或系统设计已不能满足要求,迫切需要提高设计效率,因此能大大降低设计难度的vhdl设计方法被越来越广泛地采用。用vhdl语言设计系统的主要方法是:设计者根据vhdl的语法规则,对系统目标的逻辑行为进行描述,然后通过综合工具进行电路结构的综合、编译、优化,通过仿真工具进行逻辑功能仿真和系统时延的仿真,最后把设计的程序下载到芯片中,成功地实现系统功能。
在vhdl设计中,最常用的数据对象主要有三种:信号(signal)、变量(variable)和常数(constant)。信号是电子电路内部硬件连接的抽象。它除了没有数据流动方向说明以外,其他性质几乎和“端口”一样;信号是一个全局量,它可以用来进行进程之间的通信。变量只能在进程语句、函数语句和过程语句结构中使用,是一个局部量。
在vhdl语言中,对信号赋值是按仿真时间进行的,到了规定的仿真时间才进行赋值,而变量的赋值是立即发生的。下面的例子是从赋初值的角度说明信号与变量的这种区别的。
例如用vhdl语言实现初值为a的十六进制的16个数的循环显示。
对于如此的设计要求,如果用变量实现,则vhdl程序如下。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity sevenauto is
port(clk:in std_logic;
y:out std_logic_vector(6 downto 0));
end sevenauto;
architecture behave of sevenauto is
begin
process(clk)
variable count:std_logic_vector(3 downto 0);
variable init:std_logic;
begin
if (clk''event) and (clk=''1'') then
if (init = ''0'') then
count:= 1001;
init:=''1'
end if;
count:=count+1;
case count is
when 0000=>yyyyyyyyyyyyyyyyy<=xxxxxxx;
end case;
end if;
end process;
end behave;
在程序中,定义了变量count,希望初始值为“1010”。通过实验发现,在定义变量或信号时直接赋予初始值不能生效(如variable count:std_logic_vector(3 downto 0) :=“1010”),它的初始值仍然是系统默认值(如count为“0000”)。正是利用这一点,通过init(初始值为''0'')来给count赋初值 a即“1010”,具体方法见程序中斜体部分。这样,在第一个脉冲来时执行斜体部分if语句,而第二个脉冲来时由于init不为''0''而是 ''1'',因此不执行该部分语句,从而实现为count赋初值的功能,这样程序从a开始进行数字的循环显示。
如果把count类型改为signal,则结果将大不一样。
signal count: std_logic_vector(3 downto 0);
process(clk)
variable init :std_logic;
begin
if (clk''event) and (clk=''1'') then
if (init = ''0'') then
count<= 1001; --(1)
init := ''1'
end if;
count<=count+1; --(2)
由于信号的赋值不是立即发生的,在语句(1)后面还存在对信号count的赋值操作(2),因此,语句(1)在此不起作用,count的最后值是语句 (2)的值。因此如果将count设为signal的话,程序实现的是从0开始的16个十六进制数的循环。在这里,对信号赋初值的语句是不可行的。
仿真结果
将设计好的vhdl程序在altera公司提供的软件maxplusⅱ10.1环境下进行编译仿真,得到的仿真结果如图1、图2所示,其中图1是 count为变量的结果,图2是count为信号的结果,其中输出y[6...0]分别与七段数码管的abcdefg七段相连。
从图1可以看出,在第一个时钟脉冲上升沿,结果是“1110111”,数码管显示即为a,然后依次为b,c,d, e,f,0,1...9,a...循环下去,此处用小写的b和d,主要是与数字8进行区别。
从图中可以看出,在第一个时钟脉冲上升沿,结果是“1111110”,数码管显示即为0,然后依次示1...9,a, b,c,d,e,f,0,...循环下去。

对石化行业储罐如何进行安全监测
Vishay宣布将缩短MLCC供货周期
一加手机怎么样_和华为哪个好
如何从5.5 V获得+1V和-2V双电源?
NI连续第14年荣登《财富》杂志最佳雇主百强榜
VHDL设计中信号与变量问题的研究
特斯拉或在5年内推出电动飞机
索尼CMOS有多吊?为三星苹果定制摄像头传感器
开发适用于下一代汽车的汽车网关
大语言模型中的常用评估指标
西门子博途S71500通过PROFINET组态HMI连接
基于TI DSP器件和MSP430在生物特征识别中的应用研究
高合HiPhi X是华人运通旗下首款量产可进化超跑SUV
RA6T2的16位模数转换器操作 [1] 简介,A/D转换器概述
台积电南科18工厂一周以来发生的第三次工作安全事故了
CS8384八通道PCI数据采集卡在核辐射探测器中的应用
EMCP物联网云平台解决方案的详细介绍
关于STM32中断向量表的位置 、重定向问题
HyperXPredatorRGB内存评测 值不值得买
小米Play首推买流量送手机模式 每月10GB的高速流量真的够用吗