我的Verilog學習筆記_第1頁
我的Verilog學習筆記_第2頁
我的Verilog學習筆記_第3頁
我的Verilog學習筆記_第4頁
我的Verilog學習筆記_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Verilog學習筆記1.我的第一個verilog程序:三態(tài)門module three_status_device(in,out,oe);input in,oe;output out;assign out = (oe)? in : 1bz;endmodule其中oe為輸出有效端,當oe置高則輸入能順利通過,否則輸出高阻態(tài)。查看Technology Schematic后可知three_status_device模塊使用的FPGA內(nèi)部資源:分別是輸入緩沖器IBUF,非門INV和三態(tài)緩沖器OBUFT。我們還可以通過View Synthesis Report來觀察到底使用了多少資源:我們可以看出所選的

2、芯片類型為V5系列的fx100,SPEED等級為-2,使用了1個查找表,1個Flip Flop觸發(fā)器和3個IO口。由于模塊比較簡單,我們直接進入后仿真階段;最后,我們可以通過中的View HDL Instantiation Template看到生成的HDL模板供我們調(diào)用實例:three_status_device instance_name (.in(in),.out(out),.oe(oe);小結(jié):通過設計三態(tài)門,熟悉了verilog開發(fā)的主要流程和ise中的常用工具。反思:對于高阻態(tài),一般FPGA內(nèi)部是不支持判斷的。現(xiàn)在有些比較新的FPGA內(nèi)部已經(jīng)帶有BUFT三態(tài)門讓用戶直接調(diào)用(在IOB

3、中),而對于市面上常用的FPGA則無法做到,因為內(nèi)部并沒有BUFT三態(tài)門,所以就需要用到slice資源中的MUX復用器,用MUX除了多占用LC/LE的資源以外,受控信號(如數(shù)據(jù)總線等)會隨著驅(qū)動源的增加而使延時加大。也有說法是使用RAM或ROM的總線結(jié)構(gòu)提供高阻態(tài)的輸出。在FPGA開發(fā)時,一般將不用的IO口設置為三態(tài)狀態(tài),如果IO口較多的時候既占用連線資源也占用slice資源,對系統(tǒng)產(chǎn)生延遲。2.組合邏輯:有毛刺怎么辦?引用數(shù)字電路基礎的描述,當一個邏輯門的兩個輸入端的信號同時向相反方向變化,而變化的時間有差異的現(xiàn)象,稱為競爭。由競爭而可能產(chǎn)生的輸出干擾脈沖的現(xiàn)象就叫做冒險,也就是通俗上說的毛

4、刺。書上還給出了常用的消除競爭冒險的方法:消除互補相乘項:通過人為優(yōu)化邏輯表達式,消去同一信號的同反相同時存在項,降低競爭的發(fā)生幾率。增加乘積項避免互補項相加:若組合邏輯表達式中,在某些信號取一定值的情況下,表達式可化為一個信號的同反相同時相乘或相加時,則需要人為加入相乘項以確保此時輸出狀態(tài)的穩(wěn)定。那么在verilog如何實現(xiàn)消除毛刺呢?信號在fpga器件中通過邏輯單元連線時,一定存在延時。延時的大小不僅和連線的長短和邏輯單元的數(shù)目有關(guān),而且也和器件的制造工藝、工作環(huán)境等有關(guān)。因此,信號在器件中傳輸?shù)臅r候,所需要的時間是不能精確估計的,當多路信號同時發(fā)生跳變的瞬間,就產(chǎn)生了“競爭冒險”。這時,

