第 9章第 1节
设计方法
<EDA技术 与应用 > 课程讲义
下一章
合肥工业大学 彭良清
上一章
本节内容
一,可编程逻辑设计的基本原则
二,可编程逻辑设计常用设计思想和技巧
三,Altera公司推荐的编码风格
四,面积优化
五,速度优化
可编程逻辑设计的基本原则
1,面积和速度的平衡与互换原则
2,硬件原则
3,系统原则
4,同步设计原则
5,避免使锁存器( LATCH)
6,Peter关于成功设计的十大原则
面积和速度:含义
? 面积:
1,含义,设计所消耗的 FPGA/CPLD的逻辑资源数量
2,衡量指标,触发器数 (FF),查找表数 (LUT),宏单元数
(MC),逻辑门数 (GATE),逻辑单元数( LE)
? 速度
1,含义,设计在芯片上稳定运行所达到的最高频率
2,影响最高频率的因子,
? PAD to PAD Time
? Clock Setup Time
? Clock Hold Time
? Clock to Output Delay
建立时间 (Tsetup time) &
保持时间 (Thold time)
返回
时钟的最小周期定义( Xilinx模型)
TCLK=TCKO+TLOGIC+TNET+TSETUP-TCLK_SKEW
时钟的最小周期定义( Xilinx模型)
TCLK=TCKO+TLOGIC+TNET+TSETUP-TCLK_SKEW
TCLK,最小时钟周期
TCKO,时钟输出时间
TLOGIC,同步元件之间的组合逻辑时间
TNET,网线延时
TSETUP,同步元件的建立时间
TCLK_SKEW,时钟信号延时的差别
TCLK_SKEW=TCD2-TCD1
时钟的最小周期定义( Altera模型)
面积和速度:含义
? 一个设计的速度和面积往往是 一个范围,是可变的
? 如何 改变 设计的速度和面积:
1,修改代码,采用 不同的 代码结构
2,在 EDA软件中 对设计的目标码 进行 编译控制
3,选择 不同的器件
? 设计的目标 不是,
1,占用 最小的面积
2,达到 最快的速度
? 设计的目标 而是,
在 满足项目功能和性能指标要求 的情况下 达到面积和速度均衡
硬件原则
1,差异:
不能用编写软件语言( C,C++,JAVA)的逻辑来
编写 VHDL代码
2,过程:
必须对实现的硬件电路“成竹在胸”,然后再
用 HDL代码实现之
3,串行和并行:
必须深刻理解之
4,基本语句电路:
对基本 IF,SWITCH,CASE,FOR等语句生
成的电路应完全掌握
系统原则
? 与其他部分 的任务划分,
在一块具有 DSP CPU FPGA/CPLD的系统中
如何划分”势力范围”?
? 内部资源的任务划分
1,不同 RAM资源的使用 (M512 RAM /M4K RAM
/M RAM)
2,软核的使用
3,SERDES的使用
4,其他资源
同步原则
?一般电路,尽量使用同步设计
?对于高速电路,
必须使用 同步 电路结构
进行设计
?Why?
请看, 同步与异步的比较,
异步电路
1,核心逻辑 用 组合逻辑实现
2,电路的主要信号、输出信号不依赖于时钟
3,容易产生毛刺
4,不利于器件移植
5,不容易进行时序分析
同步电路
1,核心逻辑用触发器实现
2,电路的主要信号、输出信号 依赖于 时钟边
沿
3,可完全避免产生毛刺
4,利于器件移植
5,容易进行时序分析
异步设计的例子
Binary Counter, LLLL
LLLH
LLHL
LLHH
..........
HHHH
BCD to DEC, LLLL -> HHHHHHHHHL
LLLH -> HHHHHHHHLH
LLHL -> HHHHHHHLHH
LLHH -> HHHHHHLHHH
.........,->,...........................
HLLH -> LHHHHHHHHH
预期的输出波形
这是一个 理想的
输出波形
但是
实际的波形是
什么?
功能仿真输出
What is this?
时序仿真输出
这里 出错 !!! 原因?
电路设计问文题还是 CPLD器件问题?
但,...,该电路使用 74xx TTL 逻辑电路可工作很好,
用 Altera Device却不正常 t
一定是 Altera Device 问题,......…
改用同步设计
Synchornous m7442 Circuit Design
避免使锁存器( LATCH)
使用寄存器( Register)
Peter关于成功设计的十大原则
( English)原文
原文参考
中译
Peter关于成功设计的十大原则
1,所有状态机输出应该有寄存器 (registered)
2,使用寄存器 (register),不使用锁存器( latch)
3,状态输入、包括复位信号应该使用同步设计
4,路径时间越短,问题越少
5,时钟偏斜( skew)应该尽量小
6,对于不同时钟域的信号传递应该引起极大注意,应该同步
这些信号。
7,状态机中应无“死”状态产生
8,不应该存在未知的异步逻辑反馈电路
9,所有解码逻辑应该精心设计,避免异步逻辑产生
10,不应该依赖于仿真器,有时仿真正确,但设计却很糟。
常用设计思想和技巧
? 常用的 4中设计技巧
1,乒乓操作
2,串并转换
3,流水线操作
4,数据接口同步
乒乓操作
输入
数据
选择
单元
MUX
2-1
数据缓冲
模块 1
数据缓冲
模块 2
输出
数据
选择
单元
MUX
2-1
…6,5,4,3,2,1
…6,4,2
…5,3,1
有何好处?
…6,5,4,3,2,1
乒乓操作,
低速模块 处理 高速数据?
输入
数据
选择
单元
MUX
2-1
数据缓冲
模块 1
数据缓冲
模块 2
输出
数据
选择
单元
MUX
2-1
100Mhz 100Mhz数据处理 模块 1
数据处理
模块 2
XXMhz?
串并转换
? 串行- >并行
1,提高了速度
2,面积换取速度
3,通过逻辑复制提高数据吞吐率
? 并行- >串行
1,减小了面积占用
2,速度换取面积
? 问题:如何实现?
串- >并 转换
流水线( Pipelining) 操作:概念
?将处理过程分成串连的 n个步骤,并将单向串
连起来,每个步骤之间用 D触发器分割。
Step 1 Step 2 Step n…
问题:下图的流水线为何可以提高速
度?
流水线( Pipelining) 操作:过程图示
step2step1 step3 step4
step2step1 step3 step4
step2step1 step3 step4
step2step1 step3 step4
step2step1 step3 step4
Time
流水线操作,应用
1,高速电路设计的常用方法
2,适合场合:单向数据流应用
3,实例,N位加法器,N位乘法器等
4,流水线技术具有广法的应用:
CPU,DSP,AD/DA
数据接口同步:概念
? 含义,异步时钟域的数据同步
? 问题,如何达到 2个不同时钟域的数据同步?
? 异域时钟的 2种情况
1,时钟频率相同,但相差不固定,或者相差固定
但不可测
2,时钟频率不相同
3,问题,相差固定,频率相同的时钟是异域时钟
吗?
数据接口同步:同步方法
? 不推荐的方法:
1,使用 buffer等组合逻辑延时来调整时间
2,使用时钟的正负沿调整数据采样
数据接口同步:同步方法
? 推荐方法
一,同频异相问题
1,使用后级时钟对前级数据采样 2次
2,使用 FIFO,DPRAM作为缓冲,用前级时钟控制数据写
入,用后级时钟控制数据读出
二,异频问题
1,使用 FIFO,DPRAM作为缓冲,用前级时钟控制数据写
入,用后级时钟控制数据读出
2,问题,数据吞吐率不同的影响?
3,问题,缓冲池的大小?
Altera公司推荐的编码风格
1,组合逻辑的注意事项
2,时钟设计的注意事项
3,状态机设计的一般原则
4,全局异步复位资源
5,三态信号的设计
组合逻辑的注意事项 (一 )
?避免组合逻辑环 (Combinational Loops)
D Q
CLK
CLRN
组合逻辑
如何修改?加入寄存器注意此类错误的 warning信息
替换异步脉冲产生单元
( Pulse Generator)
?如何产生脉冲信号?
?异步电路常用 Delay Chains差生
?问题:脉冲宽度无法确定
?这是同步电路的脉冲产生方法,
同步脉冲产生方法
D Q
CLK
D Q
CLK
时钟设计的注意事项
?有全局时钟引脚如时钟信号
?使用 PLL( ALTERA)或者 DLL(XILINX)进
行分频 /倍频、移相输出,控制内部的全局时
钟网络使用
?图示:
?问题:在原理图和 VHDL 2种设计中如何遵
循以上原则?
Cyclone的 PLL结构
Quartus II的 altpll megafunction.
状态机设计的一般原则
1,CPLD使用 Gray状态码,FPGA使用 one-hot
编码
2,使用 2进程状态机
3,必须有初态处理
4,多状态相同操作的逻辑复用
全局异步复位资源
?使用专用的全局复位引脚对芯片进行复位操

