Transcript Document

可综合Verilog语言及FPGA验证
2013-12-11
目录
可综合Verilog语言
数字电路验证
HDL的软件仿真
FPGA简介
FPGA验证流程
FPGA设计中的基本问题
2/108
Verilog HDL简介
• Verilog HDL是一种应用广泛的硬件描述性语言,是硬件设
计人员和电子设计自动化(EDA)工具之间的界面。
• 其主要目的是用来编写设计文件,建立电子系统行为级的仿
真模型。即利用计算机的巨大能力对用Verilog HDL建模的
复杂数字逻辑进行仿真,然后再自动综合以生成符合要求且
在电路结构上可以实现的数字逻辑网表(Netlist), 根据网
表和某种工艺的器件自动生成具体电路,然后生成该工艺条
件下这种具体电路的延时模型。仿真验证无误后用于制造
ASIC芯片或写入CPLD和FPGA器件中。
• 常用的Verilog HDL语言开发软件有Altera公司的Quartus II
和Xilinx公司的ISE。
3/108
为什么要用Verilog HDL?
• 电子设计规模越来越大(普通设计已达几百万门的数
量级) ,复杂度越来越高。有必要用高级语言来表
达其功能,隐藏其具体的细节实现。
• 提高逻辑设计的效率,降低设计成本,更重要的是缩
短设计周期。
• 可读性强,易修改。
注意:
将HDL描述在目标器件上实现是由EDA工具软件的综
合器完成,并不是所有Verilog HDL语句均可被综合。
4/108
可综合设计
可综合指的是所设计的指令
和代码能转化为具体的电路
网表结构。在用CPLD/FPGA
器件实现的数字设计中,综
合就是将Verilog HDL语言描
述的行为级或数据流电路模
型转化为RTL级功能块或门
级电路网表的过程。而不可
综合设计则主要用于设计的
验证、仿真。综合过程的示
意图如图所示。
Verilog HDL行为级
或数据流电路建模
RTL级综合
RTL级功能块
逻辑优化
门级综合
优化后的门级网表
RTL级综合后得到由功能模块构成的
电路结构,逻辑优化器以用户设定的
面积和定时约束为目标优化电路网表,
针对目标工艺产生优化后的电路门级
网表结构。
5/108
可综合/不可综合 结构
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,parameter……
2、综合工具不支持的结构:
time,defparam,$finish,fork,join,initial,delays,
wait……
6/108
其他不可综合的结构
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
设计准则
要保证Verilog HDL语句的可综合性,在建模时应注意以下
要点:
(1)不使用initial。
(2)不使用#延时。
(3)不使用循环次数不确定的循环语句,如forever、while
等。
(4)不使用用户自定义原语(UDP元件)。
(5)尽量使用同步方式设计电路。
(6)除非是关键路径的设计,一般不采用调用门级元件来
描述设计的方法,建议采用行为语句来完成设计。
8/108
设计准则(续)
(7)用always过程块描述组合逻辑,应在敏感信号列表中
列出所有的输入信号。
(8)所有的内部寄存器都应该能够被复位,在使用FPGA实
现设计时,应尽量使用器件的全局复位端作为系统总的复位。
(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值(<=)方
式。对组合逻辑描述和建模,既可以用阻塞赋值(=),也可以用
非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值
和非阻塞赋值。
(10)不能在一个以上的always过程块中对同一个变量赋值。
而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式
赋值。
9/108
设计准则(续)
(11)如果不打算把变量推导成锁存器,那么必须在if语
句或case语句的所有条件分支中都对变量明确地赋值。
(12)避免混合使用上升沿和下降沿触发的触发器。
(13)同一个变量的赋值不能受多个时钟控制,也不能受
两种不同的时钟条件(或者不同的时钟沿)控制。
(14)避免在case语句的分支项中使用不定态x值或高阻
态z值。
10/108
敏感列表
在下面的例子,a, b, sl是块的输入
• sl用作条件
• a、b用在过程赋值语句的右边
敏感表不完全:
完全的敏感列表
module sens (a, q, b, sl);
module sensc (q, a, b, sl);
input a, b, sl;
input a, b, sl;
output q;
output q;
reg q;
reg q;
always @( sl)
always @( sl or a or b)
begin
begin
if (! sl)
if (! sl)
q = a;
q = a;
else
else
q = b;
q = b;
end
end
endmodule
endmodule
将块的所有输入都列入敏感表是很好的描述习惯。不同的综合工具对不完全敏感
表的处理有所不同。有的将不完全敏感表当作非法。其他的则产生一个警告并假
设敏感表是完全的。在这种情况下,综合输出和RTL描述的仿真结果可能不一致。
11/108
条件语句
自然完全的条件语句
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;
2'b01: e = 1'b0;
2'b00: e = 1'b1;
endcase
endmodule
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
例中定义了所有可能的选项,综合结果是纯组合逻辑,没有不期望
的锁存器产生。
12/108
不完全条件语句
若 a 变为 0,
e 为何值
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;
endcase
endmodule
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。这是锁存器的特性。
13/108
default完全条件语句
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;
endcase
endmodule
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”,可
以进行更好的优化。
例中没有定义所有选项,但对没有定义的项给出了缺省行为。同
样,其综合结果为纯组合逻辑——没有不期望的锁存器产生。
14/108
指示完全条件语句
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;
endcase
endmodule
和前例一样,没有定义所有case项,但综合指示通知优化器缺少的
case项不会发生。结果也为纯组合逻辑,没有不期望锁存器产生。注
意如果缺少的case项发生,而其结果未定义,综合结果和RTL的描述的
行为可能不同。
15/108
阻塞或非阻塞
使用的赋值类型依赖于所描述的逻辑类型:
• 在时序块RTL代码中使用非阻塞赋值
– 非阻塞赋值保存值直到时间片段的结束,从而避免
仿真时的竞争情况或结果的不确定性
• 在组合的RTL代码中使用阻塞赋值
– 阻塞赋值立即执行
16/108
阻塞、非阻塞对比
非阻塞赋值语句并行执行,因此临时变量不可避免地在一个周期中
被赋值,在下一个周期中被采样。
使用阻塞赋值,此描述综合
出一个D flip-flop:
使用非阻塞赋值,此描述将
综合出两个D Flip-flop。
module bloc (clk, a, b);
input clk, a;
output b;
reg y;
reg b;
always @( posedge clk)
begin
y =a;
b =y;
end
endmodule
module nonbloc (clk, a, b);
input clk, a;
output b;
reg y;
reg b;
always @( posedge clk)
begin
y <= a;
b <= y;
end
endmodule
17/108
资源共享
资源共享是指多节代码共享一组逻辑。例如:
always @( a or b or c or d)
if (a)
out = b + c;
资源共享与所用综合工具有关。但通
常,要共享资源,表达式必须在同一
个always块中的同一个条件语句中。
else
out = b + d;
没有资源共享
资源共享
18/108
资源共享
只有在同一个条件语句(if和case)不同的分支中的算术操作才会共享。
条件操作符 ?: 中的算术操作不共享。
if (cond)
z = a + b;
else
z = c + d;
Z = (cond) ? (a + b) : (c + d);
19/108
括号的作用
利用括号分割逻辑。
a
z = a + b + c
+ d;
b
+
c
+
+
d
a
Z = (a + b) + (c +
d);
b
+
z
+
c
d
+
20/108
z
目录
可综合Verilog语言
数字电路验证
HDL的软件仿真
FPGA简介
FPGA验证流程
FPGA设计中的基本问题
21/108
系统定义
HDL代码编
写
功能验证
前端设计
后端设计
流片
布局布线
22/108
综合综合
为什么需要验证?
• 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];
reg类型变量不
assign clk_d8=~count[2];
能使用连续赋
always @(posedge clk) if(!en) count<=0;
值
else if (en)
if (!data_in) count=count+1;
同一过程块赋
else
值类型要一致,
begin
reg类型最好使
if (count==6) count<=0;
用“<=“非阻塞
else
count<=count+1;
赋值
endmodule
begin—end 要匹配
23/108
为什么需要验证?
2.逻辑检查
assign test=~a|(b&c); 如果
a=0,b=1,c=0,test= 1
24/108
验证的必要性