5、往往會出現(xiàn)一些不正確的尖峰信號,這些尖峰信號就是“毛刺”。另外,由于fpga以及其它的cpld器件內(nèi)部的分布電容和電感對電路中的毛刺基本沒有什么過濾作用,因此這些毛刺信號就會被“保留”并傳遞到后一級,從而使得毛刺問題更加突出。盡管毛刺持續(xù)時間很短,但在高速電路中,這樣的毛刺足以使后一級電路產(chǎn)生“誤動作”。要消除毛刺,我們先要了解FPGA內(nèi)部毛刺的具體特點:由于布線延遲,和器件延遲,取決于FPGA內(nèi)部結(jié)構(gòu),這個涉及到約束問題,F(xiàn)PGA中消除毛刺的常用方法是:1.觸發(fā)器輸出通過添加觸發(fā)器,使輸出信號在clk跳變沿進行讀取,并輸出,能有效地降低毛刺的發(fā)生幾率。但這樣的話,延時也就增大。但是,毛刺的產(chǎn)

6、生是不定時的,如果毛刺在時鐘跳變時期產(chǎn)生,則使用觸發(fā)器的方法無法解決問題。2.信號延時法信號延時法,顧名思義,延時信號處理時期,等待信號穩(wěn)定時再對數(shù)據(jù)進行處理。它的具體做法有很多:信號延時檢測信號延時方法很多,如使用門級電路延時,fpga的專用延時單元lcell,毛刺的產(chǎn)生隨機性,單憑延時是無法解決問題的。時鐘延時像使用觸發(fā)器的原理類似,通過增加時鐘計數(shù)器,對時鐘進行分頻,加大時鐘間隔,來保證對信號進行處理的時候信號已經(jīng)穩(wěn)定;或者為防止在信號檢測時鐘跳變時,信號發(fā)生變化,延時對信號檢測時間,比如加入標志位寄存器,信號跳變后的下一個檢測時鐘對其檢測。這針對檢測時期瞬變信號導致檢測錯誤的方法。狀態(tài)

7、機檢測使用狀態(tài)機對信號進行多次檢測,首先第一次檢測信號,進入下一狀態(tài),再次檢測信號并與前面進行比較,如果不同則重新開始檢測知道檢測一定次數(shù)后確定信號不變動后,進行數(shù)據(jù)處理。這種方法結(jié)合了上述方法,極好地消除了競爭冒險。信號延時法缺點是用速度換取電路的穩(wěn)定性,我們只能擇優(yōu)而取。下面我們來看一些例子:按照設想 out=abc+bde;其時序圖要求如下:(用TimingDesigner畫圖)下面我們一一驗證一下不同方法所實現(xiàn)的邏輯組合的效果。/方法一,直接使用assign語句(數(shù)據(jù)流)assign out = a&b&c|d&e&b;類似的描述組合邏輯方法還有:always (a or b or c

8、 or d or e)begintemp1 = a&c|d&e; out = temp1&b;endwire temp1,temp2;and myand1(temp1,a,b,c);and myand2(temp2,d,e,b);or myor(out,temp1,temp2);由于表達式out=abc+bde可轉(zhuǎn)換成out=b(ac+de),因此b的取值至關(guān)重要,當輸入信號b變?yōu)?時,輸出即變?yōu)?,所以上述語句一般寫成:wire temp;assign temp = a&c|d&e;assign out = temp&b;這樣一來,當b變?yōu)?,輸出立即變化,這就是關(guān)鍵路徑的選取。關(guān)鍵路徑所生

9、成的RTL結(jié)構(gòu)如下:與沒有選取關(guān)鍵路徑相比:由行為仿真波形可以看出,這樣的邏輯設計與設想相同:我們通過修改仿真文件.twf 對某些輸入信號進行人為的延時,觀察加入延時后出來的效果:輸入信號波形代碼段均寫在Initial段中:(我們就在這里修改),為了保持毛刺持續(xù)時間盡量滿足實際情況(一般為十幾ns)所以這里設置延時均為10ns,即在timescale 1ns/1ps情況下,使用#10;語句進行延時動作。initial begin / - Current Time: 490ns #490; a = 1b1; b = 1b1; c = 1b1; d = 1b1; / - / - Current T

