一. 簡介
這是FPGA之旅設(shè)計的第十例啦,在上一例中,已經(jīng)成功驅(qū)動了OLED屏幕,本例將結(jié)合上一例,以及第四例多bytes串口通信做一個有趣的例程。
簡單來說,就是利用Qt編寫上位機,通過串口與FPGA進行通信,然后FPGA將接收到的數(shù)據(jù),通過IIC接口發(fā)送給OLED,就這么一個流程。
二. QT上位機
大家可能對QT部分不感興趣,也不熟悉,這里就只對上位機的功能進行說明,實現(xiàn)過程就不敘述了,想了解的可以點個贊,人多的話,就專門介紹一下。
上位機目前一共只實現(xiàn)了兩個功能,一個是添加文字,另外一個是添加圓。添加過后,會在OLED預覽區(qū)域中進行顯示。等編輯好之后,就可以點擊執(zhí)行,這時候,上位機會解析這部分的數(shù)據(jù),然后通過串口發(fā)送給FPGA,接下來的就是FPGA里面的處理了。
上位機可以更加完善。例如字體的大小可調(diào),字體可選,圓的線寬可調(diào),像其他圖形矩形,橢圓,線等等,都是可以的。也可以擴展功能,如添加圖片等等。上位機的介紹就到這里。
三. FPGA部分實現(xiàn)
一
(一). 串口部分
在第四例,多byte串口接收模塊中,默認為每次接收到三個byte就使能一次。剛好這里發(fā)送給OLED的數(shù)據(jù)也是三個byte,就對應(yīng)上了,不需要修改任何程序,直接在top模塊里面例化即可。
UART_MulRX UART_MulRXHP( .sys_clk (sys_clk), /*系統(tǒng)時鐘 50M*/ .rst_n (rst_n), /*復位信號*/ .uart_rxs_done (uart_rxs_done), /*串口接收完成*/ .odats (uart_rxs_data), /*接收數(shù)據(jù)*/ .uartrx (UART_RX) /*uart rx信號線*/);
二
OLED部分
在上一例中,程序?qū)LED進行初始化之后,就進入了空閑態(tài),在空閑態(tài)的時候,是沒有任何處理的。但在本例中,需要對串口接收到的數(shù)據(jù)進行處理,通過IIC發(fā)送給OLED,這部分也很簡單,代碼如下。
module OLED_SelData( input sys_clk, input rst_n, input init_req, input[23:0] init_data, input uart_req, input[23:0] uart_data, output IICWriteReq, output[23:0] IICWriteData); reg IICWriteReqReg;reg[23:0] IICWriteDataReg; assign IICWriteReq = init_req | uart_req;assign IICWriteData = (init_req == 1'b1) ? init_data : uart_data; endmodule
這個例程,就是將前面的串口多byte串口通信和這個結(jié)和起來了,設(shè)計難點在上位機的編寫,對上位機感興趣的可以多了解一下,不感興趣的可以參考一下,例如說,將IIC模塊上包一個串口模塊,就可以將IIC接口變?yōu)榇诹?,就可以通過串口來配置OLED了。效果如下。