FPGA设计原则以及代码规范-精选.ppt

上传人(卖家):三亚风情 文档编号:3373108 上传时间:2022-08-24 格式:PPT 页数:35 大小:422.50KB
下载 相关 举报
FPGA设计原则以及代码规范-精选.ppt_第1页
第1页 / 共35页
FPGA设计原则以及代码规范-精选.ppt_第2页
第2页 / 共35页
FPGA设计原则以及代码规范-精选.ppt_第3页
第3页 / 共35页
FPGA设计原则以及代码规范-精选.ppt_第4页
第4页 / 共35页
FPGA设计原则以及代码规范-精选.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、FPGAFPGA设计原则以及代码规范设计原则以及代码规范 2009.4.22FPGA设计原则面积和速度的平衡与互换硬件原则系统原则同步设计原则 “面积”指一个设计消耗FPGA的逻辑资源的数量,一般可以用所消耗的触发器(FF)和查找表(LUT)来衡量,更一般的衡量方式可以用设计所占用的等价逻辑门数。“速度”指设计在芯片上稳定运行,所能够达到的最高频率,这个频率由设计的时序状况决定,它和设计满足的时钟周期,PAD to PAD Time,Clock Setup Time,Clock Hold Time,Clock to output delay等众多时序特征量密切相关。面积与速度面积与速度进一步了

2、解进一步了解FPGAFPGA内部的内部的“面积面积”资源!资源!面积与速度的平衡与互换原则面积与速度的平衡与互换原则速度换面积:面积换速度:FPGA设计和软件设计存在本质区别,要做到对所需实现的硬件电路“心有成竹”,对该部分硬件的结构与连接十分清晰,然后再用适当的HDL语句表达出来。要明确FPGA的逻辑设计所采用的硬件描述语言(HDL)和软件语言(如C,C+等)的区别,HDL的本质作用在于描述硬件!它的最终实现结果是芯片内部的实际电路。硬件原则硬件原则 硬件原则的另外一个重要理解是“并行”和“串行”的概念。一般来说硬件系统比软件系统速度快,实时性高,其中一个重要原因就是硬件系统中各个单元的运算

3、是独立的,信号流是并行的。而C语言编译后,其机器指令在CPU的高速缓冲队列中基本是顺序执行的。硬件原则并行处理硬件原则并行处理系统原则系统原则 一方面是一个硬件系统,例如一块板卡如何进行功能模块划分与任务分配,什么样的算法和功能适合放在传统FPGA里面实现,什么样的算法和功能适合放在DSP、CPU里面实现,或者在使用内嵌CPU和DSP Block的FPGA中如何划分软硬件功能,以及FPGA的规模估算数据接口设计、开发成本的估算等。另一方面就是具体到FPGA内部设计要有一个宏观上的合理安排,比如时钟域、模块复用、约束、面积、速度等问题。同步设计原则同步与异步同步设计原则同步与异步 在设计电路时,

4、可以有异步电路和同步电路两种实现方法。异步电路使用组合逻辑电路实现,没有统一的时钟信号,容易产生毛刺和竞争冒险。同步时序电路使用组合逻辑和触发器实现电路功能,主要信号和输出信号都由时钟驱动触发器产生,能够避免毛刺,信号稳定。同步设计时钟信号的质量和稳定性决定了同步时序电路的性能。FPGA的内部有专用的时钟资源,如全局时钟布线资源、专用的时钟管理模块DUL、PLL等。同步设计原则时钟同步设计原则时钟 同步设计中,稳定可靠的数据采样必须遵从以下两条基本原则:1、在有效时钟沿到达前,数据输入至少已经稳定了采样寄存器Setup时间之久。这条原则简称满足Setup时间原则。2、在有效时钟沿到达后,数据输

5、入至少还将稳定保持采样寄存器Hold时间之久。这条原则简称满足Hold时间原则。同步设计原则建立同步设计原则建立/保持时间保持时间FPGA设计代码规范设计代码规范u Verilog代码编写风格的必要性u 结构层次化编码u 时钟和RESET信号设计指南u 可综合性编码Verilog代码编写风格的必要性代码编写风格的必要性 Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档。相反代码编写风格随意的代码,通常会很凌乱,会给开发者本人的调试、修改工作带来困难,也会给合作者带来很大麻烦。编写规范的宗旨编

6、写规范的宗旨缩小篇幅;提高整洁度;便于跟踪、分析、调试;增强可读性,帮助阅读者理解;便于整理文档;便于交流合作。结构层次化编码框架图结构层次化编码框架图1)结构的层次不宜太深,一般为3到5层即可;2)顶层模块最好仅仅包含对所有模块的调用,而不应该完成比较复杂的逻辑功能。比较为合理的顶层模块由输入输出管脚声明、模块的调用与实例化、全局时钟资源、全局置位/复位、三态门控制等构成;3)所有的I/O信号,如输入、输出、双向信号等的描述在顶层模块完成;结构层次化编码注意事项结构层次化编码注意事项 )一般来说,进入FPGA的信号必须先同步,以提高系统工作频率;)所有模块的输出都要寄存器化,以提高工作频率,

7、这对设计做到时序收敛也是极有好处的;)将相关的组合逻辑放在同一模块;结构层次化编码注意事项结构层次化编码注意事项 7)所有未使用的模块输入必须加上确定的逻辑值,不允许输入信号出现悬空状态;8)尽量少用组合逻辑设计;9)多用case语句少用if-else语句,if-else的嵌套不能超过四级;10)描述always块尽量简洁。结构层次化编码注意事项结构层次化编码注意事项 1)信号名一律小写,参数用大写。2)对于低电平有效的信号结尾要用_n标记,如rst_n。3)端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪个模块去的关系排列,这样在后期仿真验证找错时后方便很多。如:信号命

