1、Spring 2010,可综合VerilogHDL设计,Slide 1,基于FPGA的嵌入式系统设计 电工电子工程基础,王贞炎 18607112468 ,Spring 2010,可综合VerilogHDL设计,Slide 2,3 可综合VerilogHDL设计,3.1 FPGA中逻辑设计的一些概念和原则 3.2 组合逻辑的建模 3.3 时序逻辑的建模 3.4 存储器的建模与使用 3.5 有限状态机的建模 3.6 课堂操作实验,Spring 2010,可综合VerilogHDL设计,Slide 3,3.1 FPGA中逻辑设计的一些概念和原则,3.1.1 一些基本概念 3.1.2 同步设计 3.1
2、.3 串并操作 3.1.4 流水线 3.1.5 异步时钟域处理,Spring 2010,可综合VerilogHDL设计,Slide 4,3.1.1 一些基本概念,3.1.1.1 面积和速度,面积:是指一个设计所消耗FPGA,可理解为一个设计在FPGA中占用的“面积”。主要由LE衡量,还包括RAM和DSP块等。 速度:是指一个设计在FPGA芯片上能稳定运行的最高频率。 “面积”和“速度”是一对对立统一的矛盾体。可以用更多的逻辑资源实现更快速的处理,也可以牺牲速度用较少的逻辑资源“面积”和“速度”互换。科学的设计目标是:在满足设计时序要求的前提下,占用最小的芯片面积;或者在所规定的面积下,使设计的
3、时序余量更大,频率更高。,Spring 2010,可综合VerilogHDL设计,Slide 5,3.1.1 一些基本概念,3.1.1.1 Verilog描述的逻辑的并行性,Verilog很多语法规则和C语言相似,但两者有本质区别! 在编写Verilog代码时,要始终记住:“我在描述一个硬件电路的连接,而不是顺序执行的代码。”,对于一个硬件电路,在Verilog描述中各部分语句的“执行”是并发的。 一个HDL代码的优劣的最终评价标准是其描述实现的硬件电路的性能(包括面积和速度两个方面),而不能只是片面地追求代码的简洁。 在编写Verilog代码前,应先对系统要实现的硬件电路的连接在大体上和关键
4、点上有一个明确地规划。硬件描述语言是描述硬件的,要实现对硬件实现“胸有成竹”,才能描述得好。,Spring 2010,可综合VerilogHDL设计,Slide 6,3.1.1 一些基本概念,3.1.1.1 合理分配模块,在设计一个较大的系统时,往往需要将系统分为多个模块。模块的划分是需要合理考虑的。 按实际功能划分模块。 划分出来的模块的端口意义尽量简明。 一个模块自成一体,调用模块者绝对不需要知道模块内部原理,绝对不需要干涉内部工作过程。 模块规模合理。,Spring 2010,可综合VerilogHDL设计,Slide 7,3.1.1 一些基本概念,3.1.1.1 合理利用资源,在设计一
5、个电子系统时,要了解,什么样的功能适合用LE实现,什么样的功能时候由DSP、CPU实现(包括FPGA内部的DSP、CPU)。实时性要求高、频率高、大量并行的功能模块适合使用传统的FPGA逻辑实现。 在FPGA内部设计时,要对的FPGA全局有宏观上的合理安排,比如时钟、模块组织结构、RAM的利用、面积和速度等问题。 善于利用片内RAM、乘法器。,Spring 2010,可综合VerilogHDL设计,Slide 8,3.1.2 同步设计,3.1.2.1 同步和异步设计,异步数字电路: 电路的核心逻辑用组合电路实现; 电路的主要信号并不依赖任何一个时钟性信号; 容易产生毛刺,出现竞争冒险; 不利于
6、器件移植、不利于时序分析与验证。 同步数字电路: 电路核心逻辑用各种触发器实现; 电路的主要信号都是由某个时钟沿驱动产生的; 可以很好地避免毛刺; 有利于器件移植和时序分析及验证。 可编程器件成本越来越低,综合效果越来越强,现代PLD设计首选同步时序设计方式!,Spring 2010,可综合VerilogHDL设计,Slide 9,3.1.2 同步设计,3.1.2.2 同步设计的原则,所有信号均由时钟驱动,并且在同一个设计内,最好只由同一个时钟驱动。 在同步设计中,一切逻辑均可简化为由下面的结构罗列而成,Spring 2010,可综合VerilogHDL设计,Slide 10,3.1.2 同步
7、设计,3.1.2.3 建立时间和保持时间,建立时间(TSU):在时钟有效沿之前数据必须保持稳定的最小时间 保持时间(TH):在时钟有效沿之后数据必须保持稳定的最小时间 建立时间和保持时间形成一个时间窗,在此窗之内,数据必须保持稳定。 同步设计的速度限制,根本上源于建立时间和保持时间的要求,Spring 2010,可综合VerilogHDL设计,Slide 11,3.1.2 同步设计,3.1.2.4 统一时钟和时钟使能!,在同一个设计中,尽量让所有的模块使用同一时钟,让所有的“always(xxxedge clk)”中的clk是同一个clk。 系统中不同部分的信号速率可能不一样,使用时钟使能控制
8、处理速率。,例如:要让一个模块以1/8时钟工作:,Spring 2010,可综合VerilogHDL设计,Slide 12,3.1.2 同步设计,3.1.2.4 统一时钟和数据使能!,数据流处理模块的端口建议,使用于一切对单个数据处理需要数个、甚至不确定数目的时钟周期的情况。,Clk:工作时钟 ARst:异步复位 DataIn:数据输入 DataEn:输入数据有效 DataOut:数据输出 DataValid:输出数据有效指示 每一级的DataValid接至后级的DataEn。 DataEn有效时,采入数据进行处理。 处理完数据输出的同时让DataValid有效,通知下级。,Spring 20
9、10,可综合VerilogHDL设计,Slide 13,3.1.3 串并操作,“串并操作”是面积速度互换原则的直接体现。 将串行转换为并行,一般旨在通过复制逻辑,提高整个设计的设计吞吐量,其本质是通过面积的消耗提高系统的工作速率。 将并行转换为串行,一般旨在节约资源,因为设计速度有足够的余量,通过提高串行通道的工作速率而节约了面积,其本质是通过速度的提高节约芯片面积。如串行加法器,乘法器,除法器等。,Spring 2010,可综合VerilogHDL设计,Slide 14,3.1.4 流水线,流水线处理是高速设计中的常用设计手段,是面积换取速度原则的又一具体体现。 时序逻辑处理数据流就是天然的
10、流水线结构。 流水线的结构示例:,Spring 2010,可综合VerilogHDL设计,Slide 15,3.1.4 流水线,流水线示例:Y=|A|*100-100,Spring 2010,可综合VerilogHDL设计,Slide 16,3.1.5 异步时钟域处理,如果连续两个数据处理模块需要使用不同的时钟,前级的数据由一个时钟驱动输出,而后级的输入却有另一个时钟采入。这时出现时钟异步。 异步域数据同步也是FPGA设计的一个较常见问题,处理不好往往会影响系统稳定。 异步时钟域同步的表现形式: 同频异相问题,两个时钟域频率相同,但相差不固定。 异频问题,两个时钟域的频率不同。,Spring
11、2010,可综合VerilogHDL设计,Slide 17,3.1.5 异步时钟域处理,一般同步方法: 两级寄存器采样,即用后级时钟对前级数据采样两次。这种做法可以有效地减少亚稳态的传播,使后级电平都是有效电平值,但不一定是正确电平值。该方法适用于对错误不敏感的同频异相时钟域数据的同步。 使用FIFO,可以可靠解决异步时钟域数据的同步问题,注意数据满和空:前级时钟大于后级时钟,注意写满;前级时钟小于后级时钟,注意读空。,Spring 2010,可综合VerilogHDL设计,Slide 18,3.1.5 异步时钟域处理,特殊情况转换低频时钟为时钟使能: 如果低频时钟频率远低于高频时钟,建议用高
12、频时钟将低频时钟同步为单周期使能信号。 典型例子: 用外部处理器(或用NIOS PIO)与FPGA逻辑交互。外部处理器送来的时钟可能很慢。,Spring 2010,可综合VerilogHDL设计,Slide 19,3.2 组合逻辑的建模,3.2.1 方法一数据流建模 参数化的奇偶校验器 3.2.2 方法二行为建模 BCD7段译码器 3.2.3 方法三结构建模 双向信号接口,Spring 2010,可综合VerilogHDL设计,Slide 20,3.2.1 组合逻辑的数据流建模,参数化的奇偶校验器的建模 module ParityGenerator(DataIn,OddPar,EvenPar)
13、;parameter NBITS=4;input NBITS-1:0 DataIn;output OddPar,EvenPar;assign EvenPar=DataIn;assign OddPar=EvenPar; endmodule,Spring 2010,可综合VerilogHDL设计,Slide 21,3.2.2 组合逻辑的行为建模,BCD7段译码器的建模 module bcd2led(a,b,c,d,e,f,g,D3,D2,D1,D0);output a,b,c,d,e,f,g;input D3,D2,D1,D0;reg a,b,c,d,e,f,g;always(D3 or D2 o
14、r D1 or D0)begincase(D3,D2,D1,D0)4d0: a,b,c,d,e,f,g=7b1111110;4d1: a,b,c,d,e,f,g=7b0110000;4d2: a,b,c,d,e,f,g=7b1101101;4d3: a,b,c,d,e,f,g=7b1111001;4d4: a,b,c,d,e,f,g=7b0110011;4d5: a,b,c,d,e,f,g=7b1011011;4d6: a,b,c,d,e,f,g=7b1011111;4d7: a,b,c,d,e,f,g=7b1110000;4d8: a,b,c,d,e,f,g=7b1111111;4d9: a
15、,b,c,d,e,f,g=7b1111011;default: a,b,c,d,e,f,g=7b0000000;endcaseend endmodule,Spring 2010,可综合VerilogHDL设计,Slide 22,3.2.3 组合逻辑的结构建模,双向信号接口的建模 module EE_SSTL(O,I,IO,E,BI);output O;input I,E,BI;inout IO;wire q1;bufif1 g1(IO,I,E);bufif1 g2(q1,IO,BI);buf g3(O,q1); endmodule,Spring 2010,可综合VerilogHDL设计,Sli
16、de 23,3.3 时序逻辑的建模,3.3.1 触发器建模 异步清零或置位 同步清零或置位 3.3.2 锁存器建模 异步清零或置位 3.3.3 计数器建模 二进制计数器 模N计数器 格雷码计数器 3.3.4 移位寄存器建模 3.3.5 一些设计的注意事项,Spring 2010,可综合VerilogHDL设计,Slide 24,3.3.1 触发器建模,3.3.1.1 异步置位清零D触发器 module AsyncPreClrDFF(clk,clear,preset,data,q);input clk,clear,data,preset;output q;reg q;always(posedge
17、 clk or posedge clear or posedge preset)if(preset)q=1b1;else if(clear)q=1b0;elseq=data; endmodule,Spring 2010,可综合VerilogHDL设计,Slide 25,3.3.1 触发器建模,3.3.1.2 同步置位清零D触发器 module SyncPreClrDFF(clk,clear,preset,data,q);input clk,clear,data,preset;output q;reg q;always(negedge clk)if(preset)q=1b1;else if(cl
18、ear)q=1b0;elseq=data; endmodule,Spring 2010,可综合VerilogHDL设计,Slide 26,3.3.2 锁存器建模,3.3.2.1 异步置位清零锁存器 module AsyncPreClrLatch(clk,clear,preset,data,q);input clk,clear,data,preset;output q;reg q;always(clk or clear or preset or data)if(preset)q=1b1;else if(clear)q=1b0;else if(clk)q=data; endmodule,Sprin
19、g 2010,可综合VerilogHDL设计,Slide 27,3.3.3 计数器建模,3.3.3.1 二进制计数器 module BinaryCounter(Ck,UpDown,PresetClear,LoadData,DataIn,Q,QN);parameter NBITS=2;input Ck,UpDown,PresetClear,LoadData;input NBITS-1:0 DataIn;output NBITS-1:0 Q,QN;reg NBITS-1:0 Counter;always(posedge Ck)if(PresetClear)Counter=0;else if(Loa
20、dData)Counter=DataIn;else if(UpDown)Counter=Counter+1;elseCounter=Counter-1;assign Q=Counter;assign QN=Counter; endmodule,Spring 2010,可综合VerilogHDL设计,Slide 28,3.3.3 计数器建模,3.3.3.2 模N计数器 module ModuloN_Cntr(Clock,Clear,Q,QBAR);parameter NBITS=2,UPTO=3;input Clock,Clear;output NBITS-1:0 Q,QBAR;reg NBIT
21、S-1:0 Counter;always(posedge Clock)if(Clear) Counter=0;else Counter=(Counter+1)%UPTO;assign Q=Counter;assign QBAR=Counter; endmodule,Spring 2010,可综合VerilogHDL设计,Slide 29,3.3.3 计数器建模,3.3.3.3 格雷码计数器 转换规则:格雷码最高位与二进制码最高位相同;格雷码的次高位是其二进制码的最高位和次高位异或的结果;依次类推,直到最低位。 module GrayCounter(ClockG,Clear,Q,QN);para
22、meter NBITS=2;input ClockG,Clear;output 1:NBITS Q,QN;reg 1:NBITS Counter,GrayCount;integer K;always(posedge ClockG)if(Clear)Counter=0;elseCounter=Counter+1;always(Counter)beginGrayCount1=Counter1;for(K=2;K=NBITS;K=K+1)GrayCountK=CounterK-1CounterK;endassign Q=GrayCount;assign QN=GrayCount; endmodule
23、,Spring 2010,可综合VerilogHDL设计,Slide 30,3.3.4 移位寄存器建模,3.3.3.4 3位通用移位寄存器的综合模型 具备功能:保持、左移、右移、载入。 module UnivShiftRegister(Clock,Clear,LeftIn,RightIn,S0,S1,ParIn,Q);input Clock,Clear,LeftIn,RightIn,S0,S1;input 2:0 ParIn;output 2:0 Q;reg 2:0 Q;always(negedge Clear or posedge Clock)if(!Clear)Q=3b000;elseca
24、se(S0,S1)2b00: ;2b01: Q=Q1:0,RightIn;2b10: Q=LeftIn,Q2:1;2b11: Q=ParIn;endcase endmodule,Spring 2010,可综合VerilogHDL设计,Slide 31,3.3.5 一些设计的注意事项,3.3.5.1 避免组合逻辑反馈环路 组合逻辑反馈环路( Combinational Loops)是 PLD设计的大忌!它最容易因振荡、毛刺、时序违规等引起整个系统的不稳定和不可靠。 处理方法: 牢记任何反馈环路必须包含寄存器。 检查综合、实现报告的Warning信息,发现Combinational Loops后进
25、行相应修改。,Spring 2010,可综合VerilogHDL设计,Slide 32,3.3.5 一些设计的注意事项,3.3.5.2 替换延迟链 延迟链是异步时序设计的常用手段,特别是在早期PLD设计和当代ASIC设计中,经常使用Delay Chains实现两个结点间的延迟调整。当代PLD设计推荐使用同步实现设计方法,一般要避免使用异步的Delay Chains。 在同步时序设计中,取代异步Delay Chains的最常用方法是用分频或倍频的时钟或者同步计数器完成所需延迟。,Spring 2010,可综合VerilogHDL设计,Slide 33,3.3.5 一些设计的注意事项,3.3.5.
26、3 替换异步脉冲产生单元:,在异步设计中,常用Delay Chains完成脉冲产生:,常用的同步脉冲产生方法:,Spring 2010,可综合VerilogHDL设计,Slide 34,3.3.5 一些设计的注意事项,3.3.5.4 慎用锁存器 同步逻辑设计要避免使用Latch。 综合出与设计意图不吻合的Latch结构的主要原因有: 在设计组合逻辑时,使用不完全的条件判断语句,如if没有else,或不完整的case语句; 设计中存在组合逻辑的反馈环路。 防止产生非目的性Latch的方法: 使用完备的ifelse语句; 检查设计中是否含有组合逻辑反馈环路; 为每个输入条件设计输出操作,对case
27、语句设置默认操作; 使用case语句时,特别是在设计状态机时,尽量附加综合约束属性,综合为完全条件case语句(full case)。,Spring 2010,可综合VerilogHDL设计,Slide 35,3.3.5 一些设计的注意事项,3.3.5.5 同步时序电路推荐的时钟设计方法 时钟经全局时钟输入引脚输入,通过FPGA内部专用PLL进行分频/倍频(一般可实现小数分频倍频)、移相等调整与运算,然后经FPGA内部全局时钟布线资源(一般为全铜工艺)驱动到达芯片内所有寄存器和其它模块的时钟输入端。,Spring 2010,可综合VerilogHDL设计,Slide 36,3.3.5 一些设计
28、的注意事项,3.3.5.6 内部逻辑产生的时钟 如果需要使用内部逻辑产生时钟,必须要在组合逻辑产生的时钟后插入寄存器。,Spring 2010,可综合VerilogHDL设计,Slide 37,3.3.5 一些设计的注意事项,3.3.5.7 门控时钟的使用问题 门控时钟即Gated Clock,是IC设计的一种常用减少功耗的手段。但是Gated Clock不是同步时序电路,其门控逻辑会污染Clock的质量。门控时钟改进电路:,Spring 2010,可综合VerilogHDL设计,Slide 38,3.4 存储器的建模与使用,最好把存储器建模成一个元件。通常,综合工具不能有效地设计出存储器。一
29、般采用更传统的技术来建立存储器。一旦建立了存储器模块,就可以在综合模型中使用模块实例化语句来实例化该模块。 层次设计方法和图文混合设计的概念 实例:查找表乘法器,Spring 2010,可综合VerilogHDL设计,Slide 39,3.4.1 存储器的使用步骤,Spring 2010,可综合VerilogHDL设计,Slide 40,3.4.1 存储器的使用步骤,Spring 2010,可综合VerilogHDL设计,Slide 41,3.4.1 存储器的使用步骤,Spring 2010,可综合VerilogHDL设计,Slide 42,3.4.1 存储器的使用步骤,Spring 2010
30、,可综合VerilogHDL设计,Slide 43,3.4.1 存储器的使用步骤,Spring 2010,可综合VerilogHDL设计,Slide 44,3.4.1 存储器的使用步骤,Spring 2010,可综合VerilogHDL设计,Slide 45,3.4.1 存储器的使用步骤,Spring 2010,可综合VerilogHDL设计,Slide 46,3.4.2 图形输入,Spring 2010,可综合VerilogHDL设计,Slide 47,3.4.3 建立存储器初始化文件,Spring 2010,可综合VerilogHDL设计,Slide 48,3.4.4 设定存储器初始化数据
31、,Spring 2010,可综合VerilogHDL设计,Slide 49,3.4.5 仿真结果,Spring 2010,可综合VerilogHDL设计,Slide 50,3.5 有限状态机的建模,3.5.1 有限状态机的概念 3.5.2 有限状态机的设计步骤 3.5.3 有限状态机的状态编码 3.5.4 有限状态机的设计方法 3.5.5 有限状态机的建模实例序列检测器,Spring 2010,可综合VerilogHDL设计,Slide 51,3.5.1 有限状态机的概念,Spring 2010,可综合VerilogHDL设计,Slide 52,3.5.2 有限状态机的设计步骤,1、逻辑抽象,
32、得出状态转换图 2、状态化简 3、状态分配 4、选定触发器类型,求出状态方程,驱动方程,输出方程 5、按照方程得出逻辑图用Verilog语言描述,大部分工作都由计算机自动完成,Spring 2010,可综合VerilogHDL设计,Slide 53,3.5.3 有限状态机的状态编码,二进制编码或格雷码 独热码CPLD格雷码 FPGA独热码,Spring 2010,可综合VerilogHDL设计,Slide 54,3.5.4 有限状态机的设计方法,三段式状态机的设计方法 状态转移块(时序) 状态驱动块(组合) 状态输出块(组合),Spring 2010,可综合VerilogHDL设计,Slide
33、 55,3.5.5 序列检测器,检测到序列110,输出1,否则0 状态转换图: (S0:输入一个0;S1:收到一个1;S2:连续收到两个1;S3:连续收到110),Spring 2010,可综合VerilogHDL设计,Slide 56,3.5.5 序列检测器,状态转移块 parameter 3:0 s0=4b0001,s1=4b0010,s2=4b0100,s3=4b1000; /独热码reg 3:0 current_state,next_state;always (posedge clk) /状态转移块beginif(!nclr)current_state=s0;elsecurrent_s
34、tate=next_state;end,Spring 2010,可综合VerilogHDL设计,Slide 57,3.5.5 序列检测器,状态驱动块 always (current_state or data) / 状态驱动块begincase(current_state)s0: next_state=(data=1)?s1:s0); s1: next_state=(data=1)?s2:s0); s2: next_state=(data=1)?s2:s3);s3: next_state=(data=1)?s1:s0); default: next_state=(data=1)?s1:s0);
35、endcaseend,Spring 2010,可综合VerilogHDL设计,Slide 58,3.5.5 序列检测器,状态输出块 always (current_state or data) / 状态输出块begincase(current_state)s0: out=1b0; s1: out=1b0; s2: out=(data=1)?1b0:1b1);s3: out=1b1; default: out=1b0;endcaseend,Spring 2010,可综合VerilogHDL设计,Slide 59,3.5.5 序列检测器状态查看,Spring 2010,可综合VerilogHDL设
36、计,Slide 60,3.6 课堂操作演示,课堂操作演示。 思考题 什么是同步逻辑、异步逻辑? 什么是流水线? 谈谈时钟使能的用法。 如何设计双向端口? 使用格雷码计数器有何好处? 如何使用FPGA的内部RAM块? 简述有限状态机的结构。 简述有限状态机的设计方法。 什么是“独热码”? 如何设计同步时序逻辑电路的异步清零置位功能? 用VerilogHDL设计一个移位寄存器,功能同74HC595。,Spring 2010,可综合VerilogHDL设计,Slide 61,第一次实验题,采用有限状态机(要求“三段式”)的方法设计一个姓名拼音序列检测器,包含端口: Clock 一位输入 主时钟 AR
37、st 一位输入 异步复位,到有效 SeqIn 八位输入 序列输入 Detected 一位输出 序列有效 各人检测自己的姓名,姓名拼音采用姓全拼、名缩写的方式,如“王贞炎”缩写为“WangZY”,大小写区分。 在Verilog代码和波形仿真文件中,采用ASCII码表示字母。 波形仿真文件事先提供,EndTime、Grid不要改动,Clock、Arst波形不要改动。SeqIn输入已包含随机序列,大家自行在其中加入自己的姓名序列,必须包含: 两个连续完整的姓名序列,如“WangZYWangZY” 一个有头无尾的不完整序列,如“WangZ” 一个无头有尾的不完整序列,如“ngZY” 在检测到完整序列后,从Detected输出一个宽度为一个时钟周期的高电平。 提交“.v”源代码,和仿真波形文件“.vwf”,不要压缩,文件名格式示例: U20080000_WangZY.v (内部主模块名与此同名) U20080000_WangZY.vwf 注意仿真选项中选中“回写仿真波形文件”的选项 格式不对,零分处理! 提交至ftp:/assignment:eeicst211.69.194.16/,其中已包含.vwf 模板。 截止时间5月1日(含)。,