第7章 常用接口電路設(shè)計_第1頁
第7章 常用接口電路設(shè)計_第2頁
第7章 常用接口電路設(shè)計_第3頁
第7章 常用接口電路設(shè)計_第4頁
第7章 常用接口電路設(shè)計_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章常用接口電路設(shè)計第7章常用接口電路設(shè)計LED顯示控制直流電動機控制數(shù)碼管顯示控制蜂鳴器播放音樂按鍵脈沖信號產(chǎn)生電路步進電動機控制序列檢測器LCD1602顯示控制IIC總線存儲器控制SPI總線存儲器控制串行ADC控制陣列鍵盤控制串行DAC控制點陣控制7.1LED顯示控制【例7.1-1】實現(xiàn)8位LED燈的流水設(shè)計的VerilogHDL描述。//LED控制運行方式1moduleled_run(inputclk,rst_n,outputreg[7:0]led); always@(posedgeclkornegedgerst_n)if(!rst_n)led<=8'b00000001;//復(fù)位時LED燈熄滅elseled<={led[6:0],led[7]}; //循環(huán)左移1位endmodule7.1LED顯示控制【例7.1-2】通過狀態(tài)設(shè)計LED燈顯示模式的VerilogHDL描述。//LED控制運行方式2moduleled_run_2(inputclk,rst_n,output[7:0]led);parameters0=8'b00000001, //狀態(tài)分配,指定每種狀態(tài)LED燈s1=8'b00000010,s2=8'b00000100,s3=8'b00001000,s4=8'b00010000,s5=8'b00100000,s6=8'b01000000,s7=8'b10000000; //可以修改各狀態(tài)LED燈的情況reg[7:0]state;7.1LED顯示控制//狀態(tài)轉(zhuǎn)換always@(posedgeclkornegedgerst_n)if(!rst_n)state<=s0; //初始復(fù)位else case(state) //用來確定狀態(tài)轉(zhuǎn)換的順序 s0:state<=s1; s1:state<=s2; s2:state<=s3; s3:state<=s4; s4:state<=s5; s5:state<=s6; s6:state<=s7; s7:state<=s0; default:state<=s0; endcaseassignled=state; //LED輸出顯示endmodule7.2數(shù)碼管顯示控制【例7.2-1】

