1. 程式人生 > >【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗十二:串列埠模組① — 傳送

【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗十二:串列埠模組① — 傳送

實驗十二:串列埠模組① — 傳送

串列埠固然是典型的實驗,想必許多同學已經作爛,不過筆者還要循例介紹一下。我們知道串列埠有傳送與接收之分,實驗十二的實驗目的就是實現串列埠傳送,然而不同的是 ... 筆者會用另一種思路去實現串列埠傳送。

clip_image002

圖12.1 PS/2傳送時序與串列埠傳送時序。

如圖12.1所示,串列埠傳送時序相較PS/2傳送時序,串列埠傳送時序就像斷了翅膀的小鳥般,沒有時鐘訊號控制整個傳輸協議。除此之外,串列埠傳送時序與PS/2傳送時序近似的地方也非常驚人 ... 預設下,一幀PS/2資料有11位,對此一幀串列埠資料也有11位,其中位分配如表12.1所示:

表12.1 一幀串列埠資料的位分配。

位分配

位定義

[0]

起始位

[8:1]

資料位

[9]

校驗位

[10]

停止位

如表12.1所示,[0]為拉低的起始位,[8:1]為任意填充的資料位,[9]為任意填充的校驗位,[10]為拉高的停止位。

clip_image004

圖12.2 FPGA傳送一幀串列埠資料(無視波特率)。

假設我們無視波特率,並且利用FPGA傳送一幀串列埠資料的話 ... 如圖12.2所示,一幀有11位的串列埠資料,一共使用了11個上升沿傳送出去,為此Verilog則可以這樣表示,結果如程式碼12.1所示:

      reg [10:0]D1;
     always @(posedge CLOCK)
         case(i)
            0,1,2,3,4,5,6,7,8,9,10:      
            begin TXD <= D1[i]; i <= i + 1'b1; end
            ......
         endcase

程式碼12.1

如程式碼12.1所示,暫存器D為11位寬的暫存器,並且驅動TXD輸出口,期間步驟0~11公按照i的位定址,將D1的內容逐個傳送出去。

雖然串列埠傳輸協議極為類似PS/2傳輸協議,但是串列埠傳輸協議也有區別的地方。其一串列埠傳輸協議有波特率的概念,而且串列埠協議有各種各樣的波特率,常用的波特率有9600 bps或者115200 bps,波特率最低為 110 bps,最高為 256000 bps(目前暫定)。所謂波特率就是一秒內,串列埠可以傳送多少位資料,此外波特率也是一位資料的週期,或者說是一位資料的保持時間,就拿115200 bps為例:

1/115200 = 8.68E-6

115200波特率的一位資料週期為 8.68us,如果用50Mhz 的時鐘頻率去量化的話:

( 1/115200 ) / (1/50E+6) = 8.68E-6 / 20E-9

= 434

clip_image006

圖12.3 FPGA傳送一幀串列埠資料(考慮波特率)。

如果圖12.3考慮115200的波特率,結果如圖12.3所示,每一位資料都保持434個時鐘

,為此Verilog可以這樣表示,如程式碼12.2所示:

      reg [10:0]D1;
      reg [8:0]C1;
     always @(posedge CLOCK)
         case(i)
            0,1,2,3,4,5,6,7,8,9,10:    
             if( C1 == 9’d434 -1 ) begin C1 <= 9’d0; i <= i + 1’b1; end  
            else begin TXD <= D1[i]; C1 <= C1 + 1'b1; end
            ......
         endcase

程式碼12.1

如程式碼12.1所示,步驟0~10不再保持一個時鐘,換之每個步驟都保持434個時鐘,因此每位TXD的傳送資料也保持 8.68us。

除此此外,串列埠傳輸協議不僅可以自定義波特率,串列埠傳輸協議也可以自定義一幀資料的位寬,自定義內容如表12.2所示:

表12.2 自定義一幀資料。

自定義資料位

自定義內容

資料位

5~9

校驗位

有/無

停止位

1~2

