您當前的位置:首頁 > 收藏

串列埠收發模組設計

作者:由 數字積木 發表于 收藏時間:2022-01-06

串列埠收發模組設計

作者:鞏文宏 公眾號:數字積木

該串列埠收發模組有串列埠傳送模組,串列埠接收模組,波特率生成模組,傳送資料fifo模組,接收資料的fifo模組組成。

預設配置下,要求輸入的參考時鐘為50MHz,輸入輸出的波特率預設配置為115200。該設定體現在波特率生成模組中。

整體的設計框架如下:

串列埠收發模組設計

埠定義如下:

埠名方向描述Clk

Input主時鐘,預設頻率為50MHz

Rst_n

Input復位訊號,低有效

RsRx

Input串列埠接收埠

RSTx

Output串列埠傳送埠

Tx_data_in[7:0]

Inputtx端要傳送的1位元組資料

Rx_data_out[7:0]

outputrx埠接收到的1位元組資料

Tx_wen

Input傳送資料的寫入使能訊號

Rx_ren

Input接收資料的讀取使能訊號

Uart_irq

output串列埠中斷訊號,為高時標誌著rx接收到了有效的資料該模組的使用:

傳送資料

將要傳送的資料放置到Tx_data_in[7:0]總線上,同時將Tx_wen置為高,下一個時鐘時,該資料會寫進tx_fifo中。如要傳送多位元組資料,則重複上述步驟,每個時鐘向TX_FIFO中傳送一個位元組的資料,tx_fiof的預設深度為256,可以儲存256個位元組的資料,則一次最多可以傳送256位元組資料。

接收資料

接收到一個位元組的有效資料時,該位元組立即在Rx_data_out[7:0]埠輸出,此時中斷訊號Uart_irq為高時,讀取輸出埠的資料,同時將Rx_ren置一個時鐘的高電平即可 。 。

1,波特率計數模組

在波特率生成模組中,生成傳送和接收資料的取樣時鐘,該取樣時鐘為波特率的16倍頻時鐘。count_reg 是分頻計數器。27為波特率設定為115200時的時鐘分頻引數。

串列埠收發模組設計

設定一個可配置引數 Baud_rate,便可以再頂層例化模組中透過該引數來改變串列埠的波特率。引數值和對應的波特率如下表所示。預設情況下,配置引數為6,對應的波特率設定為115200。

串列埠收發模組設計

分頻計數器的引數計算如下:

分頻引數 = 主時鐘頻率/(波特率*16)。

設定為其他常用波特率時,該引數的值為下表:

波特率計算的分頻引數實際的分頻引數配置引數1200

2604。226041

2400

1302。113022

4800

651。06513

9600

325。53254

38400

81。4815

115200

27。1276

2,fifo模組

tx_fifo和rx_fifo 都是例化的自定義的fifo模組。該fifo模組預留有引數介面,可以透過改變該引數來改變fifo的深度和資料寬度。

fifo模組用於臨時儲存串列埠傳送和接收的資料,進行跨時鐘預的資料儲存。若不使用fifo來暫存資料,由於串列埠傳送資料相對緩慢,則要連續傳送多個位元組的資料時,必須等待上一個位元組傳送完成後才能傳送下一個位元組,則主模組便要不斷等待。使用fifo後,便可以將連續多個位元組的資料一次性發送到fifo中,傳送模組便會自動讀取fifo中的資料進行傳送,主模組便可以空閒。

接收模組的fifo同理。將接收到的多個數據暫時儲存在fifo中,在讀取時便可以一次性連續讀取多個位元組的資料。

當往fifo中寫入資料時,寫入的第一個位元組的資料就會在R_out[7:0]埠輸出。將rd訊號置高時,讀指標指向下一個地址,在下一個時鐘將輸出下一個位元組資料。

fifo模組的配置引數和埠定義如下:

串列埠收發模組設計

定義了一個名為array_reg的記憶體陣列,該記憶體陣列的儲存深度由引數AWIDTH決定,儲存的深度等於 2^AWIDTH。fifo的資料寬度等於DWIDTH。

串列埠收發模組設計

在串列埠模組例化該fifo模組時,將AWIDTH配置為8,DWIDTH也配置為8。即例化了一個數據寬度為8,儲存深度為256的fifo模組。

