- 浏览: 299980 次
- 性别:
- 来自: 广州
文章分类
转自: http://www.mcu123.com/news/Article/fpga/FPGA/200607/50.html
第一章 FPGA设计指导性原则
这一部分主要介绍FPGA/CPLD设计的指导性原则,如FPGA设计的基本原则、基本设计思想、基本操作技巧、常用模块等。FPGA/CPLD设计的基本原则、思想、技巧和常用模块是一个非常大的问题,在此不可能面面俱到,只能我们公司项目中常用的一些设计原则与方法提纲携领地加以介绍,希望引起同事们的注意,如果大家能有意识的用这些原则方法指导日后的工作,不断积累和充实自己,将取得事半功倍的效果!
本章主要内容如下:
·基本原则之一:面积和速度的平衡与互换;
·基本原则之二:硬件原则;
·基本原则之三:系统原则;
·基本原则之四:同步设计原则;
·基本设计思想与技巧之一:乒乓操作;
·基本设计思想与技巧之二:串并转换;
·基本设计思想与技巧之三:流水线操作;
·基本设计思想与技巧之四:数据接口的同步方法;
·常用模块之一:RAM;
·常用模块之二:FIFO;
·常用模块之三:全局时钟资源与时钟锁相环;
·常用模块之四:全局复位、置位信号。
1.1 基本原则之一:面积和速度的平衡与互换
这里“面积”指一个设计消耗FPGA/CPLD的逻辑资源的数量,对于FPGA可以用所消耗的触发器(FF)和查找表(LUT)来衡量,更一般的衡量方式可以用设计所占用的等价逻辑门数。“速度”指设计在芯片上稳定运行,所能够达到的最高频率,这个频率由设计的时序状况决定,和设计满足的时钟周期,PAD to PAD Time,Clock Setup Time,Clock Hold Time,Clock-to-Output Delay等众多时序特征量密切相关。面积(area)和速度(speed)这两个指标贯穿着FPGA/CPLD设计的始终,是设计质量的评价的终极标准。这里我们就讨论一下关于面积和速度的两个最基本的概念:面积与速度的平衡和面积与速度的互换。
面积和速度是一对对立统一的矛盾体。要求一个同时具备设计面积最小,运行频率最高是不现实的。更科学的设计目标应该是在满足设计时序要求(包含对设计频率的要求)的前提下,占用最小的芯片面积。或者在所规定的面积下,使设计的时序余量更大,频率跑得更高。这两种目标充分体现了面积和速度的平衡的思想。关于面积和速度的要求,我们不应该简单的理解为工程师水平的提高和设计完美性的追求,而应该认识到它们是和我们产品的质量和成本直接相关的。如果设计的时序余量比较大,跑的频率比较高,意味着设计的健壮性更强,整个系统的质量更有保证;另一方面,设计所消耗的面积更小,则意味着在单位芯片上实现的功能模块更多,需要的芯片数量更少,整个系统的成本也随之大幅度削减。
作为矛盾的两个组成部分,面积和速度的地位是不一样的。相比之下,满足时序、工作频率的要求更重要一些,当两者冲突时,采用速度优先的准则。
面积和速度的互换是FPGA/CPLD设计的一个重要思想。从理论上讲,一个设计如果时序余量较大,所能跑的频率远远高于设计要求,那么就能通过功能模块复用减少整个设计消耗的芯片面积,这就是用速度的优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么一般可以通过将数据流串并转换,并行复制多个操作模块,对整个设计采取“乒乓操作”和“串并转换”的思想进行运作,在芯片输出模块再在对数据进行“并串转换”,是从宏观上看整个芯片满足了处理速度的要求,这相当于用面积复制换速度提高。面积和速度的互换的具体操作有很多的技巧,比如模块复用,“乒乓操作”,“串并转换”等,需要大家在日后工作中积累掌握。下面举例说明如何使用“速度换面积”和“面积换速度”。
1.2 基本原则之二:硬件原则
硬件原则主要针对HDL代码编写而言的。
首先应该明确FPGA/CPLD、ASIC的逻辑设计所采用的硬件描述语言(HDL)与同软件语言(如C,C++等)是有本质区别的!以VerilogHDL语言为例(我们公司多数逻辑工程师使用Verilog),虽然Verilog很多语法规则和C语言相似,但是Verilog作为硬件描述语言,它的本质作用在于描述硬件!应该认识到Verilog是采用了C语言形式的硬件的抽象,它的最终实现结果是芯片内部的实际电路。所以评判一段HDL代码的优劣的最终标准是:其描述并实现的硬件电路的性能(包括面积和速度两个方面)。评价一个设计的代码水平较高,仅仅是说这个设计由硬件向HDL代码这种表现形式转换的更流畅、合理。而一个设计的最终性能,在更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。
初学者,特别是由软件转行的初学者,片面追求代码的整洁,简短,这是错误的!是与评价HDL的标准背道而驰的!正确的编码方法是,首先要做到对所需实现的硬件电路"心有成竹",对该部分硬件的结构与连接十分清晰,然后再用适当的HDL语句表达出来即可。
另外,Verilog作为一种HDL语言,是分层次的。比较重要的层次有:系统级(System)、算法级(Algorithm)、寄存器传输级(RTL)、逻辑级(Logic)、门级(Gate)、电路开关级(Switch)设计等。系统级和算法级与C语言更相似,可用的语法和表现形式也更丰富。自RTL级以后,HDL语言的功能就越来越侧重于硬件电路的描述,可用的语法和表现形式的局限性也越大。相比之下C语言与系统级和算法级Verilog描述更相近一些,而与RTL级,Gate级、Switch级描述从描述目标和表现形式上都有较大的差异。
例3 举例RTL级Verilog描述语法和C语言描述语法的一些区别。
简单的举例RTL级Verilog描述语法和C语言描述语法的一些区别。在C语言的描述中,为了代码执行效率高,与表述简洁,经常用到如下所示的for循环语句:
for (i=0; i<16; i++)
DoSomething();
但是在我们工作中,除了描述仿真测试激励(testbench)时,使用for循环语句外,极少在RTL级编码中使用for循环。其原因是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效的复用硬件逻辑资源,造成巨大的资源浪费。在RTL硬件描述中,遇到类似算法,推荐的方式是先搞清楚设计的时序要求,做一个reg型计数器,在每个时钟沿累加,并在每个时钟沿判断计数器情况,做相应的处理,如果能复用的处理模块,尽量复用,即使所有操作都不能复用,也采用case语句展开处理。如下所示:
reg [3:0] counter;
always @ (posedge clk)
if (syn_rst)
counter <= 4'b0;
else
counter <= counter+1;
always @ (posedge clk)
begin
case (counter)
4'b0000:
4'b0001:
... ...
default:
endcase
end
另外在C语句描述中有if…else和switch条件判断语句,其语法如下所示:
if (flag)// 表示flag为真
…
else
…
switch语句的基本格式是:
switch (variable)
{
case value1 : …
break;
case value2 : …
break;
…
default : …
break;
}
两者之间的区别主要在于switch是多分支选择语句,而if语句只有两个分支可供选择。虽然可以用嵌套的if语句来实现多分支选择,但那样的程序冗长难读。
对应Verilog也有if…else语句和case语句,if语句的语法相似,case语句的语法如下:
case (var)
var_value1:
var_value1:
... ...
default:
endcase
姑且不论ca***和casez的作用(这两个语句的应用一定要小心,要注意是否可综合),case语句和if…else嵌套描述结构就有很大的区别。在Verilog语法中,if…else if…else语句是有优先级的,一般来说第一个if的优先级最高,最后一个else的优先级最低。如果描述一个编码器,在Xilinx的XST综合参数就有一个关于优先级编码器硬件原语的选项Priority Encoder Extraction。而case语句是“平行”的结构,所有的case的条件和执行都没有“优先级”。而建立优先级结构(优先级树)会消耗大量的组合逻辑,所以如果能够使用case语句的地方,尽量用case替换if...else结构。
关于这点简单的引申两点:第一,也可以用if...; if…;的结构描述出不带优先级的“平行”条件判断语。第二,随着现在综合工具的优化能力越来越强,大多数情况下可以将不必要的优先级树优化掉。关于if和case语句的更详细的阐释,见后面关于Coding style的讨论。
当评估完系统的流水线时间余量后,发现整个流水线有16个时钟周期,而FHT模块的频率很高,加法本身仅仅消耗1个时钟周期,加上数据的选择和分配所消耗时间,也能完全满足频率要求,所以将单步FHT运算复用4次,就能大幅度节约所消耗的资源。这种复用单步算法由输入选择寄存、单步FHT模块、输出选择寄存、计数器构成。代码如下:
//复用单步算法的FHT运算模块
module wch_fht(Clk,Reset,
PreFhtStar,
In0,In1,In2,In3,In4,In5,In6,In7,
In8,In9,In10,In11,In12,In13,In14,In15,
Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7,Out8,
Out9,Out10,Out11,Out12,Out13,Out14,Out15
);
input Clk; //设计的主时钟
input Reset; //异步复位信号
input PreFhtStar; //FHT 运算指示信号,和上级模块运算关联
input [11:0] In0,In1,In2,In3,In4,In5,In6,In7;
input [11:0] In8,In9,In10,In11,In12,In13,In14,In15; //FHT的16个输入
output [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7;
output [15:0] Out8,Out9,Out10,Out11,Out12,Out13,Out14,Out15; //FHT的16个输出
//FHT输出寄存信号
reg [15:0] Out0,Out1,Out2,Out3,Out4,Out5,Out6,Out7;
reg [15:0] Out8,Out9,Out10,Out11,Out12,Out13,Out14,Out15;
//FHT的中间结果
wire [15:0] Temp0,Temp1,Temp2,Temp3,Temp4,Temp5,Temp6,Temp7;
wire [15:0] Temp8,Temp9,Temp10,Temp11,Temp12,Temp13,Temp14,Temp15;
//FHT运算控制计数器,和前一级流水线模块配合
reg [2:0] Cnt3;//count from 0 to 4,when Reset Cnt3=7;
reg FhtEn;//Enable fht culculate
always @(posedge Clk or negedge Reset)
begin
if (!Reset)
Cnt3<= #1 3'b111;
else
begin
if(PreFhtStar)
Cnt3<= #1 3'b100;
else
Cnt3<= #1 Cnt3-1;
end
end
always @(posedge Clk or negedge Reset)
if (!Reset)
FhtEn<= #1 0;
else
begin
if (PreFhtStar)
FhtEn<= #1 1;
if (Cnt3==1)
FhtEn<= #1 0;
end
//补码运算,复制符号位
assign Temp0=(Cnt3==4)?{4{In0[11]},In0}:Out0;
assign Temp1=(Cnt3==4)?{4{In1[11]},In1}:Out1;
assign Temp2=(Cnt3==4)?{4{In2[11]},In2}:Out2;
assign Temp3=(Cnt3==4)?{4{In3[11]},In3}:Out3;
assign Temp4=(Cnt3==4)?{4{In4[11]},In4}:Out4;
assign Temp5=(Cnt3==4)?{4{In5[11]},In5}:Out5;
assign Temp6=(Cnt3==4)?{4{In6[11]},In6}:Out6;
assign Temp7=(Cnt3==4)?{4{In7[11]},In7}:Out7;
assign Temp8=(Cnt3==4)?{4{In8[11]},In8}:Out8;
assign Temp9=(Cnt3==4)?{4{In9[11]},In9}:Out9;
assign Temp10=(Cnt3==4)?{4{In10[11]},In10}:Out10;
assign Temp11=(Cnt3==4)?{4{In11[11]},In11}:Out11;
assign Temp12=(Cnt3==4)?{4{In12[11]},In12}:Out12;
assign Temp13=(Cnt3==4)?{4{In13[11]},In13}:Out13;
assign Temp14=(Cnt3==4)?{4{In14[11]},In14}:Out14;
assign Temp15=(Cnt3==4)?{4{In15[11]},In15}:Out15;
always @(posedge Clk or negedge Reset)
begin
if (!Reset)
begin
Out0<=0;Out1<=0;Out2<=0;Out3<=0;
Out4<=0;Out5<=0;Out6<=0;Out7<=0;
Out8<=0;Out9<=0;Out10<=0;Out11<=0;
Out12<=0;Out13<=0;Out14<=0;Out15<=0;
end
else
begin
if ((Cnt3<=4) && Cnt3>=0 && FhtEn)
begin
Out0[15:0]<= #1 Temp0[15:0]+Temp8[15:0];
Out1[15:0]<= #1 Temp0[15:0]-Temp8[15:0];
Out2[15:0]<= #1 Temp1[15:0]+Temp9[15:0];
Out3[15:0]<= #1 Temp1[15:0]-Temp9[15:0];
Out4[15:0]<= #1 Temp2[15:0]+Temp10[15:0];
Out5[15:0]<= #1 Temp2[15:0]-Temp10[15:0];
Out6[15:0]<= #1 Temp3[15:0]+Temp11[15:0];
Out7[15:0]<= #1 Temp3[15:0]-Temp11[15:0];
Out8[15:0]<= #1 Temp4[15:0]+Temp12[15:0];
Out9[15:0]<= #1 Temp4[15:0]-Temp12[15:0];
Out10[15:0]<= #1 Temp5[15:0]+Temp13[15:0];
Out11[15:0]<= #1 Temp5[15:0]-Temp13[15:0];
Out12[15:0]<= #1 Temp6[15:0]+Temp14[15:0];
Out13[15:0]<= #1 Temp6[15:0]-Temp14[15:0];
Out14[15:0]<= #1 Temp7[15:0]+Temp15[15:0];
Out15[15:0]<= #1 Temp7[15:0]-Temp15[15:0];
end
end
end
endmodule
发表评论
-
基于 FPGA 的视频监控系统
2011-12-09 09:51 900基于 FPGA 的视频监控系统 -
verilog中reg和wire类型的区别和用法
2011-08-05 14:58 1418reg相当于存储单元,wire相当于物理连线 Veril ... -
关于verilog综合-个人小结
2011-07-22 13:57 869转自:http://www.mcu123.com/ ... -
使用SignalTap II逻辑分析仪调试FPGA(图)
2011-07-21 08:30 834摘 要:本文介绍了可编程逻辑器件开发工具Quartus ... -
Quartus警告分析 warning
2011-07-20 14:13 930http://hi.baidu.com/davinzhan ... -
verilog 不可综合语句
2011-07-19 17:28 1538转自: http://blog.sina.com ... -
verilog 中if的使用,以及input output inout 使用
2011-07-19 17:20 2002转自:http://blog.sina.com.cn/s/ ... -
格雷码对照表
2011-07-19 10:02 25032位元格雷码 00 01 11 10 ... -
Verilog 阻塞/非阻塞用法 基础
2011-07-19 08:25 807转自: http://blog.21ic.com/u ... -
uart loopback
2011-07-18 14:19 1178uart.v module uar ...
相关推荐
FPGA设计指导原则
### FPGA设计指导原则详解 #### 一、基本原则 ##### 1.1 面积和速度的平衡与互换 FPGA设计的核心在于面积(area)和速度(speed)这两个关键指标之间的平衡与互换。面积指的是设计所占用的逻辑资源数量,通常通过...
《FPGA设计指导原则》是一本面向嵌入式学习者的宝贵资源,涵盖了FPGA(Field-Programmable Gate Array)开发的关键概念和技术。FPGA是一种可编程逻辑器件,允许开发者根据需求自定义硬件功能,广泛应用于通信、图像...
本主题将深入探讨“FPGA设计指导性原则”,特别是结合Verilog语言进行的设计方法。以下是一些核心知识点: 1. **FPGA基础知识**:FPGA是由可编程逻辑单元(CLB)、输入/输出块(IOB)、配置存储器(Configuration ...
### FPGA设计的指导原则 #### 1.1 面积和速度的平衡与互换 在FPGA设计中,“面积”通常指的是该设计在FPGA芯片上所占用的资源量,具体而言,可以量化为触发器(FF)、查找表(LUT)的数量或等效逻辑门的数量。...
### FPGA设计的指导原则详解 #### 一、面积与速度的平衡与互换:核心设计哲学 FPGA设计的核心在于平衡资源使用与性能表现。**面积**,即设计占用的逻辑资源,通常以触发器(FF)和查找表(LUT)的数量或等效逻辑门...
FPGA设计的指导性原则,对于初次涉及该领域,有很大的指导,总结很全面。
"FPGA设计指导准则"是初学者和经验丰富的工程师都需要遵循的一套最佳实践,旨在提高设计效率、优化性能并确保设计的可靠性。以下是对这些指导原则的详细说明: 1. **理解FPGA架构**:了解FPGA的基本结构,如CLB...
#### 一、FPGA设计指导原则概览 FPGA设计涉及诸多考量因素,其中最重要的莫过于面积与速度之间的平衡。本文档旨在介绍一系列设计原则和技巧,帮助工程师们在实际工作中更好地应用这些原则,从而优化FPGA设计。 ###...
《FPGA设计指导手册电子版第一版》是针对FPGA(Field-Programmable Gate Array)和CPLD(Complex Programmable Logic Device)设计的重要参考资料,旨在为工程师提供一套有效的设计原则,帮助他们在实际工作中提高...
- **FPGA设计指导原则**:比如面积换速度原则(即牺牲一定的面积来提高运行速度),乒乓处理原则(用于数据传输中避免死锁)等。 - **FPGA的调试技巧**:包括测试点选取、片上逻辑分析仪使用等,这对于快速定位问题...
这份压缩包文件包含了《FPGA设计指导准则》的PDF文档,旨在帮助设计师们更好地理解和实践FPGA的设计原则。 在FPGA设计中,以下几个关键知识点至关重要: 1. **FPGA基本结构**:FPGA由可编程逻辑单元(CLB)、输入/...
书籍通常以实例为导向,指导读者逐步完成FPGA设计项目。 "FPGA管脚分配需要考虑的因素"这部分内容强调了在设计过程中如何正确地分配FPGA的输入/输出引脚。这涉及到信号完整性、电磁兼容性、电源管理以及封装限制等...
FPGA 设计规范是指在 FPGA 设计过程中需要遵守的规则和指南,以确保设计的正确性、可读性和可维护性。本文将详细介绍 FPGA 设计规范的相关知识点。 一、FPGA 设计流程 FPGA 设计流程是一个复杂的过程,涉及到数字...