Presentation is loading. Please wait.

Presentation is loading. Please wait.

可综合Verilog语言及FPGA验证 2015-12-08.

Similar presentations


Presentation on theme: "可综合Verilog语言及FPGA验证 2015-12-08."— Presentation transcript:

1 可综合Verilog语言及FPGA验证

2 目录 可综合Verilog语言 数字电路验证 HDL的软件仿真 FPGA简介 FPGA设计流程 FPGA设计中的基本问题

3 Verilog HDL简介 Verilog HDL是一种应用广泛的硬件描述性语言,是硬件设计人员和电子设计自动化(EDA)工具之间的界面。
2017/9/11 Verilog HDL简介 Verilog HDL是一种应用广泛的硬件描述性语言,是硬件设计人员和电子设计自动化(EDA)工具之间的界面。 利用Verilog进行的开发步骤如下: 编写设计和测试文件 综合前仿真 逻辑综合 综合后仿真 实现:ASIC芯片、CPLD或FPGA FPGA常用的Verilog HDL语言开发软件有Altera公司的Quartus II和Xilinx公司的ISE。 硬件描述语言HDL:描述电路硬件及时序的一种编程语言 共134页 3

4 为什么要用Verilog HDL? 电子设计规模越来越大(普通设计已达几百万门的数量级) ,复杂度越来越高。有必要用高级语言来表达其功能,隐藏其具体的细节实现。 提高逻辑设计的效率,降低设计成本,更重要的是缩短设计周期。 可读性强,易修改。 从HDL到具体的硬件电路是由EDA工具软件的综合器完成,但并不是所有Verilog HDL语句均可被综合。 注意:

5 2017/9/11 可综合设计 可综合指的是所设计的代码能转化为具体的电路网表。在用CPLD/FPGA器件实现的数字设计中,综合就是将Verilog HDL语言转化为门级电路网表的过程。 不可综合设计则主要用于设计的验证、仿真。 逻辑综合 = 翻译 + 优化 + 映射 RTL级综合后得到由功能模块构成的电路结构,逻辑优化器以用户设定的面积和定时约束为目标优化电路网表,针对目标工艺产生优化后的电路门级网表结构。 共134页

6 可综合/不可综合 1、综合工具支持的语句: always,assign,begin,end,case,wire,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,if,inout,input,module,negedge,posedge,output, defparam,parameter…… 2、综合工具不支持的语句: time,$finish,fork,join,initial,delays,wait……

7 其他不可综合的情况 1、敏感列表里同时带有时钟的posedge和negedge 2、同一个reg变量被多个always块驱动
clk or negedge clk)  不可综合 2、同一个reg变量被多个always块驱动 3、以#开头的延时不可综合成硬件电路延时,综合工具会忽略 所有延时代码,但不会报错。  如:a=#10 b; 这里的#10是用于仿真时的延时,在综合的 时候综合工具会忽略它,等同于a=b; 4、与不定态X、高阻态Z的比较 如 if ((b == 1’bz) || (b == 1’bx)) begin 不可综合

8 设计准则 要保证Verilog HDL语句的可综合性,在建模时应注意:     (1)不使用initial。     (2)不使用#延时。     (3)不使用循环次数不确定的循环语句,如for、while。     (4)不使用用户自定义原语(UDP元件)。     (5)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。

9 2017/9/11 设计准则(续) (6)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号或使用*代替。     (7)描述时序逻辑,应使用非阻塞赋值(<=)方式。描述组合逻辑,应尽量采用阻塞赋值(=) 。     (8)不能在一个以上的always过程块中对同一个变量赋值 (9)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。     (10)避免混合使用上升沿和下降沿触发的触发器。 共134页