如表12.2所示,可以自定義的資料其中便包含資料位,預設下為1位元組,自定義內容則是5~9位,校驗位也可以設定為有或者無(預設下是有),停止位也可以增至2位(預設下是1位)。不管怎麼樣,表12.2是比較官方的自定義內容 ... 只要讀者歡喜,任何畸形的自定義內容也有可能實現。

理解完畢以後,我們便可以開始建模了。

clip_image008

圖12.4 實驗十二的建模圖。

圖12.4是實驗十二的建模圖,不過內容較為寒酸 ... 組合模組 tx_demo 內容包括一段核心操作,還有一隻TX功能模組。核心操作負責TX功能模組的呼叫,亦即控制溝通訊號還有Data的輸入。TX功能模組被使能以後,便將iData經由TXD輸出端傳送出去

,完後便反饋完成訊號以示一次性的操作已經完畢。

tx_funcmod.v

clip_image010

圖12.5 TX功能模組的建模圖。

如圖12.5所示,該模組的左方有問答訊號,還有8位的iData,至於右方則是 TXD 頂層訊號。此外,一幀資料的波特率為 115200 bps。

1.    module tx_funcmod
2.    (
3.         input CLOCK, RESET,
4.         output TXD,
5.         input iCall,
6.         output oDone,
7.         input [7:0]iData
8.    );
9.         parameter B115K2 = 9'd434; // formula : ( 1/115200 )/( 1/50E+6 )     

以上內容為相關的出入端宣告,第9行則是波特率為115200的常量宣告。

11.         reg [3:0]i;
12.         reg [8:0]C1;
13.         reg [10:0]D1;
14.         reg rTXD;
15.         reg isDone;
16.         
17.         always @( posedge CLOCK or negedge RESET )
18.             if( !RESET )
19.                  begin
20.                         i <= 4'd0;
21.                         C1 <= 9'd0;
22.                         D1 <= 11'd0;
23.                         rTXD <= 1'b1; 
24.                         isDone <= 1'b0;
25.                  end

以上內容為相關的暫存器宣告以及復位操作。

26.              else if( iCall )
27.                  case( i )
28.                    
29.                         0:
30.                         begin D1 <= { 2'b11 , iData , 1'b0 }; i <= i + 1'b1; end
31.                         
32.                         1,2,3,4,5,6,7,8,9,10,11:      
33.                         if( C1 == B115K2 -1 ) begin C1 <= 8'd0; i <= i + 1'b1; end
34.                         else begin rTXD <= D1[i - 1]; C1 <= C1 + 1'b1; end
35.    
36.                         12:
37.                         begin isDone <= 1'b1; i <= i + 1'b1; end
38.                         
39.                         13:
40.                         begin isDone <= 1'b0; i <= 4'd0; end
41.                    
42.                    endcase
43.                        

以上內容為部分核心操作。第26行的if( iCall ) 表示該模組不使能就不工作。步驟0用來準備傳送資料,其中 2’b11 是停止位與校驗位(隨便填),1’b0則是起始位。步驟1~11用來發送一幀資料。步驟12~13用來反饋完成訊號並返回步驟。

44.        assign TXD = rTXD;
45.        assign oDone = isDone;           
46.    
47.    endmodule

以上內容為驅動輸出的宣告。

tx_demo.v

連線部署直接看程式碼比較具體一點。

1.    module tx_demo
2.    (
3.         input CLOCK, RESET,
4.         output TXD
5.    );
6.        wire DoneU1;

以上內容是相關的出入端宣告。

8.        tx_funcmod U1
9.         (
10.              .CLOCK( CLOCK ),
11.              .RESET( RESET ),
12.              .TXD( TXD ),
13.              .iCall( isTX ),
14.              .oDone( DoneU1 ),
15.             .iData( D1 )
16.         );

以上內容是TX功能模組的例項化,其中isCall由isTX驅動,iData由D驅動。

18.         reg [3:0]i;
19.         reg [7:0]D1;
20.         reg isTX;
21.         
22.         always @ ( posedge CLOCK or negedge RESET )
23.             if( !RESET )
24.                  begin
25.                         i <= 4'd0;
26.                         D1 <= 8'd0;
27.                         isTX <= 1'b0;
28.                    end