8、名要规范化。信号命名要规范化。module a(clk,rst_n,wren,rden,avalon_din,sdi,data_ready,avalon_dout );尽量少用立即数,多用常量。使用常量有以下优点:(1)常量对于一个设计具有更多的灵活性;(2)常量值只需要在一个地方修改。方法:对于Verilog程序,把常数和参数定义在一个或多个小文件中,例如文件design_parameters.v,然后在需要调用这些参数的模块中插入“include design_parameters.v“语句即可。常量常量/参数化设计参数化设计时钟和时钟和RESET信号设计指南信号设计指南避免在模块内部产生

9、RESET信号:(1)如果可能,尽量避免在模块内部产生RESET信号,或者避免用其它条件逻辑产生RESET信号;(2)如果确实需要条件RESET信号,那么可以创建一个独立的RESET信号,再创建一个独立的条件RESET产生逻辑模块。DFF1:always(posedge clk_125m)beginif(!rst_n)q=1b0;elseq=d;endDFF2:always(negedge clk_125m)begin if(!rst_n)q=1b0;else q=d;end例如避免使用混合时钟沿避免使用混合时钟沿(1)在你的设计中,要避免同时使用上升沿触发和下降沿触发这两种触发方式的寄存器。

10、(2)如果在你的设计中必须同时使用大量的上升沿和下降沿出发的触发器,那么应该把他们放在不同的模块中。在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔离。这样做可以让综合器综合出更优的结果。这里的一个模块是指一个module。一个模块尽量只用一个时钟一个模块尽量只用一个时钟避免在模块内部产生时钟避免在模块内部产生时钟避免使用内部产生时钟的方法,例如采用计数器分频出来的脉冲直接拿去当作时钟使用,是不允许的,这种时钟对设计的可靠性极为不利.逻辑分频时钟:always(posedge clk_125m)beginif(!rst_n)clk_div_62m5=1b0;else cl

11、k_div_62m5=!clk_div_62m5;endalways(posedge clk_div_62m5)beginif(!rst_n)data_out=8h00;else data_out=data_in;end时钟使能方式:always(posedge clk_125m)beginif(!rst_n)en_clk_62m5=1b0;else en_clk_62m5=!en_clk_62m5;endalways(posedge clk_125m)beginif(!rst_n)data_out=8h00;else if(en_clk_62m5)data_out=data_in;end 避

12、免在RTL代码中直接使用门控时钟,门控时钟会增加设计的不稳定性 always(en1 or en2)begin if(!rst_n)data_out=8h00;else data_out=data_in;end避免使用门控时钟避免使用门控时钟DQen1en2data_indata_outVerilog中,用always块设计组合逻辑电路时,1)在赋值表达式右端参与赋值的所有信号都必须在 always(敏感电平列表)中列出,2)always中if语句的判断表达式必须在敏感电平列表中列出。3)确保过程模块敏感信号列表中的信号是必需的。敏感信号列表中没必要出现的信号会降低仿真速度。敏感变量的描述完备

13、性敏感变量的描述完备性错误写法:always(a or b or c)begin e=d&a&b;/*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变化*/d=e|c;end正确写法:always(a or b or c or d)begin e=d&a&b;/*d在敏感电平列表中,d变化时e立刻变化*/d=e|c;end敏感变量的描述完备性敏感变量的描述完备性(1)在Verilog语言中的case语句对应一个单级的多选电路,if-else if-else语句对应于一个优先编码的多级组合选择电路。(2)如果你的设计中没有优先级的要求,最好使用case语句,不要使用if-

14、else if-else语句进行描述。CaseCase语句和语句和If-ElseIf-Else语句语句不推荐这种写法:具有优先级例子1:没有优先级例子1:优先级电路优先级电路不推荐这种写法,同时不推荐大小写混合使用具有优先级例子2:优先级电路优先级电路例:位置映射法Block block_1(signal_a,signal_b);例:信号名映射法block block_1(.signal_a(signal_a),.signal_b(signal_b);在Verilog中,有两种模块调用的方法,一种是位置映射:模块名(连接端口1信号名,连接端口2信号名,连接端 口3信号名,);另一种为信号名映射

15、法:模块名(.端口1信号名(连接端口1信号名),.端口2信号名(连接端口2信号名),.端口3信号名(连接端口3信号名),);模块调用规范模块调用规范在书写Verilog可综合代码时,在always(posedge clk)模块中,总是使用非阻塞赋值方式,否则会产生RTL级仿真和门级仿真功能不一样的现象。同一个always中不能混用阻塞,非阻塞赋值。阻塞和非阻塞赋值(阻塞和非阻塞赋值(VerilogVerilog)Error:状态机要写成3段式的(这是最标准的写法),即 always(posedge clk or negedge rst_n)(第一段).current_state=next_st

16、ate;.always (current_state.)(第二段).case(current_state).s1:if.next_state=s2;.always(posedge clk or negedge rst_n)(第三段).else case(current_state)s1:a=1b0;s2:b=1b1;default:.状态机的写法小结以上列出的代码编写规范无法覆盖代码编写的方方面面,还有很多细节问题,需要在实际编写过程中加以考虑。并且有些规定也不是绝对的,需要灵活处理,并不是律条。但是在一个项目组内部、一个项目的进程中,应该有一套完成、统一的代码编写规范来作为约束,才能做到整洁、可读性好的代码,提高项目研发进度。THE END谢谢大家!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(FPGA设计原则以及代码规范-精选.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|