经验表明,验证已经占到整个产品开发周期的
70%以上,它已经成为复杂SOC开发中的重要壁
垒。

Verification is hard没有一个简单的工具
可以解决你所有的验证问题。
25/108
如何验证?
1.软件验证---仿真
Modelsim,Questasim(后者对system
verilog, system C支持较好)
2.硬件验证---FPGA或者CPLD
编译下载软件ISE,Quartus II
26/108
常用工具工作站启动方法
• Modelsim6.5
• source /opt/demo/modelsim.env
• vsim
• ISE12.4
• source /opt/demo/ise.env
• ise &
27/108
前端设计流程
1.代码编写
2.编写测试矢量(testbench)
3.运行仿真软件仿真
或者
1.代码编写
2.运行FPGA软件编译下载进行验证
28/108
目录
可综合Verilog语言
数字电路验证
HDL的软件仿真
FPGA简介
FPGA验证流程
FPGA设计中的基本问题
29/108
测试矢量--Testbench
test=~a|(b&c);
Testbench更像一个激励的
产生器,对所设计的输入管脚
产生相应的输入值(0,或
者1),通过观察输出值来
评估设计的正确性。
Testbench 的工作就是把这
些不同的输入值加载到所设
计的电路中。
a
0
0
0
0
1
1
1
1
30/117
b
0
0
1
1
0
0
1
1
c
0
1
0
1
0
1
0
1
test
1
1
1
1
0
0
0
1
Testbench与设计模块的关系
•
•
•
•
仿真软件--铁锅
设计模块--准备好的生菜
Testbench--调料
观察输出--尝味道
• 仿真---修改---再仿真
31/117
编写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/108
Modelsim 仿真步骤