以上內容是相關的暫存器宣告,第23~28行則是這些暫存器的復位操作。

29.              else
30.                  case( i )
31.                    
32.                        0:
33.                         if( DoneU1 ) begin isTX <= 1'b0; i <= i + 1'b1; end
34.                         else begin isTX <= 1'b1; D1 <= 8'hA1; end
35.                         
36.                         1:
37.                         if( DoneU1 ) begin isTX <= 1'b0; i <= i + 1'b1; end
38.                         else begin isTX <= 1'b1; D1 <= 8'hA2; end
39.                         
40.                         2:
41.                         if( DoneU1 ) begin isTX <= 1'b0; i <= i + 1'b1; end
42.                         else begin isTX <= 1'b1; D1 <= 8'hA3; end
43.                         
44.                         3: // Stop
45.                         i <= i;
46.                    
47.                    endcase
48.    
49.    endmodule

以上內容是核心操作的內容,步驟0傳送資料 8’hA1,步驟1傳送資料8’hA2,步驟2傳送資料 8’hA3。

編譯完畢便下載程式,並且將串列埠線連線至電腦與開發板。開啟串列埠除錯助手,波特率設為115200,資料位為8,校驗位隨便,停止位為1位 ... 事後,顯示方式設定為HEX(十六進位制)。當程式下載完畢以後,串列埠除錯助手便會出現 A1,A2與A3。

細節一: 完整的個體模組

實驗十二的TX功能模組已經是完整的個體,可以直接拿來呼叫。

相關推薦

黑金原創教程FPGA那些事兒-驅動I 實驗串列模組① — 傳送

實驗十二:串列埠模組① — 傳送 串列埠固然是典型的實驗,想必許多同學已經作爛,不過筆者還要循例介紹一下。我們知道串列埠有傳送與接收之分,實驗十二的實驗目的就是實現串列埠傳送,然而不同的是 ... 筆者會用另一種思路去實現串列埠傳送。 圖12.1 PS/2傳送時序與串列埠傳送時序。 如圖12.1所示

黑金原創教程FPGA那些事兒-驅動I 實驗流水燈模組

實驗一:流水燈模組 對於發展商而言,動土儀式無疑是最重要的任務。為此,流水燈實驗作為低階建模II的動土儀式再適合不過了。廢話少說,我們還是開始實驗吧。 圖1.1 實驗一建模圖。 如圖1.1 所示,實驗一有名為 led_funcmod的功能模組。如果無視環境訊號(時鐘訊號還有復位訊號),該功能模組只有

黑金原創教程FPGA那些事兒-驅動I 連載導讀

前言: 無數晝夜的來回輪替以後,這本《驅動篇I》終於編輯完畢了,筆者真的感動到連鼻涕也流下來。所謂驅動就是認識硬體,還有前期建模。雖然《驅動篇I》的硬體都是我們熟悉的老友記,例如UART,VGA等,但是《驅動篇I》貴就貴在建模技巧的昇華,亦即低階建模II。 話說低階建模II,讀過《建模篇》的朋友多少也會面

黑金原創教程FPGA那些事兒-驅動I 實驗按鍵模組② — 點選與長點選

實驗三:按鍵模組② — 點選與長點選 實驗二我們學過按鍵功能模組的基礎內容,其中我們知道按鍵功能模組有如下操作: l 電平變化檢測; l 過濾抖動; l 產生有效按鍵。 實驗三我們也會z執行同樣的事情,不過卻是產生不一樣的有效按鍵: l 按下有效(點選); l 長按下有效(長點選)。 圖3

黑金原創教程FPGA那些事兒-驅動I 實驗按鍵模組

實驗二:按鍵模組① - 消抖 按鍵消抖實驗可謂是經典中的經典,按鍵消抖實驗雖曾在《建模篇》出現過,而且還惹來一堆麻煩。事實上,筆者這是在刁難各位同學,好讓對方的慣性思維短路一下,但是慘遭口水攻擊 ... 面對它,筆者宛如被甩的男人,對它又愛又恨。不管怎麼樣,如今 I’ll be back,筆者再也不會重複一

