当前位置:
文档之家› 【华为】VHDL设计风格和实现
【华为】VHDL设计风格和实现
VHDL 设计风格和实现, 2000 年6月10日 第 8 页
安全同步化异步输入一例 ——去抖动逻辑
延迟一个周期后才复位,确保D端输入脉冲至少 有一个周期的宽度,没有中间态
D
Q
D
Q
D
Q
同步输入
异步输入
R 异步输入的信号变化时机和宽度不确定, 有抖动(毛刺),不能直接被同步系统正确采样
系统时钟
设备外围
- 对于异步设计,通过了时间仿真也不一定能正常工作。
� 要小心,时钟信号可别产生毛刺啊。 � 要小心,异步复位可别有毛刺啊。 � 快速FPGA中的触发器会对非常窄的毛刺信号作出反应。
- 异步设计中,设计者老要想着去消除时钟、异步复位信号以及锁存器使能端的 毛刺,但这一点在异步设计中很困难,甚至不可能。
VHDL 设计风格和实现, 2000 年6月10日 第 16 页
二、速度
VHDL 设计风格和实现, 2000 年6月10日 第 17 页
中间态、时延和速度
� 当寄存器间数据传递的时延超过一个时钟周期,下游寄存器不能在下 一个时钟周期采样到本时钟周期给出的上游数据,出现错误。 � 当时钟来临时,寄存器输入发生变化,会采样到中间态。
process(SynInput, AsynInput) begin if SynInput=‘1’ then --此置位为寄存器信号,为同步设计,可行 InputReg <= ‘0’; if rising_edge(AsynInput) then InputReg <= ‘1’; end if; end process; process(Clk) begin if rising_edge(Clk) then Delay <= InputReg; SynInput <= Delay; end if;
--使用组合逻辑输出作时钟,是异步设计,禁止!!!
VHDL 设计风格和实现, 2000 年6月10日 第 7 页
毛刺和同步设计
u 组合逻辑的毛刺通常总是存在,难于甚至无法消除 u 毛刺只有在异步设计中(连接到时钟、异步复位、 锁存器的使能端)才存在问题 u 在同步设计中,由于寄存器在时钟沿才会动作,只 要能满足时延要求,就能确保采样到稳定正确的结 果 u 毛刺无法消除,但其造成的问题却可以消除 — 采用同步设计并达到时延要求
� 两年前我做的FPGA设计,现在却不能工作。FPGA本身有什么变化吗?
- 如果采用的是异步设计,能否工作有很多无法控制的随机因素。
� 我的设计原来可以工作,但将FPGA重新布线后,就不行了。怎么回事?
- 异步设计也许在特定布线下能工作,但布线改变后就不行了。很危险吧?
� 我的设计通过了时间仿真,但上板调试时不干活。时间仿真对不对?
--此复位为寄存器信号,为同步设计,可行
--注意和异步设计中TC信号的比较 --此处TC为寄存器输出
VHDL 设计风格和实现, 2000 年6月10日 第 12 页
同步设计的更多例子(可行)
INPUT CLOCK
Counter D Q1 Q0
INPUT CLOCK
Counter D TC
DATA D
VHDL设计风格和实现
VHDL 设计风格和实现, 2000 年6月10日 第 1 页
内容概述
一、同步设计 二、速度 三、资源 四、其他
VHDL 设计风格和实现, 2000 年6月10日 第 2 页
一、同步设计
VHDL 设计风格和实现, 2000 年6月10日 第 3 页
什么是同步设计? � 同步设计:上游数据到下游逻辑单元的传递 是通过时钟来同步的。
3.1 Flop A D Q 3.6 Flop B D Q 3.3 Flop C D Q
CLOCK
3.0
12.1
3.6
VHDL 设计风格和实现, 2000 年6月10日 第 19 页
时延级数怎么算?
� FPGA的时延通常 布线占50%,逻辑占50% � 不要忘记了时钟到输出的时间 (tco,输出时间)和时钟 到建立的时间 (tsu,建立时间)
signal Counter: signal TC: signal flop: std_logic_vector(3 downto 0); std_logic; std_logic;
process(Clk) begin if rising_edge(Clk) then Counter <= Counter + 1; end if; end process; TC <= ‘1’ when Counter=“1111” else ‘0’; process(TC) begin if rising_edge(TC) then flop <= … end if; end process; --TC为组合逻辑输出
VHDL 设计风格和实现, 2000 年6月10日 第 18 页
时延中包括时钟歪斜(Skew)
� 下面逻辑中,数据时延很小 (最大3.6ns),如果时钟歪斜较小 ,该逻辑可以跑200MHz以上。 � 由于存在时钟歪斜, Flop B到Flop C的实际时延为 3.3+12.1-3.6=11.8ns,在100MHz下就不能工作。 � 计算速度时要考虑时钟歪斜的影响。 � 使用全局驱动,可以减少时钟歪斜。 INPUT
输出高电平的毛刺,从而引起寄存器的误动作。
MSB
0111 0111
1111
1000 计数器的操作为: 1000 因为MSB更快
此处的与门为电 平敏感
MSB
布线更短
flop 计数器
VHDL 设计风格和实现, 2000 年6月10日 第 6 页
此处会产生毛刺,并且与 计数器的时钟无关
相应的VHDL代码
- 只要能满足时延要求,就可以确保下游逻辑单元 能正确采样到上游数据。
� 异步设计:上游数据发生变化的时机是不确 定的,甚至会出现中间态。
- 下游逻辑对上游数据的采样是不确定的,会发生 数据传递的错误。
VHDL 设计风格和实现, 2000 年6月10日 第 4 页
为什么要做同步设计 ?
异步设计可能会产生以下问题 :
D CE Q D CE Q
Tilo+布线 + Tilo + 布线 + Tilo +布线 + Tdick Tcko+布线 + +Tilo+ +Tilo .372 +1.057+0.738+1.057+0.738+1.057+0.738+1.405+ 0. 765 1 1. 372+1.057+0.738+1.057+0.738+1.057+0.738+1.405+ 0.765 ns 或者 110 MHz = 8.927 8.927ns 110MHz
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 TC <= ‘1’; else TC <= ‘0’; end if; end if; end process;
•该逻辑确保能正确得到异步输入的上升沿。 •一个时钟周期内的多次电平变化被认为是抖动(毛刺), 最后只得到一个上升沿。
VHDL 设计风格和实现, 2000 年6月10日 第 9 页
相应的VHDL代码
signal AsynInput: signal InputReg: signal Delay: signal SynInput: std_logic; std_logic; std_logic; std_logic;
- 建立时间不能被满足,就会采样到中间态,最后的采样结果不确定。
� 避免采样不到和采样到中间态的方法是满足时延要求 � 系统中的最大时延决定了系统的速度,也决定了系统能正常工作的最 大时钟频率。
建立时间 CLK D Q CLK D Q CLK Q D Q CLK 当建立时间不够时,会采样到中间态,最后的采样结果不确定。 D
- 逻辑时延级数总会包括这两级。
� 还需要检查I/O的速度。
P D CE Q D CE
P Q
R
Rห้องสมุดไป่ตู้
VHDL 设计风格和实现, 2000 年6月10日 第 20 页
XCV100-4的例子
� 3级逻辑的速度有多快? � 布线时延大致可估算为与逻辑时延相等
— 下面Slice的时延是Tilo,从F,G经过LUT输出的时延
VHDL 设计风格和实现, 2000 年6月10日 第 14 页
异步设计的更多例子(禁止)
INPUT CLOCK
Async R Counter D Q1 Q0
INPUT CLOCK
Counter D TC
DATA D
CE
S Q
R
这些例子有什么问题 ?
VHDL 设计风格和实现, 2000 年6月10日 第 15 页
同步设计的一个简单原则 : 永远不要将组合逻辑产生 的信号用作时钟、异步复位 /置位。
VHDL 设计风格和实现, 2000 年6月10日 第 5 页
门产生的时钟有问题
� 此例中,计数终点信号会产生毛刺,使用该信号作时钟会引起 问题。
- MSB布线更短,信号变化先到达与门。与门会 “感知”到1111的中间态。由于与门为电平敏感,会