三态信号的设计
? 只能在 顶层 模块使用:
1,三态设计
2,双向端口
面积优化
? 为何要进行面积优化?
1,采用规模更小的芯片,降低成本
2,占用资源越少,电路性能越好
3,保留资源用于 系统升级 设计
4,降低功耗
? 常用的 3种面积优化方法
1,资源共享
2,逻辑优化
3,串行化
资源共享:乘法器共享举例
乘 法 器 0
×
乘 法 器 1
×
选 择 器
0
1
A 0
B
A 1
B
R e s u l t
S e l
选 择 器
0
1
乘 法 器
×
A 0
S e l
A 1
R e s u l t
B
X
代码详见
代码详见
1,……..
2,ENTITY multmux IS
3,PORT ( A0,B0,B, IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 );
4,sel, IN STD_LOGIC;
5,result, OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 )
6,);
7,END ENTITY multmux;
8,ARCHITECTURE bhv OF multmux IS
9,BEGIN
10,PROCESS ( A0,A1,B,sel )
11,BEGIN
12,IF sel = '0' THEN
13,result <= A0 * B ;
14,ELSE
15,result <= A1 * B ;
16,END IF;
17,END PROCESS;
18,END ARCHITECTURE bhv;
优化前:代码
详见
P311_ex10_1_multmux
面积优化

