一. 簡(jiǎn)介
這是FPGA之旅設(shè)計(jì)的第十例啦,在上一例中,已經(jīng)成功驅(qū)動(dòng)了OLED屏幕,本例將結(jié)合上一例,以及第四例多bytes串口通信做一個(gè)有趣的例程。
簡(jiǎn)單來(lái)說,就是利用Qt編寫上位機(jī),通過串口與FPGA進(jìn)行通信,然后FPGA將接收到的數(shù)據(jù),通過IIC接口發(fā)送給OLED,就這么一個(gè)流程。
二. QT上位機(jī)
大家可能對(duì)QT部分不感興趣,也不熟悉,這里就只對(duì)上位機(jī)的功能進(jìn)行說明,實(shí)現(xiàn)過程就不敘述了,想了解的可以點(diǎn)個(gè)贊,人多的話,就專門介紹一下。
上位機(jī)目前一共只實(shí)現(xiàn)了兩個(gè)功能,一個(gè)是添加文字,另外一個(gè)是添加圓。添加過后,會(huì)在OLED預(yù)覽區(qū)域中進(jìn)行顯示。等編輯好之后,就可以點(diǎn)擊執(zhí)行,這時(shí)候,上位機(jī)會(huì)解析這部分的數(shù)據(jù),然后通過串口發(fā)送給FPGA,接下來(lái)的就是FPGA里面的處理了。
上位機(jī)可以更加完善。例如字體的大小可調(diào),字體可選,圓的線寬可調(diào),像其他圖形矩形,橢圓,線等等,都是可以的。也可以擴(kuò)展功能,如添加圖片等等。上位機(jī)的介紹就到這里。
三. FPGA部分實(shí)現(xiàn)
(一). 串口部分
在第四例,多byte串口接收模塊中,默認(rèn)為每次接收到三個(gè)byte就使能一次。剛好這里發(fā)送給OLED的數(shù)據(jù)也是三個(gè)byte,就對(duì)應(yīng)上了,不需要修改任何程序,直接在top模塊里面例化即可。
UART_MulRX UART_MulRXHP(
.sys_clk (sys_clk), /*系統(tǒng)時(shí)鐘 50M*/
.rst_n (rst_n), /*復(fù)位信號(hào)*/
.uart_rxs_done (uart_rxs_done), /*串口接收完成*/
.odats (uart_rxs_data), /*接收數(shù)據(jù)*/
.uartrx (UART_RX) /*uart rx信號(hào)線*/
);
二
OLED部分
在上一例中,程序?qū)LED進(jìn)行初始化之后,就進(jìn)入了空閑態(tài),在空閑態(tài)的時(shí)候,是沒有任何處理的。但在本例中,需要對(duì)串口接收到的數(shù)據(jù)進(jìn)行處理,通過IIC發(fā)送給OLED,這部分也很簡(jiǎn)單,代碼如下。
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
這個(gè)例程,就是將前面的串口多byte串口通信和這個(gè)結(jié)和起來(lái)了,設(shè)計(jì)難點(diǎn)在上位機(jī)的編寫,對(duì)上位機(jī)感興趣的可以多了解一下,不感興趣的可以參考一下,例如說,將IIC模塊上包一個(gè)串口模塊,就可以將IIC接口變?yōu)榇诹耍涂梢酝ㄟ^串口來(lái)配置OLED了。效果如下。
更多信息可以來(lái)這里獲取==>>電子技術(shù)應(yīng)用-AET<<
電子技術(shù)應(yīng)用專欄作家 FPGA之旅
原文鏈接:https://mp.weixin.qq.com/s/_6IMXK_hM0udLnciTAc75A