一、簡介
??UART轉AHB模塊用于實現一種簡單的通過上位機控制FPGA內部寄存器的方式。上位機通過串口助手發送讀寫寄存器的指令,UART轉AHB模塊接收指令后解析出地址,命令,數據信息,然后轉成AHB總線格式輸出。這時UART轉AHB模塊相當于AHB master主模塊,對應的包含寄存器的就是AHB slave從模塊。
??UART接口是上位機最簡單最通用的接口,物理接口就TXD和RXD兩根線,通過FPGA的3.3V引腳接可以接入。協議方面按字節傳輸,網上教程也比較多,這里不做詳細介紹。時序圖如下,也比較簡單,只是每個傳輸的字節是什么功能需要自己定義。
??一般設置參數都是波特率115200,有效數據位8,停止位1,無奇偶校驗位。
??AHB(Advanced High-performance Bus)是一種常用的FPGA內部總線接口。接口保留AHB接口中的主要端口,描述如下。
??AHB總線的一次傳輸由如下兩部分組成。地址段,一個周期;數據段,一個或多個周期,可以由HREADY發出請求延長一個周期。
??下圖是一次沒有等待狀態的簡單的傳輸時序圖。HCLK上升沿 master 驅動地址和控制信號。HCLK下一周期上升沿 slave 采樣地址和控制信息,如果是讀操作,slave 發出相應的反饋信息,在第三個時鐘上升沿被 master采樣,同時 slave 完成數據的讀寫操作。
二、模塊介紹
??仿真工程可以從此地址下載https://download.csdn.net/download/cjie221/90484623
??如下圖是UART轉AHB模塊的功能框圖。主要分兩部分,uart_slv_top模塊和uart_ahb_mst模塊。
1. uart_slv_top模塊
??uart_slv_top模塊相當于UART的從設備,接收從上位機發送過來的串行指令數據,轉成字節數據和數據使能信號。框圖和主要端口如下圖。
??其中uart_rxs用2個計數器,一個計每個bit位的時鐘數,另一個計bit位數,1個開始位,8個數據位,一個停止位,共10位。然后將串行8個數據位轉成并行輸出并加上數據有效指示信號。
??uart_txs同樣也是用2個計數器實現數據轉換,一個計每個bit位的時鐘數,另一個計bit位數。在tx_rdy信號為高時,等待tx_wrreq請求信號和數據,然后拉低tx_rdy信號,表示發送模塊正在忙,待串行數據傳輸完,再拉高tx_rdy。
2. uart_ahb_mst模塊
??uart_ahb_mst模塊接收uart_slv_top模塊發送過來的rx_data數據,解析出讀寫命令和地址,再轉成AHB總線接口輸出控制AHB slave從模塊。如果是讀命令,還要將讀回的寄存器值轉成tx_wrreq請求信號和數據送給uart_slv_top模塊。
??采用FIFO實現UART時鐘域到AHB時鐘域的轉換。因為UART傳輸較慢,而AHB傳輸較快,FIFO還具有指令和數據緩存的作用。對UART RX的FIFO可以保證UART指令接收完再進行AHB讀寫。對UART TX的FIFO可以緩存多條AHB的返回數據,從而保證UART能有足夠時間完成數據的發送。
??框圖和主要端口如下圖。
三、實際仿真過程
??如下圖所示是testbench框圖,除uart_ahb_mst_top模式是被測試模塊,其他模塊是測試激勵和相關輔助模塊。
??uart_cmd_trans模塊主要有兩個作用,一是負責將如下字符轉成ASCII 碼輸出。
`define CHAR_SPACE 8'h20
`define CHAR_R_UP 8'h52
`define CHAR_r_LO 8'h72
`define CHAR_W_UP 8'h57
`define CHAR_w_LO 8'h77
`define CHAR_0 8'h30
`define CHAR_1 8'h31
`define CHAR_2 8'h32
`define CHAR_3 8'h33
`define CHAR_4 8'h34
`define CHAR_5 8'h35
`define CHAR_6 8'h36
`define CHAR_7 8'h37
`define CHAR_8 8'h38
`define CHAR_9 8'h39
`define CHAR_A_UP 8'h41
`define CHAR_B_UP 8'h42
`define CHAR_C_UP 8'h43
`define CHAR_D_UP 8'h44
`define CHAR_E_UP 8'h45
`define CHAR_F_UP 8'h46
`define CHAR_a_LO 8'h61
`define CHAR_b_LO 8'h62
`define CHAR_c_LO 8'h63
`define CHAR_d_LO 8'h64
`define CHAR_e_LO 8'h65
`define CHAR_f_LO 8'h66
??二是產生寄存器讀寫測試指令。可根據自己需要,修改指令數量和內容
localparam N = 3;//instruction number, must match with actual memory depth
assign memc[0] = "R 00000004 ";
assign memc[1] = "W 0000000a 00001234";
assign memc[2] = "R 0000000a ";
??寫寄存器命令格式W 地址 數據,例如:W 0000000a 00001234
??讀寄存器命令格式R 地址,例如:R 00000004
??命令,地址和數據之間用1個空格隔開,命令w和r,大小寫都可以。地址和數據都用32位的十六進制表示,不用加0x前綴。
??uart_mst_top模塊將ASCII 碼轉成UART格式串行輸出,模擬上位機的UART端口。
??仿真波形如下圖所示。
結語
??通過ModelSim仿真,我們能夠確認UART轉AHB轉換模塊的功能,滿足預期設計。