串列埠收發模組設計

傳送資料fifo:

要透過tx埠向其他串列埠裝置傳送資料,首先將要傳送的資料放置到Tx_data_in[7:0]總線上,同時將Tx_wen置為高,下一個時鐘時,該資料會寫進tx_fifo中。如要傳送多位元組資料,則重複上述步驟,每個時鐘向TX_FIFO中傳送一個位元組的資料,tx_fiof的預設深度為64,可以儲存64個位元組的資料,則一次最多可以傳送64位元組資料。當資料儲存到TX_FIFO中後,fifo的空標誌位(empty)不等於零,令傳送模組的開發傳送標誌位(tx_start)等於 ~empty,則當fifo內儲存有要傳送的資料時,tx_start訊號為1,此時,傳送模組從TX_FIFO中讀取一位元組的資料。待這一位元組的資料傳送完成後,繼續讀取fifo內儲存的下一個傳送資料。直至將fifo內儲存的資料全部讀取完後,empty等於1,tx_start等於0,傳送模組不再發送資料。

接收資料fifo:

當接收到rx埠的有效資料時,接收到的資料會臨時儲存在rx_fifo中,第一個位元組的資料就會在Rx_data_out[7:0]埠輸出。中斷訊號 uart_irq 時rx_fifo的空標誌位的取反,此時中斷訊號 uart_irq 為高,標誌這接收到了有效的資料。此時將Rx_ren置為高,讀指標指向下一個資料的地址,在下一個時鐘將輸出下一個位元組資料。連續將Rx_ren置為高,則可讀出儲存在rx_fifo中的接收到的資料,並從Rx_data_out[7:0]埠輸出,直到fifo中的資料被讀完。

故當tx_fifo裡每接收到一個數據時,中斷訊號為高即標誌著接收到了資料,同時在接收到的資料就在Rx_data_out[7:0]埠輸出。如果每接收到一個有效資料就立即讀取,則必須同時傳送一個週期的Rx_ren高訊號,使得讀地址指標指向下一個讀地址,以便當接收到新的資料時,也能立即輸出。

如果等待接收多個位元組的資料才讀取的話,此時輸出埠直接輸出第一個位元組的地址,當將Rx_ren訊號置高時,每一個時鐘輸出一個接收到的資料,直到fifo中的資料被讀完。

3,傳送模組

傳送模組的埠如下:

串列埠收發模組設計

當 訊號 tx_start 為高時,該模組將此時埠 d_in[7:0]輸入的資料按照預定的波特率將該位元組的資料從埠tx傳送出去, 波特率時鐘 b_tick 指定了該模組的波特率。等到該位元組資料傳送完成後,tx_done訊號被置為一個時鐘的高電平。tx_done訊號連線到tx_fifo的讀埠,當tx_done為高時,fifo的讀指標指向下一個地址,如果下一個地址還儲存有資料,輸出埠輸出儲存在下一個地址中的資料,同時empty訊號為0,串列埠傳送模組將繼續傳送資料。當下一個地址還沒有資料時,empty輸出為高,資料傳送停止。

4,接收模組

接收模組的埠如下:

串列埠收發模組設計

當該模組從rx埠接收到一個有效的位元組資料後,rx_done會置高一個時鐘,同時接收到的資料從埠dout[7:0]輸出。rx_done連線到rx_fifo的寫使能埠,接收到的資料將寫入到rx_fifo中。

5,模組測試

透過電腦端串列埠向FPGA傳送資料,FPGA端RX模組接收到資料後再將該資料透過串列埠在傳送到電腦端。

我們連續傳送了字串“123”,在接收端也同樣接收到了字串“123”。

串列埠收發模組設計

這是接收到的三個字符采樣得到的時序圖。

串列埠收發模組設計

如下圖,當接收到一個位元組資料後,uart_irq訊號會置高,同時接收到的資料就立刻在rx_data_out[7:0]埠輸出。然後將rx_ren訊號置高一個時鐘,讓讀地址指標指向下一個地址,則當再次接收到一個新的資料時,該資料也能馬上輸出。

串列埠收發模組設計

關注公眾號:“數字積木”,獲取更多精彩內容,技術乾貨。

標簽: FIFO  模組  資料  位元組