黑金原創教程FPGA那些事兒-驅動I 實驗數碼管模組

實驗六:數碼管模組 有關數碼管的驅動,想必讀者已經學爛了 ... 不過,作為學習的新儀式,再爛的東西也要溫故知新,不然學習就會不健全。黑金開發板上的數碼管資源,由始至終都沒有改變過,筆者因此由身懷念。為了點亮多位數碼管從而顯示數字,一般都會採用動態掃描,然而有關動態掃描的資訊請怒筆者不再重複。在此,同樣也是

黑金原創教程FPGA那些事兒-驅動I 實驗按鍵模組③ — 單擊與雙擊

實驗四:按鍵模組③ — 單擊與雙擊 實驗三我們建立了“點選”還有“長點選”等有效按鍵的多功能按鍵模組。在此,實驗四同樣也是建立多功能按鍵模組,不過卻有不同的有效按鍵。實驗四的按鍵功能模組有以下兩項有效按鍵: l 單擊(按下有效); l 雙擊(連續按下兩下有效)。 圖4.1 單擊有效按鍵,時序示意圖

黑金原創教程FPGA那些事兒-驅動I 實驗按鍵模組④ — 點選,長點選,雙擊

實驗五:按鍵模組④ — 點選,長點選,雙擊 實驗二至實驗四,我們一共完成如下有效按鍵: l 點選(按下有效) l 點選(釋放有效) l 長擊(長按下有效) l 雙擊(連續按下有效) 然而,不管哪個實驗都是隻有兩項“功能”的按鍵模組而已,如今我們要建立三項“功能”的按鍵模組,亦即點選(按下有效),長

黑金原創教程FPGA那些事兒-驅動I 原創教程連載導讀連載完成,共九章

前言: 無數晝夜的來回輪替以後,這本《驅動篇I》終於編輯完畢了,筆者真的感動到連鼻涕也流下來。所謂驅動就是認識硬體,還有前期建模。雖然《驅動篇I》的硬體都是我們熟悉的老友記,例如UART,VGA等,但是《驅動篇I》貴就貴在建模技巧的昇華,亦即低階建模II。 話說低階建模II,讀過《建模篇》的朋友多少也會面

黑金原創教程FPGA那些事兒-驅動I 實驗SDRAM模組④ — 頁讀寫 β