通過數(shù)碼管顯示撥碼開關(guān)表示的二進制數(shù)值的VerilogHDL描述。moduleseg7display_one(input[3:0]sw,outputreg[6:0]seg, //數(shù)碼管段碼CG,CF,CE,CD,CC,CB,CAoutputdp, //數(shù)碼管小數(shù)點output[7:0]an //數(shù)碼管位碼);assigndp=1;assignan=8'b11111110; //僅一個數(shù)碼管顯示,低電平有效always@(sw)case(sw)4'b0000:seg=7'b1000000;//段碼g~a,顯示04'b0001:seg=7'b1111001;//顯示14'b0010:seg=7'b0100100;//顯示24'b0011:seg=7'b0110000;//顯示37.2數(shù)碼管顯示控制4'b0100:seg=7'b0011001; //顯示44'b0101:seg=7'b0010010; //顯示54'b0110:seg=7'b0000010; //顯示64'b0111:seg=7'b1111000; //顯示74'b1000:seg=7'b0000000; //顯示84'b1001:seg=7'b0010000; //顯示94'b1010:seg=7'b0001000; //顯示A4'b1011:seg=7'b0000011; //顯示B4'b1100:seg=7'b1000110; //顯示C4'b1101:seg=7'b0100001; //顯示D4'b1110:seg=7'b0000110; //顯示E4'b1111:seg=7'b0001110; //顯示Fdefault:seg=7'b1111111; //默認(rèn)數(shù)碼管熄滅endcaseendmodule7.2數(shù)碼管顯示控制【例7.2-2】4位數(shù)碼管動態(tài)顯示撥碼開關(guān)表示的二進制數(shù)值的VerilogHDL描述。//動態(tài)顯示頂層模塊moduleseg7display_4_top(inputclk,rst,input[15:0]sw,outputdp, //數(shù)碼管上的小數(shù)點output[6:0]seg,//數(shù)碼管7位段碼output[7:0]an//8個數(shù)碼管對應(yīng)的位碼);wireclk_1khz;div_1khzu1(.clk(clk),//調(diào)用1kHz分頻電路,用于動態(tài)掃描.rst(rst),.clk_1khz(clk_1khz));seg7display_4u2(.clk(clk_1khz),//調(diào)用動態(tài)顯示7.2數(shù)碼管顯示控制.rst(rst),.data(sw),.dp(dp),.seg(seg),.an(an));endmodule//1kHz分頻模塊modulediv_1khz(inputclk,rst,outputregclk_1khz);reg[15:0]cnt;always@(posedgeclkorposedgerst)beginif(rst==1)cnt<=0; //高電平異步復(fù)位,計數(shù)清零7.2數(shù)碼管顯示控制elseif(cnt==50000-1)begincnt<=0;clk_1khz<=~clk_1khz;//產(chǎn)生1kHz信號endelsecnt<=cnt+1; //計數(shù)endendmodule//動態(tài)顯示模塊moduleseg7display_4(inputclk,rst,input[15:0]data, //待顯示的4位十六進制數(shù)outputdp,outputreg[6:0]seg,outputreg[7:0]an);7.2數(shù)碼管顯示控制reg[1:0]sel; //位碼控制信號reg[3:0]disp;assigndp=1; //不顯示小數(shù)點always@(posedgeclkorposedgerst)beginif(rst)beginan=8'b1111_1111; //復(fù)位時數(shù)碼管全部熄滅sel=0;endelsebeginsel=sel+1; //位碼控制信號依次選通不同位數(shù)碼管case(sel)2'b00:begindisp=data[3:0];an=8'b1111_1110;end//最右側(cè)數(shù)碼管顯示2'b01:begindisp=data[7:4];an=8'b1111_1101;end2'b10:begindisp=data[11:8];an=8'b1111_1011;end7.2數(shù)碼管顯示控制2'b11:begindisp=data[15:12];an=8'b1111_0111;enddefault:;//默認(rèn)不做任何操作endcaseendendalways@(disp) //數(shù)據(jù)顯示譯碼case(disp)4'b0000:seg=7'b1000000; //段碼g~a,顯示04'b0001:seg=7'b1111001; //顯示14'b0010:seg=7'b0100100; //顯示24'b0011:seg=7'b0110000; //顯示34'b0100:seg=7'b0011001; //顯示44'b0101:seg=7'b0010010; //顯示54'b0110:seg=7'b0000010; //顯示67.2數(shù)碼管顯示控制4'b0111:seg=7'b1111000; //顯示74'b1000:seg=7'b0000000;//顯示84'b1001:seg=7'b0010000;//顯示94'b1010:seg=7'b0001000;//顯示A4'b1011:seg=7'b0000011; //顯示B4'b1100:seg=7'b1000110; //顯示C4'b1101:seg=7'b0100001;//顯示D4'b1110:seg=7'b0000110; //顯示E4'b1111:seg=7'b0001110; //顯示Fdefault:seg=7'b1111111; //默認(rèn)數(shù)碼管熄滅endcaseendmodule7.2數(shù)碼管顯示控制【例7.2-3】結(jié)構(gòu)化設(shè)計四位數(shù)碼管動態(tài)掃描顯示的VerilogHDL描述。moduleseg7display_4(inputclk,rst_n,input[15:0]data,//待顯示的4位十六進制數(shù)output[7:0]seg,output[3:0]an

);wireclk_1khz;divider#(.CLK_FREQ(25000000),.CLK_OUT_FREQ(1000)) U1(.clk(clk), //調(diào)用1kHz分頻電路,用于動態(tài)掃描 .rst_n(rst_n), .clk_out(clk_1khz));seg7displayU2(.clk(clk_1khz), //調(diào)用動態(tài)顯示.rst_n(rst_n),.data(data),.seg(seg),.an(an));endmodule7.2數(shù)碼管顯示控制【例7.2-4】4位數(shù)碼管滾動顯示數(shù)值的VerilogHDL描述。moduleseg7display_scroll(inputclk,rst_n, //時鐘和復(fù)位信號output[7:0]seg, //段碼output[3:0]an //位碼);wireclk_1khz,clk_scroll;wire[15:0]data;divider#(.CLK_FREQ(25000000),.CLK_OUT_FREQ(1000)) //分頻器輸出時鐘頻率:1KHz

