搜索
您的当前位置:首页正文

FPGA程序中组合逻辑和时序逻辑的运用

来源:易榕旅网


FPGA程序中组合逻辑和时序逻辑的运用

FPGA程序中组合逻辑和时序逻辑的运用

版本记录表 作者 王长友 版本号 V1.00.a 日期 2016.05.28 修改内容 第一次创建

FPGA程序中组合逻辑和时序逻辑的运用

1、时序逻辑以及组合逻辑使用问题

在编写程序中关于时序的控制中,我们经常会遇到关于组合逻辑和时序逻辑的许多问题,最典型的是组合逻辑和时序逻辑的混合使用,导致程序中的时序可控性降低,调试起来让我们很头疼。

2、组合逻辑以及时序逻辑的使用分析

为此分析一下组合逻辑和时序逻辑的使用来加深对这两种逻辑的使用是有必要的。

组合逻辑适用于门级建模以及数据流建模,其开始于assign,依赖于各种操作符(算数、逻辑、关系、等价、按位、缩减、拼接、移位、重复、条件等操作运算符)。

时序逻辑适用于行为级建模,其使用一般建立在时钟之上,以always@(*)或initial语句开始,使用电平敏感的时序控制机制,运用行为语句:if—else条件语句、case多路分支语句、while循环、for循环、repeat循环、forever循环等,又分为并行块以及顺序块等。

在使用中我们会使用单纯的时序逻辑,单纯的组合逻辑,或者两种逻辑混合使用来建立我们的整个模块系统以及逻辑控制。但是不同的使用方式会带来不同的问题,当然这都是建立在各自逻辑的使用性能的基础上的。

3、实例分析以及解决方案

下来将会简单的举几个例子来说明义下一些会遇到的问题: 1、单纯的时序逻辑

一般的程序设计都是建立在时钟之上的的可控低速数据传输的操作,因此明了的时序控制可以是我们的程序的运行具有很高的可操作和控制性。

如下图:

clkred_n

使用确认的时序,我们可以很明确的知道,我们的数据的改变,很容易控制并改变。

2、单纯的组合逻辑

组合逻辑,在数据传输工程中的使用,可以实时的检测到数据流的变化。 如图:

data16'hffff16'bad01

FPGA程序中组合逻辑和时序逻辑的运用

clkdata0data1data0&data116'hfe2116'h001316'hfc3316'had1316'had0116'h32dc16'hbfdd

3、组合逻辑和时序逻辑的混合使用

在程序中使用组合逻辑可以节省逻辑资源 ,但是组合逻辑使用时要注意,使用组合逻辑生成的信号,如果再使用时序逻辑去判定,或者作为触发条件时会有信号但是触发不到的情况。因为组合逻辑建立的信号不一定符合时序逻辑,他的信号宽度可能无法满足时序中的建立时间和保持时间,从而在使用chipscop调试过程中可以看到有信号,但是不能执行在此信号为触发条件的语句和逻辑。 如下:

clkTemp_0Temp_0_reTemp_1Temp_1_reTemp_1_re&Temp_0Temp_0_re&Temp_1

assign temp_0 = ((!arm_cs)&&( !arm_ce)&&(addr == 16’h2200))?0:1;

always@(posedge clk, negedge reset_n) begin

if(!reset_n)begin temp_1 <= 0; end

else begin

temp_1<= temp_0; end end

assign r_temp = temp_0&(! temp_1_re); assign f_temp = temp_1&(! Temp_0_re); 因此建议,使用组合逻辑产生的信号作为触发信号时,为保证所得到的触发条件可靠。最好将其延时两拍后,再作触发信号;或者在产生触发信号源时就是用时序逻辑,可以保证所得到的信号是可以满足时钟的建立时间以及保持时间。 在上面的程序中,我们可以在生成temp_0时就使用时序逻辑来实现,就不会出问题了。(还有另外的一种方式!!)

因篇幅问题不能全部显示,请点此查看更多更全内容

Top