好文档 - 专业文书写作范文服务资料分享网站

FPGA入门教程 - 图文

天下 分享 时间: 加入收藏 我要投稿 点赞

局’ 可以被理解挑选可实现设计网表的最优的资源组合,‘布线’就是将这些查找表和寄存器资源以最优方式连接起来。

3.8时序/时延分析

通过时序/时延分析获得布局布线后系统的延时信息,不仅包括门延时,而且还有实际的布线延时。时序/时延分析的时序仿真是最准确的,能较好地反映芯片的实际工作情况,同,即不满足时序约束条件或者器件固有时序规则(建立时发现时序违规(Timing Violation)时间、保持时间)的情况。

3.9配置与下载

通过编程器(programmer)将布局布线后的配置文件下载至FPGA中,对其硬件进行编程。配置文件一般为.pof或.sof文件格式,下载方式包括AS(主动)、PS(被动)、JTAG(边界扫描)等方式。

4.RTL设计

4.1使用verilog进行RTL设计

使用verilog进行RTL设计一般可归纳为3种基本的描述方式:

1、数据流描述:采用assign连续赋值语句

2、行为描述:使用always语句或initial语句块的过程赋值语句。

3、结构化描述:实例化已有的功能模块或原语,即平常所说的元件例化和IP core。 其中,连续赋值语句是连续驱动的,也就是说只要输入变化,都会导致该语句的重新计算。其被赋值的变量不会被电路寄存。过程赋值语句包括非阻塞过程赋值、阻塞过程赋值和连续过程赋值。对于这些抽象的概念,我们将在其后的实际例子中详细解释。

4.1.1硬件设计意识

RTL设计其实就是用语言的方式去描述硬件电路行为的过程。这同一般的软件设计有很大区别,因为对于很多的软件代码,硬件电路是无法实现的(即无法综合,从语言到硬件电路的解析过程称为综合)。我们只能使用可综合的代码结构来实现我们所需的硬件电路。

首先,我们需要建立硬件设计的意识,硬件意识是RTL级设计的基础。

1.电路在物理上是并行工作的。其含义是,一旦接通电源,所有电路都同时工作。 2.电路行为的先后顺序通过时钟节拍得顺序来体现。

4.1.2 RLT级设计时需注意的问题:

1.凡是在always或initial语句中赋值的变量,一定是reg类型变量;凡是在assign语句中赋值的变量,一定是wire类型变量;

2. 定义存储器:reg [3:0] MEMORY [0:7]; 地址为0~7,每个存储单元都是4bit; 3.由于硬件是并行工作的,在Verilog语言的module中,所有描述语句(包括连续赋值语句assign、行为语句块always和initial语句块以及模块实例化)都是并发执行的。

4.使用完备的if…else语句,使用条件完备的case语句并设置default操作,以防止产生锁存器latch,因为锁存器对毛刺敏感。

5.严禁设计组合逻辑反馈环路,它最容易引起振荡、毛刺、时序违规等问题。 6.不要在两个或两个以上的语句块(always或initial)中对同一个信号赋值。

4.1.3阻塞赋值与非阻塞赋值

在Verilog HDL中,有两种过程性赋值方式,即阻塞赋值(blocking assignment)和非阻塞赋值(non-blocking assignment)。这两种赋值方式有着根本的区别,如果使用不当,综合出来的结果会和设计的期望结果相去甚远。

1.阻塞赋值的操作符为 “ = ”。它的含义是在计算等式右侧表达式值及完成其赋值时不会被其他的verilog语句打断,就是说,在当前赋值没有完成之前,它阻塞了其他verilog语句的执行。

例如:begin

x = y + c; //语句1 y = a + b; //语句2

end

语句1和语句2都要求在同一仿真时刻执行,但在语句1没有执行完之前,是不会执行语句2的,它\阻塞\语句2的执行。这里说的\执行完\指的是在本时刻计算完y+c的值,并赋给y。若该仿真时刻y=5(旧值),c=4,a=3,b=1,则x=9,y=4。

还有下面的情况,过程1和过程2是同一个module中的两个always语句块。

过程1: 过程2:

always @ (posedge clk or negedge rst_n) always @ (posedge clk or negedge rst_n) begin begin

if ( rst_n == 1'b0) if ( rst_n == 1'b0) y = 1'b0; x = 1'b1; else else

y = x; x = y; end end

仿真开始时,两个always语句块将并行地同时执行。如果仿真器先执行过程2的话,则在复位完后,x、y的值最终都会变为1;如果先执行过程1,则x、y的值最终都会变为0。

为什么会出现这种情况呢?因为按照Verilog的标准,上例中两个always块是并行执行的,与书写的前后顺序无关,但是,verilog标准没有规定在这种特殊情况下的执行顺序。所以,这需要我们在编程时避免这样的代码。

2.非阻塞赋值的操作符为 “ <= ”。它的含义是在赋值操作时刻开始时计算等式右边,赋值操作时刻结束时更新等式左边。在这期间,可以执行其它verilog语句,也不阻塞其它verilog语句的执行。 例如: begin

x <= y + c; //语句1 y <= a + b; //语句2

