1、FPGA设计,FPGA设计流程,设计举例,FPGA设计基本原则,内容,其它,典型的FPGA设计流程,设计输入前仿真(功能仿真)综合(优化、综合、映射)布局布线后仿真(时序仿真)生成下载文件,进行板级调试,FPGA设计的基本原则,系统原则硬件原则同步设计原则面积和速度的平衡和互换,系统原则,原则:FPGA设计要求对设计的全局有个宏观的上的合理安排。比如时钟域、模块复用、约束、面积和速度等问题。FPGA/CPLD的资源情况:一般是由底层可编程硬件单元、BLOCK RAM资源、布线资源、可配置的IO单元、时钟资源等组成。返回,可编程的硬件单元,底层的可编程硬件单元 FF触发器LUT查找表返回,时钟资
2、源,锁相环(Phase-Locked Loop,PLL)延迟锁定环(Delay-Locked Loop,DLL) 返回,硬件原则,1.评判一段HDL代码的优劣标准:其描述并实现的硬件电路的性能(包括面积和速度两个方面)。2.举例:比较Verilog和语言的区别 C: For(I=0;I16;I+) function(); Verilog: reg 3:0counter; always (negedge rst_n or negedge clk) always (negedge clk) begin begin if(!rst_n) case(counter) counter=4b0; 4b00
3、00: else 4b0001: counter = counter+1; end endcase end,C: Verilog:if() 1) if() else else 2)swithch(variable) 2) case (var) value1: case value1 break; value2: case value2 break; default: endcase解决办法:一:使用if() ;if() ;的结构描述出不带优先级的“平行”条件判断语句;二:使用软件将优先级树优化掉返回,同步设计原则,异步电路特点:电路的核心逻辑用组合逻辑电路实现。比如异步的FIFO/RAM读写信
4、号,地址译码等电路;电路的主要信号,输出信号等并不依赖于任何一个时钟信号。不是由时钟信号驱动FF产生;异步时序电路的最大缺点是容易产生毛刺。,同步时序电路的特点:电路的核心逻辑用各种各样的触发器实现电路的主要信号、输出信号等都是由某个时钟沿驱动触发器产生出来的;同步时序电路可以很好的避免毛刺。同步时序电路设计的几个问题:是否同步时序电路一定比异步电路更多使用逻辑资源?如何实现同步时序电路的延时?同步时序电路的时钟如何产生?返回,面积与速度的平衡和互换原则,概念:面积:指一个设计消耗的FPGA/CPLD的逻辑资源的数量速度:指设计在芯片上稳定运行,所能够达到的最高频率面积与速度的平衡:对面积和速
5、度的要求,和产品的质量和成本有直接关系。面积与速度的互换:,速度的优势换面积的节约:从理论上讲,一个设计如果时序余量较大,那么就能通过功能模块的复用减少设计消耗的面积。面积复制换速度的提高:如果,一个设计的时序要求比较高,普通方法达不到设计频率,那么一般可以通过将数据流串并转换,并行复制多个操作模块,对整个设计采取“乒乓操作”和“串并转换”的思想进行运作,在芯片输出模块再对数据进行“并串转换”。这样从宏观上看整个芯片满足了处理速度的要求。,返回,其它,阻塞赋值与非阻塞赋值的区别和用法module non_block (a,c,clk); 非阻塞赋值 input a; input clk; ou
6、tput c; reg b,c; always (negedge clk) begin b=a; c=b; endendmodule,module non_block (a,c,clk); 阻塞赋值input a;input clk; output c; reg b,c; always (negedge clk) begin b=a; c=b; endendmodule,两种赋值方式的使用,规则:在always块中,组合逻辑设计使用阻塞赋值“”。在always块中,时序逻辑设计使用非阻塞赋值“”。在always块中,当即存在组合逻辑,有存在时序逻辑时,使用非阻塞赋值“” 。,module te
7、st(a,b,c,d,y); module test(a,b,c,d,y);input a,b,c,d; input a,b,c,d;output y; output y; reg y,tmp1,tmp2; reg y,tmp1,tmp2;always (a or b or c or d) always (a or b or c or d or tmp1 or tmp2) begin begin tmp1=a end endendmodule endmodule返回,module test(d,clk,q3); 解决方法:module test(d,clk,q3); input d,clk;
8、input d,clk; output q3; output q3; reg q1,q2,q3; reg q1,q2,q3; always (negedge clk) always (negedge clk) begin begin q1 = d; q3 = q2; q2 = q1; q2 = q1; q3 = q2; q1 = d; end endendmodule endmodule,解决二:module test(d,clk,q3); 解决三: module test(d,clk,q3); input d,clk; input d,clk; output q3; output q3; r
9、eg q1,q2,q3; reg q1,q2,q3; always (negedge clk) always (negedge clk) q1 = d; q3 = q2; always (negedge clk) always (negedge clk) q2 = q1; q2 = q1; always (negedge clk) always (negedge clk) q3 = q2; q1 = d; endmodule endmodule返回,module test() module test() input a,b,clk,rst_n; input a,b,clk,rst_n; output q; output q; reg q; reg q; always always (negedge clk or negedge rst_n) (negedge clk or negedge rst_n) begin begin if(!rst_n) q = 1b0; if(!rst_n) q = 1b0; else begin else begin tmp = a end end end end end module end module,谢谢大家!,