10 敏感列表 在下面的例子,a, b, sl是块的输入 sl用作条件 a、b用在过程赋值语句的右边 敏感表不完全:
module sens (a, q, b, sl); input a, b, sl; output q; reg q; sl) begin if (! sl) q = a; else q = b; end endmodule 完全的敏感列表 module sensc (q, a, b, sl); input a, b, sl; output q; reg q; sl or a or begin if (! sl) q = a; else q = b; end endmodule 将块的所有输入都列入敏感表是很好的描述习惯。不同的综合工具对不完全敏感表的处理有所不同。有的将不完全敏感表当作非法。其他的则产生一个警告并假设敏感表是完全的。在这种情况下,综合输出和RTL描述的仿真结果可能不一致。

11 完全的条件语句 例中定义了所有可能的选项,综合结果是纯组合逻辑,没有不期望的锁存器产生。
module compif (a, b, c, d, e); input a, b, c, d; output e; reg e; a or b or c or d) if (a & b) e = d; else if (a & ~b) e = ~c; else if (~ a & b) e = 1'b0; else if (~ a & ~b) e = 1'b1; endmodule module compcase (a, b, c, d, e); input a, b, c, d; output e; reg e; a or b or c or d) case ({ a, b}) 2'b11: e = d; 2'b10: e = ~c; 2'b01: e = 1'b0; 2'b00: e = 1'b1; endcase endmodule 例中定义了所有可能的选项,综合结果是纯组合逻辑,没有不期望的锁存器产生。

12 不完全条件语句 若 a 变为 0, 在上面的例子中,当a变为零时,不对e赋新值。因此e保存其值直到a变为1。这是锁存器的特性。 e 为何值
module inccase (a, b, c, d, e); input a, b, c, d; output e; reg e; a or b or c or d) case ({ a, b}) 2'b11: e = d; 2'b10: e = ~c; endcase endmodule module incpif (a, b, c, d, e); input a, b, c, d; output e; reg e; a or b or c or d) if (a & b) e = d; else if (a & ~b) e = ~c; endmodule 在上面的例子中,当a变为零时,不对e赋新值。因此e保存其值直到a变为1。这是锁存器的特性。

13 default完全条件语句 综合工具将 ’bx作为无关值,因此if语句类似于“ full case”,可以进行更好的优化。
module comcase (a, b, c, d, e); input a, b, c, d; output e; reg e; a or b or c or d) case ({ a, b}) 2'b11: e = d; 2'b10: e = ~c; default: e = 'bx; endcase endmodule module compif (a, b, c, d, e); input a, b, c, d; output e; reg e; a or b or c or d) if (a & b) e = d; else if (a & ~b) e = ~c; else e = 'bx; endmodule 综合工具将 ’bx作为无关值,因此if语句类似于“ full case”,可以进行更好的优化。 例中没有定义所有选项,但对没有定义的项给出了缺省行为。同样,其综合结果为纯组合逻辑——没有不期望的锁存器产生。

14 指示完全条件语句 module dircase (a, b, c, d); input b, c; input [1: 0] a; output d; reg d; a or b or c) case (a) // ambit synthesis case = full 2'b00: d = b; 2'b01: d = c; endcase endmodule 和前例一样,没有定义所有case项,但综合指示通知优化器缺少的case项不会发生。结果也为纯组合逻辑,没有不期望锁存器产生。

15 阻塞或非阻塞 使用的赋值类型依赖于所描述的逻辑类型: 在时序块RTL代码中使用非阻塞赋值 非阻塞赋值语句之间是并行处理的,没有先后顺序
阻塞赋值语句之间按先后顺序执行

16 阻塞、非阻塞对比 使用阻塞赋值,此描述综合出一个D flip-flop: 使用非阻塞赋值,此描述将综合出两个D Flip-flop。
module bloc (clk, a, b); input clk, a; output b; reg y; reg b; posedge clk) begin y =a; b =y; end endmodule module nonbloc (clk, a, b); input clk, a; output b; reg y; reg b; posedge clk) begin y <= a; b <= y; end endmodule