U1(.clk(clk),

.rst_n(rst_n),

.clk_out(clk_1khz)); //調(diào)用1kHz分頻模塊

7.2數(shù)碼管顯示控制seg7displayU2(.clk(clk_1khz),.rst_n(rst_n),.data(data),.seg(seg), .an(an)); //調(diào)用8位動態(tài)顯示模塊divider#(.CLK_FREQ(25000000),.CLK_OUT_FREQ(0.5)) //分頻器輸出時鐘頻率:0.5Hz U3(.clk(clk),.rst_n(rst_n),.clk_out(clk_scroll)); //調(diào)用1kHz分頻模塊process_data_scroll#(.info(64'hABCDEF9876543210)) U4(.clk(clk_scroll), .rst_n(rst_n), .data(data)); //調(diào)用數(shù)據(jù)處理模塊endmodule7.2數(shù)碼管顯示控制//處理待顯示數(shù)據(jù)模塊moduleprocess_data_scroll#(parameterinfo=64'hF9E8D7C6B5A43210)( //滾動顯示信息inputclk,rst_n,output[15:0]data);reg[63:0]message;assigndata=message[63:48];always@(posedgeclkornegedgerst_n) if(!rst_n) message<=info; //初始顯示值 elsemessage<={message[59:0],message[63:60]}; //移位操作endmodule7.3蜂鳴器播放音樂【例7.3-1】通過蜂鳴器演奏音樂《梁?!返腣erilogHDL描述。7.4陣列鍵盤控制【例7.4-1】4×4陣列鍵盤控制的VerilogHDL描述實例。modulekey4x4(clk,row,column,y);inputclk;input[3:0]row;outputreg[3:0]column;outputreg[3:0]y;reg[1:0]cnt;always@(posedgeclk)begin cnt<=cnt+1; case(cnt) 2'b00:column=4'b0001; 2'b01:column=4'b0010; 2'b10:column=4'b0100; 2'b11:column=4'b1000; endcase case({column,row}) 8'b0001_0001:y<=4'b0001;//顯示1,c4,c3,d2,c1,r4,r3,r2,r17.4陣列鍵盤控制 8'b0010_0001:y<=4'b0010;//顯示2 8'b0100_0001:y<=4'b0011;//顯示3 8'b1000_0001:y<=4'b1100;//顯示C 8'b0001_0010:y<=4'b0100;//顯示4 8'b0010_0010:y<=4'b0101;//顯示5 8'b0100_0010:y<=4'b0110;//顯示6 8'b1000_0010:y<=4'b1101;//顯示D 8'b0001_0100:y<=4'b0111;//顯示7 8'b0010_0100:y<=4'b1000;//顯示8 8'b0100_0100:y<=4'b1001;//顯示9 8'b1000_0100:y<=4'b1110;//顯示E 8'b0001_1000:y<=4'b1010;//顯示A 8'b0010_1000:y<=4'b0000;//顯示0 8'b0100_1000:y<=4'b1011;//顯示B 8'b1000_1000:y<=4'b1111;//顯示F endcaseendendmodule7.5按鍵脈沖信號產(chǎn)生電路【例7.5-1】

