在FPGA开发中尽量避免全局复位的使用
- 格式:pdf
- 大小:434.74 KB
- 文档页数:8
verilog中的可综合逻辑和不可综合逻辑⼀、verilog语法,可否综合总体有以下区分:(1)所有综合⼯具都⽀持的结构:always,assign,begin,end,case,wire,tri,supply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,inpu 可综合的运算符包括:> , < , >= , <= , == , != , >>, << (位移量为变量,则会综合出通⽤位移器), &, |, ^ , +, - ,*, /(某些综合⼯具可能不⽀持){[ ],[ ]} :部分选取和位选取操作,这个有点复杂。
部分选取仅⽀持常量部分选取。
如:1module PartSelect(2 in_a,3 in_b ,4 out_c);56input [3:0] in_a, in_b;7output [3:0] out_c;89assign out_c[2:0] = {in_a[2],in_b[3:2]};1011endmodule12// out_c[2:0] 和 in_b[3:2]即为部分选取位选取⽀持常量和⾮常量选取,⾮常量选取时会⽣成多路选择器或译码器。
如:1//常量位选取2module ConstantBitSelect(3 in_a,4 in_b,5 in_c,6 out_d7 );89input [3:0] in_a,in_b,in_c;10output [3:0] out_d;1112assign out_d[2:0] = {in_a[2],in_b[1:0]};13assign out_d[3] = in_c[2];14endmodule15//这⾥in_a[2],out_d[3] , in_c[2]都是位选取。
verilog 不可综合语句总结汇总2009-04-20 18:37(1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。
(2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
(3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。
建立可综合模型的原则要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:(1)不使用initial。
(2)不使用#10。
(3)不使用循环次数不确定的循环语句,如forever、while等。
(4)不使用用户自定义原语(UDP元件)。
(5)尽量使用同步方式设计电路。
(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
(8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。
对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。
但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
FPGA上电复位和按键复位当初开始学FPGA的时候,总是疑惑:FPGA不是没有复位管教么,但总在always看到有复位信号。
这个复位信号(我们暂且称为rst_n)从哪里来?从我们自己搭建的外部复位信号产生电路里来。
一个简易的复位电路(既可以实现上电复位又可以实现按键复位)如下:上电复位:这个电路在系统接电后由3.3V经过R21给C10充电,此时复位管脚上得到低电平.经过一段时间后,C10被充满,复位管脚电平升高.最后稳定在高电平.这是上电时的情况,即上电复位.按键复位:当按下B1时,C10经过R22放电到地,复位管脚被瞬间拉到低电平,当按键放开后,C10再次通过R21充电,经过一段时间后稳定到高电平.完成手动复位.这个电路上电复位还行,但按键复位是不够的.由于FPGA是高速电路,在按键复位开关按键的时候会产生抖动,生成很多毛刺方波,这对于我们的电路来说是很有害的.可以通过verilog编写防抖程序来消除可能的误动作。
/*************************************** 功能:上电复位模块(未加消抖程序)* 输入参数:* clk: 50M 时钟输入* rst_n:外部按键全局复位信号* 输出参数:* sys_rst_n:系统全局同步复位信号***************************************/ module reset(input clk,input rst_n,output sys_rst_n);//------------------------------------------ // Delay 100ms for steady statereg [22:0] cnt;always@(posedge clk or negedge rst_n)beginif(!rst_n)cnt <= 0;elsebeginif(cnt < 23'd50_00000) //100mscnt <= cnt+1'b1;elsecnt <= cnt;endend//------------------------------------------ //rst_n synchronismreg rst_nr0;reg rst_nr1;always@(posedge clk or negedge rst_n)beginif(!rst_n)beginrst_nr0 <= 0;rst_nr1 <= 0;endelse if(cnt == 23'd50_00000) beginrst_nr0 <= 1;rst_nr1 <= rst_nr0;endelsebeginrst_nr0 <= 0;rst_nr1 <= 0;endendassign sys_rst_n = rst_nr1;endmodule消抖程序可如下设计:module fangdou(in,clk,out);input in,clk;output out;reg i,out;initial out=0;always @(posedge clk) //clk可以是系统时钟分频得到的,其的周期约100msbeginif(in==1)if(i==1)out<=1; //如果相邻的两个时钟上升沿都是都有in==1,那就说明是按键动作而非干扰,那么把out置1.elsei<=1;elsebegini<=0;out<=0; endend endmodule。
Zynq System Reset方法随着嵌入式系统的发展,各种嵌入式处理器和FPGA芯片的使用日益普遍。
在这些嵌入式系统中,Zynq SoC(System on Chip)是一种广泛应用的处理器与FPGA集成方案。
Zynq SoC具有强大的处理能力和可编程的逻辑资源,广泛应用于无人机、汽车电子、工业自动化等领域。
在Zynq SoC中,系统复位(Reset)是一个重要的功能,它能够将系统带回初始状态,保证系统正常启动。
本文将介绍Zynq系统复位的方法和相关知识。
一、系统复位的种类1. 软件复位软件复位是通过处理器内部的复位控制寄存器或特定的寄存器来实现的。
在Zynq SoC中,处理器核心是ARM Cortex-A9,所以软件复位通常是通过设置特定的寄存器位来实现的。
2. 硬件复位硬件复位是通过物理引脚或电源管理模块来实现的。
在Zynq SoC中,通常是通过PS部分的MIO引脚或PS-PL接口的引脚来实现硬件复位。
Zynq SoC还有一个全局复位引脚(POR_B),当此引脚被拉低时,整个芯片将被复位。
二、系统复位的实现1. 软件复位的实现在Zynq SoC中,软件复位是通过设置处理器核心的控制寄存器来实现的。
处理器核心的控制寄存器包括系统复位寄存器(SR)和中断控制寄存器(ICR)。
通过对这些寄存器进行写操作,可以实现对系统的软件复位。
2. 硬件复位的实现硬件复位的实现通常涉及到物理引脚的操作。
在Zynq SoC中,可以通过PS部分的MIO引脚或PS-PL接口的引脚来实现硬件复位。
通过设置相应的引脚为复位信号,可以实现对系统的硬件复位。
三、系统复位的注意事项1. 复位信号的连接和配置在设计Zynq SoC系统时,需要合理连接和配置复位信号。
特别是在多个外设和FPGA逻辑之间的复位关系上,需要考虑复位的优先级和时序,以确保系统能够正确复位。
2. 复位后的初始化系统复位后,需要进行相应的初始化操作,包括处理器核心的初始化、外设的初始化、FPGA逻辑的配置等。
总结:做FPGA一定要懂时序,因为面试基本都是问时序约束什么的,如果不懂这个,你可能根本就没学会FPGA。
不细说了。
1.1.⑴结合Xilinx、Altera等公司的FPGA芯片,简要罗列一下FPGA内部的资源或专用模块,并简要说明这些资源的一些作用或用途。
(至少列出5项,越多越好)⑵如果,对内部特定资源,曾有应用经历,结合个人理解和体验,简要说明初步的设计技巧或设计经验。
1.可编程输入输出单元(IOB)可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求,其示意结构如图1-2所示。
FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。
通过软件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大小,可以改变上、下拉电阻。
目前,I/O口的频率也越来越高,一些高端的FPGA通过DDR寄存器技术可以支持高达2Gbps的数据速率。
外部输入信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入FPGA 内部。
当外部输入信号经过IOB模块的存储单元输入到FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为0。
为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank 的接口标准由其接口电压VCCO决定,一个bank只能有一种VCCO,但不同bank的VCCO可以不同。
只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。
2.可配置逻辑块(CLB)CLB是FPGA内的基本逻辑单元。
CLB的实际数量和特性会依器件的不同而不同,但是每个CLB都包含一个可配置开关矩阵,此矩阵由4或6个输入、一些选型电路(多路复用器等)和触发器组成。
开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或RAM。
在Xilinx公司的FPGA器件中,CLB由多个(一般为4个或2个)相同的Slice和附加逻辑构成,每个CLB模块不仅可以用于实现组合逻辑、时序逻辑,还可以配置为分布式RAM 和分布式ROM。
F PG A竞争冒险详解 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】1 引言现场可编程门阵列(FPGA)在结构上由逻辑功能块排列为阵列,并由可编程的内部连线连接这些功能块,来实现一定的逻辑功能。
FPGA可以替代其他PLD或者各种中小规模数字逻辑芯片在数字系统中广泛应用,也是实现具有不同逻辑功能ASIC的有效办法。
FPGA是进行原型设计最理想的载体,原型机的最初框架和实现通过PFGA来验证,可以降低成本、缩短开发周期。
利用FPGA的可重配置功能,可以在使用过程中,在不改变所设计的设备的硬件电路情况下,改变设备的功能。
但和所有的数字电路一样,FPGA电路中也存在毛刺问题。
它的出现会影响电路工作的可靠性、稳定性,严重时会导致整个数字系统的误动作和逻辑紊乱。
在此详细论述了解决此问题的多种方法。
2 FPGA的功能和结构特点FPGA的功能FPGA的功能由逻辑结构的配置数据决定,在工作时,这些配置数据存放在片内的SRAM或者熔丝图上。
使用SRAM的FPGA器件,在工作前需要从芯片外部加载配置数据,这些配置数据可以存放在片外的EPROM或其他存储体上,人们可以控制加载过程,在现场修改器件的逻辑功能。
图1 实际逻辑电路图2 LUT的实现方式FPGA的结构特点FPGA使用了可编程的查找表(Look Up Table ,LUT)结构,LUT是可编程的最小逻辑构成单元。
大部分FPGA采用基于SRAM的查找表逻辑形成结构,就是用SRAM(静态随机存储器)来构成逻辑函数发生器。
图1、2分别是4输入LUT的实际逻辑电路和LUT的实现方式。
FLEX10KE系列器件的结构和工作原理在Altera的FPGA器件中具有典型性,下面以此类器件为例,介绍PFGA的结构。
其内部结构如图3所示:图3 FLEX10KE内部结构FLEX10KE内部结构包含嵌入式阵列块(EAB,Embedded Array Block)、逻辑阵列块(LAB,Logic Array Block)、快速通道(Fast Track)互连和输入/输出单元(I/O Element,IOE)四部分。
IC设计中同步复位与异步复位的区别
异步复位是不受时钟影响的,在一个芯片系统初始化(或者说上电)的时候需要这么一个全局的信号来对整个芯片进行整体的复位,到一个初始的确定状态。
而同步复位需要在时钟沿来临的时候才会对整个系统进行复位。
请注意,如果芯片是有多个时钟的系统,那么如何保证不同时钟域的电路能够“同时”复位将会是一个重要的问题,此外,如果你的时钟是一个低频时钟,那么在这个系统(包括其他芯片)上电时如何保证能和其他芯片同时复位?硬件全局异步复位是必要的,请注意这里加上了“全局”,这是因为异步复位既然要对整个芯片“同时”复位,那么布线延时绝不能不考虑,使用FPGA设计时芯片的异步复位必须要走全局网络。
再提醒一点,芯片中最好不要出现多个异步复位。
一个关键原因是对于FPGA而言,多个异步复位信号难以实现前面要求的“全局网络”。
异步复位最大的优点是, 数据通路就可以不依赖于时钟而确保清洁可控。
然而, 异步复位也有其固有的缺陷。
异步复位设计的DFT (可测性设计) 与STA (静态时序分析) 的复杂性要高于同步复位设计; 但异步复位中最严重的问题是, 如果异步复位信号在触发器时钟有效沿附近“释放”(复位信号从有效变为无效) 的话, 可能会导致触发器输出的亚稳态。
在FPGA开发中尽量避免全局复位的使用 最近几天读了Xilinx网站上一个很有意思的白皮书(white paper,wp272.pdf),名字叫《Get Smart About Reset:Think Local, Not Global》,在此分享一下心得,包括以前设计中很少注意到的一些细节。 在数字系统设计中,我们传统上都认为,应该对所有的触发器设置一个主复位,这样将大大方便后续的测试工作。所以,在所有的程序中,我往往都在端口定义中使用同一个reset信号(其实好多时候根本就没有用到)。所以,当看到文档中提到,“不建议在FPGA设计中使用全局复位,或者说应该努力避免这种设计方式”时,许多设计人员(包括我)都会觉得非常难以理解,这种设计思想跟我们通常的认识是相冲突的! 继续读下去,不知不觉发现这个白皮书讲的还真是在理。接下来把我的个人理解讲述一下。
1. 全局复位是不是关键时序 全局复位信号一般由以下三种途径获得: 1) 第一种,最常见的,就是用一个复位按钮产生一个复位信号接到FPGA的全局复位管脚上。它的速度显然是非常慢的(因为是机械结构),而且存在抖动的问题。 2) 第二种是上电的时候由电源芯片产生的,如TI的TPS76x系列的电源系统一般都可以产生复位信号,供主芯片上电复位使用。 3) 第三种是由控制芯片产生的复位脉冲,这个是我们设计人员可以方便使用程序控制的。 在这些情况下,复位信号的变化与FGPA芯片内部信号相比看起来是极其缓慢的,例如,复位按钮产生的复位信号的周期至少是在毫秒级别的,而我们FPGA内部信号往往是纳米或者微秒级别的。复位信号的频率是如此之低,以至于我们认为它不属于关键时序(not timing-critical)。即使是对此类信号进行时序约束,约束的周期也是非常长的。全局复位脉冲的周期远大于时钟周期,所以传统意义上假设FPGA芯片中所有的触发器都能够得到有效的复位。 然而,随着FPGA性能和工作频率的快速提高,这种假设开始不再成立。此时,全局复位信号的产生开始成为时序关键的问题。 在Xilinx 的FPGA器件中,全局的复位/置位信号(Global Set/Reset (GSR))(可以通过全局复位管脚引入)是几乎绝对可靠的,因为它是芯片内部的信号。如果所有的触发器都使用这一全局复位信号,则GSR信号将形成一个高扇出的网络(有兴趣的朋友可以在综合工具中查看)。虽然在启动顺序中,它可以与一个用户自定义的时钟进行同步,但是想让它与设计中的所有时钟信号进行同步是不可能的;比如,一个Xilinx FPGA中可能含有多个DLL/DCM/PLL时钟处理模块,每个模块又可以产生多个时钟信号,在各个模块内部进行时钟信号的同步是可行的,然而想让所有时钟信号同步是完全不可行的——从DCM的分布上就可以看出来:中间相隔的长距离布线对高频时钟信号的延时显著增大,进行同步自然无法做到。于是,在时钟信号频率越来越高的情况下,全局复位信号便开始成为关键时序。解释如下:
图1被两个时钟信号的边沿截断的复位信号的时序图 图1 给出了被两个时钟信号的边沿截断的复位信号的时序图,第一行是时钟信号,第二行是器件复位管脚上的信号,第三行是到达触发器复位端的复位信号。为了使触发器进行有效的复位,在有效的时钟边沿到来之前,复位信号应该被保持至少一个建立时间(时钟信号的建立时间)。可以看出,时钟信号的频率越高,用来分配复位信号的可用时间就越少。而且考虑到全局复位信号往往是高扇出的网络,想在这个庞大的网络中满足苛刻的时序要求是非常困难的。在经常使用的异步复位的设计中,即使存在用来分配复位信号的可用时间,也没有办法来保证所有的触发器都可以在同一个时钟边沿被释放。这一点从图2中可以看出。
图2 异步设计中复位信号的时序图 图2给出了异步设计中复位信号的时序图。可以看出,在A时刻产生的复位信号,将在第一个时钟信号的有效边沿产生,而在C时刻产生的复位信号将在第二个有效的时钟信号边沿产生。在B时刻,触发器很难有效定义哪一个复位信号是有效的,这将导致亚稳态的产生。 随着时钟信号频率的增高和器件规模增大带来的潜在的时钟偏移,在同一个时钟边沿对所有的触发器进行复位已经几乎是不可能的了。图3显示了高时钟频率下的复位时序图。
图3 高时钟频率下的复位时序 2. 全局复位对时序的要求真的很关键吗 好消息是,在绝大多数设计中(白皮书说是超过99.99%?应该是老外写文档的习惯吧),复位信号的时序是无关紧要的——通常情况下,大部分电路都能够正常工作。然而,只要你曾经遇到过复位信号不正常导致电路无法正确工作的情况,那么可以说你“幸运”地遇到了那0.01%的复位信号异常的情况。图4给出了一个流水线复位的情况。
图4 流水线的复位 在流水线中,假如数据都是完全顺序处理的(即不存在反馈、环路等情况),则主复位信号是何时产生的是完全无关紧要的。经过几个周期的流水线操作,任何不正常的数据状态都将被从系统中“冲出”流水线,这是很容易理解的。事实上,在正常的流水线操作中,我们也很少会用到复位操作的,因为这是完全没有必要的。即使是在仿真环境中,我们也往往会在测试程序中对初始状态进行配置,从而将所有的未知状态从系统中清除出去,使得系统中的所有输入都变为有效的数据。 然而,在图5所示的独热码(One-Hot)状态机的情况下,复位信号的时序却的的确确成为了系统正常工作的关键因素之一。
图5 独热码状态机的复位 图5 的例子中演示了一个简单的独热码状态机的复位示意图。图中清晰地显示了复位失败的潜在可能性。如果第一个含有独热码的触发器比第二个触发器提前释放一个时钟周期,则其含有的独热码将丢失,整个状态机将永远进入无效状态(cold)。减小这种情况发生的概率往往可以通过使用相邻的触发器构成状态机来解决(使用本地复位网络,则信号的失真度较低),但前提是时序约束中的建立时间必须满足。此外,如果所有的触发器无法在同一个时钟信号的有效边沿被释放,则一个已经编码的状态机可能会跳变进入未知状态,包括非法状态,造成电路无法正确工作。所以,在包含反馈通路的电路设计中,需要对复位信号的时序要求进行仔细考虑。 事实上,不存在反馈通路的电路是完全不需要使用复位信号的。例如,在数字信号处理应用中,有限脉冲响应滤波器(FIR)就不存在反馈通路:只有在有效数据填满所有节拍时,滤波器才会输出采样值,否则不输出任何数据;所以对节拍寄存器进行复位是毫无意义的。然而,在无限脉冲响应滤波器(IIR)中,存在反馈通路,如果在一个不可靠的复位信号下对节拍寄存器进行复位并产生一个伪信号输出,则滤波器输出会受到显著的影响。最坏的情况下,伪信号带来的不稳定将导致整个滤波器陷入崩溃状态。
3. 如何自动覆盖99.99%的情况 当一个Xilinx的FPGA芯片被重新配置时,每一个单元都将被初始化,如图6所示。
图6 FPGA配置 在某种意义上讲,这是一个上电之后的“终极的”全局复位操作,因为它不仅仅是对所有的触发器进行了复位操作,还初始化了所有的RAM单元。随着Xilinx FPGA芯片内部的嵌入式RAM资源越来越多,这种“终极的”全局复位操作越来越有意义。对所有的RAM单元进行预定义,在软件仿真和实际操作中都是非常有帮助的,因为这样避免了在上电时采用复杂的启动顺序来清除存储单元内容的操作。 随着Xilinx的FPGA芯片越来越多的嵌入处理器内核,比如MicroBlaze软核、ARM和PowerPC硬核等,这种特性使得所有的程序和数据空间在处理器内核执行第一条指令之前都已经被预定义,则原来那种靠烧写昂贵的可编程资源来仅仅复位触发器的操作变得毫无意义了。开发过程中所使用的仿真工具也应当具有模拟此操作的能力(即我们通常所说的“上电复位”),这样在后续的设计中就可以避免使用可有可无的复位操作了。
4. 其余0.01% 情况的设计准则 最重要的事情是使用某些准则来处理设计中的复位操作,并且这些准则在设计审查阶段就应该被完全考虑到。可以使用一个局部的高性能的复位网络来控制仅仅需要局部复位的触发器。图7给出了一个这种局部复位的示意图。这种电路的优点在于,它所提供的复位效果与外接全局复位信号的效果是一致的。
图7 局部复位示意图 在器件配置或者异步复位时,链中的所有触发器都被预设为1。几乎在这同时,链中的最后一个触发器驱动局部复位网络并向其发送一个有效复位信号。随着全局复位/置位信号或异步复位信号的释放,整个移位寄存器链开始在每个时钟周期被填充为0。 链中触发器的数目决定了局部复位网络所需要的复位脉冲的最小宽度。最后的结果是,链中最后一个触发器从高跳变到低,而局部复位信号的释放与时钟周期同步。被复位的触发器可以采用同步置位(synchronous set (FDS))或者同步复位(synchronous reset (FDR)),即构成了完整的同步设计,而接下来的时序规范和分析也将容易得多。 5. 复位操作消耗的资源远比你想象的要多 在FPGA设计中,我们往往习惯在HDL文件的端口声明中加入一个reset信号,却忽略了它所带来的资源消耗。仔细分析一下,竟会有如此之多的影响: 1) 复位网络需要占用布线资源 Ø 导致其余信号的布线受到影响,降低了它们布线的自由度。 Ø 增加的布线网络往往需要使用更高速率的芯片。 Ø 复位网络占用大量布线资源,使得Place&Route的时间大大增加。 2) 复位信号需要占用大量的逻辑资源 Ø 复位信号需要使用触发器的专用复位管脚。 Ø 可操作的复位信号往往导致D触发器的输入前增加额外的门操作或专用的复位信号输入。 Ø 增大整个设计的尺寸。 Ø 额外的逻辑消耗降低了系统的性能。 3) 阻止了使用高效特征,如Xilinx FPGA特有的SRL16E 移位寄存器。 Ø SRL16E可以在一个LUT中实现多达16个触发器。 Ø SRL16E 实现的虚拟触发器不支持复位操作,这使得HDL设计中带有复位操作时,综合工具无法有效利用SRL16E 资源。有可能增加多达16倍的资源消耗。 在Xilinx网站的白皮书 WP275:《Get your Priorities Right - Make your Design Up to 50% Smaller》中提到了复位信号是如何影响FPGA资源利用率的,有兴趣的朋友可以去读一下。 总结一下,Xilinx FPGA设计中一般不需要插入全局复位网络,这样我们在写程序的时候就不必每个模块都加入reset端口了,既方便了程序书写,又减小了编译时间,还减少了资源占用。绝大多数情况下,重配置或者上电过程中,所有的触发器和RAM等都可以被预设初始状态,所以全局复位是完全没有必要的,因为所有的信号都已经具有明确的初值!Xilinx FPGA都已经经过充分验证,所以扫描逻辑和运行测试向量都不再是必须的操作,全局复位作为这些操作的一部