VHDL的变量与信号赋值问题
比如下面三个程序哪个是8位奇偶校验器的正确表述,三个程序区别在哪里,形成的RTL图为什么不同?LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL...
比如下面三个程序哪个是8位奇偶校验器的正确表述,三个程序区别在哪里,形成的RTL图为什么不同?
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY XH1 IS
PORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y:OUT STD_LOGIC);
END ENTITY XH1;
ARCHITECTURE one OF XH1 IS
SIGNAL tmp:STD_LOGIC;
BEGIN
PROCESS(a)
BEGIN
tmp<='0';
FOR n IN 0 TO 7 LOOP
tmp<=tmp XOR a(n);
END LOOP;
y<=tmp;
END PROCESS;
END one;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY XH1 IS
PORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y:OUT STD_LOGIC);
END ENTITY XH1;
ARCHITECTURE one OF XH1 IS
BEGIN
PROCESS(a)
VARIABLE tmp:STD_LOGIC;
BEGIN
tmp:='0';
FOR n IN 0 TO 7 LOOP
tmp:=(tmp XOR a(n));
END LOOP;
y<=tmp;
END PROCESS;
END one;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY XH1 IS
PORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y:OUT STD_LOGIC);
END ENTITY XH1;
ARCHITECTURE one OF XH1 IS
BEGIN
PROCESS(a)
VARIABLE tmp:STD_LOGIC:='0';
BEGIN
FOR n IN 0 TO 7 LOOP
tmp:=(tmp XOR a(n));
END LOOP;
y<=tmp;
END PROCESS;
END one; 展开
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY XH1 IS
PORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y:OUT STD_LOGIC);
END ENTITY XH1;
ARCHITECTURE one OF XH1 IS
SIGNAL tmp:STD_LOGIC;
BEGIN
PROCESS(a)
BEGIN
tmp<='0';
FOR n IN 0 TO 7 LOOP
tmp<=tmp XOR a(n);
END LOOP;
y<=tmp;
END PROCESS;
END one;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY XH1 IS
PORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y:OUT STD_LOGIC);
END ENTITY XH1;
ARCHITECTURE one OF XH1 IS
BEGIN
PROCESS(a)
VARIABLE tmp:STD_LOGIC;
BEGIN
tmp:='0';
FOR n IN 0 TO 7 LOOP
tmp:=(tmp XOR a(n));
END LOOP;
y<=tmp;
END PROCESS;
END one;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY XH1 IS
PORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y:OUT STD_LOGIC);
END ENTITY XH1;
ARCHITECTURE one OF XH1 IS
BEGIN
PROCESS(a)
VARIABLE tmp:STD_LOGIC:='0';
BEGIN
FOR n IN 0 TO 7 LOOP
tmp:=(tmp XOR a(n));
END LOOP;
y<=tmp;
END PROCESS;
END one; 展开
2个回答
展开全部
第三个和第二个是一样的
VARIABLE tmp:STD_LOGIC;
tmp:='0';
合并成一个语句:VARIABLE tmp:STD_LOGIC:='0';
VARIABLE:变量。
SIGNAL tmp:STD_LOGIC; 信号
信号会有延时,而变量是立即赋值的,
两个类型仿真出来的RTL图是不一样的。
在一个进程中,如果对一个信号多次赋值,那么,只有最后一个值才是有效的。如果对变量多次赋值,那么每次赋值都是有效的,并且,变量的值在再次赋值之前一直保持不变。
信号跟硬件有点类似,并且是在进程结束的时候才更新;变量是立即更新的,因此可以影响程序的功能,但变量的好处是仿真速度更快。
因此,通常情况下,推荐使用信号,可以保证程序的正确性。
VARIABLE tmp:STD_LOGIC;
tmp:='0';
合并成一个语句:VARIABLE tmp:STD_LOGIC:='0';
VARIABLE:变量。
SIGNAL tmp:STD_LOGIC; 信号
信号会有延时,而变量是立即赋值的,
两个类型仿真出来的RTL图是不一样的。
在一个进程中,如果对一个信号多次赋值,那么,只有最后一个值才是有效的。如果对变量多次赋值,那么每次赋值都是有效的,并且,变量的值在再次赋值之前一直保持不变。
信号跟硬件有点类似,并且是在进程结束的时候才更新;变量是立即更新的,因此可以影响程序的功能,但变量的好处是仿真速度更快。
因此,通常情况下,推荐使用信号,可以保证程序的正确性。
追问
让我不解的是第三个和第二个的RTL图不同啊,有一个反馈。而且三个哪一个才是正确的8位奇偶校验器啊。程序中用信号还是变量对电路功能与结构是不是都有影响啊,不能随便用是吧。
追答
第三个和第二个不同在于给变量赋初值,一个在程序执行前,一个在程序执行中……这不难理解吧
理解了VHDL程序执行的顺序就懂了,一个是立即赋值,一个是开始后才赋值。
变量具有局部特征,它的有效性只局限于所定义的一个进程中,或一个子程序中,它是一个局部的、暂时性数据对象,对于它的赋值是立即发生的。
信号具有全局特征,它不但可以作为一个设计实体内部各单元之间数据传送的载体,而且可通过信号与其他的实体进行通信,信号的赋值不是立即发生的,它发生在一个进程结束时。
用第一种
2013-08-24
展开全部
书上说的是用第二种或者第三种,凡是中间值都应该用变量,信号的话会有延时产生时序电路
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询