使用按鍵產(chǎn)生脈沖信號的VerilogHDL描述實例。//按鍵產(chǎn)生脈沖模塊modulekey_pulse(inputclk, //時鐘信號inputkey, //按鍵輸入outputpulse //脈沖輸出);regkey_r,key_rr;always@(posedgeclk)beginkey_r<=key;key_rr<=key_r;endassignpulse=key&key_r&~key_rr; //脈沖產(chǎn)生endmodule7.5脈沖信號產(chǎn)生電路【例7.5-2】使用按鍵產(chǎn)生脈沖信號的Testbench仿真測試實例。modulekey_pulse_tb();regclk,key;wirepulse;key_pulsetest(.clk(clk),.key(key),.pulse(pulse));initialbeginclk=0;key=0;#105key=0;#50key=1;#200key=0;#100key=1;endalways#10clk=~clk;endmodule7.6直流電動機控制首先調(diào)用例7.5-1的按鍵脈沖電路,每次按下按鍵都會對應(yīng)產(chǎn)生脈沖信號,按鍵分為正轉(zhuǎn)、反轉(zhuǎn)、停止,加速和減速。然后通過步進電機模塊,產(chǎn)生所需要的控制電機轉(zhuǎn)動方向和PWM波形,輸出給電機驅(qū)動電路,實現(xiàn)直流電機控制。程序設(shè)計參考例7.6-1。7.7步進電動機控制首先調(diào)用例7.5-1的按鍵脈沖電路,每次按下按鍵都會對應(yīng)產(chǎn)生脈沖信號,然后輸入給步進電機模塊,產(chǎn)生所需要的控制波形,按一定的順序給步進電機的各相輪流通電,步進電機就能轉(zhuǎn)動起來。程序設(shè)計參考例7.7-1。7.8序列檢測器【例7.8-1】