end

虽然语句1的在语句2之前,但是由于是非阻塞赋值,语句1的执行不影响语句2的执行,在该仿真时刻完了后,才更新左端的值。若该仿真时刻y=5(旧值),c=4,a=3,b=1,则x=8,y=4。

同样,对于下面的情况,过程1和过程2是同一个module中的两个always语句块。 过程1: 过程2:

always @ (posedge clk or negedge rst_n) always @ (posedge clk or negedge rst_n) begin begin

if ( rst_n == 1'b0) if ( rst_n == 1'b0) y = 1'b0; x = 1'b1; else else

y = x; x = y; end end

由于仿真时刻完了后才会去更新左端的值,所以上面两个过程将最终形成一反馈移位寄存器。

在实际使用中,我们需要遵循以下的原则: 1.在时序逻辑中,使用非阻塞赋值; 2.在组合逻辑中,使用阻塞赋值;

3.在同一个always块中,不要混合使用阻塞赋值和非阻塞赋值;

4.在同一个always块中,如果既有组合逻辑又有时序逻辑,使用非阻塞赋值; 5.always模块的敏感表为电平敏感信号时,使用阻塞赋值; 6.不要使用#0时延进行赋值。 7.不要在阻塞赋值中使用时延语句。

8.在行为级描述中,若语句间是顺序执行的关系,使用阻塞赋值。

另外一点需注意的就是,阻塞赋值是相对时间赋值,非阻塞赋值是绝对时间赋值。

4.2 HDL代码的可综合性

任何符合HDL语法标准的代码都是对硬件行为的一种描述,但不一定是可直接对应成电路的设计信息。行为描述可以基于不同的层次,如系统级,算法级,寄存器传输级(RTL)、门级等等。以目前大部分EDA软件的综合能力来说,只有RTL或更低层次的行为描述才能保证是可综合的。绝大部分电路设计必须遵循RTL的模式来编写代码,而不能随心所欲得

写仅仅符合语法的HDL代码。

4.2.1哪些是不可综合的代码

我们不可能将所有不可综合的代码都一一列出,我们举几个例子来说明这个问题: 1.对于一些抽象的行为描述代码是不可综合的。比如我们常见的延迟语句(如:#delay)、初始化语句initial以及等待语句wait都是不可综合的,他们所描述的功能对硬件而言是不可实现的。

2.对于一些抽象的运算代码也是不可综合的。比如,实现两个变量相除运算的代码:

always @(posedge clk) c<=A/B; 我们将发现这句代码只能在前仿真中正确执行,在QuartusⅡ和其他EDA软件中都不试想一下,如果我们自己用笔算除法是怎么做的?从高位到低位逐次试能将其综合成硬件。

除、求余、移位。试除和求余需要减法器,商数和余数的中间结果必须有寄存器存储;而这些运算显然不能在一个时钟延上完成,它需要一个状态机来控制时序,经过多个时钟周期才能得出结果。一句简单的C=A/B同所有这些相比显得太抽象,对于只能接受RTL或更低层次描述的EDA软件来说确实太难实现。(注:有些FPGA的配套软件提供乘除法的运算模块,但也只能支持直接调用,不支持把形如C=A/B的语句综合成除法模块)。

3.对于不定次数的循环运算是不可综合的,比如对于如下的代码段:

for (i=0; i

当wordlength为变量时,任何EDA软件都不能综合这个代码。这是因为硬件规模必须是有限的、固定的。当综合软件遇到循环语句时,总是将其展开成若干条顺序执行的语句,然后再综合成电路。若wordlength是常数,则展开的语句数是确定的,具有可综合性;而若它是变量时,展开的语句数不确定,对应的硬件电路数量也不能确定,无法被综合。这样的语句还包括while,repeat,forever等,他们都不可综合。

4.2.2如何判断自己写的代码是可综合的

通常EDA软件对HDL代码的综合能力总是比人的思维差。也就是说,对于一段代码,如果你不能想象出一个较直观的硬件实现方法,那EDA软件肯定也不行。比如说,加法器、多路选择器是大家都很熟悉的电路,所以类似A+B-C,(A>B)?C:D这样的运算一定可以综合。而除法、开根、对数等等较复杂的运算,必须通过一定的算法实现,没有直观简单的实现方法,则可以判断那些计算式是不能综合的,必须按它们的算法写出更具体的代码才能实现。此外,硬件无法支持的抽象行为描述,当然也不能被综合。

FPGA入门教程 - 图文

局’可以被理解挑选可实现设计网表的最优的资源组合,‘布线’就是将这些查找表和寄存器资源以最优方式连接起来。3.8时序/时延分析通过时序/时延分析获得布局布线后系统的延时信息,不仅包括门延时,而且还有实际的布线延时。时序/时延分析的时序仿真是最准确的,能较好地反映芯片的实际工作情况,同,即不满足时序约束条件或者器件固有时序规则(建立时发现时序违规(Tim
推荐度:
点击下载文档文档为doc格式
7z8sj0f2p46m3qp9y5qe
领取福利

微信扫码领取福利

微信扫码分享