10、ime: 1090ns #600; a = 1b0; c = 1b0; #10; e = 1b1; #10; b = 1b0; / - / - Current Time: 1690ns #600; b = 1b1; #10; e = 1b0; / - / - Current Time: 2290ns #600; e = 1b1; / - / - Current Time: 2690ns #400; e = 1b0; / - / - Current Time: 3090ns #400; e = 1b1; #10; b = 1b0; c = 1b1; / - / - Current Time: 3

11、690ns #600; b = 1b1; #10; d = 1b0; #10; a = 1b1; / - end仿真出來的效果(毛刺出現(xiàn)了)可見,盡管做出了關(guān)鍵路徑的選取,組合邏輯電路還是非常容易產(chǎn)生毛刺。下面我們使用上面的說法,加入寄存器后觀察結(jié)果。reg out; wire temp;assign temp = a&b&c|d&e&b;always (posedge clk)out = temp;從RTL結(jié)構(gòu)圖中可以直觀看到加入D觸發(fā)器(即寄存器)輸出:依舊采用改動后的仿真文件,所得出的仿真波形如下:可見,上面的毛刺完全被消除了,而且不留一點痕跡。由于使用觸發(fā)器免不了使用時鐘,詳細的使用放

12、到后面的時序電路學習一節(jié)中。小結(jié):從本節(jié)中,實現(xiàn)了簡單的邏輯組合,并透過閱讀修改仿真文件,了解毛刺的產(chǎn)生;通過觀察RTL結(jié)構(gòu)圖,了解到代碼風格與生成的模型之間的聯(lián)系,并通過使用D觸發(fā)器消除毛刺。反思:如果外部情況比較惡劣,延時級別大于ns級,或者輸入信號的跳變在時鐘跳變時期發(fā)生,會產(chǎn)生什么效果,這需要在后面的學習中逐步體會。3.使用組合邏輯:加法器的設計一個設計,其實現(xiàn)方案多樣,而且不同的實現(xiàn)方案,電路結(jié)構(gòu)是不一樣的,這將導致速度或使用資源的差異。所以,在學習過程中,需要對不同的方法進行比較,了解各種編碼風格實現(xiàn)的差別,對將來的系統(tǒng)設計有極大的幫助。下面我們以加法器的設計為引導,延伸本節(jié)的討論

13、。首先,我們要知道一個加法器模型應該有的端口,他們分別為:加數(shù),被加數(shù),上級進位,和,進位這幾個端口。注意verilog的編碼規(guī)范,模塊端口有高位至低位,從輸出到輸入進行描述:module adder(cout,sum,clk,rst,a,b,cin);(1)實現(xiàn)方法一assign cout, sum = a + b + cin;這樣看來,加法器的實現(xiàn)非常簡單,從結(jié)構(gòu)上看,它直接調(diào)用了一個加法器(如圖):但是對于“+”號的綜合,F(xiàn)PGA內(nèi)部是采用查找表所實現(xiàn)的,下面是由上述語句生成的二級查找表結(jié)構(gòu):(查找表的級數(shù)是延時的主要因素,降低查找表級數(shù)是代碼優(yōu)化的首要任務)其中LUT3_E8表示3輸入

14、查找表,E8指查找表內(nèi)部真值表的結(jié)果值。由于使用查找表實現(xiàn),容易出現(xiàn)毛刺,我們回顧下上一節(jié)所用到的方法,我們再使用一次:再次出現(xiàn)了D觸發(fā)器。(仿真波形就不看了,大家可以自己試試)(2)串行加法器wire 1:0 temp;assign temp0,sum0 = a0 + b0;assign temp1,sum1 = a1 + b1 + temp0;assign cout = temp1;雖然咋一看,與第一種方法相當類似,你確定是一樣嗎?我們看看生成的,如下圖:我們可以看出,這樣的代碼,只使用了一級的LUT,這樣設計有助于降低延時,而且并沒有增多LUT的使用量,反而少用一個LUT??梢娰Y源利用率