启动Modelsim
source /opt/demo/modelsim.env(注意空格)
vsim&





建立新的编译库
FileNewlibrary
建立新的工程
FileNewproject
添加.v文件到新的project,包括测试激励
testbench
编译
仿真
33/108
建立新的工作库
34/108
建立新的工程1/2
35/108
建立新的工程2/2
存放verilog代码的目录
36/108
编译
编译前状态
编译后状态
37/108
编译状态刷新
• 状态刷新很慢的情况下
在主窗口下鼠标右键
弹出来的选项中选择
Update
38/108
编译错误查看
绿色对号表示编译无误。红色叉号表示有错误。
黄色感叹号表示有警告。错误查看:双击红色叉号。
数字表示错误代码行数,比如这里的16,表示代
码第16行有错误,双击这行可以直接定位到错误
处。
39/108
错误修改
• 错误修改后需要保存,保存后代码状态又
变成问号,需要重新编译。
40/108
仿真1/2
• 启动仿真方法一
选择的这个模块一定要是
testbench的模块
41/108
仿真2/2
• 启动
仿真
方法二
选中testbench模块后鼠标右键
42/108
波形查看
变
量
过
程
块
43/108
波形查看
• 选中要查看
的模块,
鼠标右键
44/108
波形查看
跑固定
时间
跑完全部
45/108
结束仿真
46/108
目录
可综合Verilog语言
数字电路验证
HDL的软件仿真
FPGA简介
FPGA验证流程
FPGA设计中的基本问题
47/108
FPGA
• FPGA (Field Programmable Gate Array)
,即现场可编程门阵列,它是作为专用集成
电路(ASIC)领域中的一种半定制电路而
出现的,既解决了定制电路的不足,又克服
了原有可编程器件门电路数有限的缺点。
48/108
FPGA的结构
• FPGA由可编程逻辑块(CLB)、输入/输出模块
(IOB)及可编程互连资源(PIR)等三种可编程
电路和一个SRAM结构的配置存储单元组成。
• CLB是实现逻辑功能的基本单元,它们通常规则
地排列成一个阵列,散布于整个芯片中;
• IOB主要完成芯片上的逻辑与外部引脚的接口,
它通常排列在芯片的四周;
• IR包括各种长度的连线线段和一些可编程连接开
关,它们将各个CLB之间或CLB与IOB之间以及
IOB之间连接起来,构成特定功能的电路。
49/108
FPGA的结构
IOB
IR
IOB
IOB
IR
CLB
IR
IOB
CLB
CLB
IOB
IR
IR
IR
CLB
CLB
50/108
IOB
IR
CLB
IOB
IR
IR
IOB
IOB
IR
IR
IR
IOB
CLB
CLB
CLB
IR
IR
IR
IR
IOB
IOB
可编程逻辑块CLB
• CLB主要由逻辑函数发生器、触发器、数据选
择器等电路组成
输入A
函数发生器基于查找
表LUT单元:
输入1
输入2
输入3
输入4
查找表
LUT
16×1
RAM
输出
0
0
0
0
0
1
1
0
0
0
0
0
0
0
1
1
51/108
输入B
输入C
输入D
多路选择器
查找表
输出
输入/输出模块IOB
• IOB主要由输入触发器、输入缓冲器和输出
触发/锁存器、输出缓冲器组成,每个IOB
控制一个引脚,它们可被配置为输入、输
出或双向I/O功能。
52/108
可编程互连资源(PIR)
• PIR由许多金属线段构成,这些金属线段带
有可编程开关,通过自动布线实现各种电
路的连接。实现FPGA内部的CLB和CLB之
间、CLB和IOB之间的连接
53/108
CPLD
• CPLD(Complex Programmable Logic
Device)复杂可编程逻辑器件
• FPGA与CPLD的辨别和分类主要是根据其结
构特点和工作原理。通常的分类方法是:
将以乘积项结构方式构成逻辑行为的器件称
为CPLD
将以查表法结构方式构成逻辑行为的器件称
为FPGA。
54/108
FPGA与CPLD的区别
CPLD
FPGA
程序存储
内部EEPROM
SRAM,外挂EEPROM
资源类型
组合电路资源丰富
触发器资源丰富
集成度
低
高
使用场合
完成控制逻辑
完成比较复杂的算法
编程元素
非易失性(FLASH、
EEPROM)
易失性(SRAM)
上电速度
快,上电后立即开始工作
慢(从外部存储器读取)
保密性
好
差
其他资源
—
PLL、DSP
55/108
FPGA生产厂商
• 随着可编程逻辑器件应用的日益广泛,许
多IC制造厂家涉足FPGA领域。目前世界上
有十几家生产CPLD/FPGA的公司,最大的
三家是:ALTERA,XILINX,Lattice,其
中ALTERA和XILINX占有了60%以上的市
场份额。
56/108
Altera
• Altera的主流FPGA分为两大类
1、一种侧重低成本应用,容量中等,性能可以满
足一般的逻辑设计要求,如
Cyclone,CycloneⅤ;
2、还有一种侧重于高性能应用,容量大,性能能
满足各类高端应用,如Stratix,StratixⅤ等,用户
可以根据自己实际应用要求进行选择。
• 开发软件为QuartusⅡ
57/108
• 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
58/108
• Stratix V: 2011年推出,28nm工艺,0.85v内
核供电,大容量高性能FPGA。
Stratix V系列概览
功能
5SGXA3
自适应逻辑模块(ALM)75,500
等效逻辑单元 (LE)
200,000
5SGXA4
113,000
300,000
5SGXA5
5SGXA7
5SGXA9
5SGXAB
160,500
234,750
317,000
397,000
622,000
840,000
1,052,00
0
1,588,00
0
425,000
452,000
642,000
939,000
1,268,00
0
M20K RAM 块 (20 Kb) 800
1,316
2,304
2,560
1,600
2,016
总嵌入 RAM (M bits) 16
26
45
50
31
39
376
512
512
1,000
1,500
Registers
302,000
18x18乘法器
376
支持I/O电压(V)
1.2, 1.5, 1.8, 2.5, 3.3
59/108
Xilinx
• Xilinx的主流FPGA分为两大类
• 一种侧重低成本应用,容量中等,性能可
以满足一般的逻辑设计要求,如Spartan系
列;
• 还有一种侧重于高性能应用,容量大,性
能能满足各类高端应用,如Virtex系列
• 开发软件为ISE
60/108
• Spartan-6: 2009年初推出,45nm工艺,面
向低成本、低功耗应用。
器件
逻辑单元
最大Block DSP
RAM(kb) 块
存储器 最大用
控制块 户I/O数
价格
(美元)
XC6SLX4
3,840
216
8
0
132
6-10
XC6SLX9
9,152
576
16
2
200
10-15
XC6SLX16
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个
61/108
• 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
600
XC6VLX240T
241,152
14,976
768
720
XC6VLX365T
364,032
14,976
576
720
XC6VLX550T
549,888
22,752
864
1200
XC6VLX760
758,784
25,920
864
1200
62/108
Xilinx-7系列
• 2011年推出,28nm工艺,具有比6系列更
高的性价比。
• ARTIX-7 系列:最低成本与功耗
• KINTEX-7 系列:最佳性价比
• VIRTEX-7 系列:最高带宽和系统性能
63/108
FPGA开发板
64/108
目录
可综合Verilog语言
数字电路验证
HDL的软件仿真
FPGA简介
FPGA验证流程
FPGA设计中的基本问题
65/108
软件设计
66/108
Xilinx--ISE
Altera--Quartus II
Actel--Libero
Lattice--ispLEVER
Xilinx ISE 设计流程
1.创建新工程
2.添加设计文件(.v或者.vhd)
3.分配IO管脚
4.综合
5.布局布线
6.下载
7.测试
71/108
创建新工程1/2
• File-->New project
72/108
创建新工程2/2
Spartan3
XC3S400
FT256
-4
73/108
接下来一直
Next..
添加设计文件
鼠标右键
74/108
分配IO管脚1/2
75/108
分配IO管脚2/2
添加管脚约束文件
上一步分配完管脚,
保存,自动生成这
个ucf文件。
76/108
综合
鼠标单击选中
顶层模块
fsk_modulator,
双击Synthesize
77/108
布局布线
鼠标单击选中
顶层模块
fsk_modulator,
双击Implement
Design
78/108
生成下载文件--.bit格式
79/108
下载文件1/3
80/108
下载文件2/3
81/108
下载文件3/3
82/108
演示
• ISE操作演示
83/108
目录
可综合Verilog语言
数字电路验证
HDL的软件仿真
FPGA简介
FPGA验证流程
FPGA设计中的基本问题
84/108
一、
FPGA电路设计基本概念
(一)、建立时间和保持时间
建立时间(setup time)是指在
触发器的时钟信号上升沿到来以前
,数据稳定不变的时间,如果建立
时间不够,数据将不能在这个时钟
上升沿被打入触发器;
保持时间(hold time)是指在触发器的时钟信号上升沿到来
以后,数据稳定不变的时间, 如果保持时间不够,数据同样
不能被打入触发器。
数据稳定传输必须满足建立和保持时间的要求。
85/108
(二)、FPGA中的冒险现象
信号在FPGA器件内部通过连线和逻辑单元时,都有一定的延时。
信号的高低电平转换也需要一定的过渡时间。
由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化
的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一
些不正确的尖峰信号,这些尖峰信号称为“毛刺”。如果一个组合逻辑
电路中有“毛刺”出现,就说明该电路存在“冒险”。
(与分立元件不同,由于PLD内部不存在寄生电容电感,这些毛刺将
被完整的保留并向下一级传递,因此毛刺现象在PLD、FPGA设计中尤为
突出)
86/108
下图给出了一个逻辑冒险的例子, 从仿真波形可以看出, “A、 B、 C、 D”
四个输入信号的高低电平变换不是同时发生的, 导致输出信号“OUT”出现
了毛刺。 由于信号路径长度的不同, 译码器、 数值比较器以及状态计数器
等器件本身容易出现冒险现象.
Name:
Value:
A
0
B
1
C
0
D
0
OUT
0
1 00 .0 n s
2 00 .0 n s
毛刺信号
87/108
3 00 .0 n s
4 00 .0 n s
(三)、消除毛刺
冒险往往会影响到逻辑电路的稳定性, 时钟端口、 清零和置位端口
对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错, 因此判断逻辑
电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题
可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。一般
情况下有两种去除毛刺的方法,采样法和滤波法。
1、采样法
a.一种方法是在输出信号的保持时间内,用一定宽度的高电平脉冲与输出
信号做逻辑"与"运算,由此获取输出信号的电平值
88/108
Name:
Value:
A
1
B
0
C
1
D
1
SAMPLE
0
TEST
1
OUT
0
1 00 .0 n s
2 00 .0 n s
3 00 .0 n s
4 00 .0 n s
采样脉冲
毛刺信号
89/108
去除毛刺后
的输出信号
b.另一种更常见的方法是利用D触发器的D输入端对毛刺信号不敏感
的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出
信号,这种方法类似于将异步电路转化为同步电路。
Name:
Value:
A
0
B
1
C
0
D
0
CLK
1
TEST
0
OUT
0
2 00 .0 n s
4 00 .0 n s
6 00 .0 n s
采样时钟
毛刺信号
去除毛刺后
的输出信号
90/108
8 00 .0 n s
2、滤波法
在仿真时,我们也可能会发现在FPGA器件对外输出引脚上有输出毛刺,但
由于毛刺很短,加上PCB本身的寄生参数,大多数情况下,毛刺通过PCB走线,基
本可以自然被虑除,不用再外加阻容滤波。
91
(四)、清除和置位信号
在FPGA的设计中,全局的清零和置位信号必须经过全局的清
零和置位管脚输入,因为他们也属于全局的资源,其扇出能
力大,而且在FPGA内部是直接连接到所有的触发器的置位和
清零端的,这样的做法会使芯片的工作可靠、性能稳定,而
使用普通的IO脚则不能保证该性能。
在FPGA的设计中,除了从外部管脚引入的全局清除和置位信
号外在FPGA内部逻辑的处理中也经常需要产生一些内部的清
除或置位信号。清除和置位信号要求象对待时钟那样小心地考
虑它们,因为这些信号对毛刺也是非常敏感的。
92/108
(五)、触发器与锁存器
我们知道,触发器是在时钟的沿进行数据的锁存的,而锁存器
是用电平使能来锁存数据的。所以触发器的Q输出端在每一个
时钟沿都会被更新,而锁存器只能在使能电平有效器件才会被
更新。
在FPGA设计中建议如果不是必须,那么应该尽量使用触发器
而不是锁存器。
那么在使用硬件描述语言进行电路设计的时候如何区分触发器和锁存器
的描述方法?其实有不少人在使用的过程中可能并没有特意区分过,所以
也忽略了二者在描述方法上的区别。下面是用verilog语言描述的触发器
和锁存器。
93/108
触发器的语言描述:
module d_ff(clk,data,q)
input clk,data;
output q;
reg q;
always @(posedge clk)
q<=data;
D锁存器
module latchinf (enable, data, q);
input enable, data;
output q;
reg q;
always @(enable or data)
if (enable)
q <= data;
endmodule
endmodule
94/108
(六)、FPGA中的延时设计
• 当需要对电路中的某一信号作一段延时时,可在信号后串接
一些“非门”或其它门电路。
• 但在FPGA中,开发软件会在综合设计时将这些门当作冗余
逻辑去掉,达不到延时的效果。
• 因此,可以用高频时钟来驱动一移位寄存器,需要延时的信
号作为数据输入,按所需延时正确设置移位寄存器的级数,
移位寄存器的输出即为延时后的信号。此方法产生的延时信
号有误差,误差大小由高频时钟的周期来决定。对于数据信
号的延时,在输出端用数据时钟对延时后的信号重新采样,
就可以消除误差。当然,当所需延时较长时,这样做比较浪
费资源。
• 此外,不能用after语句来实现延时,因为目前的综合工具还
不能做到如此精确的延时,即程序中的after语句不能被综合。
95/108
二、 FPGA系统速度
同步电路的速度是指同步时钟的速度。同步时钟愈快,电路
处理数据的时间间隔越短,电路在单位时间处理的数据量就愈大。
我们先来看一看同步电路中数据传递的一个基本模型:如下图
Tdelay是组合逻辑的延时
Tsetup是触发器的建立时间
Tco是触发器时钟到数据输出的延时
96/108
假设数据已经被时钟的上升沿打入D触发器,那么数据到达第一个触发器的Q
端需要Tco,再经过组合逻辑的延时Tdelay到达的第二个触发器的D端,要想
时钟能在第二个触发器再次被稳定的锁入触发器,则时钟的延迟不能晚于
Tco+Tdelay+Tsetup,由以上分析可知:最小时钟周期:
T=Tco+Tdelay+Tsetup
最快时钟频率 F= 1/T
PLD开发软件也正是通过
这个公式来计算系统运行速度Fmax
注:在这个逻辑图中有个参数:Tpd ,即时钟的延时参数,我们在刚才做时
间分析的时候,没有提这个参数,(如果使用FPGA的全局时钟型号,Tpd
可以为0,如果是普通时钟,则不为0)。所以如果考虑到时钟的延时,精
确的公式应该是T=Tco+Tdelay+Tsetup-Tpd。当然以上全部分析的都是器件
内部的运行速度,如果考虑芯片I/O管脚延时对系统速度的影响,那么还需
要加一些修正。
97
由于Tco、Tsetup是由具体的器件和工艺决定的,我们设计电路时只可以改
变Tdelay。所以缩短触发器间组合逻辑的延时是提高同步电路速度的关键。
由于一般同步电路都不止一级锁存(如下图),而要使电路稳定工作,时
钟周期必须满足最大延时要求,缩短最长延时路径,才可提高电路的工作
频率。
转移组合逻辑
98
如图所示:我们可以将较大的组合逻辑分解为较小的几块,中间插入触
发器,这样可以提高电路的工作频率。这也是所谓“流水线”
(pipelining)技术的基本原理。
分割组合逻辑
99
三、 FPGA设计的基本思想
FPGA/CPLD 的设计思想与技巧是一个非常大的话题,由于篇幅所限,这里
介绍一些常用的设计思想与技巧,包括乒乓球操作、串并转换、流水线操
作和数据接口的同步方法。希望有意识地利用这些原则指导日后的设计工
作,将取得事半功倍的效果!
(一)、乒乓操作
“ 乒乓操作 ” 是一个常常应用于数据流控制的处理技巧,典型的乒乓操作
方法如图 所示。
100
乒乓操作的处理流程为:输入数据流通过 “ 输入数据选择单元 ” 将数
据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比
较常用的存储单元为双口 RAM(DPRAM) 、单口 RAM(SPRAM) 、 FIFO 等。
在第一个缓冲周期,将输入的数据流缓存到 “ 数据缓冲模块 1” ;
在第 2 个缓冲周期,通过 “ 输入数据选择单元 ” 的切换,将输入的
数据流缓存到 “ 数据缓冲模块 2” ,同时将 “ 数据缓冲模块 1” 缓
存的第 1 个周期数据通过 “ 输入数据选择单元 ” 的选择,送到 “ 数
据流运算处理模块 ” 进行运算处理;
在第 3 个缓冲周期通过 “ 输入数据选择单元 ” 的再次切换,将输入
的数据流缓存到 “ 数据缓冲模块 1” ,同时将 “ 数据缓冲模块 2”
缓存的第 2 个周期的数据通过 “ 输入数据选择单元 ” 切换,送到
“ 数据流运算处理模块 ” 进行运算处理。如此循环。
101
(二)、串并转换设计技巧
串并转换是 FPGA 设计的一个重要技巧,它是数据流处理的常用手段,
也是面积与速度互换思想的直接体现。串并转换的实现方法多种多样,
根据数据的排序和数量的要求,可以选用寄存器、 RAM 等实现。前
面在乒乓操作的图例中,就是通过 DPRAM 实现了数据流的串并转换,
而且由于使用了 DPRAM ,数据的缓冲区可以开得很大,对于数量比
较小的设计可以采用寄存器完成串并转换。如无特殊需求,应该用同
步时序设计完成串并之间的转换。
对于排列顺序有规定的串并转换,可以用 case 语句判断实现。对
于复杂的串并转换,还可以用状态机实现。串并转换的方法比较简
单,在此不必赘述。
102
(三)、流水线操作设计思想
流水线处理是高速设计中的一个常用设计手段。如果某个设计的处理流程分
为若干步骤,而且整个数据处理是 “ 单流向 ” 的,即没有反馈或者迭代
运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计
方法来提高系统的工作频率。
流水线设计的结构示意图如上图 所示。其基本结构为:将适当划分的 n
个操作步骤单流向串联起来。流水线操作的最大特点和要求是,数据流在
各个步骤的处理从时间上看是连续的,如果将每个操作步骤简化假设为通
过一个 D 触发器 ( 就是用寄存器打一个节拍 ) ,那么流水线操作就类
似一个移位寄存器组,数据流依次流经 D 触发器,完成每个步骤的操作。
103
流水线设计时序如上图 所示。 流水线设计的一个关键在于整个设计时序的
合理安排,要求每个操作步骤的划分合理。如果前级操作时间恰好等于后级
的操作时间,设计最为简单,前级的输出直接汇入后级的输入即可;如果前
级操作时间大于后级的操作时间,则需要对前级的输出数据适当缓存才能汇
入到后级输入端;如果前级操作时间恰好小于后级的操作时间,则必须通过
复制逻辑,将数据流分流,或者在前级对数据采用存储、后处理方式,否则
会造成后级数据溢出。
104
四、
注意问题
1、所有的状态机输入,包括复位、置位信号,都要
用同步信号。所有的状态机输出都要用寄存器寄存输
出。注意在状态机设计中不要出现死锁状态。
2、要用寄存器和触发器设计电路,尽量不要用锁存
器,因它对输入信号的毛刺太敏感。如果坚持用锁存
器设计必须保证输入信号绝对没有毛刺,且满足保持
时间。
105/108
3、设计译码逻辑电路时必须十分小心,因为译码器
和比较器本身会产生尖峰,容易产生毛刺,把译码器
或比较器的输出直接连到时钟输入端或异步清除端,
会造成严重的后果。
4、大部分FPGA器件都为时钟、复位、预置等
信号提供特殊的全局布线资源,要充分利用这
些资源。这样可以减少电路中的毛刺并且大大
提高设计电路的性能。
106/108
5、不要试图用HDL语言去综合RAM、ROM或FIFO
等存储模块。当前的综合工具主要用于产生逻辑电路,
如需要用这些模块,直接调用或例化相应的宏单元即
可。
6、注意仿真结果和实际综合的电路的不一致性。无论
是时序电路还是异步逻辑电路,其行为与其仿真器结
果都是不完全一样的。特别是异步逻辑电路,仿真结
果将会隐藏竞争冒险和毛刺现象,与实际行为相差较
远。故在FPGA设计中,对每一个逻辑门、每一行代码,
必须完全理解,不要期望仿真器替你找到错误。
107/108
作业
设计流水灯,要求:
1、驱动5个LED发光管发光(用高电平表示发光),
要求轮流发光,产生流水灯的流动效果;
2、应具有正向依次闪亮和逆向依次闪亮2种效果,有
闪亮效果切换键;
3、利用ISE软件进行功能仿真及布局布线后仿真。
注:
1、在ISE中自选最合适的FPGA ,用UCF文件约束管脚位置;
2、FPGA外接晶振50MHz;
3、检查功能仿真及布局布线后仿真两个波形图。
108/108