《fpga数字电路设计基础(李桥).ppt》由会员分享,可在线阅读,更多相关《fpga数字电路设计基础(李桥).ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、VHDL 设计风格和实现, 2000年6月10日 第 2 页内容概述一、同步设计二、速度三、资源VHDL 设计风格和实现, 2000年6月10日 第 3 页一、同步设计VHDL 设计风格和实现, 2000年6月10日 第 4 页什么是同步设计?w 同步设计:上游数据到下游逻辑单元的传递是通过时钟来同步的。- 只要能满足时延要求,就可以确保下游逻辑单元能正确采样到上游数据。w 异步设计:上游数据发生变化的时机是不确定的,甚至会出现中间态。- 下游逻辑对上游数据的采样是不确定的,会发生数据传递的错误。VHDL 设计风格和实现, 2000年6月10日 第 5 页为什么要做同步设计 ?w两年前我做的F
2、PGA设计,现在却不能工作。FPGA本身有什么变化吗?- 如果采用的是异步设计,能否工作有很多无法控制的随机因素。w我的设计原来可以工作,但将FPGA重新布线后,就不行了。怎么回事?- 异步设计也许在特定布线下能工作,但布线改变后就不行了。很危险吧?w我的设计通过了时间仿真,但上板调试时不干活。时间仿真对不对?- 对于异步设计,通过了时间仿真也不一定能正常工作。w要小心,时钟信号和异步复位可别产生毛刺啊。w快速FPGA中的触发器会对非常窄的毛刺信号作出反应。-异步设计可能会产生以下问题:异步设计中,设计者老要想着去消除时钟、异步复位信号以及锁存器使能端的毛刺,但这一点很困难,甚至不可能。同步设
3、计的一个简单原则同步设计的一个简单原则: 永远不要将组合逻辑产生永远不要将组合逻辑产生的信号用作时钟、异步复位的信号用作时钟、异步复位/置位。置位。VHDL 设计风格和实现, 2000年6月10日 第 6 页门产生的时钟有问题w 此例中,计数终点信号会产生毛刺,使用该信号作时钟会引起问题。- MSB布线更短,信号变化先到达与门。与门会“感知”到1111的中间态。由于与门为电平敏感,会输出高电平的毛刺,从而引起寄存器的误动作。布线更短此处会产生毛刺,并且与计数器的时钟无关MSB0111 1000 计数器的操作为:0111 1111 1000 因为MSB更快计数器flopMSB此处的与门为电平敏感
4、VHDL 设计风格和实现, 2000年6月10日 第 7 页相应的VHDL代码signal Counter: std_logic_vector(3 downto 0);signal TC:std_logic;signal flop:std_logic;process(Clk)beginif rising_edge(Clk) thenCounter = Counter + 1;end if;end process;TC = 1 when Counter=“1111” else 0;-TC为组合逻辑输出process(TC)beginif rising_edge(TC) then-使用组合逻辑输出
5、作时钟,是异步设计,禁止!flop = end if;end process;VHDL 设计风格和实现, 2000年6月10日 第 8 页毛刺和同步设计u 组合逻辑的毛刺通常总是存在,难于甚至无法消除u 毛刺只有在异步设计中(连接到时钟、异步复位、锁存器的使能端)才存在问题u 在同步设计中,由于寄存器在时钟沿才会动作,只要能满足时延要求,就能确保采样到稳定正确的结果u 毛刺无法消除,但其造成的问题却可以消除 采用同步设计并达到时延要求VHDL 设计风格和实现, 2000年6月10日 第 9 页DQ3Async RINPUTCLOCKCounterQ2Q1Q0DQ同步设计方法中TC的生成和使用对
6、照前面异步设计中TC生成和使用的例子TCVHDL 设计风格和实现, 2000年6月10日 第 10 页相应的VHDL代码signal Counter: std_logic_vector(3 downto 0);signal TC:std_logic;signal flop:std_logic;process(TC, Clk)beginif TC=1 then-此复位为寄存器信号,为同步设计,可行Counter = “0000”;TC = -;elsif rising_edge(Clk) thenCounter = Counter + 1;if Counter=“1110” then-注意和异步
7、设计中TC信号的比较-此处TC为寄存器输出TC = 1;elseTC = 0;end if;end if;end process;VHDL 设计风格和实现, 2000年6月10日 第 11 页同步设计的更多例子(可行)DQ1DTCCounterINPUTCLOCKCounterQ0INPUTCLOCKDCEQRSDATAVHDL 设计风格和实现, 2000年6月10日 第 12 页相应的VHDL代码例2signal Counter: std_logic_vector(3 downto 0);signal TC: std_logic;signal s: std_logic;process(Clk
8、)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; end if;end process;TC = 1 when Counter=“1111” else 0;-TC为组合逻辑输出例1signal Counter: std_logic_vector(1 downto 0);process(Clk)begin if rising_edge(Clk) then if INPUT=1 and
9、Counter/=“11” then Counter = Counter + 1; end if; -组合逻辑用在寄存器的D端, -为同步设计,可行 end if;end process;VHDL 设计风格和实现, 2000年6月10日 第 13 页异步设计的更多例子(禁止)DQ1Async RDTCCounter这些例子有什么问题 ?INPUTCLOCKCounterQ0INPUTCLOCKDCEQRSDATAVHDL 设计风格和实现, 2000年6月10日 第 14 页相应的VHDL代码例2signal Counter: std_logic_vector(3 downto 0);signa
10、l TC: std_logic;signal s: std_logic;process(Clk)begin if rising_edge(Clk) then if INPUT=1 then Counter = Counter + 1; end if;end if;end process;TC = 1 when Counter=“1111” else 0;-TC为组合逻辑输出process(TC)begin if rising_edge(TC)=1 then -TC 用作寄存器的时钟,为异步设计,禁止! s = DATA; end if;end process;例1signal Counter:
11、 std_logic_vector(1 downto 0);process(Counter, Clk)begin if Counter=“11” then -组合逻辑用作寄存器的异步复位, -为异步设计,禁止! Counter = “00”; elsif rising_edge(Clk) then if INPUT=1 then Counter = Counter + 1; end if;end if;end process;VHDL 设计风格和实现, 2000年6月10日 第 15 页二、速度VHDL 设计风格和实现, 2000年6月10日 第 16 页中间态、时延和速度w当寄存器间数据传递
12、的时延超过一个时钟周期,下游寄存器不能在下一个时钟周期采样到本时钟周期给出的上游数据,出现错误。w当时钟来临时,寄存器输入发生变化,会采样到中间态。- 建立时间不能被满足,就会采样到中间态,最后的采样结果不确定。w避免采样不到和采样到中间态的方法是满足时延要求w系统中的最大时延决定了系统的速度,也决定了系统能正常工作的最大时钟频率。DCLKQCLKDQ当建立时间不够时,会采样到中间态,最后的采样结果不确定。建立时间DCLKQDCLKQVHDL 设计风格和实现, 2000年6月10日 第 17 页时延中包括时钟相差w 下面逻辑中,数据时延很小(最大3.6ns),如果时钟相差较小,该逻辑可以跑20
13、0MHz以上。w 由于存在时钟相差,Flop B到Flop C的实际时延为3.3+12.1-3.6=11.8ns,在100MHz下就不能工作。w 计算速度时要考虑时钟相差的影响。w 使用全局驱动,可以减少时钟相差。DQINPUTCLOCKDQDQFlop C12.13.63.33.63.13.0Flop BFlop AVHDL 设计风格和实现, 2000年6月10日 第 18 页时延级数怎么算?w FPGA的时延通常 布线占50%,逻辑占50%w 不要忘记了时钟到输出的时间 (tco,输出时间)和时钟到建立的时间 (tsu,建立时间)- 逻辑时延级数总会包括这两级。DCEQRPDCEQRPVH
14、DL 设计风格和实现, 2000年6月10日 第 19 页XCV100-4的例子w 3级逻辑的速度有多快?w 布线时延大致可估算为与逻辑时延相等 下面Slice的时延是Tilo,从F,G经过LUT输出的时延DCEQDCEQ Tcko+布线布线 +Tilo+布线布线 +Tilo + 布线布线 + Tilo +布线布线 + Tdick 1.372+1.057+0.738+1.057+0.738+1.057+0.738+1.405+ 0.765= 8.927ns 或者或者 110MHz VHDL 设计风格和实现, 2000年6月10日 第 20 页速度估计w用逻辑时延作为网络时延的估计用逻辑时延作为
15、网络时延的估计w已知系统的时钟频率,可以估计允许的逻辑深度已知系统的时钟频率,可以估计允许的逻辑深度和功能需求相对照,修改设计以满足性能需要。w在在50 MHz下使用下使用XCV100-4的例子的例子:时钟周期20 ns一级布线时延- 5 ns (Tcko + Tnet + Tick) Tcko+Tick=2.871ns允许增加时延=15 ns每增加一级的时延/ 1.52 ns (Tilo + Tnet) Tilo=0.738ns允许增加的级数=710 SlicesTckoTnetTiloTnetTiloTnetTickSliceSliceSliceSlice注意此Slice中使用了LUT,所
16、以建立时间是Tick而不是Tdick,这种映射结果减少了一级布线时延VHDL 设计风格和实现, 2000年6月10日 第 21 页对高扇出的网络使用全局驱动w 设计中,有高扇出的时钟使能、IOB三态以及其他信号吗?w 使用剩余的BUFG来驱动它们,以达到更小的相差和更高的性能w 使用BUFG,时钟输入的相差可以小于1nsw 使用BUFG的方法,实例化BUFG,将相应信号连接上去DCEQRPCE or OE or RSTINPUTCLOCKBUFGVHDL 设计风格和实现, 2000年6月10日 第 22 页使用全局复位有助于提高速度w所有的触发器在上电时通过全局置位/复位(GSR)网络进行初始
17、化w你可以通过实例化STARTUP 元件访问GSR网络。GSR自动连接到所有CLB的触发器,使用专用的布线资源。使用GSR,可以节约通用布线资源,减小布线时延,提高系统速度不要连接不要连接GSR到触发器的复位、置位输入端w任何信号(如内部信号、外部输入等)都可以连接到GSR,但该信号必须在设计中定义。VHDL 设计风格和实现, 2000年6月10日 第 23 页VHDL代码中的复位u在下面的VHDL中,应该在Rst中对寄存器赋值,否则Rst信号会被综合成寄存器的CE端的一个输入。- 浪费布线资源、增加逻辑级数,降低系统速度u 即使不关心寄存器的复位状态,也应该对其赋初值,可以赋初值为“-”,即
18、“Donnt care”。这样,寄存器的复位端不会被使用,节约布线资源Process(Rst,Clk)begin if Rst=1 then DataValid = 0; Data(31 downto 0) -); -这个语句一定要写,否则Rst信号会被综合成寄存器 -Data到DataCE端的一个输入 elsif rising_edge(Clk) then DataValid = f(x); Data = g(y);-f(x),g(x)表示组合逻辑 end if;end process;小技巧: 对于逻辑向量std_logic_vector的赋值,可以使用“()”来表示。如:signal p
19、tr: std_logic_vector(14 downto 0);ptr = 000 & x000; 可以写成 ptr 0);ptr(12 downto 7) = - 可以写成 ptr(12 downto 7) -);ptr = -00 & x000; 可以写成 ptr -, others=0);VHDL 设计风格和实现, 2000年6月10日 第 24 页采用流水线逻辑来提高速度w FPGA触发器资源丰富w 增加流水线逻辑级数,可提高系统速度DCEQRPDCEQRPDCEQRPDCEQRPDCEQRP25MHz50MHzVHDL 设计风格和实现, 2000年6月10日 第 25 页4-5输
20、入的逻辑函数对速度和密度最有利w Xilinx FPGA由四输入查找表(LUT)组成。w 一个查找表能实现其输入形成的任何逻辑函数 相当于编址ROM,将输入作为地址,查找出函数结果。w LUT能实现的函数只受输入数目限制,不受函数复杂度限制w 一个Slice中可用两个LUT和选择器实现5输入的任何逻辑。 减少函数输入(扇入)来适合Slice,可以提高逻辑密度和速度。w 取反不耗费资源(free)。CLB Lookup TableVHDL 设计风格和实现, 2000年6月10日 第 26 页状态机的三种类型编码与速度w二进制: 状态序列如同计数器序列,S1 = 001, S2=010, S3=0
21、11, S4=100, etcw枚举: 状态有指定的值, S1=100, S2=110, S3=101, S4 = 111, etcwOne Hot: 每个状态只有一个寄存器有效,S1=00000001, S2=00000010, S3=00000100, etcw在状态机从当前状态跳到下一状态时,二进制和枚举类型有大量的反馈输入。w在FPGA中, 使用二进制和枚举类型,比one-hot 编码慢。- One Hot每个状态只需提供一位反馈输入VHDL 设计风格和实现, 2000年6月10日 第 27 页状态机的速度w 对于较大的状态机,使用One Hot编码w 二进制或者枚举编码,对于较小的状
22、态机合适。w记住四输入查找表!状态机可能会有很多的扇入,和大量的反馈,对速度不利w 使用One Hot, 并限制输入状态数,使输入限制到4-5,可以达到最高的速度。Input 1Input 3State 4State 6State 191 LUTVHDL 设计风格和实现, 2000年6月10日 第 28 页DQfn1DQfn1DQfn1对高扇出网络,通过复制寄存器来提高速度w 高扇出网络难于布线,而且较慢w 通过复制寄存器来改进布线和速度w Foundation工具不会自动完成这种功能w 将复制寄存器命名为 _a, _b, _c, 不要不要用1,2,3。VHDL 设计风格和实现, 2000年6
23、月10日 第 29 页计数终点信号提前译码以提高速度w 对大的计数器而言,译码产生计数终点信号需要逻辑级数较多- 提前一个时钟周期译码计数终点信号,寄存后使用,可以提高速度,并保持时序关系不变。Q0Q1Q2Q3COD0D1D2D3CECQDATA0DATA1DATA2DATA3ENABLECLOCKDQ0Q1Q2Q3COD0D1D2D3CECDATA0DATA1DATA2DATA3ENABLECLOCK其他逻辑其他逻辑VHDL 设计风格和实现, 2000年6月10日 第 30 页速度关键输入应在逻辑最后一级提供w 关键输入应该在逻辑最后一级提供 关键输入为芯片、Slice、或者LUT提供的时延
24、最大的输入 将关键输入连接在逻辑最后一级 在VHDL中,将关键输入放在ifelsif链的第一级IN (Critical)OUTIN (Critical)OUTAAVHDL 设计风格和实现, 2000年6月10日 第 31 页编码:只有在必要时才使用二进制序列w可以生成各种需要的序列,而不仅限于二进制w使用预缩放(prescale)技术来提高速度低位翻转很快参见Application Notes XAPP001 and XAPP014w如果要译码输出,使用格雷(Gray)码计数器两位编码00, 01, 11, 10每次只翻转一位,可以避免译码产生毛刺w如果只需要计数终点,考虑使用线性反馈移位寄存
25、器(LFSR)提高速度。生成序列可以覆盖的地址空间为2n-1,全0不包含在序列中。n取不同值时,用来生成反馈位的两位不同,参见相关资料在可以采用任意规则序列的情况下,也可以使用LFSR (比如, FIFO) 进位较慢的进位较慢的大计数器大计数器TCCE快速的快速的小小计数器计数器 10-bit SRQ0Q9Q610位的线性反馈移位寄存器位的线性反馈移位寄存器process(Rst, Clk)begin if Rst=1 then Q = (others=0); Q(0) = 1; elsif rising_edge(Clk) then for I in 1 to 9 loop Q(I) = Q
26、(I-1); end loop; Q(0) = Q(6) xor Q(9); end if;end process;VHDL 设计风格和实现, 2000年6月10日 第 32 页使用预缩放(Pre-scale)提高计数器速度w 计数器的速度由从LSB到MSB的进位延迟决定w 预缩放技术对较大的计数器特别有益- 低位翻转很快,用低位的TC作为高位的CE,可以降低高位的时钟频率- 使用TimeSpecs进行约束w 预缩放技术限制了载入时间,故计数器不可加载w 参考XAPP014快速的快速的小计数器小计数器进位较慢的进位较慢的大计数器大计数器TCCEVHDL 设计风格和实现, 2000年6月10日
27、第 33 页I/O 速度:FPGA的建立时间 TsuwFPGA的输入输出也有时延要求。w满足时延要求的FPGA建立时间由: 全局时钟时延Tbufg 、板上时延Tbrd和上游器件的输出时间Tco(up)决定。wFPGA建立时间(Tsu)的计算公式:Tsu-fpga = Tcyc -Tco(up)- Tbrd + Tbufgw可以使用“OFFSET IN”对Tsu进行约束DCEQ上游器件上游器件DCEQXCV400 FPGAClock (Tcyc)Tco(up)TbrdTbufgTsuVHDL 设计风格和实现, 2000年6月10日 第 34 页I/O速度:FPGA的输出时间Tcow FPGA输出
28、时间的计算公式:Tco = Tcyc - Tsu(down) - Tbrd - Tbufgw 使用“OFFSET OUT”对Tco进行约束DCEQXCV400 FPGADCEQ下游器件下游器件Clock (Tcyc)TcoTbrdTbufgTsu(down)VHDL 设计风格和实现, 2000年6月10日 第 35 页OPADOBUFFAST使用快跳变提高输出速度w 管脚输出可以控制跳变速度。w 缺省跳变速度为“slow”,以降低噪音w 当速度重要时,将跳变速度设为“fast” 可以通过管脚加入FAST约束实现。VHDL 设计风格和实现, 2000年6月10日 第 36 页使用I/O寄存器提高
29、输入和输出速度w使用IOB中的I/O寄存器,可以提高输入和输出速度- 输入或输出可以去除从内部布线的时延,IOB中的时延也更小- 还可以节约寄存器资源w实现选项中,选择“Pack I/O Registers/Latches into IOBs for Inputs and Outputs”- 输入若未寄存,直接扇入到组合逻辑,则不能map到IO寄存器中- 输出若为组合逻辑输出,或者需要反馈为输入,则不能map到IO寄存器中DCEQDCEQI/O padFrom: FPGAInto: FPGAOFFIFFOutput ClockInput ClockVHDL 设计风格和实现, 2000年6月10
30、日 第 37 页使用I/O寄存器的例子(FPGA-FPGA)DCEQ发送器发送器(XCV100-4 FPGA)DCEQ接收器接收器(XCV100-4 FPGA)使用IOB中寄存器的时延Tiockp + PCB网络时延 + Tiopick5.649 1.962=7.611不使用IOB中寄存器的时延(Tcko + Tnet +Tioop) + PCB网络时延 + (Tiopi + Tnet + Tdick) (1.372 +0.756+5.652)(0.989+ 1.930+0.728)7.7803.647 =11.427VHDL 设计风格和实现, 2000年6月10日 第 38 页三、资源VHD
31、L 设计风格和实现, 2000年6月10日 第 39 页w资源使用量是指FPGA使用了的百分率w在宏、库、以及XAPP application notes中找到可比较的函数来估计资源使用量w也可以根据别的设计的经验来估计器件使用率w快速实现,然后查看MAP报告选择“Implementation/ View Report Files/ Map report”Slices, IOBs, Block RAMs, 以及其他部件分别列出,并给出使用百分率。最后给出相当于ASIC的门数资源估计Design Summary- Number of errors: 0 Number of warnings: 6
32、44 Number of Slices: 1,147 out of 1,200 95% Slice Flip Flops: 735 4 input LUTs: 1,046 (1 used as a route-thru) Dual Port RAMs: 312 Number of Slices containing unrelated logic: 0 out of 1,147 0% Number of bonded IOBs: 85 out of 98 86% IOB Flip Flops: 68 Number of Block RAMs: 10 out of 10 100% Number
33、of GCLKs: 2 out of 4 50% Number of GCLKIOBs: 2 out of 4 50% Number of DLLs: 1 out of 4 25% Number of Startups: 1 out of 1 100% Number of RPM macros: 9Total equivalent gate count for design: 224,805Additional JTAG gate count for IOBs: 4,176VHDL 设计风格和实现, 2000年6月10日 第 40 页可以把查找表用作RAMq使用使用CoreGen或或LogiB
34、LOX,可以用可以用LUT生成生成RAM q选择功能选择功能 - 单/双端口 - 同步/异步 - 深度扩展时,基于BUFT还是LUTq 选择大小- 没有浪费的资源- 可扩展为需要的大小q选择位置 - 布置在基片的任何地方 - 邻近关键电路以提高速度q选择编程方法选择编程方法 - 通过启动时的比特流 - 通过设计中的操作AddressDataWEDistributedRAMClockData 2Address 2OptionalDual PortVHDL 设计风格和实现, 2000年6月10日 第 41 页使用RAM作状态寄存器可以节约资源w 和触发器比,Slice密度提高为16:1而且FPGA的布线更容易w 例如10个16位可读写状态寄存器需要: 160个寄存器,即个寄存器,即80个个Slicew 使用RAM, 同样10个状态寄存器需要:16个个4输入输入LUT, 即即8个个Slicew 也可以用RAM实现移位寄存器vs.寄存器寄存器.RAM结束结束