【小月电子】ALTERA FPGA开发板系统学习教程-LESSON8 LCD1602液晶显示
串口通信例程講解
若要觀看該博客配套的視頻教程,可點擊此鏈接 開發板實物圖 圖1.FPGA設計流程 根據多年工作經驗,總結出的FPGA的設計流程,概括起來總共有以上12步,其中根據項目難易度可省去其中一些步驟。比如非常簡單的項目,我們可以省去虛線框里面的步驟,但是我們的入門級課程,即使再簡單,也按照這12個步驟來進行講解。
1. 需求解讀
1.1 需求
在液晶屏第一行顯示“HELLO FPGA 1234!”
1.2 知識背景
1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因為如此所以它不能很好地顯示圖形(用自定義CGRAM,顯示效果也不好)。
LCD1602是指顯示的內容為16X2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數字)。一般來說,LCD1602有16條引腳,據說還有14條引腳的,與16腳的相比缺少了背光電源A(15腳)和地線K(16腳)。實物如下圖所示:
引腳定義如下:
說明:
1.3 硬件設計
有源晶振,與E1管腳相連 液晶接口電路圖 FPGA管腳映射圖 PCB板上管腳標注 LCD1602液晶與開發板管腳連接圖1.4 接口說明
| CLK50M | 輸入 | E1 | 時鐘信號,50MHZ |
| LCD_RS | 輸出 | J6 | 命令/數據選擇引腳,當RS為低電平時,選擇命令;當RS為高電平時,選擇數據 |
| LCD_RW | 輸出 | F5 | 是讀/寫選擇引腳,當RW為低電平時,向LCD1602寫入命令或數據;當RW為高電平時,從LCD1602讀取狀態或數據 |
| LCD_CLK | 輸出 | E5 | 執行命令的使能引腳 |
| LCD_DB0 | 輸出 | D4 | 并行數據輸入/輸出引腳 |
| LCD_DB1 | 輸出 | G5 | 并行數據輸入/輸出引腳 |
| LCD_DB2 | 輸出 | D1 | 并行數據輸入/輸出引腳 |
| LCD_DB3 | 輸出 | C2 | 并行數據輸入/輸出引腳 |
| LCD_DB4 | 輸出 | B1 | 并行數據輸入/輸出引腳 |
| LCD_DB5 | 輸出 | B7 | 并行數據輸入/輸出引腳 |
| LCD_DB6 | 輸出 | B4 | 并行數據輸入/輸出引腳 |
| LCD_DB7 | 輸出 | B3 | 并行數據輸入/輸出引腳 |
2. 繪制理論波形圖
理論波形圖3.新建QuartusII 工程
為了讓工程看起來整潔,同時方便工程移植。我們新建4個文件夾,分別是Project,Source,Sim,Doc。
Project — 工程文件夾,里面放的QuartusII工程
Source — 源代碼文件夾,里面放的工程源碼(.v文件或.vhd文件)
Sim — 仿真文件夾,里面放的仿真相關的文件
Doc — 存放相關資料,比如數據手冊,需求文檔等
4.編寫代碼
/// //QQ:3181961725 //TEL/WX:13540738439 //作者:Mr Wang //模塊介紹:LCD1602顯示驅動 /// module lcd ( input clk ,//系統時鐘輸入50Minput rst_n ,//復位,低電平有效output reg [7:0] dat ,//LCD的8位數據口output reg rs ,//數據命令選擇信號,高電平表示數據,低電平表示命令output rw ,//讀寫標志,高電平表示讀,低電平表示寫,該程序我們只對液晶屏進行寫操作output en //LCD的控制腳);reg [15:0] counter ; reg [ 5:0] current ; reg clkr ; reg e ;//定義了LCD狀態機需要的狀態。parameter set0 =6'd0; parameter set1 =6'd1; parameter set2 =6'd2; parameter set3 =6'd3; parameter set4 =6'd4; parameter dat0 =6'd5; parameter dat1 =6'd6; parameter dat2 =6'd7; parameter dat3 =6'd8; parameter dat4 =6'd9; parameter dat5 =6'd10;parameter dat6 =6'd11; parameter dat7 =6'd12; parameter dat8 =6'd13; parameter dat9 =6'd14;parameter dat10=6'd15; parameter dat11=6'd16;parameter dat12=6'd17; parameter dat13=6'd18; parameter dat14=6'd19; parameter dat15=6'd20; parameter fini=6'hF1; always @(posedge clk or negedge rst_n) //da de data_w1 zhong pinlv begin if(!rst_n)begincounter<=0;clkr<=0;endelsebegincounter<=counter+1; if(counter==16'h000f) clkr<=~clkr; else;end end always @(posedge clkr or negedge rst_n) begin if(!rst_n)begincurrent<=set0;dat<=0;rs<=0;e<=1;endelsebegincase(current) set0: begin e<=0;rs<=0; dat<=8'h38; current<=set1; end //*設置8位格式,2行,5*7*set1: begin e<=0;rs<=0; dat<=8'h0C; current<=set2; end //*整體顯示,關光標,不閃爍*/ set2: begin e<=0;rs<=0; dat<=8'h06; current<=set3; end //*設定輸入方式,增量不移位*/ set3: begin e<=0;rs<=0; dat<=8'h01; current<=set4; end //*清除顯示*/ set4: begin e<=0;rs<=0; dat<=8'h80; current<=dat0; end //設置顯示第一行dat0: begin e<=0;rs<=1; dat<="H"; current<=dat1; end dat1: begin e<=0;rs<=1; dat<="E"; current<=dat2; end dat2: begin e<=0;rs<=1; dat<="L"; current<=dat3; end dat3: begin e<=0;rs<=1; dat<="L"; current<=dat4; end dat4: begin e<=0;rs<=1; dat<="O"; current<=dat5; end dat5: begin e<=0;rs<=1; dat<=" "; current<=dat6; end dat6: begin e<=0;rs<=1; dat<="F"; current<=dat7; end dat7: begin e<=0;rs<=1; dat<="P"; current<=dat8; end dat8: begin e<=0;rs<=1; dat<="G"; current<=dat9; end dat9: begin e<=0;rs<=1; dat<="A"; current<=dat10 ; end dat10: begin e<=0;rs<=1; dat<="!"; current<=dat11; end dat11: begin e<=0;rs<=1; dat<="1"; current<=dat12; end dat12: begin e<=0;rs<=1; dat<="2"; current<=dat13; end dat13: begin e<=0;rs<=1; dat<="3"; current<=dat14; end dat14: begin e<=0;rs<=1; dat<="4"; current<=dat15; end dat15: begin e<=0;rs<=1; dat<="6"; current<=fini; end fini: begin e<=1;rs<=0; dat<=8'h00; enddefault: current<=set0; endcase endend assign en=clkr|e; assign rw=0; endmodule5.編寫仿真測試激勵文件
`timescale 1ns/1ns module lcd1602_tb;reg clk ;reg rst_n ; initial beginclk = 0;rst_n=0;#1000rst_n=1; end always #10 clk=~clk; lcd Ulcd( .clk (clk),//系統時鐘輸入50M.rst_n (rst_n),//復位,低電平有效.dat (),//LCD的8位數據口.rs (),//數據命令選擇信號,高電平表示數據,低電平表示命令.rw (),//讀寫標志,高電平表示讀,低電平表示寫,該程序我們只對液晶屏進行寫操作.en ()//LCD的控制腳); endmodule6.Modelsim仿真
Modelsim仿真一般有兩種方法
圖形化界面仿真,即所有的操作都是在Modelsim軟件界面上來完成,該方式的優點是,簡單易學,適用于簡單的項目,缺點是操作步驟繁瑣。
批處理仿真,這種方式在仿真前需要編寫相應的腳本文件,該方式的優點是,一鍵即可完成仿真,省時省力,缺點是前期需要編寫腳本文件。前兩講采用的是圖形化界面仿真的方式;為了更貼近工程實際,從第三講開始,我們就采用批處理方式仿真。具體操作步驟可參考我們的視頻教程
仿真出的波形如下圖所示:
7.對比波形圖
將第二步繪制的理論波形圖與第六步Modelsim仿真出來的波形圖進行對比,結果一致,說明我們的邏輯設計是正確的。如果發現比對結果不一致,就需要找到不一致的原因,最終要保證對比結果一致。通過對比,理論波形與仿真波形一致,說明功能符合設計要求。
8.編譯綜合
9.綁定管腳
當工程編譯成功后,即可進行管腳分配(需要參考開發板的原理圖)。我們店鋪的開發板和模塊在PCB板上均標注了信號名,在綁定管腳時也可以直接參照實物的連接關系。
管腳映射關系如下所示:
10.再次編譯綜合
11 下載SOF文件
再次編譯綜合成功后便可以將生成的SOF文件下載到開發板
下載成功后,便可以觀察到開發板上的實驗現象,如果實驗現象與設計需求相符,那說明我們的設計是沒有問題的,即可進行下一步固化JIC文件操作
12 生成并固化JIC文件
FPGA有一個特性,就是掉電后配置信息會丟失,所以我們需要將配置信息存儲在配置芯片(FLASH)中,待開發板上電后,FPGA便會讀取配置芯片中的配置信息,這樣開發板掉電再上電后同樣可正常工作。要將程序固化到配置芯片,需要先生成JIC文件。SOF文件轉換成JIC文件步驟如下:
12.1 file–>Convert Programming File…
12.2 選擇JIC文件以及配置芯片的型號,FPGA的型號
標號1:選擇生成文件的格式,我們選擇JIC文件
標號2:選擇配置芯片的型號,我們選擇EPCS16
標號3:修改生成JIC文件的名字以及存放路徑
標號4:鼠標左鍵點擊Flash Loader
標號5:選擇FPGA的型號,我們開發板用的是EP4CE6F17C8這款FPGA,所以我們也應該選這個型號,如下圖所示:
12.3 選擇SOF文件
標號1:鼠標左鍵點擊SOF Data
標號2:添加SOF文件,選中我們工程生成的SOF文件,如下圖:
12.3 生成JIC文件
到此,JIC文件生成好,可以進行固化操作了。
12.4 固化JIC文件
固化好以后,掉電程序也不會丟失了!
實驗現象
與設計需求吻合,設計完成!
總結
以上是生活随笔為你收集整理的【小月电子】ALTERA FPGA开发板系统学习教程-LESSON8 LCD1602液晶显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1048
- 下一篇: “磨刀”真的不误“砍柴”工吗?