当前位置:文档之家› fpga数字电路设计基础李桥

fpga数字电路设计基础李桥

VHDL 设计风格和实现, 2000年6月10日 第 5 页
门产生的时钟有问题
此例中,计数终点信号会产生毛刺,使用该信号作时钟会引 起问题。
- MSB布线更短,信号变化先到达与门。与门会“感知”到1111的中间态。由于与门为电平敏感,
会输出高电平的毛刺,从而引起寄存器的误动作。
MSB
0111
1000 计数器的操作为:
两年前我做的FPGA设计,现在却不能工作。FPGA本身有什么变化吗?
- 如果采用的是异步设计,能否工作有很多无法控制的随机因素。
我的设计原来可以工作,但将FPGA重新布线后,就不行了。怎么回事?
- 异步设计也许在特定布线下能工作,但布线改变后就不行了。很危险吧?
我的设计通过了时间仿真,但上板调试时不干活。时间仿真对不对?
0111
1111 1000 因为MSB更快
此处的与门为电 平敏感
MSB
布线更短
计数器
VHDL 设计风格和实现, 2000年6月10日 第 6 页
flop
此处会产生毛刺,并且与 计数器的时钟无关
相应的VHDL代码
signal Counter: signal TC: signal flop:
std_logic_vector(3 downto 0); std_logic; std_logic;
process(TC, Clk) begin
if TC=‘1’ then Counter <= “0000”; TC <= ‘-’;
elsif rising_edge(Clk) then Counter <= Counter + 1; if Counter=“1110” then
else
end if; end if; end process;
- 对于异步设计,通过了时间仿真也不一定能正常工作。
要小心,时钟信号和异步复位可别产生毛刺啊。
快速FPGA中的触发器会对非常窄的毛刺信号作出反应。
-
异步设计中,设计者老要想着去消除时钟、异步复位 信号以及锁存器使能端的毛刺,但这一点很困难,甚 至不可能。 同步设计的一个简单原则: 永远不要将组合逻辑产生 的信号用作时钟、异步复位/置位。
if rising_edge(TC) then flop <= …
end if; end process;
--使用组合逻辑输出作时钟,是异步设计,禁止!!!
VHDL 设计风格和实现, 2000年6月10日 第 7 页
毛刺和同步设计
u 组合逻辑的毛刺通常总是存在,难于甚至无法消除 u 毛刺只有在异步设计中(连接到时钟、异步复位、
锁存器的使能端)才存在问题 u 在同步设计中,由于寄存器在时钟沿才会动作,只
要能满足时延要求,就能确保采样到稳定正确的结 果 u 毛刺无法消除,但其造成的问题却可以消除 — 采用同步设计并达到时延要求
VHDL 设计风格和实现, 2000年6月10日 第 8 页
同步设计方法中TC的生成和使用
INPUT
- 只要能满足时延要求,就可以确保下游逻辑单元 能正确采样到上游数据。
异步设计:上游数据发生变化的时机是不确 定的,甚至会出现中间态。
- 下游逻辑对上游数据的采样是不确定的,会发生 数据传递的错误。
VHDL 设计风格和实现, 2000年6月10日 第 4 页
为什么要做同步设计 ?
异步设计可能会产生以下问题:
end if; end process;
end if; end process;
例2
signal Counter: std_logic_vector(3 downto 0);
signal TC:
std_logic;
signal s:
std_logic;
process(Clk) begin
if rising_edge(Clk) then if INPUT=‘1’ then Counter <= Counter + 1; end if; if TC=‘1’ then --TC 用在寄存器的CE端,为同步设计,可行 s <= DATA; end if;
Counter
D
Q3
Q2
Q1
Q0
TC
D
Q
CLOCK
Async R
对照前面异步设计中TC生成和使用的例子
VHDL 设计风格和实现, 2000年6月10日 第 9 页
相应的VHDL代码
signal Counter: signal TC: signal flop:
std_logic_vector(3 downto 0); std_logic; std_logic;
CLOCK
DATA S
D
Q
CE
R
VHDL 设计风格和实现, 2000年6月10日 第 11 页
相应的VHDL代码
例1 signal Counter: std_logic_vector(1 downto 0);
process(Clk) begin
if rising_edge(Clk) then if INPUT=‘1’ and Counter/=“11” then Counter <= Counter + 1; end if; --组合逻辑用在寄存器的D端, --为同步设计,可行
p rising_edge(Clk) then Counter <= Counter + 1;
end if; end process;
TC <= ‘1’ when Counter=“1111” else ‘0’;
--TC为组合逻辑输出
process(TC) begin
数字电路设计基础
VHDL 设计风格和实现, 2000年6月10日 第 1 页
内容概述
一、同步设计 二、速度 三、资源
VHDL 设计风格和实现, 2000年6月10日 第 2 页
一、同步设计
VHDL 设计风格和实现, 2000年6月10日 第 3 页
什么是同步设计?
同步设计:上游数据到下游逻辑单元的传递 是通过时钟来同步的。
TC <= ‘1’; TC <= ‘0’;
--此复位为寄存器信号,为同步设计,可行
--注意和异步设计中TC信号的比较 --此处TC为寄存器输出
VHDL 设计风格和实现, 2000年6月10日 第 10 页
同步设计的更多例子(可行)
INPUT CLOCK
Counter D Q1
Q0
INPUT
Counter D TC
相关主题