可 综合 verilog 语言及 fpga 验证

108
可可可 Verilog 可可可 FPGA 可可 可可可可 ICLAB 可可可 2016-12-12

Upload: seanna

Post on 22-Mar-2016

283 views

Category:

Documents


12 download

DESCRIPTION

可 综合 Verilog 语言及 FPGA 验证. 2013-12-11. 目录. Verilog HDL 简介. Verilog HDL 是一种应用广泛的硬件描述性语言,是硬件设计人员和电子设计自动化( EDA )工具之间的界面。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 可 综合 Verilog 语言及 FPGA 验证

可综合 Verilog 语言及 FPGA 验证浙江大学 ICLAB 实验室

2016-12-12

Page 2: 可 综合 Verilog 语言及 FPGA 验证

可综合 Verilog 语言

数字电路验证

HDL 的软件仿真

FPGA 简介

FPGA 设计流程

FPGA 设计中的基本问题

目录

2/108

Page 3: 可 综合 Verilog 语言及 FPGA 验证

Verilog HDL 简介• Verilog HDL 是一种应用广泛的硬件描述性语言,是硬件设计人员和电子设计自动化( EDA )工具之间的界面。• 利用 Verilog 进行的开发步骤如下:

编写设计和仿真文件 综合前仿真 逻辑综合 综合后仿真 实现: ASIC 芯片、 CPLD 或 FPGA

• FPGA 常用的 Verilog HDL 语言开发软件有 Altera 公司的Quartus II 和 Xilinx 公司的 ISE 。

3/108

Page 4: 可 综合 Verilog 语言及 FPGA 验证

为什么要用 Verilog HDL ?• 电子设计规模越来越大(普通设计已达几百万门的数量

级) ,复杂度越来越高。有必要用高级语言来表达其功能,隐藏其具体的细节实现。

• 提高逻辑设计的效率,降低设计成本,更重要的是缩短设计周期。

• 可读性强,易修改。 从 HDL 到具体的硬件电路是由 EDA 工具软件的综合器完成,但并不是所有 Verilog HDL 语句均可被综合。

注意:

4/108

Page 5: 可 综合 Verilog 语言及 FPGA 验证

可综合设计 可综合指的是所设计的代码能转化为具体的电路网表。在

用 CPLD/FPGA 器件实现的数字设计中,综合就是将Verilog HDL 语言转化为门级电路网表的过程。

不可综合设计则主要用于设计的仿真。逻辑综合 = 翻译 + 优化 + 映射

5/108

Page 6: 可 综合 Verilog 语言及 FPGA 验证

可综合 / 不可综合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……

6/108

Page 7: 可 综合 Verilog 语言及 FPGA 验证

