你的位置:EETOP 赛灵思(Xilinx) 社区 >> >> 全部 >> 详细内容

跟着我从零开始入门FPGA(一周入门XXOO系列)-5、同步和异步设计

发布者:jackzhang 时间:2015-03-13 19:01:25


(本连载共七部分,这是第部分)

作者:McuPlayer2013   (EETOP FPGA版块版主) 原帖地址:http://bbs.eetop.cn/thread-385362-1-1.html

以下是正文:


5、同步和异步设计

前面已有铺垫,同步就是与时钟同步。
同步就是走正步,一二一,该迈哪个脚就迈那个脚,跑的快的要等着跑的慢的。
异步就是搞赛跑,各显神通,尽最大力量去跑,谁跑得快,谁拿奖牌。

我们举个例子,SPI接口,他是一个低成本的单端的高速串行数据传输协议。
四个信号,nCS、SCK、MISO、MOSI

下面是一个Slave SPI的接口部分,简化了,

model mySPI(input nCS, input SCK, input MOSI, output MISO);
    reg[3:0]    bitcnt;
    reg[7:0]    shift_in;   //写入
    reg[7:0]    shift_out;  //读出

    reg[7:0]    data_wt;
    reg[7:0]    data_rd;

    always @(posdge SCK)
    if(nCS)
        bitcnt <= 0;
    else
    begin
        if(bit_cnt!=4'h7)
        begin
            bitcnt <= bitcnt+4'h1;
            shift_in <= {shift_in[6:0], MOSI};
            shift_out <= {shift_out[6:0], 0};
        end
        else
        begin
            bitcnt <= 4'h0;
            ...........
            data_wt <= deshift_in;
            shift_out <= data_rd;
        end
    end
endmodule

这段代码是同步的还是异步的?
其实,他远看是同步的,近看是异步的,仔细一看还是同步的。

大致一看,丫的还配时钟呢,按钟点走步,八成是同步的。
然后一想,不对啊,SPI的SCK是Master提供的,跟自家的全局时钟没有必然关系啊,异步的。
思索一阵,假如俺系统全局时钟都靠SCK不就是同步的了吗?

实际情况如何呢?
举个例子,SPI Flash,比如25系列,其实就是同步的,SCK就是全局时钟。

比如某ARM core的MCU内置SPI模块,为了简化问题,我们只谈Slave的情况,问题就来了。
ARM MCU肯定有其自家的时钟,SPI的Master又送来一个时钟,咋办呢?

当你发愁的时候,你该庆幸自己遇到了几乎所有入门的人都必须解决的问题----多时钟系统。

多时钟,各自都是同步,放在一起就是异步。
正如两队人马,都在走正步,共军走得快,国军走的更快,他们各自都是同步的,扯蛋到一块就是异步。
咋办呢?
丛林法则要起作用了,单一时钟同步化处理,势力小的听势力大的人安排。

model mySPI(input clk, input nCS, input SCK, input MOSI, output MISO);

    always @(clk)
    ...................................
endmodule

clk是自家的全局CLK信号,对方的SCK信号,只在自家CLK触发才看一眼对方的各个信号,包括SCK信号。
这就是强者的统战部,你家的可汗(SCK),见到我家皇帝(clk),也是称臣子。

当然,这个处理方法是有前提的,就是clk的频率要远远高于SCK信号。
所谓远远高于,就是即使我clk的上升沿,瞄你一眼,就不会漏掉你所有的表现。
根据XXXOOO定律,要达到采样不丢信息,尼玛的频率至少是人家的2倍,实际应用中一般保证4倍,或更高。
就好比有4个小弟的人,叫只有一个小弟的人,对自己称臣,听话大家就河蟹,不听就干你。

前面有朋友谈到了复位信号的同步化处理,最简单的就是复位和释放都同步处理,我前面几个帖子有用到。
复位,是什么,是杀头,复位释放是什么,是重新投胎。
你跟情敌斗志斗勇的时候,想到了制胜的一招时候,你觉得是立马去执行,还是等下一次例行见面时再执行。
当然是立马执行了,这不就是异步把情敌给复位了嘛。
你击败情敌之后,要对全班同学宣布的你胜利,是每天早会宣布呢,还是里面召集同学宣布呢?
此时大势已定,当然是按CLK四平八稳来得妥当,大家会认为你是一个做事不鲁莽,有步骤的,电工十佳青年。

所以,我们称之为,异步复位,同步释放。
always @ (posedge clk or negedge nRST)
    if (!nRST)
        击败情敌;
    else
        把击败情敌的战果宣布;
   

再举个例子,Memory的访问,为了简化,我们做个ROM,这样只有读的一种情况,适合理解记忆
model memory8(input[7:0] addr, output[7:0] dat)
    reg[7:0]    rom[255:0];
    assign dat = rom[addr];
endmodule

model memory8(input clk, input[7:0] addr, output[7:0] dat)
    reg[7:0]    rom[255:0];
    reg[7:0]    outbuf;

    assign dat = outbuf;
    always @(posedge clk)
        outbuf <= rom[addr];
endmodule

简单的是异步的,只要地址变化了,输出立马就表现。
我们实际使用的27系列的EPROM,61系列的异步SRAM,都是这样的,始终把OE信号置于有效即可。

复杂的就是同步的了,我不管你地址变了没,在CLK上升沿到来之前,我懒的理你。
异步的SRAM,刚查了下,也有61系列的; 看来不能以前缀来瞎子摸象了。

一般实际用的时候,异步SRAM肯定比同步的好用,同步的老要CLK,你是IO口模拟呢,还是怎么输出呢?
但同步的Memory也不是吃素的,吃的多必然长得壮,同步可以提高更高的传输速度。

该往回说了,为何同步电路可以提高更高的速度呢?

异步,就是赛跑,速度以跑得慢的人为准,团队精神嘛,这不能平均,只能搞木桶原理。
同步,就是大家按一个节奏,你慢的话,就用2个节奏完成,但必须按节奏。

这样负责协调的那个人,就是喊一二一的那个人(clk),可以把握全局的节奏来达到速度最大化。

所以一般FPGA里面都有全局时钟,强大的扇出能力,最小的传输延迟,因为他是老大,好资源他先挑的。
他就好比系统的原子铯钟,他很精确,我们每天跟他对一下时间,我们自家的表,就不会产生误差积累。

异步,2个队伍,各自有自家的老大,比如一个是地址线,一个是数据先,某个时刻,主控一抓。
可能地址线跑得快,数据线跑的慢,就会出现数据错位的情况,数字电路上叫竞争。
你作为运筹帷幄的总统,不能断定2个队伍能同事到达,你仍然用这个方法,你就是在冒险。

作为设计而言,应尽量避免竞争冒险。
如果系统简单,工期紧,速度要求低,逻辑简单,用异步的。
如果系统庞大,速度要求越高越好,逻辑交叉错节,坚决用同步的。
同步设计就是个工具,让智商90的人可以干智商120的人的工作。

Asynchronous 和 Synchronous 这两个单词我老是分不清
后来学软件学逻辑电路,给记住了,带A的要要冒尖的,是异步的

明天要讲的有限状态机,是以同步设计为基础的设计方式,然后我们就可以用90的智商做150智商的工作了。

最新课程

  • 深入浅出玩儿转FPGA

    本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念

  • 从零开始大战FPGA基础篇

    本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“

  • Verilog基础及典型数字

    课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了