序列檢測電路的VerilogHDL描述實例。//序列檢測電路頂層文件modulesequence_detect(inputclk,rst, //時鐘和復(fù)位信號input[1:0]key, //定義按鍵1和0outputled //輸出指示);wirepulse;key_pulseu1(.clk(clk),.key(|key),.pulse(pulse));//調(diào)用脈沖產(chǎn)生電路sequence_compareu2(.clk(pulse),.rst(rst),.data(key[1]),.result(led)); //調(diào)用序列比較電路endmodule7.8序列檢測器//序列比較模塊u2modulesequence_compare(inputclk,rst,inputdata,outputresult); parameters0=2'b00, //s0狀態(tài)表示沒有出現(xiàn)1s1=2'b01, //s1狀態(tài)表示出現(xiàn)第一個1s2=2'b10, //s2狀態(tài)表示出現(xiàn)連續(xù)兩個1s3=2'b11; //s3狀態(tài)表示出現(xiàn)序列110reg[1:0]next_state;always@(posedgeclkorposedgerst)if(rst)next_state=s0; //異步復(fù)位,初始狀態(tài)s0elsecase(next_state)7.8序列檢測器 s0:if(data==1'b1)next_state=s1; elsenext_state=s0; s1:if(data==1'b1)next_state=s2; elsenext_state=s0; s2:if(data==1'b1)next_state=s2; elsenext_state=s3; s3:if(data==1'b1)next_state=s1; elsenext_state=s0; default:next_state=s0;endcaseassignresult=(next_state==s3)?1:0; //穆爾型輸出endmodule7.9LCD1602顯示控制根據(jù)顯示器手冊,設(shè)計狀態(tài)機實現(xiàn)讀寫時序,使LCD1602顯示動態(tài)數(shù)據(jù)。LCD1602顯示控制使用了3個模塊實現(xiàn):模塊U0調(diào)用了例4.4-11參數(shù)化分頻器,對系統(tǒng)25MHz信號分頻用作U2顯示模塊的時鐘。顯示模塊U2,通過狀態(tài)機,實現(xiàn)LCD1602讀寫時序。U1模塊為測試模塊,用來產(chǎn)生顯示器需要顯示的數(shù)據(jù),最后一位數(shù)據(jù)0-9每秒變化一次。程序設(shè)計參見例7.9-1。7.10IIC總線存儲器控制集成電路總線(Inter-IntegratedCircuit,即IIC)一般有兩根信號線,一根是雙向的數(shù)據(jù)線SDA,另一根是時鐘線SCL??偩€的運行(數(shù)據(jù)傳輸)由主機控制。所謂主機是指啟動數(shù)據(jù)的傳送(發(fā)出啟動信號)、發(fā)出時鐘信號以及傳送結(jié)束時發(fā)出停止信號的設(shè)備。被主機尋訪的設(shè)備稱為從機。為了進行通訊,每個接到IIC總線的設(shè)備都有一個唯一的地址,以便于主機尋訪。主機和從機的數(shù)據(jù)傳送,可以由主機發(fā)送數(shù)據(jù)到從機,也可以由從機發(fā)到主機。在IIC總線傳輸過程中,將兩種特定的情況定義為開始和停止條件:當(dāng)SCL保持“高”時,SDA由“高”變?yōu)椤暗汀睘殚_始條件;當(dāng)SCL保持“高”且SDA由“低”變?yōu)椤案摺睍r為停止條件。開始和停止條件均由主控制器產(chǎn)生。SDA線上的數(shù)據(jù)在時鐘“高”期間必須是穩(wěn)定的,只有當(dāng)SCL線上的時鐘信號為低時,數(shù)據(jù)線上的“高”或“低”狀態(tài)才可以改變。輸出到SDA線上的每個字節(jié)必須是8位,每次傳輸?shù)淖止?jié)不受限制,但每個字節(jié)必須要有一個應(yīng)答ACK。如果一接收器件在完成其他功能(如一內(nèi)部中斷)前不能接收另一數(shù)據(jù)的完整字節(jié)時,它可以保持時鐘線SCL為低,以促使發(fā)送器進入等待狀態(tài);當(dāng)接收器準(zhǔn)備好接受數(shù)據(jù)的其它字節(jié)并釋放時鐘SCL后,數(shù)據(jù)傳輸繼續(xù)進行。數(shù)據(jù)傳送具有應(yīng)答是必須的。與應(yīng)答對應(yīng)的時鐘脈沖由主控制器產(chǎn)生,發(fā)送器在應(yīng)答期間必須下拉SDA線。當(dāng)尋址的被控器件不能應(yīng)答時,數(shù)據(jù)保持為高并使主控器產(chǎn)生停止條件而終止傳輸。在傳輸?shù)倪^程中,如果用到了主控接收器,那么主控接收器必須發(fā)出一數(shù)據(jù)結(jié)束信號給被控發(fā)送器,從而使被控發(fā)送器釋放數(shù)據(jù)線,以允許主控器產(chǎn)生停止條件。7.11SPI總線存儲器控制SPI是串行外設(shè)接口(SerialPeripheralInterface)的縮寫,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時在PCB的布局上節(jié)省空間,提供方便,正是出于這種簡單易用的特性,越來越多的芯片集成了這種通信協(xié)議。SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設(shè)備和一個或多個從設(shè)備,需要4根線,分別是MISO(主設(shè)備數(shù)據(jù)輸入)、MOSI(主設(shè)備數(shù)據(jù)輸出)、SCLK(時鐘)、CS(片選)。7.12串行ADC控制用VerilogHDL實現(xiàn)對8位串行ADC芯片TLC549控制,例7.12-1控制串行ADC采樣外部0-3.3V電壓,并通過四位數(shù)碼管顯示采集的模擬值。TLC549帶有片內(nèi)系統(tǒng)時鐘,該時鐘與外部I/OCLOCK時鐘是獨立工作的,無需特殊的速度或相位匹配。當(dāng)CS為高時,數(shù)據(jù)輸出DATAOUT端處于高阻狀態(tài),此時I/OCLOCK不起作用。這種CS控制作用允許在同時使用多片TLC549時,共用I/OCLOCK,以減少多片A/D使用時的I/O控制端口。7.13串行DAC控制本節(jié)用VerilogHDL實現(xiàn)對12位串行DAC芯片DAC7512控制,例7

溫馨提示

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

評論

0/150

提交評論