其他不可综合的情况1 、敏感列表里同时带有时钟的 posedge 和 negedge 如: always @(posedge 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 不可综合

7/108

Page 8: 可 综合 Verilog 语言及 FPGA 验证

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

8/108

Page 9: 可 综合 Verilog 语言及 FPGA 验证

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

设计准则(续)

9/108

Page 10: 可 综合 Verilog 语言及 FPGA 验证

敏感列表敏感表不完全 :module sens (a, q, b, sl);input a, b, sl;output q;reg q;always @( sl)begin if (! sl) q = a; else q = b;endendmodule

完全的敏感列表module sensc (q, a, b, sl);input a, b, sl;output q;reg q;always @( sl or a or b) 或者@ ( * )begin if (! sl) q = a; else q = b;endendmodule

在下面的例子, a, b, sl 是块的输入• sl 用作条件• a 、 b 用在过程赋值语句的右边

将块的所有输入都列入敏感表是很好的描述习惯。不同的综合工具对不完全敏感表的处理有所不同。有的将不完全敏感表当作非法。其他的则产生一个警告并假设敏感表是完全的。在这种情况下,综合输出和 RTL 描述的仿真结果可能不一致。 10/108

Page 11: 可 综合 Verilog 语言及 FPGA 验证

完全的条件语句module compcase (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( 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; endcaseendmodule

module compif (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( 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 例中定义了所有可能的选项,综合结果是纯组合逻辑,没有不期望的锁存器产生。

Case 完全条件语句 if 完全条件语句

11/108

Page 12: 可 综合 Verilog 语言及 FPGA 验证

不完全条件语句module inccase (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) case ({ a, b}) 2'b11: e = d; 2'b10: e = ~c; endcaseendmodule

module incpif (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) if (a & b) e = d; else if (a & ~b) e = ~c;endmodule

在上面的例子中,当 a 变为零时,不对 e 赋新值。因此 e保存其值直到 a 变为 1 。这是锁存器的特性。

若 a 变为 0 ,

e 为何值Case 不完全条件语句 if 不完全条件语句

12/108

Page 13: 可 综合 Verilog 语言及 FPGA 验证

default , else 完全条件语句module comcase (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( a or b or c or d) case ({ a, b}) 2'b11: e = d; 2'b10: e = ~c; default: e = 'bx; endcaseendmodule

module compif (a, b, c, d, e); input a, b, c, d; output e; reg e; always @( 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” ,可以进行更好的优化。 例中没有定义所有选项,但对没有定义的项给出了缺省行为。同样,其综合结果为纯组合逻辑——没有不期望的锁存器产生。

13/108

Page 14: 可 综合 Verilog 语言及 FPGA 验证

指示完全条件语句module dircase (a, b, c, d); input b, c; input [1: 0] a; output d; reg d; always @( a or b or c) case (a) // ambit synthesis case = full 2'b00: d = b; 2'b01: d = c; endcaseendmodule

和前例一样,没有定义所有 case项,对于 a=1 的值设计者并不关心,综合指示通知优化器缺少的 case项不会发生。结果也为纯组合逻辑,没有不期望锁存器产生。

14/108

Page 15: 可 综合 Verilog 语言及 FPGA 验证

阻塞或非阻塞使用的赋值类型依赖于所描述的逻辑类型:• 在时序块 RTL 代码中使用非阻塞赋值

– 非阻塞赋值语句之间是并行处理的,没有先后顺序• 在组合的 RTL 代码中使用阻塞赋值

– 阻塞赋值语句之间按先后顺序执行

15/108

Page 16: 可 综合 Verilog 语言及 FPGA 验证

阻塞、非阻塞对比module bloc (clk, a, b); input clk, a; output b; reg y; reg b; always @( posedge clk) begin y =a; b =y; endendmodule

module nonbloc (clk, a, b); input clk, a; output b; reg y; reg b; always @( posedge clk) begin y <= a; b <= y; endendmodule

使用阻塞赋值,此描述综合出一个 D flip-flop: 不建议 使用非阻塞赋值,此描述将综合出两个 D Flip-flop 。

16/108

Page 17: 可 综合 Verilog 语言及 FPGA 验证

资源共享资源共享是指多节代码共享一组逻辑。例如:

always @( a or b or c or d) if (a) out = b + c; else out = b + d;

没有资源共享 资源共享

资源共享与所用综合工具有关。但通常,要共享资源,表达式必须在同一个 always 块中的同一个条件语句中(如右边代码所示)。

17/108

Page 18: 可 综合 Verilog 语言及 FPGA 验证

资源共享只有在同一个条件语句 (if 和 case) 不同的分支中的算术操作才会共享。条件操作符 ?: 中的算术操作不共享。if (cond)

z = a + b;

else

z = c + d;

Z = (cond) ? (a + b) : (c + d);

18/108

Page 19: 可 综合 Verilog 语言及 FPGA 验证

括号的作用利用括号分割逻辑。

z = a + b + c + d;

Z = (a + b) + (c + d);

+

a

b+c

+z

d

+

a

b

+

c

d

+z

目前综合工具可以自动优化成下图的形式

19/108

Page 20: 可 综合 Verilog 语言及 FPGA 验证

可综合 Verilog 语言

数字电路验证

HDL 的软件仿真

FPGA 简介

FPGA 设计流程

FPGA 设计中的基本问题

目录

20/108

Page 21: 可 综合 Verilog 语言及 FPGA 验证

数字 IC 设计流程

综合

系统定义 HDL 代码编写 功能验证

布局布线流片 综合

前端设计

后端设计

21/108

Page 22: 可 综合 Verilog 语言及 FPGA 验证

为什么需要验证 ?• 1. 语法检查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];always @(posedge 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 要匹配22/108

Page 23: 可 综合 Verilog 语言及 FPGA 验证

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

a=0,b=1,c=0,test=?

23/108

Page 24: 可 综合 Verilog 语言及 FPGA 验证

验证的必要性经验表明,验证已经占到整个产品开发周期的70% 以上,它已经成为复杂 SOC 开发中的重要壁垒。

Verification is hard没有一个简单的工具可以解决你所有的验证问题。

24/108

Page 25: 可 综合 Verilog 语言及 FPGA 验证

如何验证?1. 软件验证Modelsim,Questasim (后者对 system

verilog, system C 支持较好 ) , PT , Formality , calibre

2. 硬件验证 ---FPGA 或者 CPLD开发工具 ISE , Quartus II

25/108

Page 26: 可 综合 Verilog 语言及 FPGA 验证

常用工具工作站启动方法• Modelsim6.5

• source /opt/demo/modelsim.env• vsim

• ISE12.4• source /opt/demo/ise.env• ise &

26/108

Page 27: 可 综合 Verilog 语言及 FPGA 验证

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

27/108

Page 28: 可 综合 Verilog 语言及 FPGA 验证

可综合 Verilog 语言

数字电路验证

HDL 的软件仿真

FPGA 简介

FPGA 设计流程

FPGA 设计中的基本问题

目录

28/108

Page 29: 可 综合 Verilog 语言及 FPGA 验证

测试矢量 --Testbench Testbench 更像一个激励的产生器 , 对所设计的输入管脚产生相应的输入值( 0 ,或者 1 ),通过观察输出值来评估设计的正确性。

Testbench 的工作就是把这些不同的输入值加载到所设计的电路中。

a b c test0 0 0 10 0 1 10 1 0 10 1 1 11 0 0 01 0 1 01 1 0 01 1 1 1

test=~a|(b&c);

29/117

Page 30: 可 综合 Verilog 语言及 FPGA 验证

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

30/117

Page 31: 可 综合 Verilog 语言及 FPGA 验证

编写 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)); // 调用设计模块initialbeginbegin 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;endendendmodule

不需要端口列表和端口类型定义

31/108

Page 32: 可 综合 Verilog 语言及 FPGA 验证

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

testbench 编译 仿真

32/108

Page 33: 可 综合 Verilog 语言及 FPGA 验证

建立新的工作库

33/108

Page 34: 可 综合 Verilog 语言及 FPGA 验证

建立新的工程 1/2

34/108

Page 35: 可 综合 Verilog 语言及 FPGA 验证

建立新的工程 2/2

存放 verilog 代码的目录

35/108

Page 36: 可 综合 Verilog 语言及 FPGA 验证

编译编译前状态

编译后状态

36/108

Page 37: 可 综合 Verilog 语言及 FPGA 验证

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

编译状态刷新

37/108

Page 38: 可 综合 Verilog 语言及 FPGA 验证

绿色对号表示编译无误。红色叉号表示有错误。黄色感叹号表示有警告。错误查看:双击红色叉号。编译错误查看

数字表示错误代码行数,比如这里的 16 ,表示代码第 16 行有错误,双击这行可以直接定位到错误处。38/108

Page 39: 可 综合 Verilog 语言及 FPGA 验证

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

错误修改

39/108

Page 40: 可 综合 Verilog 语言及 FPGA 验证

仿真 1/2• 启动仿真方法一

选择的这个模块一定要是testbench 的模块

40/108

Page 41: 可 综合 Verilog 语言及 FPGA 验证

仿真 2/2• 启动仿真方法二

选中 testbench 模块后鼠标右键

41/108

Page 42: 可 综合 Verilog 语言及 FPGA 验证

波形查看

变量

过程块

42/108

Page 43: 可 综合 Verilog 语言及 FPGA 验证

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

43/108

Page 44: 可 综合 Verilog 语言及 FPGA 验证

波形查看

跑固定时间 跑完全部44/108

Page 45: 可 综合 Verilog 语言及 FPGA 验证

结束仿真

45/108

Page 46: 可 综合 Verilog 语言及 FPGA 验证

可综合 Verilog 语言

数字电路验证

HDL 的软件仿真

FPGA 简介

FPGA 设计流程

FPGA 设计中的基本问题

目录

46/108

Page 47: 可 综合 Verilog 语言及 FPGA 验证

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

FPGA

47/108

Page 48: 可 综合 Verilog 语言及 FPGA 验证

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

FPGA 的结构

48/108

Page 49: 可 综合 Verilog 语言及 FPGA 验证

FPGA 的结构

CLB

IR

IOB CLB

CLB CLB

CLB

CLB

CLB CLB CLB

IOB IOBIOB

IOB

IOB

IOB

IOB

IOB IOB

IOB IOB

IRIR

IR IR IR IR

IR

IR

IR

IR

IR

IRIR

IRIR

49/108

Page 50: 可 综合 Verilog 语言及 FPGA 验证

• CLB 主要由逻辑函数发生器、触发器、数据选择器等电路组成

可编程逻辑块 CLB

0000010100000101

16× 1RAM

A输入 B输入 C输入 D输入

查找表输出

多路选择器

查找表LUT

1输入

2输入

3输入

4输入

输出

函数发生器基于查找表 LUT单元:

50/108

Page 51: 可 综合 Verilog 语言及 FPGA 验证

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

输入 / 输出模块 IOB

51/108

Page 52: 可 综合 Verilog 语言及 FPGA 验证

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

可编程互连资源( PIR )

52/108

Page 53: 可 综合 Verilog 语言及 FPGA 验证

• CPLD(Complex Programmable Logic Device) 复杂可编程逻辑器件

• FPGA 与 CPLD 的辨别和分类主要是根据其结构特点和工作原理。通常的分类方法是: 将以乘积项结构方式构成逻辑行为的器件称为 CPLD 。 将以查表法结构方式构成逻辑行为的器件称为 FPGA 。

CPLD

53/108

Page 54: 可 综合 Verilog 语言及 FPGA 验证

FPGA 与 CPLD 的区别CPLD FPGA

程序存储 内部 EEPROM SRAM ,外挂 EEPROM

资源类型 组合电路资源丰富 触发器资源丰富集成度 低 高

使用场合 完成控制逻辑 完成比较复杂的算法编程元素 非易失性

( FLASH 、 EEPROM)

易失性( SRAM )

上电速度 快,上电后立即开始工作 慢(从外部存储器读取)保密性 好 差

其他资源 — PLL 、 DSP54/108

Page 55: 可 综合 Verilog 语言及 FPGA 验证

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

FPGA生产厂商

55/108

Page 56: 可 综合 Verilog 语言及 FPGA 验证

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

Altera

56/108

Page 57: 可 综合 Verilog 语言及 FPGA 验证

• Cyclone V: 2011年推出 ,28nm 工艺 ,1.1v内核供电。Cyclone V 不同型号概览

功能 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 4 4 4 4

DSP 39 78 132 220 406

存储器控制硬核 1 1 2 2 2

支持 I/O 电压( V ) 1.1, 1.2, 1.5, 1.8, 2.5, 3.3

57/108

Page 58: 可 综合 Verilog 语言及 FPGA 验证

• 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 376 512 512 1,000 1,500

支持 I/O 电压( V ) 1.2, 1.5, 1.8, 2.5, 3.3 58/108

Page 59: 可 综合 Verilog 语言及 FPGA 验证

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

Xilinx

59/108

Page 60: 可 综合 Verilog 语言及 FPGA 验证

• Spartan-6: 2009年初推出, 45nm 工艺,面向低成本、低功耗应用。器件 逻辑单元

最大Block RAM ( kb )

DSP块 存储器控制块

最大用户 I/O 数

价格(美元)

XC6SLX4 3,840 216 8 0 132 6-10XC6SLX9 9,152 576 16 2 200 10-15XC6SLX16 14,579 576 32 2 232 13-25

XC6SLX25 24,051 936 38 2 266 20-42

XC6SLX45 43,661 2,088 58 2 358 30-52

XC6SLX75 74,637 3,096 132 4 408 52-80

XC6SLX100 101,261 4,824 180 4 480 63-137

XC6SLX150 147,443 4,824 180 4 576 97-180

注: DSP 块内含 18x18乘法器、加法器、累加器各 1 个60/108

Page 61: 可 综合 Verilog 语言及 FPGA 验证

• Virtex-6: 2009年初推出, 45nm 工艺,面向高性能应用。器件 逻辑单元

最大 Block RAM ( kb)

DSP块 最大用户I/O 数

XC6VLX75T 74,496 5,616 288 360XC6VLX130T 128,000 9,504 480 600XC6VLX195T 199,680 12,384 640 600XC6VLX240T 241,152 14,976 768 720XC6VLX365T 364,032 14,976 576 720XC6VLX550T 549,888 22,752 864 1200XC6VLX760 758,784 25,920 864 1200

61/108

Page 62: 可 综合 Verilog 语言及 FPGA 验证

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

Xilinx-7系列

62/108

Page 63: 可 综合 Verilog 语言及 FPGA 验证

FPGA 开发板

63/108

Page 64: 可 综合 Verilog 语言及 FPGA 验证

可综合 Verilog 语言

数字电路验证

HDL 的软件仿真

FPGA 简介

FPGA 设计流程

FPGA 设计中的基本问题

目录

64/108

Page 65: 可 综合 Verilog 语言及 FPGA 验证

FPGA 开发工具和语言

65/108

Page 66: 可 综合 Verilog 语言及 FPGA 验证

Xilinx--ISE

Page 67: 可 综合 Verilog 语言及 FPGA 验证

Altera--Quartus II

Page 68: 可 综合 Verilog 语言及 FPGA 验证

Actel--Libero

Page 69: 可 综合 Verilog 语言及 FPGA 验证

Lattice--ispLEVER

Page 70: 可 综合 Verilog 语言及 FPGA 验证

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

70/108

Page 71: 可 综合 Verilog 语言及 FPGA 验证

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

71/108

Page 72: 可 综合 Verilog 语言及 FPGA 验证

创建新工程 2/2

接下来一直Next..

Spartan3XC3S400FT256-4

72/108

Page 73: 可 综合 Verilog 语言及 FPGA 验证

添加设计文件鼠标右键

73/108

Page 74: 可 综合 Verilog 语言及 FPGA 验证

分配 IO管脚 1/2

74/108

Page 75: 可 综合 Verilog 语言及 FPGA 验证

添加管脚约束文件分配 IO管脚 2/2

上一步分配完管脚,保存,自动生成这个 ucf 文件。

75/108

Page 76: 可 综合 Verilog 语言及 FPGA 验证

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

76/108

Page 77: 可 综合 Verilog 语言及 FPGA 验证

鼠标单击选中顶层模块fsk_modulator,双击 ImplementDesign

布局布线

77/108

Page 78: 可 综合 Verilog 语言及 FPGA 验证

添加仿真的 tb 文件

78/108

Page 79: 可 综合 Verilog 语言及 FPGA 验证

选择仿真类型

79/108

Page 80: 可 综合 Verilog 语言及 FPGA 验证

启动仿真

80/108

Page 81: 可 综合 Verilog 语言及 FPGA 验证

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

81/108

Page 82: 可 综合 Verilog 语言及 FPGA 验证

下载文件 1/3

82/108

Page 83: 可 综合 Verilog 语言及 FPGA 验证

下载文件 2/3

83/108

Page 84: 可 综合 Verilog 语言及 FPGA 验证

下载文件 3/3

84/108

Page 85: 可 综合 Verilog 语言及 FPGA 验证

可综合 Verilog 语言

数字电路验证

HDL 的软件仿真

FPGA 简介

FPGA 验证流程

FPGA 设计中的基本问题

目录

85/108

Page 86: 可 综合 Verilog 语言及 FPGA 验证

建立时间和保持时间

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

86/108

Page 87: 可 综合 Verilog 语言及 FPGA 验证

FPGA 中的冒险组合逻辑电路中,信号经不同的路径传输后,到达电路中某一会合点的时间有先有后,这种现象称为逻辑竞争,而因此产生输出干扰脉冲的现象称为冒险。

与分立元件不同,由于 CPLD 、 FPGA内部的寄生电容电感很小,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在 CPLD 、 FPGA 设计中尤为突出。

87/108

Page 88: 可 综合 Verilog 语言及 FPGA 验证

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

毛刺信号

0

1

0

0

0

Name:

A

B

C

D

OUT

Value: 100.0ns 200.0ns 300.0ns 400.0ns

FPGA 中的冒险实例

88/108

Page 89: 可 综合 Verilog 语言及 FPGA 验证

消除毛刺

1 、采样法利用 D触发器的 D 输入端对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号。

冒险往往会影响到逻辑电路的稳定性, 时钟端口、 清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错, 因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题一般情况下有两种去除毛刺的方法,采样法和滤波法。

89/108

Page 90: 可 综合 Verilog 语言及 FPGA 验证

毛刺信号

采样时钟

去除毛刺后的输出信号

Name: Value: 200.0ns 400.0ns 600.0ns 800.0ns

A

B

C

D

CLK

TEST

OUT 0

0

1

0

0

1

0

90/108

Page 91: 可 综合 Verilog 语言及 FPGA 验证

2 、滤波法

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

91/108

Page 92: 可 综合 Verilog 语言及 FPGA 验证

清零和置位信号在 FPGA 的设计中,全局的清零和置位信号必须经过全局的清零和置位管脚输入,因为他们也属于全局的资源,其扇出能力大,而且在 FPGA内部是直接连接到所有的触发器的置位和清零端的,这样的做法会使芯片的工作可靠、性能稳定,而使用普通的 IO脚则不能保证该性能。

在 FPGA 的设计中,除了从外部管脚引入的全局清零和置位信号外在 FPGA内部逻辑的处理中也经常需要产生一些内部的清零或置位信号。清零和置位信号要求像对待时钟那样小心地考虑,因为这些信号对毛刺也是非常敏感的。

92/108

Page 93: 可 综合 Verilog 语言及 FPGA 验证

触发器与锁存器触发器是在时钟的沿进行数据的锁存的,而锁存器是用电

平使能来锁存数据的。所以触发器的 Q 输出端在每一个时钟沿都会被更新,而锁存器只能在使能电平有效期间才会被更新。

在 FPGA 设计中建议如果不是必须,那么应该尽量使用触发器而不是锁存器。

那么在使用硬件描述语言进行电路设计的时候如何区分触发器和锁存器的描述方法?其实有不少人在使用的过程中可能并没有特意区分过,所以也忽略了二者在描述方法上的区别。下面是用 verilog 语言描述的触发器和锁存器。

93/108

Page 94: 可 综合 Verilog 语言及 FPGA 验证

触发器的语言描述:module d_ff(clk,data,q)input clk,data;output q;reg q;

always @(posedge clk)q<=data;endmodule

D 锁存器module latchinf (enable, data, q);input enable, data;output q;reg q;

always @(enable or data)if (enable)q <= data;

endmodule

94/108

Page 95: 可 综合 Verilog 语言及 FPGA 验证

FPGA系统速度 同步电路的速度是指同步时钟的速度。同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间处理的数据量就愈大。我们先来看一看同步电路中数据传递的一个基本模型:如下图

Tco 是触发器时钟到数据输出的延时

Tdelay 是组合逻辑的延时

Tsetup 是触发器的建立时间

95/108

Page 96: 可 综合 Verilog 语言及 FPGA 验证

假设数据已经被时钟的第一个上升沿打入 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管脚延时对系统速度的影响,那么还需要加一些修正。

96/108

Page 97: 可 综合 Verilog 语言及 FPGA 验证

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

转移组合逻辑 97/108

Page 98: 可 综合 Verilog 语言及 FPGA 验证

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

分割组合逻辑 98/108

Page 99: 可 综合 Verilog 语言及 FPGA 验证

流水线操作设计思想流水线处理是高速设计中的一个常用设计手段。如果某个设计的处理流程分为若干步骤,而且整个数据处理是 “ 单流向 ” 的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法来提高系统的工作频率。

流水线设计的结构示意图如上图 所示。其基本结构为:将适当划分的 n 个操作步骤单流向串联起来。流水线操作的最大特点和要求是,数据流在各个步骤的处理从时间上看是连续的,如果将每个操作步骤简化假设为通过一个 D 触发器 ( 就是用寄存器打一个节拍 ) ,那么流水线操作就类似一个移位寄存器组,数据流依次流经 D 触发器,完成每个步骤的操作。

99/108

Page 100: 可 综合 Verilog 语言及 FPGA 验证

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

“ 乒乓操作 ” 是一个常常应用于数据流控制的处理技巧,典型的乒乓操作方法如图 所示。 100/108

Page 101: 可 综合 Verilog 语言及 FPGA 验证

乒乓操作的处理流程为:输入数据流通过 “ 输入数据选择单元 ” 将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口 RAM(DPRAM) 、单口 RAM(SPRAM) 、 FIFO 等。

在第一个缓冲周期,将输入的数据流缓存到 “ 数据缓冲模块 1” ;在第 2 个缓冲周期,通过 “ 输入数据选择单元 ” 的切换,将输入的数据流缓存到 “ 数据缓冲模块 2” ,同时将 “ 数据缓冲模块 1” 缓存的第 1 个周期数据通过 “ 输出数据选择单元 ” 的选择,送到 “ 数据流运算处理模块 ” 进行运算处理;

在第 3 个缓冲周期通过 “ 输入数据选择单元 ” 的再次切换,将输入的数据流缓存到 “ 数据缓冲模块 1” ,同时将 “ 数据缓冲模块 2” 缓存的第 2 个周期的数据通过 “ 输入数据选择单元 ” 切换,送到 “ 数据流运算处理模块 ” 进行运算处理。如此循环。

101/108

Page 102: 可 综合 Verilog 语言及 FPGA 验证

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

102/108

Page 103: 可 综合 Verilog 语言及 FPGA 验证

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

注意问题

103/108

Page 104: 可 综合 Verilog 语言及 FPGA 验证

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

104/108

Page 105: 可 综合 Verilog 语言及 FPGA 验证

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

105/108

Page 106: 可 综合 Verilog 语言及 FPGA 验证

• ISE操作演示演示

106/108

Page 107: 可 综合 Verilog 语言及 FPGA 验证

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

Page 108: 可 综合 Verilog 语言及 FPGA 验证

Thanks

108/108