15、是第二種略為節(jié)省些。(3)查找法reg 1:0 sum;reg cout;always (posedge clk or negedge rst)beginif(!rst)cout,sum=3bzzz;elsecase( a,b )4b00_00:cout,sum=3b000;4b00_01:cout,sum=3b001;4b00_10:cout,sum=3b010;4b00_11:cout,sum=3b011;4b01_00:cout,sum=3b001;4b01_01:cout,sum=3b010;4b01_10:cout,sum=3b011;4b01_11:cout,sum=3b100;4

16、b10_00:cout,sum=3b010;4b10_01:cout,sum=3b011;4b10_10:cout,sum=3b100;4b10_11:cout,sum=3b101;4b11_00:cout,sum=3b011;4b11_01:cout,sum=3b100;4b11_10:cout,sum=3b101;4b11_11:cout,sum=3b110;default:cout,sum=3bzzz;endcaseend我們看生成的RTL圖如下:可見編譯器知道我們的用意,使用了ROM作為查找的存儲,加數(shù)為取址信號。通過觀察.ngc文件可知,這樣的描述仍然使用了一級的3個LUT,輸出使用

17、寄存器同步輸出。(4)卡諾圖法我們寫出他的真值表,通過卡諾圖進行簡化,得出各輸出的邏輯表達式:assign sum0 = (a0&b0)|(a0&b0);assign sum1 = (a1&a0&b1)|(a1&a0&b1&b0)|(a1&a0&b1&b0)|(a1&b1&b0)|(a1&b1&b0)|(a1&a0&b1);assign cout = (a0&b1&b0)|(a1&a0&b0)|(a1&b1);這種方法是用門電路數(shù)目較多,延時參次不齊,而且使用不方便,但速度相對會快些。要注意,有時候適當?shù)募由侠ㄌ?,除了有助于閱讀,還可以減少邏輯門的級數(shù),下面再舉個例子:assign out =

18、 (da + db) + (dc + dd);和assign out = da + db + dc + dd;da + db + dc + dd生成的模塊內(nèi)部圖(da + db) + (dc + dd)所生成的模塊內(nèi)部圖盡管使用的加法器個數(shù)一樣,但級數(shù)變少了,這樣的編碼風格,提高了模塊運行的速度,但由于FPGA內(nèi)部使用LUT實現(xiàn),所以最終對提高速度影響不大,但對于ASIC(專用集成芯片)的模塊設計,這樣的考慮是很有必要的。(5)超前加法器assign sum0 = a0 b0 cin;assign sum1 = a1 b1 ( (a0 & b0) | (a0 b0) & cin );assig

19、n cout = ( a1 & b1 ) | ( (a1b1) & (a0&b0) ) | ( (a0b0) & (a1b1) & cin );根據(jù)數(shù)電書上的解釋,人為地觀察進位與輸入的關(guān)系,由輸入直接導出進位是這種方法的核心思想。但我們?nèi)匀豢梢钥闯?,當位?shù)增加的時候,電路的設計變得非常復雜,下面我們通過調(diào)用模塊來簡化多位加法器的設計。(6)調(diào)用模塊module one_bit_adder(cout,sum,cin,ina,inb);input ina,inb,cin;output cout,sum;assign cout,sum = ina + inb + cin;endmodule/two

