<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/268640.htm

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

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

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

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

  

點(diǎn)擊看大圖

 

  大體和上面的波形相差無(wú)幾,地址總線(xiàn)沒(méi)有畫(huà)出來(lái),不過(guò)地址總線(xiàn)一般是會(huì )早于片選CS到來(lái),并且晚于片選信號CS撤銷(xiāo)(這個(gè)說(shuō)法不是絕對的,但是至少對于下面的應用是這樣)。

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

  其實(shí)這個(gè)MCU的讀寫(xiě)時(shí)序的時(shí)間相對還是很充裕的,因為我們的FPGA用的是50MHz的晶振。所以一個(gè)很基本的想法是要求我們把MCU端的信號同步到FPGA的時(shí)鐘域上,達到異步信號的同步處理。

  verilog代碼:

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

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

  input clk; //50MHz

  input rst_n; //復位信號,低有效

  input mcu_cs_n; //MCU片選信號,低有效

  input mcu_wr_n; //MCU寫(xiě)信號,低有效

  input[3:0] mcu_addr; //MCU地址總線(xiàn)

  input[7:0] mcu_db; //MCU數據總線(xiàn)

  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拉低,表示片選并寫(xiě)選通

  wire wr_state = mcu_cs_n || mcu_wr_n; //寫(xiě)狀態(tài)標志位,寫(xiě)選通時(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寫(xiě)狀態(tài)上升沿標志位

  reg wr1,wr2; // MCU寫(xiě)狀態(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; //寫(xiě)選通信號上升沿pos_wr拉高一個(gè)時(shí)鐘周期

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

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

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


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


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


關(guān)鍵詞: FPGA MCU

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>