一、设计的方法
1、所有除了0和1都加上“X”
if( sel = ‘1’ ) then
y <= ‘0’;
elsif( sel = ‘0’ ) then
y <= ‘1’;
else
y <= ‘X`;
end if;
2、所有无关分支加上无关态
(0)
善于使用无关态‘-’来填补分支,可以引导综合工具生成很优化的电路。
无关态‘-’在本质上时起了冗余电路删简的作用。
(1)Case sel is
when “000” => dout <= dina;
when “010” => dout <= dinb;
when others => dout <= ‘-’;
End case;
(2)这样比这样好:
Case sel is
when “000” => dout <= dina;
when “010” => dout <= dinb;
when others => dout <= ‘0’;
End case;
(3)对比:
3、仿真中的有些电路会出现X,此时不一定是代码错误。
常见的出现X的电路为,“组合回环”。这种组合回环,用VHDL的逻辑运算语句来描述,会无法通过综合;用port map语句来描述可通过综合。
RTL级别描述的组合回环很少使用(并且不推荐使用),一般仅用在一些特殊场合中(比如多时钟切换中的毛刺避免等),但是这在仿真时dout往往会出现不确定态,这是必须要注意的。
4、时钟沿描述限制
一个进程中,只能有一个时钟沿判断语句。所以,不能在一个进程中判断两次或以上的时钟沿,甚至是判断同一个时钟的同一个沿也不行。
5、锁存
(1)错误的锁存产生于组合进程中if和case的分支不完整,意味着电路需要在某种电平状态下,让被赋值的信号“保持原值”,这只能使用锁存电路实现。
(2)锁存和寄存区别:
锁存是电平起作用,寄存是时钟有效沿起作用。
(3)在设计中,应该尽量避免使用锁存。因为锁存要占去大量的触发器资源,而且会对电路带来某种不稳定的隐患。
(4)条件完整但仍然生成锁存器的描述:
Architecture behav of And2 is
Begin