17 资源共享 资源共享是指多节代码共享一组逻辑。例如:
a or b or c or d) if (a) out = b + c; else out = b + d; 资源共享与所用综合工具有关。但通常,要共享资源,表达式必须在同一个always块中的同一个条件语句中。 没有资源共享 资源共享

18 资源共享 只有在同一个条件语句(if和case)不同的分支中的算术操作才会共享。 条件操作符 ?: 中的算术操作不共享。 if (cond)
条件操作符 ?: 中的算术操作不共享。 if (cond) z = a + b; else z = c + d; Z = (cond) ? (a + b) : (c + d);

19 括号的作用 利用括号分割逻辑。 z = a + b + c + d; Z = (a + b) + (c + d); a + + b + c

20 目录 可综合Verilog语言 数字电路验证 HDL的软件仿真 FPGA简介 FPGA设计流程 FPGA设计中的基本问题

21 数字IC设计流程 系统定义 HDL代码编写 功能验证 布局布线 流片 综合 前端设计 后端设计 综合

22 为什么需要验证? 1.语法检查 端口申明结束 变量类型错误 reg类型变量不能使用连续赋值
module clk_devider(clk,en,data_in,clk_d7,clk_d8,clk_out,); input clk,en;data_in; output clk_d7,clk_d8,clk_out; wire [2:0] count; wire clk_d8,clk_out; reg clk_d7; assign clk_out= data_in ? clk_d8 : clk_d7; assign clk_d7<=~count[2]; assign clk_d8=~count[2]; clk) if(!en) count<=0; else if (en) if (!data_in) count=count+1; else begin if (count==6) count<=0; else count<=count+1; endmodule 端口申明结束 变量类型错误 reg类型变量不能使用连续赋值 同一过程块赋值类型要一致,reg类型最好使用“<=“非阻塞赋值 begin—end 要匹配

23 为什么需要验证? 2.功能验证 assign test=~a|(b&c); 如果a=0,b=1,c=0,test=1

24 验证的必要性 经验表明,验证已经占到整个产品开发周期的 70%以上,它已经成为复杂SOC开发中的重要壁 垒。
Verification is hard没有一个简单的工具 可以解决你所有的验证问题。

25 如何验证? 1.软件验证 Modelsim,Questasim(后者对system verilog, system C支持较好),PT,Formality,calibre 2.硬件验证---FPGA或者CPLD 编译下载软件ISE,Quartus II

26 常用工具工作站启动方法 Modelsim6.5 ISE12.4 source /opt/demo/modelsim.env vsim
source /opt/demo/ise.env ise &

27 前端设计流程 采用软件验证的前端设计流程 1.代码编写 2.编写测试矢量(testbench) 3.运行仿真软件仿真
采用硬件验证的前端设计流程 3.运行FPGA软件编译下载进行验证

28 目录 可综合Verilog语言 数字电路验证 HDL的软件仿真 FPGA简介 FPGA设计流程 FPGA设计中的基本问题

29 测试矢量--Testbench a b c test 1
test=~a|(b&c); Testbench更像一个激励的产生器,对所设计的输入管脚产生相应的输入值(0,或者1),通过观察输出值来评估设计的正确性。 Testbench 的工作就是把这些不同的输入值加载到所设计的电路中。 a b c test 1

30 Testbench与设计模块的关系 仿真软件--铁锅 设计模块--准备好的生菜 Testbench--调料 观察输出--尝味道
仿真---修改---再仿真

