<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 基于FPGA的跨時(shí)鐘域信號(hào)處理——MCU

          基于FPGA的跨時(shí)鐘域信號(hào)處理——MCU

          作者: 時(shí)間:2015-01-26 來源:網(wǎng)絡(luò) 收藏

            說到異步時(shí)鐘域的信號(hào)處理,想必是一個(gè)設(shè)計(jì)中很關(guān)鍵的技術(shù),也是令很多工程師對望而卻步的原因。但是異步信號(hào)的處理真的有那么神秘嗎?那么就讓特權(quán)同學(xué)和你一起慢慢解開這些所謂的難點(diǎn)問題,不過請注意,今后的這些關(guān)于異步信號(hào)處理的文章里將會(huì)重點(diǎn)從工程實(shí)踐的角度出發(fā),以一些特權(quán)同學(xué)遇到過的典型案例的設(shè)計(jì)為依托,從代碼的角度來剖析一些特權(quán)同學(xué)認(rèn)為經(jīng)典的跨時(shí)鐘域信號(hào)處理的方式。這些文章都是即興而寫,可能不會(huì)做太多的分類或者歸納,也有一些特例,希望網(wǎng)友自己把握。

          本文引用地址:http://www.ex-cimer.com/article/268640.htm

            另外,關(guān)于異步時(shí)鐘域的話題,推薦大家不妨去看看這些不錯(cuò)的文章,如《跨越鴻溝:同步世界中的異步信號(hào)》等。

            首先說之間的異步通信,參加CPLD助學(xué)活動(dòng)的朋友應(yīng)該都注意到了那塊BJ-EPM板子上預(yù)留了16PIN的單片機(jī)接口,但是那個(gè)實(shí)驗(yàn)里其實(shí)也沒有給出什么實(shí)驗(yàn)代碼。究其原因,大概是特權(quán)同學(xué)有點(diǎn)自私了吧(呵呵~~~),因?yàn)楫?dāng)初剛接觸與FPGA通信處理的時(shí)候,是為了做一個(gè)液晶控制板,用的是很老的EPM7128,資源很小,摸索了個(gè)把月才搞定,不過當(dāng)時(shí)的處理方式上并不穩(wěn)妥,后來隨著不斷學(xué)習(xí)不斷積累經(jīng)驗(yàn)才尋覓到現(xiàn)在的處理方式。不想公開源碼自有所謂的“比較關(guān)鍵的技術(shù)”一說,現(xiàn)在想來蠻有些可笑的。網(wǎng)絡(luò)這么大一個(gè)平臺(tái),憑什么你只索取不共享呢?所以,特權(quán)同學(xué)今后會(huì)努力把自己的點(diǎn)點(diǎn)滴滴設(shè)計(jì)經(jīng)驗(yàn)和大家分享。當(dāng)然了,在提出自己的觀點(diǎn)和看法的同時(shí),也一定會(huì)得到更多高人不同的也許更好的見解,幫助他人的同時(shí)自己也在進(jìn)步,何樂而不為呢。

            羅嗦了一大堆,步入正題吧……

            首先,這個(gè)項(xiàng)目是基于單片機(jī)的應(yīng)用,如果你對單片機(jī)的讀寫時(shí)序不是很熟練,不妨看看特權(quán)同學(xué)的一篇詳細(xì)討論51單片機(jī)擴(kuò)展RAM讀寫時(shí)序的文章《單片機(jī)的擴(kuò)展RAM讀寫時(shí)序》。下面簡單看下11.0592MHz的51單片機(jī)的讀寫時(shí)序圖吧。

            

          點(diǎn)擊看大圖

           

            大體和上面的波形相差無幾,地址總線沒有畫出來,不過地址總線一般是會(huì)早于片選CS到來,并且晚于片選信號(hào)CS撤銷(這個(gè)說法不是絕對的,但是至少對于下面的應(yīng)用是這樣)。

            我們現(xiàn)在的工作是作為的從機(jī),即模擬MCU的擴(kuò)展RAM。MCU若發(fā)出寫時(shí)序,F(xiàn)PGA就得在數(shù)據(jù)穩(wěn)定于數(shù)據(jù)總線時(shí)將其鎖存起來;MCU發(fā)出讀時(shí)序,F(xiàn)PGA就要在MCU鎖存數(shù)據(jù)的建立時(shí)間之前把數(shù)據(jù)放到數(shù)據(jù)總線上,并且到MCU鎖存數(shù)據(jù)的保持時(shí)間結(jié)束后才能將數(shù)據(jù)撤銷?;旧?,我們要干的就是這些活,下面討論verilog在設(shè)計(jì)上如何實(shí)現(xiàn),但是限于篇幅,不對時(shí)序分析做討論,假定這是一個(gè)很理想的總線時(shí)序。

            其實(shí)這個(gè)MCU的讀寫時(shí)序的時(shí)間相對還是很充裕的,因?yàn)槲覀兊腇PGA用的是50MHz的晶振。所以一個(gè)很基本的想法是要求我們把MCU端的信號(hào)同步到FPGA的時(shí)鐘域上,達(dá)到異步信號(hào)的同步處理。

            verilog代碼:

            //----------------------------------------------------------------------

            //----------------------------------------------------------------------

            input clk; //50MHz

            input rst_n; //復(fù)位信號(hào),低有效

            input mcu_cs_n; //MCU片選信號(hào),低有效

            input mcu_wr_n; //MCU寫信號(hào),低有效

            input[3:0] mcu_addr; //MCU地址總線

            input[7:0] mcu_db; //MCU數(shù)據(jù)總線

            reg[3:0] mcu_addr_r; //mcu_addr鎖存寄存器

            reg[7:0] mcu_db_r; // mcu_db鎖存寄存器

            //////mcu_cs_n和mcu_wr_n同時(shí)拉低時(shí)wr_state拉低,表示片選并寫選通

            wire wr_state = mcu_cs_n || mcu_wr_n; //寫狀態(tài)標(biāo)志位,寫選通時(shí)拉底

            always @ (posedge clk or negedge rst_n)

            if(!rst_n) begin

            mcu_addr_r <= 4’h0;

            mcu_db_r <= 8’h00;

            end

            else if(!wr_state) begin

            mcu_addr_r <= mcu_addr;// mcu_addr鎖存寄存器

            mcu_db_r <= mcu_db;// mcu_db鎖存寄存器

            end

            wire pos_wr; // MCU寫狀態(tài)上升沿標(biāo)志位

            reg wr1,wr2; // MCU寫狀態(tài)寄存器

            always @ (posedge clk or negedge rst_n)

            if(!rst_n) begin

            wr1 <= 1'b1;

            wr2 <= 1'b1;

            end

            else begin

            wr1 <= wr_state;

            wr2 <= wr1;

            end

            assign pos_wr = ~wr2 && wr1; //寫選通信號(hào)上升沿pos_wr拉高一個(gè)時(shí)鐘周期

            上面的代碼就是基于MCU發(fā)出的異步時(shí)序的一種同步處理。當(dāng)然了,這種處理是基于特定的應(yīng)用。MCU寫選通撤銷時(shí),pos_wr信號(hào)(使用了脈沖邊沿檢測方法處理)會(huì)拉高一個(gè)時(shí)鐘周期,就可以利用此信號(hào)作為后續(xù)處理的狀態(tài)機(jī)中的一個(gè)指示信號(hào)。然后對已經(jīng)鎖存在FPGA內(nèi)部相應(yīng)寄存器里的地址總線和數(shù)據(jù)總線進(jìn)行處理。

            另外,對于mcu_addr_r和mcu_db_r的鎖存為什么要在wr_state為低時(shí)進(jìn)行,這個(gè)問題特權(quán)同學(xué)是這么考慮的:wr_state拉低期間即MCU片選和寫選通同時(shí)有效期間數(shù)據(jù)總線/地址總線一定是穩(wěn)定的,而為了有更充足的數(shù)據(jù)建立時(shí)間,比較常見的做法是用mcu_wr_n的上升沿鎖存數(shù)據(jù),而如果用諸如posedge mcu_wr_n來做觸發(fā)鎖存數(shù)據(jù)/地址,那就很容易出現(xiàn)異步?jīng)_突的問題(這個(gè)問題的危害以后的文章詳細(xì)討論),達(dá)不到同步的效果,所以這里就用一個(gè)電平信號(hào)作為使能信號(hào)來得更加穩(wěn)妥。換個(gè)角度看,無非是wr_state上升沿的前0-20ns都有可能是最后鎖存下來的數(shù)據(jù),這對于我們充足的MCU寫時(shí)序來說是綽綽有余了。理論上來說,wr_stata是一個(gè)總線使能信號(hào),應(yīng)該要做至少一級(jí)同步再使用更穩(wěn)妥一些,但是出于我們充裕的時(shí)序,即便是wr_stata沒有進(jìn)行同步處理,退一步說,出現(xiàn)了wr_state的一個(gè)亞穩(wěn)態(tài)時(shí)在鎖存數(shù)據(jù),那么此時(shí)的數(shù)據(jù)總線/地址總線的數(shù)據(jù)也不會(huì)受到影響,該什么值還是什么值。不同的應(yīng)用中往往有允許非常規(guī)處理的時(shí)候,就像時(shí)序分析中的時(shí)序例外一樣。希望大家能理解這個(gè)部分,不理解也沒有關(guān)系,以后的文章會(huì)更深入探討異步時(shí)鐘域中亞穩(wěn)態(tài)這個(gè)大問題,到時(shí)再回頭看看也許你就明白了。

          fpga相關(guān)文章:fpga是什么


          51單片機(jī)相關(guān)文章:51單片機(jī)教程


          晶振相關(guān)文章:晶振原理


          關(guān)鍵詞: FPGA MCU

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();