VHDL中IF不考虑所有情况 会怎样
答案:2 悬赏:20 手机版
解决时间 2021-03-25 13:28
- 提问者网友:山高云阔
- 2021-03-24 22:08
VHDL中IF不考虑所有情况 会怎样
最佳答案
- 五星知识达人网友:神也偏爱
- 2021-03-24 23:35
使用顺序代码设计组合电路时,必须遵守下面两个原则:
原则1:确保在PROCESS中用到的所有输入信号都出现在敏感信号列表中;
原则2:确保所有输入、输出的所有组合,也就是说,电路的真值表必须在代码中完整地反映出来。
给你举个例子:
我们要完成如下真值表所示的电路(是一个多路复用器)
sel x y
00 a 0
01 b 1
10 c
11 d
(真值表1)
用顺序代码设计:
library ieee;
use ieee.std_logic_1164.all;
entity example is
port(a,b,c,d:in std_logic;
sel: in iteger range 0 to 3;
x,y:out std_logic);
end example;
architecture bh of example is
begin
process(a,b,c,d,sel)
begin
if(sel=0)then
x<=a;
y<='0';
elseif(sel=1)then
x<=b;
y<='1';
elseif(sel=2)then
x<=c;
elsif
x<=d;
end if;
end process;
end bh;
上面的代码经过编译后,报告中并没有显示有锁存器生成。然而,仿真时,y的波形可能存在异常。对于同样的输入,y出现两种不同的输出值(当两次出现sel=3时,y的输出结果不同)。这表明编译时的确生成了某种记忆单元。事实上,如果观察QuartusII综合的结果,会发现y=(sel(0)and sel(1))or(sel(0)and y)or(sel(1)and y),这里面隐含着一个由与门和或门组成的锁存器,它造成了y的记忆。
为了避免生成锁存器,需要使用如下真值表,其中使用了'X'来表示“不确定”或“不需要考虑”。这样就可以消除异常。
sel x y
00 a 0
01 b 1
10 c X
11 d X
顺便问一下,你是在自学吗?这个应该有人会提醒你的啊?
原则1:确保在PROCESS中用到的所有输入信号都出现在敏感信号列表中;
原则2:确保所有输入、输出的所有组合,也就是说,电路的真值表必须在代码中完整地反映出来。
给你举个例子:
我们要完成如下真值表所示的电路(是一个多路复用器)
sel x y
00 a 0
01 b 1
10 c
11 d
(真值表1)
用顺序代码设计:
library ieee;
use ieee.std_logic_1164.all;
entity example is
port(a,b,c,d:in std_logic;
sel: in iteger range 0 to 3;
x,y:out std_logic);
end example;
architecture bh of example is
begin
process(a,b,c,d,sel)
begin
if(sel=0)then
x<=a;
y<='0';
elseif(sel=1)then
x<=b;
y<='1';
elseif(sel=2)then
x<=c;
elsif
x<=d;
end if;
end process;
end bh;
上面的代码经过编译后,报告中并没有显示有锁存器生成。然而,仿真时,y的波形可能存在异常。对于同样的输入,y出现两种不同的输出值(当两次出现sel=3时,y的输出结果不同)。这表明编译时的确生成了某种记忆单元。事实上,如果观察QuartusII综合的结果,会发现y=(sel(0)and sel(1))or(sel(0)and y)or(sel(1)and y),这里面隐含着一个由与门和或门组成的锁存器,它造成了y的记忆。
为了避免生成锁存器,需要使用如下真值表,其中使用了'X'来表示“不确定”或“不需要考虑”。这样就可以消除异常。
sel x y
00 a 0
01 b 1
10 c X
11 d X
顺便问一下,你是在自学吗?这个应该有人会提醒你的啊?
全部回答
- 1楼网友:摆渡翁
- 2021-03-24 23:54
相当于else NULL;也就是当出现11时,啥也没有做。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