31 编写testbench `timescale 1ns/1ns //定义仿真时间步长 module top_test();
reg a_test, b_test, c_test; test test (.a(a_test), .b(b_test), .c(c_test), .test(test_out)); //调用设计模块 initial begin begin a_test=0; b_test=0;c_test=0;end #(100) begin a_test=0; b_test=0;c_test=1;end #(100) begin a_test=0; b_test=1;c_test=0;end #(100) begin a_test=0; b_test=1;c_test=1;end #(100) begin a_test=1; b_test=0;c_test=0;end #(100) begin a_test=1; b_test=0;c_test=1;end #(100) begin a_test=1; b_test=1;c_test=0;end #(100) begin a_test=1; b_test=1;c_test=1;end end endmodule 不需要端口列表和端口类型定义

32 Modelsim 仿真步骤 启动Modelsim 建立新的编译库 FileNewlibrary
source /opt/demo/modelsim.env(注意空格) vsim& 建立新的编译库 FileNewlibrary 建立新的工程 FileNewproject 添加.v文件到新的project,包括测试激励testbench 编译 仿真

33 建立新的工作库

34 建立新的工程1/2

35 建立新的工程2/2 存放verilog代码的目录

36 编译 编译前状态 编译后状态

37 编译状态刷新 状态刷新很慢的情况下 在主窗口下鼠标右键 弹出来的选项中选择 Update

38 编译错误查看 绿色对号表示编译无误。红色叉号表示有错误。 黄色感叹号表示有警告。错误查看:双击红色叉号。
数字表示错误代码行数,比如这里的16,表示代码第16行有错误,双击这行可以直接定位到错误处。

39 错误修改 错误修改后需要保存,保存后代码状态又变成问号,需要重新编译。

40 仿真1/2 启动仿真方法一 选择的这个模块一定要是testbench的模块

41 仿真2/2 启动 仿真 方法二 选中testbench模块后鼠标右键

42 波形查看 变量 过程块

43 波形查看 选中要查看 的模块, 鼠标右键

44 波形查看 跑固定时间 跑完全部

45 结束仿真

46 目录 可综合Verilog语言 数字电路验证 HDL的软件仿真 FPGA简介 FPGA设计流程 FPGA设计中的基本问题

47 FPGA FPGA (Field Programmable Gate Array),即现场可编程门阵列,它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了全定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

48 FPGA的结构 FPGA由可配置逻辑块(CLB )、输入/输出模块(IOB)及可编程互连资源(PIR)等三种可编程电路和一个SRAM结构的配置存储单元组成。 CLB是实现逻辑功能的基本单元,它们通常规则地排列成一个阵列,散布于整个芯片中; IOB主要完成芯片上的逻辑与外部引脚的接口,它通常排列在芯片的四周; PIR包括各种长度的连线线段和一些可编程连接开关,它们将各个CLB之间或CLB与IOB之间连接起来,构成特定功能的电路。

49 FPGA的结构

50 可编程逻辑块CLB CLB主要由逻辑函数发生器、触发器、数据选择器等电路组成 函数发生器基于查找表LUT单元:

51 输入/输出模块IOB IOB主要由输入触发器、输入缓冲器和输出触发/锁存器、输出缓冲器组成,每个IOB控制一个引脚,它们可被配置为输入、输出或双向I/O功能。

52 可编程互连资源(PIR) PIR由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电路的连接。实现FPGA内部的CLB和CLB之间、CLB和IOB之间的连接

53 CPLD CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件
FPGA与CPLD的辨别和分类主要是根据其结构特点和工作原理。通常的分类方法是: 将以乘积项结构方式构成逻辑行为的器件称为CPLD。 将以查表法结构方式构成逻辑行为的器件称为FPGA。

54 FPGA与CPLD的区别 CPLD FPGA 程序存储 内部EEPROM SRAM,外挂EEPROM 资源类型 组合电路资源丰富
触发器资源丰富 集成度 使用场合 完成控制逻辑 完成比较复杂的算法 编程元素 非易失性(FLASH、EEPROM) 易失性(SRAM) 上电速度 快,上电后立即开始工作 慢(从外部存储器读取) 保密性 其他资源 PLL、DSP

55 FPGA生产厂商 随着可编程逻辑器件应用的日益广泛,许多IC制造厂家涉足FPGA领域。目前世界上有十几家生产CPLD/FPGA的公司,最大的三家是:ALTERA,XILINX,Lattice,actel其中ALTERA和XILINX占有了60%以上的市场份额。

56 Altera Altera的主流FPGA分为两大类 1、一种侧重低成本应用,容量中等,性能可以满足一般的逻辑设计要求,如Cyclone系列;
2、还有一种侧重于高性能应用,容量大,性能能满足各类高端应用,如Stratix系列等,用户可以根据自己实际应用要求进行选择。 开发软件为QuartusⅡ

57 Cyclone V: 2011年推出,28nm工艺,1.1v内核供电。
功能 5CEA2 5CEA5 5CEA8 5CEB5 5CEB9 等效逻辑单元 (LE) 25,000 48,000 75,000 150,000 300,000 M10K RAM 块 ( Kbits) 1,560 3,120 4,620 6,160 12,760 PLL 4 DSP 39 78 132 220 406 存储器控制硬核 1 2 支持I/O电压(V) 1.1, 1.2, 1.5, 1.8, 2.5, 3.3

58 Stratix V: 2011年推出,28nm工艺,0.85v内核供电,大容量高性能FPGA。 Stratix V系列概览
功能 5SGXA3 5SGXA4 5SGXA5 5SGXA7 5SGXA9 5SGXAB 自适应逻辑模块(ALM) 75,500 113,000 160,500 234,750 317,000 397,000 等效逻辑单元 (LE) 200,000 300,000 425,000 622,000 840,000 1,052,000 Registers 302,000 452,000 642,000 939,000 1,268,000 1,588,000 M20K RAM 块 (20 Kb) 800 1,316 2,304 2,560 1,600 2,016 总嵌入 RAM (M bits) 16 26 45 50 31 39 18x18乘法器 376 512 1,000 1,500 支持I/O电压(V) 1.2, 1.5, 1.8, 2.5, 3.3

59 Xilinx Xilinx的主流FPGA分为两大类 一种侧重低成本应用,容量中等,性能可以满足一般的逻辑设计要求,如Spartan系列;
还有一种侧重于高性能应用,容量大,性能能满足各类高端应用,如Virtex系列 开发软件为ISE

60 Spartan-6: 2009年初推出,45nm工艺,面向低成本、低功耗应用。
器件 逻辑单元 最大Block RAM(kb) DSP块 存储器控制块 最大用户I/O数 价格(美元) XC6SLX4 3,840 216 8 132 6-10 XC6SLX9 9,152 576 16 2 200 10-15 XC6SLX16 14,579 32 232 13-25 XC6SLX25 24,051 936 38 266 20-42 XC6SLX45 43,661 2,088 58 358 30-52 XC6SLX75 74,637 3,096 4 408 52-80 XC6SLX100 101,261 4,824 180 480 63-137 XC6SLX150 147,443 97-180 注:DSP块内含18x18乘法器、加法器、累加器各1个

61 Virtex-6: 2009年初推出,45nm工艺,面向高性能应用。
器件 逻辑单元 最大Block RAM(kb) DSP块 最大用户I/O数 XC6VLX75T 74,496 5,616 288 360 XC6VLX130T 128,000 9,504 480 600 XC6VLX195T 199,680 12,384 640 XC6VLX240T 241,152 14,976 768 720 XC6VLX365T 364,032 576 XC6VLX550T 549,888 22,752 864 1200 XC6VLX760 758,784 25,920

62 Xilinx-7系列 2011年推出,28nm工艺,具有比6系列更高的性价比。 ARTIX-7 系列:最低成本与功耗
KINTEX-7 系列:最佳性价比 VIRTEX-7 系列:最高带宽和系统性能

63 FPGA开发板

64 目录 可综合Verilog语言 数字电路验证 HDL的软件仿真 FPGA简介 FPGA设计流程 FPGA设计中的基本问题

65 FPGA开发工具和语言

66 Xilinx--ISE

67 Altera--Quartus II

68 Actel--Libero

69 Lattice--ispLEVER

70 Xilinx ISE 设计流程 1.创建新工程 2.添加设计文件(.v或者.vhd) 3.分配IO管脚 4.综合 5.布局布线 6.下载
7.测试

71 创建新工程1/2 File-->New project

72 创建新工程2/2 Spartan3 XC3S400 FT256 -4 接下来一直Next..

73 添加设计文件 鼠标右键

74 分配IO管脚1/2

75 分配IO管脚2/2 添加管脚约束文件 上一步分配完管脚,保存,自动生成这个ucf文件。

76 综合 鼠标单击选中 顶层模块 fsk_modulator, 双击Synthesize

77 布局布线 鼠标单击选中 顶层模块 fsk_modulator, 双击Implement Design

78 添加仿真的tb文件

79 选择仿真类型

80 启动仿真

81 生成下载文件--.bit格式

82 下载文件1/3

83 下载文件2/3

84 下载文件3/3

85 目录 可综合Verilog语言 数字电路验证 HDL的软件仿真 FPGA简介 FPGA验证流程 FPGA设计中的基本问题

86 建立时间和保持时间 建立时间(setup time)是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据无法被打入触发器。 保持时间(hold time)是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间, 如果保持时间不够,可能输出亚稳态。 数据稳定传输必须满足建立和保持时间的要求。

87 FPGA中的冒险 组合逻辑电路中,信号经不同的路径传输后,到达电路中某一会合点的时间有先有后,这种现象称为逻辑竞争,而因此产生输出干扰脉冲的现象称为冒险。 与分立元件不同,由于ASIC内部的寄生电容电感很小,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在CPLD、FPGA设计中尤为突出。

88 FPGA中的冒险实例 下图给出了一个逻辑冒险的例子, 从仿真波形可以看出, “A、 B、 C、 D”四个输入信号的高低电平变换不是同时发生的, 导致输出信号“OUT”出现了毛刺。

89 消除毛刺 冒险往往会影响到逻辑电路的稳定性, 时钟端口、 清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错, 因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题 一般情况下有两种去除毛刺的方法,采样法和滤波法。 1、采样法 a.一种方法是在输出信号的保持时间内,用一定宽度的高电平脉冲与输出信号做逻辑"与"运算,由此获取输出信号的电平值

90

91 b.另一种更常见的方法是利用D触发器的D输入端对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号。

92 2、滤波法 在仿真时,我们也可能会发现在FPGA器件对外输出引脚上有输出毛刺,但由于毛刺时间很短,加上PCB本身的寄生参数,大多数情况下,毛刺通过PCB走线,基本可以自然被虑除,不用再外加阻容滤波。

93 清零和置位信号 在FPGA的设计中,全局的清零和置位信号必须经过全局的清零和置位管脚输入,因为他们也属于全局的资源,其扇出能力大,而且在FPGA内部是直接连接到所有的触发器的置位和清零端的,这样的做法会使芯片的工作可靠、性能稳定,而使用普通的IO脚则不能保证该性能。 在FPGA的设计中,除了从外部管脚引入的全局清零和置位信号外在FPGA内部逻辑的处理中也经常需要产生一些内部的清零或置位信号。清零和置位信号要求像对待时钟那样小心地考虑,因为这些信号对毛刺也是非常敏感的。

94 触发器与锁存器 触发器是在时钟的沿进行数据的锁存的,而锁存器是用电平使能来锁存数据的。所以触发器的Q输出端在每一个时钟沿都会被更新,而锁存器只能在使能电平有效器件才会被更新。 在FPGA设计中建议如果不是必须,那么应该尽量使用触发器而不是锁存器。 那么在使用硬件描述语言进行电路设计的时候如何区分触发器和锁存器的描述方法?其实有不少人在使用的过程中可能并没有特意区分过,所以也忽略了二者在描述方法上的区别。下面是用verilog语言描述的触发器和锁存器。

95 触发器的语言描述: module d_ff(clk,data,q) input clk,data; output q; reg q; clk) q<=data; endmodule D锁存器 module latchinf (enable, data, q); input enable, data; output q; reg q; or data) if (enable) q <= data; endmodule

96 FPGA系统速度 同步电路的速度是指同步时钟的速度。同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间处理的数据量就愈大。
我们先来看一看同步电路中数据传递的一个基本模型:如下图 Tdelay是组合逻辑的延时 Tsetup是触发器的建立时间 Tco是触发器时钟到数据输出的延时

97 假设数据已经被时钟的第一个上升沿打入D触发器,那么数据到达第一个触发器的Q端需要Tco,再经过组合逻辑的延时Tdelay到达的第二个触发器的D端,要想数据能在第二个上升沿稳定地锁入第二个触发器,则时钟周期不应小于Tco+Tdelay+Tsetup,由以上分析可知:最小时钟周期:T=Tco+Tdelay+Tsetup   最快时钟频率 F= 1/T    CPLD/FPGA开发软件也正是通过这个公式来计算系统运行速度Fmax 注:在这个逻辑图中有个参数:Tpd ,即时钟的延时参数,我们在刚才做时间分析的时候,没有提这个参数,(如果使用FPGA的全局时钟型号,Tpd可以几乎为0,如果是普通时钟,则不为0)。所以如果考虑到时钟的延时,精确的公式应该是T=Tco+Tdelay+Tsetup-Tpd。当然以上全部分析的都是器件内部的运行速度,如果考虑芯片I/O管脚延时对系统速度的影响,那么还需要加一些修正。

98 由于Tco、Tsetup是由具体的器件和工艺决定的,我们设计电路时只可以改变Tdelay。所以缩短触发器间组合逻辑的延时是提高同步电路速度的关键。由于一般同步电路都不止一级锁存(如下图),而要使电路稳定工作,时钟周期必须满足最大延时要求,缩短最长延时路径,才可提高电路的工作频率。 转移组合逻辑

99 如图所示:我们可以将较大的组合逻辑分解为较小的几块,中间插入触发器,这样可以提高电路的工作频率。这也是所谓“流水线”(pipelining)技术的基本原理。
分割组合逻辑

100 流水线操作设计思想 流水线处理是高速设计中的一个常用设计手段。如果某个设计的处理流程分为若干步骤,而且整个数据处理是 “ 单流向 ” 的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法来提高系统的工作频率。 流水线设计的结构示意图如上图 所示。其基本结构为:将适当划分的 n 个操作步骤单流向串联起来。流水线操作的最大特点和要求是,数据流在各个步骤的处理从时间上看是连续的,如果将每个操作步骤简化假设为通过一个 D 触发器 ( 就是用寄存器打一个节拍 ) ,那么流水线操作就类似一个移位寄存器组,数据流依次流经 D 触发器,完成每个步骤的操作。

101 流水线设计时序如上图 所示。 流水线设计的一个关键在于整个设计时序的合理安排,要求每个操作步骤的划分合理。如果前级操作时间恰好等于后级的操作时间,设计最为简单,前级的输出直接汇入后级的输入即可;如果前级操作时间大于后级的操作时间,则需要对前级的输出数据适当缓存才能汇入到后级输入端;如果前级操作时间恰好小于后级的操作时间,则必须通过复制逻辑,将数据流分流,或者在前级对数据采用存储、后处理方式,否则会造成后级数据溢出。

102 FPGA设计的基本思想 FPGA/CPLD 的设计思想与技巧是一个非常大的话题,由于篇幅所限,这里介绍一些常用的设计思想与技巧,包括乒乓球操作、串并转换、流水线操作和数据接口的同步方法。希望有意识地利用这些原则指导日后的设计工作,将取得事半功倍的效果! (一)、乒乓操作 “ 乒乓操作 ” 是一个常常应用于数据流控制的处理技巧,典型的乒乓操作方法如图 所示。

103 乒乓操作的处理流程为:输入数据流通过 “ 输入数据选择单元 ” 将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口 RAM(DPRAM) 、单口 RAM(SPRAM) 、 FIFO 等。 在第一个缓冲周期,将输入的数据流缓存到 “ 数据缓冲模块 1” ; 在第 2 个缓冲周期,通过 “ 输入数据选择单元 ” 的切换,将输入的数据流缓存到 “ 数据缓冲模块 2” ,同时将 “ 数据缓冲模块 1” 缓存的第 1 个周期数据通过 “ 输入数据选择单元 ” 的选择,送到 “ 数据流运算处理模块 ” 进行运算处理; 在第 3 个缓冲周期通过 “ 输入数据选择单元 ” 的再次切换,将输入的数据流缓存到 “ 数据缓冲模块 1” ,同时将 “ 数据缓冲模块 2” 缓存的第 2 个周期的数据通过 “ 输入数据选择单元 ” 切换,送到 “ 数据流运算处理模块 ” 进行运算处理。如此循环。

104 (二)、串并转换设计技巧 串并转换是 FPGA 设计的一个重要技巧,它是数据流处理的常用手段,也是面积与速度互换思想的直接体现。串并转换的实现方法多种多样,根据数据的排序和数量的要求,可以选用寄存器、 RAM 等实现。前面在乒乓操作的图例中,就是通过 DPRAM 实现了数据流的串并转换,而且由于使用了 DPRAM ,数据的缓冲区可以开得很大,对于数量比较小的设计可以采用寄存器完成串并转换。如无特殊需求,应该用同步时序设计完成串并之间的转换。 对于排列顺序有规定的串并转换,可以用 case 语句判断实现。对于复杂的串并转换,还可以用状态机实现。串并转换的方法比较简单,在此不必赘述。

105 注意问题 1、所有的状态机输入,包括复位、置位信号,都要用同步信号。所有的状态机输出都要用寄存器寄存输出。注意在状态机设计中不要出现死锁状态。 2、要用寄存器和触发器设计电路,尽量不要用锁存器,因它对输入信号的毛刺太敏感。如果坚持用锁存器设计必须保证输入信号绝对没有毛刺。

106 3、设计译码逻辑电路时必须十分小心,因为译码器和比较器本身会产生尖峰,容易产生毛刺,把译码器或比较器的输出直接连到时钟输入端或异步清除端,会造成严重的后果。
4、大部分FPGA器件都为时钟、复位、预置等信号提供特殊的全局布线资源,要充分利用这些资源。这样可以大大提高设计电路的性能。

107 5、不要试图用HDL语言去综合RAM、ROM或FIFO等存储模块。当前的综合工具主要用于产生逻辑电路,如需要用这些模块,直接调用或例化相应的宏单元即可。
6、注意仿真结果和实际综合的电路的不一致性。不带延时的行为级仿真,仿真结果将会隐藏竞争冒险和毛刺现象,与实际行为相差较远。

108 演示 ISE操作演示

109 作业 设计流水灯,要求: 1、驱动5个LED发光管发光(用高电平表示发光),要求轮流发光,产生流水灯的流动效果; 2、应具有正向依次闪亮和逆向依次闪亮2种效果,有闪亮效果切换键; 3、利用ISE软件进行功能仿真及布局布线后仿真。 注: 1、在ISE中自选最合适的FPGA ,用UCF文件约束管脚位置; 2、FPGA外接晶振50MHz; 3、检查功能仿真及布局布线后仿真两个波形图。


Download ppt "可综合Verilog语言及FPGA验证 2015-12-08."

Similar presentations


Ads by Google