资源共享
代码
Flow Summary 1 (16位宽度 )
1,Flow Status ; Successful - Thu Apr 27 11:07:03 2006 ;
2,Quartus II Version ; 5.0 Build 148 04/26/2005 SJ Web Edition ;
3,Revision Name ; p312_ex10_1
4,Top-level Entity Name ; multmux
5,Family ; Cyclone
6,Device ; EP1C3T144C6
7,Timing Models ; Final
8,Met timing requirements ; Yes
9,Total logic elements ; 528 / 2,910 ( 18% )
10,Total pins ; 81 / 104 ( 77 % )
11,Total virtual pins ; 0
12,Total memory bits ; 0 / 59,904 ( 0 % )
13,Total PLLs ; 0 / 1 ( 0 % )
比较:
Flow Summary2
1,………
2,ENTITY multmux IS
3,PORT ( A0,B0,B, IN STD_LOGIC_VECTOR ( 3 DOWNTO 0 );
4,sel, IN STD_LOGIC;
5,result, OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 )
6,);
7,END ENTITY multmux;
8,ARCHITECTURE bhv OF multmux IS
9,SIGNAL temp, STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
10,BEGIN
11,PROCESS ( A0,A1,B,sel )
12,BEGIN
13.
14,IF sel = '0' THEN
15,temp <= A0 ;
16,ELSE
17,temp <= A1 ;
18,END IF;
19,result <= temp * B ;
20,END PROCESS;
21,END ARCHITECTURE bhv;
优化后:
少用一个乘法器
详见
P311_ex10_2_multmux
共享一个乘法器
Flow Summary 2(16位宽度 )
1,Flow Status ; Successful - Thu Apr 27 11:07:03 2006 ;
2,Quartus II Version ; 5.0 Build 148 04/26/2005 SJ Web Edition ;
3,Revision Name ; p312_ex10_2
4,Top-level Entity Name ; multmux
5,Family ; Cyclone
6,Device ; EP1C3T144C6 比较
7,Timing Models ; Final
8,Met timing requirements ; Yes
9,Total logic elements ; 528 / 2,910 ( 18% )
10,Total pins ; 81 / 104 ( 77 % )
11,Total virtual pins ; 0
12,Total memory bits ; 0 / 59,904 ( 0 % )
13,Total PLLs ; 0 / 1 ( 0 % )
比较:
Flow Summary1
选 择 器
0
1
A
B
S
R
选 择 器
0
1
A
B
S
R
选 择 器
0
1
A
B
S
R
资源共享 之 反例
Why?
资源共享的适用范围
? 需要共享的模块特征
1,占用 资源 较多
2,被 多处 使用
3,设计逻辑中 可以
分时使用
该模块
逻辑优化,目的,途径
?修改
VHDL代码 结构
来达到
逻辑优化的目的
?良好 的 VHDL代码
可以
大大降低
占用资源
1,ENTITY mult1 IS
2,PORT ( clk, IN STD_LOGIC;
3,ma, IN STD_LOGIC_VECTOR ( 11 DOWNTO 0 );
4,mc, OUT STD_LOGIC_VECTOR ( 23 DOWNTO 0 )
5,);
6,END ENTITY mult1;
7,ARCHITECTURE rt1 OF mult1 IS
8,SIGNAL ta,tb, STD_LOGIC_VECTOR ( 11 DOWNTO 0 );
9,BEGIN
10,PROCESS ( clk )
11,BEGIN
12.
13,IF ( clk'EVENT AND clk = '1' ) THEN
14,ta <= ma ;
15,tb <= "100110111001";
16,mc <= ta * tb;
17,END IF;
18,END PROCESS;
19,END ARCHITECTURE rt1;
逻辑优化,
代码 1(乘法器)
详见
P313_ex10_3_mult1
逻辑优化,
代码 2(乘法器)之
资源占用
1,ENTITY mult1 IS
2,PORT ( clk, IN STD_LOGIC;
3,ma, IN STD_LOGIC_VECTOR ( 11 DOWNTO 0 );
4,mc, OUT STD_LOGIC_VECTOR ( 23 DOWNTO 0 )
5,);
6,END ENTITY mult2;
7,ARCHITECTURE rt1 OF mult1 IS
8,SIGNAL ta, STD_LOGIC_VECTOR ( 11 DOWNTO 0 );
9,CONSTANT tb, STD_LOGIC_VECTOR ( 11 DOWNTO 0 ),= "100110111001";
10,BEGIN
11,PROCESS ( clk )
12,BEGIN
13.
14,IF ( clk'EVENT AND clk = '1' ) THEN
15,ta <= ma ;
16,mc <= ta * tb;
17,END IF;
18,END PROCESS;
19,END ARCHITECTURE rt1;
逻辑优化,
代码 2(乘法器)
详见
P314_ex10_4_mult2
逻辑优化,
代码 2(乘法器)之资源占用
串行化
1,串行化
就是
我们前面所介绍的
串并转换 中的
并- >串转换
2,时间上复用 某个占用很多资源的模块
3,例如,16位并行乘加器 & 16位串行乘加器
1,ENTITY mult1 IS
2,PORT ( clk, IN STD_LOGIC;
3,a0,a1,a2,a3, IN STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
4,b0,b1,b2,b3, IN STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
5,yout, OUT STD_LOGIC_VECTOR ( 15 DOWNTO 0 )
6,);
7,END ENTITY mult1;
8,ARCHITECTURE rt1 OF mult1 IS
9,BEGIN
10,PROCESS ( clk )
11,BEGIN
12.
13,IF ( clk'EVENT AND clk = '1' ) THEN
14,youy <= ( ( a0 * b0 ) +( a1 * b1 ) ) + ( ( a3 * b3 ) + ( a4 *
15,b4 ) );
16,END IF;
17,END PROCESS;
18,END ARCHITECTURE rt1;
并行乘加器:代码
并行乘加器:图
1,------------------------------------------------------------------+
2,Flow Summary ;
3,-----------------------+------------------------------------------+
4,Flow Status ; Successful - Sat Apr 29 17:21:21 2006
5,Quartus II Version ; 4.1 Build 181 06/29/2004 SJ Full Version ;
6,Revision Name ; pmultadd
7,Top-level Entity Name ; pmultadd
8,Family ; FLEX10K
9,Total logic elements ; 712 / 1,152 ( 61 % )
10,Total pins ; 82 / 102 ( 80 % )
11,Total memory bits ; 0 / 6,144 ( 0 % )
12,Device ; EPF10K10TC144-3
13,Timing Models ; Production
并行乘加器 资源占用
1,ENTITY smultadd IS
2,PORT (clk, IN STD_LOGIC;
3,a0,a1,a2,a3, IN STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
4,b0,b1,b2,b3, IN STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
5,yout, OUT STD_LOGIC_VECTOR ( 15 DOWNTO 0 ) );
6,END ENTITY smultadd;
7,ARCHITECTURE s_arch OF smultadd IS
8,SIGNAL cnt, STD_LOGIC_VECTOR ( 2 DOWNTO 0 );
9,SIGNAL tmpa,tmpb, STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
10,SIGNAL tmp,ytmp, STD_LOGIC_VECTOR ( 15 DOWNTO 0 );
11,BEGIN
12,tempa <= a0 WHEN cnt = 0 ELSE
13,a1 WHEN cnt = 1 ELSE
14,a2 WHEN cnt = 2 ELSE
15,a3 WHEN cnt = 3 ELSE
16,a0;
17,tempb <= b0 WHEN cnt = 0 ELSE
18,b1 WHEN cnt = 1 ELSE
19,b2 WHEN cnt = 2 ELSE
20,b3 WHEN cnt = 3 ELSE
21,b0;
22,tmp <= tmpa * tmpb;
23,PROCESS ( clk )
24,BEGIN
25,IF ( clk'EVENT AND clk = '1' ) THEN
26,IF start = '1' THEN
27,cnt <= "000";
28,ytmp <= (others => '0' );
29,ELSIF ( cnt < 4 ) THEN
30,cnt <= cnt + 1;
31,ytmp <= ytmp + tmp;
32,ELSIF (cnt = 4 ) THEN
33,yout <= ytmp;
34,END IF;
35,END IF;
36,END PROCESS;
37,END ARCHITECTURE s_arch;
串行乘加器:
代码
乘法器
1,------------------------------------------------------------------+
2,Flow Summary ;
3,-----------------------+------------------------------------------+
4,Flow Status ; Successful - Sat Apr 29 17:21:21 2006
5,Quartus II Version ; 4.1 Build 181 06/29/2004 SJ Full Version ;
6,Revision Name ; smultadd
7,Top-level Entity Name ; smultadd
8,Family ; FLEX10K
9,Total logic elements ; 264 / 576 ( 45 % )
10,Total pins ; 82 / 102 ( 80 % )
11,Total memory bits ; 0 / 6,144 ( 0 % )
12,Device ; EPF10K10TC144-3
13,Timing Models ; Production
串行乘加器, 资源占用
速度优化
1,流水线设计
2,寄存器配平
3,关键路径法
流水线设计,原因
Tclk ≥ Tdelay+Tco+Tsetup
流水线设计,
方法 Tclk ≥ Tdelay/2+Tco+Tsetup
流水线设计, 效果
1,提高了 电路的 数据处理速度
2,增加了 资源占用
3,流水线的级别越多,速度越
快 !!!
4,请看,例子 1,例子 2(教材)
24位加法器实现
加法器:
不使用 Pipelining
1,ARCHITECTURE normal_arch OF adder4 IS
2.
3,SIGNAL t0,t1,t2,t3, STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
4,SIGNAL addtmp0,addtmp1, STD_LOGIC_VECTOR ( 8 DOWNTO 0 );
5,BEGIN
6,PROCESS ( clk )
7,BEGIN
8,IF ( clk'EVENT AND clk = '1' ) THEN
9,t0 <= a0; t1 <= a1;
10,t2 <= a2; t3 <= a3;
11,END IF;
12,END PROCESS;
13,addtemp0 <= '0' & t0 + t1;
14,addtemp1 <= '0' & t2 + t3;
15,PROCESS ( clk )
16,BEGIN
17,IF ( clk'EVENT AND clk = '1' ) THEN
18,yout <= '0' & addtmp0 + addtmp1;
19,END IF;
20,END PROCESS;
21,END ARCHITECTURE normal_arch;
加法器:
不使用 Pipelining 代码
加法器:
使用 Pipelining
1,ARCHITECTURE pipelining_arch OF pipeadd IS
2.
3,SIGNAL t0,t1,t2,t3, STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
4,SIGNAL addtmp0,addtmp1, STD_LOGIC_VECTOR ( 8 DOWNTO 0 );
5,BEGIN
6,PROCESS ( clk )
7,BEGIN
8,IF ( clk'EVENT AND clk = '1' ) THEN
9,t0 <= a0; t1 <= a1;
10,t2 <= a2; t3 <= a3;
11,END IF;
12,END PROCESS;
13,PROCESS ( clk )
14,BEGIN
15,IF ( clk'EVENT AND clk = '1' ) THEN
16,addtmp0 <= '0' & t0 + t1;
17,addtmp1 <= '0' & t2 + t3;
18,yout <= '0' & addtmp0 + addtmp1;
19,END IF;
20,END PROCESS;
21,END ARCHITECTURE pipelining;
加法器:
使用 Pipelining 代码
寄存器配平 ( Register Blalancing)
延时较大
(组合逻辑1)
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
Q
Q
SET
CLR
D
触发器
延时较小
(组合逻辑2)
T1 T2
T1 >T2
T1
T1 > T 2
T2
Q
Q Q
Q Q
Q
不合理的结构
寄存器配平 ( Register Blalancing)
合理的结构
延时块
(组合逻辑1)
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
Q
Q
SET
CLR
D
触发器
延时块
(组合逻辑2)
t1 t2t1≈t2
t1 t1 ≈ t2 t2
Q Q Q
Q Q
关键路径法
延时块
Td2
延时最长
Td1
延时块
Td3
输入 输出
关键路径
延时最长
T d1
延时块
T d 2
延时块
T d 3
问题:
1,在 quartus II 软件中可以进行那些
优化设计的配置?
2,如何使用流水线技术设计高速的 24
位加法器电路?
The end.
以下内容

正文的引用,
可不阅读。
建立时间 和 保持时间
返回
报告类型 文件扩展名
Analysis & Synthesis,map.rpt
Assembler, asm.rpt
Compilation( This report file is a single file that
combines the information of the individual
module compilation report files.)
.cmp.rpt
Design Assistant,drc.rpt
EDA Netlist Writer,eda.rpt
Fitter,fit.rpt
Flow,flow.rpt
Simulator,sim.rpt
Timing Analyzer,tan.rpt
Quartus II中的编译报告文件