實驗二十一:SDRAM模組④ — 頁讀寫 β 未進入主題之前,讓我們先來談談一些重要的體外話。《整合篇》之際,筆者曾經比擬Verilog如何模仿for迴圈,我們知道for迴圈是順序語言的產物,如果Verilog要實現屬於自己的for迴圈,那麼它要考慮的東西除了步驟以外,還有非常關鍵的時鐘。 for(

黑金原創教程FPGA那些事兒-驅動I 實驗PS/2模組④ — 普通滑鼠

實驗十:PS/2模組④ — 普通滑鼠 學習PS/2鍵盤以後,接下來就要學習 PS/2 滑鼠。PS/2滑鼠相較PS/2鍵盤,驅動難度稍微高了一點點,因為FPGA(從機)不僅僅是從PS/2滑鼠哪裡讀取資料,FPGA還要往滑鼠裡寫資料 ... 反之,FPGA只要對PS/2鍵盤讀取資料即可。然而,最傷腦筋的地方就在

黑金原創教程FPGA那些事兒-驅動I 實驗SDRAM模組① — 單字讀寫

實驗十八:SDRAM模組① — 單字讀寫 筆者與SDRAM有段不短的孽緣,它作為冤魂日夜不斷糾纏筆者。筆者嘗試過許多方法將其退散,不過屢試屢敗的筆者,最終心情像橘子一樣橙。《整合篇》之際,筆者曾經大戰幾回兒,不過內容都是點到即止。最近它破蠱而出,日夜不停:“好~痛苦!好~痛苦!”地呻吟著,嚇得筆者不敢半夜如

黑金原創教程FPGA那些事兒-驅動I 實驗TFT模組

實驗二十七:TFT模組 - 顯示 所謂TFT(Thin Film Transistor)就是眾多LCD當中,其中一種支援顏色的LCD,相較古老的點陣LCD(12864笑),它可謂高階了。黑金的TFT LCD除了320×240大小以外,內建SSD1289控制器,同時也是獨立模組。事實上,無論是驅動點陣LCD還

黑金原創教程FPGA那些事兒-驅動I 實驗十三串列模組② — 接收

實驗十三:串列埠模組② — 接收 我們在實驗十二實現了串列埠傳送,然而這章實驗則要實現串列埠接收 ... 在此,筆者也會使用其它思路實現串列埠接收。 圖13.1 模組之間的資料傳輸。 假設我們不考慮波特率,而且一幀資料之間的傳輸也只是發生在FPGA之間,即兩隻模組之間互轉,並且兩塊模組都使用相同的時

黑金原創教程FPGA那些事兒-驅動I 實驗PS/2模組① — 鍵盤

實驗七:PS/2模組① — 鍵盤 實驗七依然也是熟爛的PS/2鍵盤。相較《建模篇》的PS/2鍵盤實驗,實驗七實除了實現基本的驅動以外,我們還要深入解PS/2時序,還有PS/2鍵盤的行為。不過,為了節省珍貴的頁數,怒筆者不再重複有關PS/2的基礎內容,那些不曉得的讀者請複習《建模篇》或者自行谷歌一下。 市場

黑金原創教程FPGA那些事兒-驅動I 實驗PS/2模組③ — 鍵盤與多組合鍵

實驗九:PS/2模組③ — 鍵盤與多組合鍵 筆者曾經說過,通碼除了單位元組以外,也有雙位元組通碼,而且雙位元組通碼都是 8’hE0開頭,別名又是 E0按鍵。常見的的E0按鍵有,<↑>,<↓>,<←>,<→>,<HOME>,<PRTSC>

黑金原創教程FPGA那些事兒-驅動I 實驗SDHC模組

實驗二十五:SDHC模組 筆者曾經說過,SD卡發展至今已經衍生許多版本,實驗二十四就是針對版本SDV1.×的SD卡。實驗二十四也說過,CMD24還有CMD17會故意偏移地址29,讓原本範圍指向從原本的232 變成 223,原因是SD卡讀寫一次都有512個位元組。為此我們可以這樣計算: SDV1.x = 2

黑金原創教程FPGA那些事兒-驅動I 實驗SDRAM模組③ — 頁讀寫 α

實驗二十:SDRAM模組③ — 頁讀寫 α 完成單字讀寫與多字讀寫以後,接下來我們要實驗頁讀寫。醜話當前,實驗二十的頁讀寫只是實驗性質的東西,其中不存在任何實用價值,筆者希望讀者可以把它當成頁讀寫的熱身運動。 表示20.1 Mode Register的內容。 Mode Register

黑金原創教程FPGA那些事兒-驅動I 實驗TFT模組

實驗二十八:TFT模組 - 觸屏 讀者在上一個實驗所玩弄過的 TFT LCD模組,除了顯示大小為 320 × 240,顏色為16位RGB的影象資訊以外,它還支援觸屏。所謂觸屏就是滑鼠還有鍵盤以外的輸入手段,例如現在流行平板還有智慧手機,觸屏輸入對我們來說,已經成為日常的一部分。描述語言一門偏向硬體的語言

黑金原創教程FPGA那些事兒-驅動I 實驗SDRAM模組⑤ — FIFO讀寫

經過漫長的戰鬥以後,我們終於來到最後。對於普通人而言,頁讀寫就是一名戰士的墓碑(最終戰役) ... 然而,怕死的筆者想透過這個實驗告訴讀者,旅程的終點就是旅程的起點。一直以來,筆者都在煩惱“SDRAM是否應該成為儲存類?”SDRAM作為一介儲存資源(儲存器),它的好處就是大容量空間,壞處則就是麻煩的控制規