20、 bit adder (by using one bit adder)/This is a top modulemodule use_adder(cout,sum,c,x,y);input 1:0 x,y;input c;output 1:0 sum;output cout;wire c_temp;one_bit_adder u1(.cout(c_temp),.sum(sum0),.cin(c),.ina(x0),.inb(y0);one_bit_adder u2(.cout(cout),.sum(sum1),.cin(c_temp),.ina(x1),.inb(y1);endmodule這里

21、先設計一位計數(shù)器(當然,計數(shù)器的設計可以使用上面的任何一個例子),然后通過對模塊端口的連線,而模塊的調(diào)用有以下兩種方法:模塊端口的對齊:即按照模塊原型聲明的端口順序模塊端口對應連接:使用 .端口名(線名),.端口名(線名)這樣的方式進行模塊調(diào)用,當某一端口需要懸空,必須加上“,”但可以不填寫任何東西。(7)流水線input3:0 a,b;input clk,cin;output3:0sum;output cout;reg3:0 tempa,tempb;reg tempci;reg cout;reg firstco;reg1:0 firstsum;reg2:0 firsta,firstb; re

22、g3:0 sum;always(posedge clk) begin tempa=a; tempb=b; tempci=cin; endalways(posedge clk) begin firstco,firstsum=tempa1:0+tempb1:0+tempci; firsta=tempa3:2; firstb=tempb3:2; endalways(posedge clk) begin cout,sum=firsta2:0+firstb2:0+firstco,firstsum; endendmodule使用流水線的方法,最重要的是將未用到的數(shù)據(jù)進行存儲,這樣做使得流水線不同級之間相互

23、獨立,這樣做大大提高了速度(除了第一次運算需要額外的兩個時鐘周期),但是這樣的設計使用大量資源,這需要在性能和資源中進行折衷。使用的資源:我們從圖中可以看出,流水線極大提高了觸發(fā)器的使用量,是典型的以面積換取速度的例子。小結(jié):通過對加法器的各種設計以及編碼風格,我們可以看出Verilog HDL硬件描述語言的優(yōu)勢,不同的編碼風格所產(chǎn)生的電路在速度與面積上都將產(chǎn)生不同的變化,要學好HDL,則需要經(jīng)驗的積累和對電路結(jié)構(gòu)的了解,必須明白語言與電路之間的對應關(guān)系,這樣,Verilog語言才能用得得心應手。反思:Verilog的編碼與FPGA內(nèi)部結(jié)構(gòu)、內(nèi)部器件特性有著很大關(guān)系,要編寫一個好的代碼,學習F

24、PGA內(nèi)部結(jié)構(gòu)成為必不可少的一個階段。4.有限狀態(tài)機時序電路由組合電路和存儲電路組成,時序電路是狀態(tài)依賴的,所以稱為狀態(tài)機。其中Melay狀態(tài)機,其狀態(tài)與當前狀態(tài),輸入,輸出均有關(guān)系,而Moore狀態(tài)機則只跟當前狀態(tài)有關(guān),一下用兩個實例對其進行探討。(1)Melay狀態(tài)機module serial_checkout(same,din,clk,rst);input din;input clk,rst;output same;reg 2:0 status;reg same_temp;/Write down your serial which you want to check outparamet

25、er serial_number = 8h11010011; /check the lowest bit firstparameter bit1 = 1b1;parameter bit2 = 1b1;parameter bit3 = 1b0;parameter bit4 = 1b0;parameter bit5 = 1b1;parameter bit6 = 1b0;parameter bit7 = 1b1;parameter bit8 = 1b1;assign same = same_temp;always (posedge clk or negedge rst)if(rst = 0)begi

26、nstatus = 3b000;same_temp = 1b0;endelsecase(status)3b000:begin if(din=bit1)status = 3b001; elsestatus = 3b000; end3b001:begin if(din=bit2)status = 3b010; elsestatus = 3b000; end3b010:begin if(din=bit3)status = 3b011; elsestatus = 3b000; end3b011:begin if(din=bit4)status = 3b100; elsestatus = 3b000;

27、end3b100:begin if(din=bit5)status = 3b101; elsestatus = 3b000; end3b101:begin if(din=bit6)status = 3b110; elsestatus = 3b000; end3b110:begin if(din=bit7)status = 3b111; elsestatus = 3b000; end3b111:begin if(din=bit8)same_temp = 1; elsestatus I/D:光標移動方向,I/D=1時右移(當讀寫一個字符后,地址指針加1),I/D=0時左移(當讀寫一個字符后,地址指

28、針減1) S:當寫一個字符屏幕上所有文字是否左移(I/D=1)或者右移(I/D=0)。S=1時表示有效,S=0時則無效parameter SETMODE=4b0011;parameter CURSOR_MOVE_RIGHT =1;parameter CURSOR_MOVE_LEFT =0;parameter WORD_SHIFT =1;parameter WORD_NOSHIFT =0;/ RS RW D7 D6 D5 D4 D3 D2 D1 D0/指令4:顯示開關(guān)控制 0 0 0 0 0 0 1 D C B/D:控制整體顯示的開與關(guān),D=1表示開顯示,D=0表示關(guān)顯示 /C:控制光標的開與關(guān)

29、,C=1表示有光標,C=0表示無光標 /B:控制光標是否閃爍,B=1閃爍,B=0不閃爍;閃爍只對于當前地址指針指向的字符位有效。parameter DISPLAY_CTRL_OFF=4b0100;parameter DISPLAY_ON =1;parameter DISPLAY_OFF =0;parameter CURSOR_ON =1;parameter CURSOR_OFF=0;parameter CURSOR_FLASH_ON =1;parameter CURSOR_FLASH_OFF =0;/ RS RW D7 D6 D5 D4 D3 D2 D1 D0/指令5:光標或字符移動0 0 0

30、 0 0 1 S/C R/L 0 0/S/C:滾動對象選擇:S/C=1時移動顯示的文字,S/C=0時移動光標 /R/L:滾動方向選擇:R/L=1時向右滾動,R/L=0 向左滾動parameter SHIFT=4b0101;parameter SEL_WORD=1;parameter SEL_CURSOR=0;parameter RIGHT_SHIFT=1;parameter LEFT_SHIFT =0;/ RS RW D7 D6 D5 D4 D3 D2 D1 D0/指令6:功能設置命令 0 0 0 0 1 D/L N F 0 0/D/L:DL=1時為8位總線(DB7-DB0有效),D/L=0?

31、位(DB7-DB4行?/N:N=0時為單行顯示,N=1時雙行顯示 /F: F=0時?x7的閼字符,F(xiàn)=1時顯示5x10的閼籩?parameter SETFUNCTION=4b0110;parameter DATAWIDTH8 =1;parameter DATAWIDTH4 =0;parameter TWOLINE_DISPLAY =1;parameter ONELINE_DISPLAY =0;parameter FONT5x10 =1;parameter FONT5x7 =0;/ RS RW D7 D6 D5 D4 D3 D2 D1 D0/指令7:置字符發(fā)生器貯存地址 0 0 0 1 ( AG

32、G )/AGG:設置CGRAM地址,AGG高三位為自定義字符代碼,低三位為字模數(shù)據(jù)地址(5X8),可最多定義8個字符調(diào)用自定義字符時,調(diào)?7這8個址爰?parameter SETCGRAM=4b0111;/ RS RW D7 D6 D5 D4 D3 D2 D1 D0/指令8:置數(shù)據(jù)存貯器地址 0 0 1 ( ADD )/ADD:DDRAM地址parameter SETDDRAM=4b1000;/指令9:讀忙信號(不用)parameter RESERVE=4b1001;/ RS RW D7 D6 D5 D4 D3 D2 D1 D0/指令10:寫RAM數(shù)據(jù) 1 0 (data )parameter

33、 WRITE_RAM=4b1010;/ RS RW D7 D6 D5 D4 D3 D2 D1 D0/指令11:讀RAM數(shù)據(jù) 1 1 (data )parameter READ_RAM=4b1011;parameter STOP=4b1100;/parameter DELAY=4b1101;parameter DISPLAY_CTRL_ON=4b1110;parameter SETFUNCTION2=4b1111;/時鐘信號reg 15:0 clkcnt;/分頻函數(shù)always (posedge clk)beginif(!rst)clkcnt=16b0000_0000_0000_0000;els

34、ebeginif(clkcnt=16b1111_1111_0101_0000) /if(clkcnt=16b1001_1100_0100_0000)/if(clkcnt=16b1001_1000_0100_0000)clkcnt=16b0000_0000_0000_0000;else clkcnt=clkcnt+1;endendwire tc_clkcnt;assign tc_clkcnt=(clkcnt=16b1111_1111_0101_0000)?1:0; /100000?/assign tc_clkcnt=(clkcnt=16b1001_1100_0100_0000)?1:0; /80

35、000分頻/assign tc_clkcnt=(clkcnt=16b1001_1000_0100_0000)?1:0;/對tc_clkcnt二分頻reg clkdiv;always (posedge tc_clkcnt)if(!rst)clkdiv=0;elseclkdiv=clkdiv;/對clkdiv二分頻reg clk_int;always (posedge clkdiv)if(rst=0)clk_int=0;elseclk_int=clk_int;always (negedge clkdiv)if(rst=0)lcd_en=0;elselcd_en=lcd_en;/為滿足總線時序而進行

36、的兩次二分頻,在rs,rw,io數(shù)葑急負煤螅鼓躤n,所以這里孟跳沿觸?/有限狀態(tài)機/reg 15:0 myclkcnt;/reg myclk;always (posedge clk_int or negedge rst)if(!rst)beginstage=START;ddram_address=8h80;shift_flag=1;shift_freq=8h00;/ddram_address=8b1001_0000; /寫DDRAM緩沖區(qū)shift_count=5b0_0000;/myclkcnt=16h0000;flag=0;/flag1=1;endelsebegincase(stage)S

37、TART:beginlcd_data=8bzzzz_zzzz;stage=SETFUNCTION;endSTOP:begin stage=STOP; endCLEAR_SCREEN:begin /0000_0001 01Hlcd_rs=0;lcd_rw=0;lcd_data=8b0000_0001;stage=SETMODE; end SETMODE:begin /0000_0110 06Hlcd_rs=0;lcd_rw=0;lcd_data7:2=6b000001;lcd_data1=CURSOR_MOVE_RIGHT;lcd_data0=WORD_NOSHIFT;stage=DISPLAY

38、_CTRL_ON; endCURSOR_BACK:begin /0000_0010 02Hlcd_rs=0;lcd_rw=0;lcd_data=8b00000010;stage=SETDDRAM; endDISPLAY_CTRL_OFF:begin /0000_1010 08Hlcd_rs=0;lcd_rw=0;lcd_data7:3=5b00001;lcd_data2=DISPLAY_OFF;lcd_data1=CURSOR_OFF;lcd_data0=CURSOR_FLASH_OFF;stage=CLEAR_SCREEN; endDISPLAY_CTRL_ON:begin /0000_11

39、00 0CHlcd_rs=0;lcd_rw=0;lcd_data7:3=5b00001;lcd_data2=DISPLAY_ON;lcd_data1=CURSOR_ON;lcd_data0=CURSOR_FLASH_ON;stage=SETDDRAM; endSETFUNCTION:begin /0011_1000 38Hlcd_rs=0;lcd_rw=0;lcd_data7:5=3b001;lcd_data4=DATAWIDTH8;lcd_data3=TWOLINE_DISPLAY;lcd_data2=FONT5x7;lcd_data1:0=2b00;stage=SETFUNCTION2;

40、endSETFUNCTION2:begin /0011_1000 38Hlcd_rs=0;lcd_rw=0;lcd_data7:5=3b001;lcd_data4=DATAWIDTH8;lcd_data3=TWOLINE_DISPLAY;lcd_data2=FONT5x7;lcd_data1:0=2b00;stage=DISPLAY_CTRL_OFF; end/SETCGRAM:begin lcd_rs=0;lcd_rw=0;data=8b01000000;state=START;endSETDDRAM:begin /1XXX_XXXXlcd_rs=0;lcd_rw=0;lcd_data7:0=ddram_address;stage=WRITE_RAM; end/SETDDRAM1:begin lcd_rs=0;lcd_rw=0;data=8b11000000;state=WRITERAM;end /設置第二行首地址WRITE_RAM:begin /XXXX_XXXX

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論