第一篇:北航_電子實(shí)習(xí)_數(shù)字部分實(shí)驗(yàn)報(bào)告
報(bào)告名稱:電子電路設(shè)計(jì)訓(xùn)練數(shù)字部
分
學(xué)院:儀器科學(xué)與光電工程學(xué)院
目錄
實(shí)驗(yàn)報(bào)告概述:...............................................................................................................3
一、選做實(shí)驗(yàn)總結(jié):.................................................................................................3(1)補(bǔ)充練習(xí)2:樓梯燈設(shè)計(jì).............................................................................3(2)練習(xí)題6:用兩種不同的設(shè)計(jì)方法設(shè)計(jì)一個功能相同的模塊,完成4個數(shù)據(jù)的冒泡排序...................................................................................................................5(3)(4)(5)
二、(1)(2)(3)(4)(5)練習(xí)題3:利用10MB的時鐘,設(shè)計(jì)一個單周期形狀的周期波形..................6 練習(xí)題4:運(yùn)用always塊設(shè)計(jì)一個8路數(shù)據(jù)選擇器......................................6 練習(xí)題5:設(shè)計(jì)一個帶控制端的邏輯運(yùn)算電路.............................................7 練習(xí)一:簡單組合邏輯設(shè)計(jì).........................................................................7 練習(xí)三:利用條件語句實(shí)現(xiàn)計(jì)數(shù)分頻失序電路.............................................7 練習(xí)四:阻塞賦值與非阻塞賦值得區(qū)別.......................................................8 練習(xí)五:用always塊實(shí)現(xiàn)較復(fù)雜的組合邏輯電路........................................8 練習(xí)六:在verilog HDL中使用函數(shù)..............................................................9 必做實(shí)驗(yàn)總結(jié):.................................................................................................7(6)練習(xí)七:在verilog HDL中使用任務(wù)..............................................................9(7)練習(xí)八:利用有限狀態(tài)機(jī)進(jìn)行時許邏輯設(shè)計(jì)..............................................10
三、實(shí)驗(yàn)總結(jié)及體會:............................................................................................10
四、選作程序源代碼...............................................................................................11(1)練習(xí)題3:利用10MB的時鐘,設(shè)計(jì)一個單周期形狀的周期波形................11(2)練習(xí)題4:運(yùn)用always塊設(shè)計(jì)一個8路數(shù)據(jù)選擇器....................................12(3)練習(xí)題5:設(shè)計(jì)一個帶控制端的邏輯運(yùn)算電路...........................................13(4)練習(xí)題6:用兩種不同的設(shè)計(jì)方法設(shè)計(jì)一個功能相同的模塊,完成4個數(shù)據(jù)的冒泡排序.................................................................................................................14(5)補(bǔ)充練習(xí)2:樓梯燈設(shè)計(jì)...........................................................................16
圖表目錄
Figure 1 樓梯燈任務(wù)4..............................................................................................5 Figure 2 組合邏輯.....................................................................................................5 Figure 3 時序邏輯.....................................................................................................6 Figure 4 周期波形....................................................................................................6 Figure 5 8路數(shù)據(jù)選擇器..........................................................................................6 Figure 6 邏輯運(yùn)算電路.............................................................................................7 Figure 7 組合邏輯設(shè)計(jì).............................................................................................7 Figure 8 計(jì)數(shù)分頻時序電路......................................................................................8 Figure 9 阻塞賦值與非阻塞賦值得區(qū)別....................................................................8 Figure 10 always塊組合邏輯電路.............................................................................9 Figure 11 使用函數(shù)..................................................................................................9 Figure 12 使用任務(wù)................................................................................................10 Figure 13 有限狀態(tài)機(jī)............................................................................................10
電子電路設(shè)計(jì)訓(xùn)練(數(shù)字部分)實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)報(bào)告概述:
本實(shí)驗(yàn)報(bào)告為對四次電子電路設(shè)計(jì)訓(xùn)練(數(shù)字部分)實(shí)驗(yàn)的總結(jié),主要包括以下四部分:
第一部分為選做實(shí)驗(yàn)總結(jié),主要包括每個選擇實(shí)驗(yàn)的設(shè)計(jì)思路、運(yùn)行結(jié)果、注意事項(xiàng)、心得體會;
第二部分為必做實(shí)驗(yàn)總結(jié),包括運(yùn)行結(jié)果、總結(jié)、心得體會; 第三部分為課程總結(jié)和體會,是對全部實(shí)驗(yàn)及課程的總結(jié); 第四部分為選做實(shí)驗(yàn)部分源代碼;
一、選做實(shí)驗(yàn)總結(jié):
(1)補(bǔ)充練習(xí)2:樓梯燈設(shè)計(jì)
設(shè)計(jì)思路:
本題給出樓梯的運(yùn)行規(guī)則,并分別給與四個相應(yīng)任務(wù)進(jìn)行編程設(shè)計(jì),考慮到程序的通用性及FPGA高速并行處理的優(yōu)點(diǎn),主要思路如下:
根據(jù)運(yùn)行規(guī)則(8s內(nèi)和大于8s等),對每個燈的相應(yīng)狀態(tài)進(jìn)行編程,設(shè)計(jì)時序邏輯及有限狀態(tài)機(jī);由于在總體上看,每個燈的狀態(tài)變化相對獨(dú)立(只有一個人上樓除外),故對每個燈編程所得到的程序代碼可通用于其它燈(只需要改變相應(yīng)寄存器定義即可),此即為燈控制模塊,對4個不同的任務(wù),只需設(shè)計(jì)其它部分判斷邏輯,即可完成任務(wù)要求;如此設(shè)計(jì),可大大提高程序設(shè)計(jì)效率、易用性,同時如果面對更多的燈控制需要,也可快速進(jìn)行修改部署。
下面針對不同任務(wù)給出不同處理方法:
任務(wù)1/任務(wù)3:由于任務(wù)1和任務(wù)3在定義上有很大相同點(diǎn),比如同樣是一個人走樓梯,若不考慮一個人同時在兩層使兩個燈亮,則事實(shí)上就是一個人始終只能使一盞燈亮,亮起后盞時熄滅前一盞;在保持每個燈控制模塊不改變的情況下,利用非阻塞賦值,判斷該人目前所處狀態(tài)及位置(上樓/下樓,樓層),同時規(guī)定輸出,同時只能亮一盞燈;
任務(wù)2:由于輸入信號已被賦值給寄存器變量,此時只需在系統(tǒng)時鐘作用下對寄存器中輸入變量進(jìn)行判斷,滿足要求即為正確信號,再輸入燈控制模塊;
任務(wù)4:由于已有燈控制模塊,此時只需結(jié)合任務(wù)2防抖電路,直接輸出狀態(tài)信號所對應(yīng)的結(jié)果即可;
(單個)燈控制模塊代碼:
always @(posedgeclk)begin signal_test[0]<=signal[0];if(signal_test[0]==signal[0])
begin
i0=i0+1;
end else
i0=0;if(i0>=5)
begin signal_reg[0]=signal[0];
end
if(state0==light_off)
begin
k0=0;
k0a=0;
k0b=0;
end else
k0=k0+1;
case(signal_reg[0])
1: if(!reset)
begin
state0=light_off;
end
else
begin
k0a=k0a+1;*分欄顯示,詳細(xì)代碼見報(bào)告第四部分;
運(yùn)行結(jié)果:
if((k0a >= 79)&&(k0<=119))
state0=light_on12;
else
state0=light_on8;
end
0:if(!reset)
begin
state0=light_off;
end
else if(k0a==0)
state0=light_off;endcase
case(state0)
light_off:light_reg[0]=0;
light_on8:
begin light_reg[0]=1;
if(k0b==79)
state0=light_off;
else
k0b=k0b+1;
end
light_on12:
begin
light_reg[0]=1;
if(k0b==119)
state0=light_off;
else
k0b=k0b+1;
end endcase end
Figure 1樓梯燈任務(wù)4
Figure 2樓梯燈信號防抖部分放大結(jié)果
(2)練習(xí)題6:用兩種不同的設(shè)計(jì)方法設(shè)計(jì)一個功能相同的模塊,完成4個數(shù)據(jù)的冒泡排序
設(shè)計(jì)思路:
純組合排序中,設(shè)計(jì)sort排序任務(wù)對數(shù)列中的元素進(jìn)行排序,通過調(diào)用任務(wù)實(shí)現(xiàn)對不同元素的排序功能,并將排序完成的結(jié)果直接輸出;
冒泡排序即為每次將兩個相鄰數(shù)進(jìn)行比較,大的數(shù)后“浮”,每一趟比較獲得較大值并置于數(shù)列末位;
根據(jù)題目要求,每比較一次,即將調(diào)換位置的數(shù)字進(jìn)行輸出;同樣設(shè)計(jì)sort任務(wù),對兩數(shù)字進(jìn)行比較并排序;
通過排序控制和邏輯判斷代碼,控制sort任務(wù)的有效調(diào)用,進(jìn)而實(shí)現(xiàn)冒泡排序功能;
根據(jù)設(shè)計(jì)要求,程序中只設(shè)計(jì)有一個輸入端口,通過對輸入信號不斷移位,模擬串并行信號轉(zhuǎn)換,從而完成穿行輸入,并行比較的功能;
運(yùn)行結(jié)果:
Figure 3組合邏輯
Figure 4時序邏輯
(3)練習(xí)題3:利用10MB的時鐘,設(shè)計(jì)一個單周期形狀的周期波形
設(shè)計(jì)思路:
對輸入時鐘進(jìn)行計(jì)數(shù),通過if語句進(jìn)行判斷,若滿足判斷條件,則按要求改變輸出信號;如此循環(huán)往復(fù),即可產(chǎn)生所需單周期形狀的周期波形;
運(yùn)行結(jié)果:
Figure 5周期波形
(4)練習(xí)題4:運(yùn)用always塊設(shè)計(jì)一個8路數(shù)據(jù)選擇器
設(shè)計(jì)思路:
利用define宏定義預(yù)先定義,利于后期程序功能的擴(kuò)充和調(diào)整;同時利用case語句判斷信號,并將相對應(yīng)信號輸出,進(jìn)而完成系統(tǒng)目標(biāo)功能;
運(yùn)行結(jié)果:
Figure 68路數(shù)據(jù)選擇器
(5)練習(xí)題5:設(shè)計(jì)一個帶控制端的邏輯運(yùn)算電路
設(shè)計(jì)思路:
設(shè)計(jì)三個函數(shù)分別完成三個要求的計(jì)算,通過函數(shù)調(diào)用實(shí)現(xiàn)相應(yīng)功能;設(shè)計(jì)的控制端為同步控制端,需要通過時鐘信號從而進(jìn)行檢測復(fù)位;
運(yùn)行結(jié)果:
Figure 7邏輯運(yùn)算電路
二、必做實(shí)驗(yàn)總結(jié):
(1)練習(xí)一:簡單組合邏輯設(shè)計(jì)
語法要點(diǎn):
Assign語句構(gòu)成的組合邏輯電路,若輸入a,b改變,則輸出equal;
利用assign equal=(a==b)?1:0語句,可同時完成判斷賦值功能,大大減少代碼量; 運(yùn)行結(jié)果:
Figure 8組合邏輯設(shè)計(jì)
(2)練習(xí)三:利用條件語句實(shí)現(xiàn)計(jì)數(shù)分頻時序電路
語法要點(diǎn):
此程序主要練習(xí)了對輸入時鐘進(jìn)行計(jì)數(shù),判斷,從而實(shí)現(xiàn)分頻輸出;
在實(shí)際應(yīng)用中,可以通過該方式獲得不同占空比或頻率的信號供系統(tǒng)使用;
課本程序問題修改:
課本測試程序中未定義F10M_clk變量,故應(yīng)將測試程序fdivision_TOP中出現(xiàn)的該變量改為已定義的F10M;
運(yùn)行結(jié)果:
Figure 9計(jì)數(shù)分頻時序電路
(3)練習(xí)四:阻塞賦值與非阻塞賦值的區(qū)別
語法要點(diǎn):
阻塞賦值呈現(xiàn)的是一種立即賦值的狀態(tài),即同一個變量在前后語句中用到,語句間的順序會影響到輸出的結(jié)果;
非阻塞賦值對每一個塊中語句間的相對位置沒有要求,只在該塊語句全部運(yùn)行完成后同一進(jìn)行賦值;
運(yùn)行結(jié)果:
Figure 10阻塞賦值與非阻塞賦值得區(qū)別
(4)練習(xí)五:用always塊實(shí)現(xiàn)較復(fù)雜的組合邏輯電路
語法要點(diǎn):
Always@實(shí)現(xiàn)了對若干輸入信號的敏感,即只要有一個信號改變,輸出即改變; 通過case語句,實(shí)現(xiàn)了選擇性輸出,對不同功能進(jìn)行綜合;
運(yùn)行結(jié)果:
Figure 11 always塊組合邏輯電路
(5)練習(xí)六:在verilog HDL中使用函數(shù)
語法要點(diǎn):
函數(shù)最基本功能即實(shí)現(xiàn)計(jì)算,通過對不同函數(shù)定義,實(shí)現(xiàn)不同的計(jì)算功能;同時定義函數(shù),可以利于在該模塊外對某函數(shù)功能的調(diào)用,增強(qiáng)了程序的通用性和功能性,同時可以使程序結(jié)構(gòu)更加清晰,易讀易懂;
運(yùn)行結(jié)果:
Figure 12使用函數(shù)
(6)練習(xí)七:在verilog HDL中使用任務(wù)
語法要點(diǎn):
相比函數(shù),任務(wù)的調(diào)用功能更強(qiáng)大,可以實(shí)現(xiàn)運(yùn)算并輸出多個結(jié)果的功能,同時任務(wù)并不返回計(jì)算值,只通過類似C語言中的形參和實(shí)參的數(shù)據(jù)交換,實(shí)現(xiàn)功能;任務(wù)的定義和調(diào)用可
以只程序結(jié)構(gòu)更明晰,功能更豐富;
程序中通過對比較順序的設(shè)計(jì),實(shí)現(xiàn)了對4個數(shù)字,進(jìn)行5次比較即可成功完成排序功能的目的;
運(yùn)行結(jié)果:
Figure 13使用任務(wù)
(7)練習(xí)八:利用有限狀態(tài)機(jī)進(jìn)行時許邏輯設(shè)計(jì)
語法要點(diǎn):
設(shè)計(jì)有限狀態(tài)機(jī)主要需要進(jìn)行狀態(tài)分配,狀態(tài)編碼,然后利用case語句進(jìn)行判斷,從而改變相應(yīng)狀態(tài),實(shí)現(xiàn)狀態(tài)轉(zhuǎn)移和輸出變換;
對涉及時鐘的一般時序邏輯,主要運(yùn)用非阻塞(〈=)賦值完成功能;
課本程序問題修改:
在modelsim 10中,測試文件時鐘無法仿真,故只能保持與課本測試文件相同的思路,重新編寫測試文件,仿真結(jié)果如下,與課本完全一致;
運(yùn)行結(jié)果:
Figure 14有限狀態(tài)機(jī)
三、實(shí)驗(yàn)總結(jié)及體會:
通過半個學(xué)期的學(xué)習(xí)和實(shí)驗(yàn),我初步掌握了verilogHDL語言和modelsim軟件,可以通過編程實(shí)現(xiàn)數(shù)字電路基礎(chǔ)中幾乎全部簡單邏輯芯片的功能,同時可以用編程實(shí)現(xiàn)相對復(fù)雜一點(diǎn)的邏輯電路和功能.總體而言,四次實(shí)驗(yàn)內(nèi)容相對簡單,幾乎是在課后實(shí)驗(yàn)的基礎(chǔ)上稍稍做了提高,以利于我們掌握并鞏固課上學(xué)習(xí)的知識。有幾個課后實(shí)驗(yàn)內(nèi)容,按照程序輸入后無法進(jìn)行波形仿真,在改正一些錯誤定義,或者重寫測試程序后,都能順利完成實(shí)驗(yàn)任務(wù)。通過實(shí)驗(yàn)上機(jī),鞏固了我們的理論知識,加強(qiáng)了實(shí)際運(yùn)用的能力,對整個課程的學(xué)習(xí)起到了很好的作用。
最后一個補(bǔ)充實(shí)驗(yàn)相對復(fù)雜,但實(shí)現(xiàn)的方法卻可以有很多,在實(shí)際寫代碼前進(jìn)行構(gòu)思分析,在這個實(shí)驗(yàn)中顯得尤為重要,例如,如何發(fā)揮FPGA并行處理的能力,如何提高程序的通用性,能夠?qū)⑺O(shè)計(jì)的模塊結(jié)構(gòu)同時完成四個任務(wù),如何設(shè)計(jì)代碼提高效率的同時節(jié)省硬件資源??都是在設(shè)計(jì)構(gòu)思中不得不考慮的環(huán)節(jié),因此,通過最后一個實(shí)驗(yàn)的設(shè)計(jì),能夠很好的鍛煉我們解決實(shí)際生活中問題的能力,使我們對所學(xué)的知識能夠真正有所使用。
運(yùn)用verilog HDL語言進(jìn)行硬件電路設(shè)計(jì),已成為未來電路設(shè)計(jì)的主要趨勢,學(xué)習(xí)這門語言及相應(yīng)軟件,能夠幫助我們在以后的學(xué)習(xí)及科研中,大大提高我們的效率,使我們能夠快速搭建實(shí)驗(yàn)平臺,完成目標(biāo)功能。
雖然8周的課,時間相對較短,但通過這8周的學(xué)習(xí),我對verilog HDL語言有了全面的認(rèn)識,對基本的語法都有了很好的掌握,雖然時間有限,不能對verilog HDL語言有更深入的認(rèn)識,但通過這8周的學(xué)習(xí),我為我將來進(jìn)一步深化使用這個工具打下了堅(jiān)實(shí)的基礎(chǔ)。
四、選作程序源代碼(1)練習(xí)題3:利用10MB的時鐘,設(shè)計(jì)一個單周期形狀的周期波形 主程序:
module fdivison_2(RESET,F10M,clk_out,j);input F10M,RESET;output clk_out;output[12:0] j;
regclk_out;
reg[12:0] j;always @(posedge F10M)begin if(!RESET)begin clk_out<=0;j<=0;end
else begin if(j==199)
begin
j<=j+1;clk_out<=1;
end
else if(j==299)
begin
j<=j+1;clk_out<=0;
end
else if(j==499)
j<=0;
else j<=j+1;end end
endmodule
output[3:0] out;
reg[3:0] out;
always @(a or b or c or d or e or f or g or h or selet)
begin
case(selet)
`s1:out=a;
`s2:out=b;
`s3:out=c;
`s4:out=d;
`s5:out=e;
`s6:out=f;
`s7:out=g;
`s8:out=h;default:out=4'hz;endcase
end
endmodule
測試程序: `timescale 1 ns/1 ns
module muxtest;
wire[3:0] out;reg[3:0] a,b,c,d,e,f,g,h;reg[2:0] selet;
parameter times1=8;
initial
begin
a=0;
b=1;
c=2;d=3;
e=4;
f=5;
g=6;
h=7;selet=3'h0;
repeat(5)測試程序:
`timescale 1ns/100ps `define clk_cycle 50 module TOP_2;reg F10M,RESET;wire clk;wire[12:0] j;always #`clk_cycle
F10M = ~F10M;
initial
begin
RESET=1;
F10M=0;
#100 RESET=0;
#100 RESET=1;
#10000 $stop;
end
fdivison_2 fdivison_2(.RESET(RESET),.F10M(F10M),.clk_out(clk),.j(j));
endmodule
(2)練習(xí)題4:運(yùn)用always塊設(shè)計(jì)一個8路數(shù)據(jù)選擇器
主程序: `define s1 3'd0 `define s2 3'd1 `define s3 3'd2 `define s4 3'd3 `define s5 3'd4 `define s6 3'd5 `define s7 3'd6 `define s8 3'd7
module mux_8(a,b,c,d,e,f,g,h,selet,out);
input[3:0] a,b,c,d,e,f,g,h;
input[2:0] selet;
begin
#100 selet=selet+1;
end
selet=0;repeat(times1)
begin
#100 selet=selet+1;
a={$random}%16;
b={$random}%16;
c={$random}%16;
d={$random}%16;
e={$random}%16;
f={$random}%16;
g={$random}%16;
h={$random}%16;
end
#100 $stop;
end
mux_8 m0(a,b,c,d,e,f,g,h,selet,out);endmodule
(3)練習(xí)題5:設(shè)計(jì)一個帶控制端的邏輯運(yùn)算電路
主程序:
`define sqrR 4'd0 `define triR 4'd0 `define factR 4'd0
module sqr(a,reset,clk,sqr_out,tri_out,fact_out);
input[3:0] a;input reset,clk;output[7:0] sqr_out,tri_out,fact_out;reg[7:0] sqr_out,tri_out,fact_out;
always @(posedgeclk)begin
if(!reset)
{sqr_out,tri_out,fact_out}={`sqrR,`triR,`factR};
else
begin
sqr_out=sqr_cal(a);tri_out=tri_cal(a);fact_out=fact_cal(a);
end end
function[7:0] sqr_cal;
input[3:0] a;
begin sqr_cal=a*a;
end endfunction
function[7:0] tri_cal;
input[3:0] a;
begin tri_cal=a*a*a;
end endfunction
function[7:0] fact_cal;
input[3:0] a;
begin
if(a>5)fact_cal=0;
else
begin
case(a)
0:fact_cal=1;
1:fact_cal=1;
2:fact_cal=2;
3:fact_cal=6;
4:fact_cal=24;
5:fact_cal=120;endcase
end
end endfunction
endmodule
測試程序:
`timescale 1 ns/100 ps `define clk_cycle 50
module sqrTEST;
reg[3:0] a,i;regreset,clk;
wire[7:0] sqr_out,tri_out,fact_out;
initial
begin clk=0;
a=0;
reset=1;
#100 reset=0;
#100 reset=1;
for(i=0;i<=6;i=i+1)
begin
#200 a=i;
end
#100 $stop;
end
always #`clk_cycleclk=~clk;
sqr m(a,reset,clk,sqr_out,tri_out,fact_out);
endmodule
(4)練習(xí)題6:用兩種不同的設(shè)計(jì)方法設(shè)計(jì)一個功能相同的模塊,完成4個數(shù)據(jù)的冒泡排序
組合邏輯實(shí)現(xiàn)程序:
module bub(ai,bi,ci,di,ao,bo,co,do);
input[7:0] ai,bi,ci,di;output[7:0] ao,bo,co,do;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n;
parameter so=4;
//
always @(ai or bi or ci or di)begin
{ar,br,cr,dr}={ai,bi,ci,di};
for(n=so;n>1;n=n-1)
//
bb(ar,br,cr,dr,n);
{ao,bo,co,do}={ar,br,cr,dr};end
task bb;
// inout[7:0] x1,x2,x3,x4;
input[3:0] n;
// reg[7:0] temp;reg[3:0] s;
if(n>0)
for(s=1;s begin case(s) 1:sort2(x1,x2);2:sort2(x2,x3); 3:sort2(x3,x4);endcase end endtask task sort2;inout[7:0] x,y;reg[7:0] temp; if(x>y) begin temp=x; x=y; y=temp; end endtask endmodule 組合邏輯測試程序: `timescale 1 ns/100 ps module bubTEST;reg[7:0] ai,bi,ci,di;wire[7:0] ao,bo,co,do; initial begin ai=0;bi=0;ci=0;di=0; repeat(4) begin #100 ai={$random}%256; bi={$random}%256; ci={$random}%256; di={$random}%256; end #100 $stop; end bub m0(ai,bi,ci,di,ao,bo,co,do); endmodule 時序邏輯實(shí)現(xiàn)程序: module bub_1(in,clk,ar,br,cr,dr,ao,bo,co,do); input[7:0] in;input clk;output[7:0] ao,bo,co,do;output[7:0] ar,br,cr,dr;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n,s,q; parameter so=4; initial begin n=0; s=0; q=0; end always @(posedgeclk)begin if(n<=so) begin n=n+1;ar<=in;br<=ar;cr<=br;dr<=cr; end if(n==so+1) begin n<=so+2; s<=so; q<=1; end if(s>1) begin {ao,bo,co,do}<={ar,br,cr,dr}; if(q begin case(q) 1:sort2(ar,br); 2:sort2(br,cr); 3:sort2(cr,dr);endcase q<=q+1; end else begin s<=s-1; q<=1; end end end task sort2;inout[7:0] x,y;reg[7:0] temp; if(x>y) begin temp=x; x=y; y=temp; end endtask endmodule 時序邏輯測試程序: `timescale 1 ns/100 ps module bubTEST_1;reg[7:0] in;regclk; wire[7:0] ao,bo,co,do,ar,br,cr,dr; initial begin clk=0; in=0; begin repeat(4) #100 in={$random}%256; end #100 $stop; end always #50 clk=~clk; bub_1 m0(in,clk,ar,br,cr,dr,ao,bo,co,do); endmodule (5)補(bǔ)充練習(xí)2:樓梯燈設(shè)計(jì) 主程序: module final2(signal,reset,clk,light); input[2:0] signal; input reset,clk; output[2:0] light; reg[2:0] signal_reg,light_reg,light_test,signal_test; reg[11:0] k0,k1,k2,k0a,k1a,k2a,k0b,k1b,k2b; reg[1:0] state0,state1,state2; reg[3:0] i0,i1,i2; parameter light_off=2'b00,light_on8=2'b01,light_on12=2'b10;initial begin k0=0;k1=0;k2=0; k0a=0;k1a=0;k2a=0; k0b=0;k1b=0;k2b=0; i0=0;i1=0;i2=0;light_reg=3'b000; state0=light_off; state1=light_off; state2=light_off;signal_reg=0;signal_test=signal;end // // always @(posedgeclk)begin signal_test[0]<=signal[0];if(signal_test[0]==signal[0]) begin i0=i0+1; end else i0=0;if(i0>=5) begin signal_reg[0]=signal[0]; end if(state0==light_off) begin k0=0; k0a=0; k0b=0; end else k0=k0+1; case(signal_reg[0]) 1: if(!reset) begin state0=light_off; end else begin k0a=k0a+1; if((k0a >= 79)&&(k0<=119)) state0=light_on12; else state0=light_on8; end 0:if(!reset) begin state0=light_off; end else if(k0a==0) state0=light_off;endcase case(state0) light_off:light_reg[0]=0; light_on8: begin light_reg[0]=1; if(k0b==79) state0=light_off; else k0b=k0b+1; end light_on12: begin light_reg[0]=1; if(k0b==119) state0=light_off; else k0b=k0b+1; end endcase end always @(posedgeclk)begin signal_test[1]<=signal[1];if(signal_test[1]==signal[1]) begin i1=i1+1; end else i1=0; if(i1>=5) begin signal_reg[1]=signal[1]; end if(state1==light_off) begin k1=0; k1a=0; k1b=0; end else k1=k1+1; case(signal_reg[1]) 1: if(!reset) begin state1=light_off; end else begin k1a=k1a+1; if((k1a >= 79)&&(k1<=119)) state1=light_on12; else state1=light_on8; end 0:if(!reset) begin state1=light_off; end else if(k1a==0) state1=light_off;endcase case(state1) light_off:light_reg[1]=0; light_on8: begin light_reg[1]=1; if(k1b==79) state1=light_off; else k1b=k1b+1; end light_on12: begin light_reg[1]=1; if(k1b==119) state1=light_off; else k1b=k1b+1; end endcase end // // always @(posedgeclk)begin signal_test[2]<=signal[2];if(signal_test[2]==signal[2]) begin i2=i2+1; end else i2=0;if(i2>=5) begin signal_reg[2]=signal[2]; end if(state2==light_off) begin k2=0; k2a=0; k2b=0; end else k2=k2+1; case(signal_reg[2]) 1: if(!reset) begin state2=light_off; end else begin k2a=k2a+1; if((k2a >= 79)&&(k2<=119)) state2=light_on12; else state2=light_on8; end 0:if(!reset) begin state2=light_off; end else if(k2a==0) state2=light_off;endcase case(state2) light_off:light_reg[2]=0; light_on8: begin light_reg[2]=1; if(k2b==79) state2=light_off; else k2b=k2b+1; end light_on12: begin light_reg[2]=1; if(k2b==119) state2=light_off; else k2b=k2b+1; end endcase casex(light_reg) 3'b000:light_test=000; 3'b001:light_test=001; 3'b01x:light_test=010; 3'b1xx:light_test=100;endcase end assign light=light_test;endmodule 測試程序: `timescale 10ms/10ms module final_TOP2;reg[2:0] signal;regclk,reset; wire[2:0] light; initial begin clk=0; reset=1; #2 reset=0; #10 reset=1; #10 signal=3'b111; #10 signal=3'b000; #900 signal=3'b111; #100 signal=3'b000; #900 signal=3'b011; #100 signal=3'b000; #900 signal=3'b001; #900 signal=3'b000; #100 $stop;end always #5 clk=~clk; final2 m(signal,reset,clk,light);endmodule Verilog數(shù)字電路設(shè)計(jì) 實(shí)驗(yàn)報(bào)告 院系: 組員: 年月日 Verilog實(shí)驗(yàn)報(bào)告 目錄 分組概況....................................................................................................................................3 分組概況................................................................................................................................3 實(shí)驗(yàn)概況................................................................................................................................4 實(shí)驗(yàn)感想................................................................................................................................5 實(shí)驗(yàn)內(nèi)容....................................................................................................................................9 實(shí)驗(yàn)一....................................................................................................................................9 實(shí)驗(yàn)二..................................................................................................................................15 實(shí)驗(yàn)三..................................................................................................................................25 實(shí)驗(yàn)四..................................................................................................................................33 Verilog實(shí)驗(yàn)報(bào)告 一、分組概況 組長: 主要負(fù)責(zé)各次實(shí)驗(yàn)的總體進(jìn)程,以及選做實(shí)驗(yàn)的代碼編譯。在實(shí)驗(yàn)報(bào)告中負(fù)責(zé)統(tǒng)籌規(guī)劃及后期編排。 組員: 負(fù)責(zé)各次實(shí)驗(yàn)必做實(shí)驗(yàn)源代碼的錄入及仿真。在實(shí)驗(yàn)報(bào)告中負(fù)責(zé)報(bào)告前期錄入,包括各次實(shí)驗(yàn)的簡要內(nèi)容、步驟等。 Verilog實(shí)驗(yàn)報(bào)告 二、實(shí)驗(yàn)概況 本課程共安排四次實(shí)驗(yàn),其內(nèi)容是: 1、練習(xí) 一、簡單的組合邏輯設(shè)計(jì) 練習(xí) 二、簡單分頻時序邏輯電路的設(shè)計(jì) 選做 一、設(shè)計(jì)一個字節(jié)(8位)的比較器 2、練習(xí) 三、利用條件語句實(shí)現(xiàn)計(jì)數(shù)分頻時序電路 練習(xí) 五、用always塊實(shí)現(xiàn)較復(fù)雜組合邏輯電路 選做 一、利用10MB時鐘設(shè)計(jì)一個單周期波形 選做 二、運(yùn)用always塊設(shè)計(jì)一個8路數(shù)據(jù)選擇器 3、練習(xí) 四、阻塞賦值與非阻塞賦值的區(qū)別 練習(xí) 六、在Verilog中使用函數(shù) 練習(xí) 七、在Verilog中使用任務(wù) 練習(xí)題 5、綜合一個可以計(jì)算正整數(shù)平方、立方、階乘的函數(shù) 思考題 3、在blocking模塊中實(shí)現(xiàn)對兩種寫法的仿真 4、必做 一、設(shè)計(jì)一個串行數(shù)據(jù)檢測器 必做 二、樓梯燈——基本任務(wù) 選做 一、樓梯燈——擴(kuò)展任務(wù) Verilog實(shí)驗(yàn)報(bào)告 三、感想 通過這4次的實(shí)驗(yàn),我們基本熟悉Modelsim 軟件,掌握了Modelsim 軟件的編譯、仿真方法。同時在編寫程序的過程中,加深了我們對課上所講的語法的認(rèn)識以及學(xué)會了測試模塊的編寫。經(jīng)過實(shí)驗(yàn)一,我們掌握了基本組合邏輯電路,基本時序電路;經(jīng)過實(shí)驗(yàn)二,我們掌握條件語句在簡單時序模塊設(shè)計(jì)中的使用、在Verilog模塊中應(yīng)用計(jì)數(shù)器以及用always實(shí)現(xiàn)較大組合邏輯電路;經(jīng)過實(shí)驗(yàn)三,我們掌握阻塞賦值與非阻塞賦值的概念與區(qū)別,了解函數(shù)的定義和在模塊設(shè)計(jì)中的使用,掌握任務(wù)在verilog模塊設(shè)計(jì)中的應(yīng)用;經(jīng)過實(shí)驗(yàn)四,我們掌握利用有限狀態(tài)機(jī)實(shí)現(xiàn)一般時序邏輯分析的方法。在實(shí)驗(yàn)過程中,我們也遇到過程序編寫以及軟件仿真上的問題。程序編寫時,要注意一些細(xì)節(jié),比如符號,全角與半角等。軟件仿真過程中,我們出現(xiàn)過程序無錯,但添加波形運(yùn)行后,卻沒有波形的情況,最后上網(wǎng)百度,找到了解決方法。實(shí)驗(yàn)總體來說,都比較順利。對于難度較大的實(shí)驗(yàn)四,只要思路清晰,考慮到所有的情況,就能做出來。 Verilog實(shí)驗(yàn)報(bào)告 四、實(shí)驗(yàn)內(nèi)容 第一次實(shí)驗(yàn)課: 練習(xí)一 簡單的組合邏輯設(shè)計(jì) 實(shí)驗(yàn)?zāi)康模海?)掌握基本組合邏輯電路的實(shí)現(xiàn)方法(2)初步了解兩種基本組合邏輯電路的生成方法(3)學(xué)習(xí)測試模塊的編寫(4)通過綜合和布局布線了解不同層次仿真的物理意義 實(shí)驗(yàn)原理: 實(shí)驗(yàn)代碼提供的是一個可綜合的數(shù)據(jù)比較器。從語句中可以看出是比較數(shù)據(jù)a,b的結(jié)果,結(jié)果相同輸出1,否則輸出0.測試模塊用于檢測模塊設(shè)計(jì)是否正確,給出輸入信號,觀察模塊的內(nèi)部信號和輸出信號以確定設(shè)計(jì)是否正確。綜合就是把compare.v文件送到synplify或其他綜合器進(jìn)行處理,啟動綜合器編譯。布局布線就是把綜合后的另一種文件(EDIF),在布線工具控制下進(jìn)行處理,啟動布局布線的編譯。實(shí)驗(yàn)內(nèi)容: 模塊源代碼的組合邏輯仿真與測試 實(shí)驗(yàn)代碼: module compare(equal,a,b);inputa,b;output equal; assign equal =(a==b)?1:0; endmodule 實(shí)驗(yàn)仿真: 測試程序: `timescale 1ns/1ns `include “./compare.v” module t;rega,b;wire equal;initial begin a=0;b=0;#100 a=0;b=1;#100 a=1;b=1;#100 a=1;b=0; Verilog實(shí)驗(yàn)報(bào)告 #100 a=0;b=0;#100 $stop;end compare m(.equal(equal),.a(a),.b(b)); endmodule 仿真結(jié)果: 練習(xí)二 簡單分頻時序邏輯電路的設(shè)計(jì) 實(shí)驗(yàn)?zāi)康模海?)掌握最基本時序電路的實(shí)現(xiàn)方法(2)學(xué)習(xí)時序電路測試模塊的編寫(3)學(xué)習(xí)綜合和不同層次的仿真 實(shí)驗(yàn)原理: 對于組合邏輯電路,可綜合成具體電路結(jié)構(gòu)的時序邏輯電路也有準(zhǔn)確的表達(dá)方式。在可綜合的模型中,通常用always塊或者@(posedgeclk)或(negedgeclk)結(jié)構(gòu)表達(dá)時序邏輯。實(shí)驗(yàn)為二分之一分頻器模型。 在always塊中,被賦值信號都必須定義為reg型,對于reg型數(shù)據(jù),如果未對它進(jìn)行賦值,仿真工具會認(rèn)為它是不定態(tài)的。為了正確觀察結(jié)果,在可綜合模塊中,常定義一個復(fù)位信號reset,其為低電平時對寄存器進(jìn)行復(fù)位。實(shí)驗(yàn)內(nèi)容: 分頻時序電路的仿真測試 實(shí)驗(yàn)代碼: modulehalf_clk(reset,clk_in,clk_out);inputclk_in,reset;outputclk_out;regclk_out;always @(posedgeclk_in)begin if(!reset)clk_out=0;elseclk_out=~clk_out;end endmodule 實(shí)驗(yàn)仿真: 測試程序: Verilog實(shí)驗(yàn)報(bào)告 `timescale 1ns/100ps `define clk_cycle 50 module top;reg clk,reset;wire clk_out;always #`clk_cycle clk=~clk;initial begin clk=0;reset=1;#10 reset=0;#110 reset=1;#100000 $stop;end half_clk m0(.reset(reset),.clk_in(clk),.clk_out(clk_out));endmodule 仿真結(jié)果: 選做一 設(shè)計(jì)一個字節(jié)(8位)比較器 實(shí)驗(yàn)內(nèi)容: 比較兩個字節(jié)的大小,若a[7:0]大于b[7:0],則輸出高電平,否則輸出低電平。 實(shí)驗(yàn)代碼: module compare8(equal,a,b);input [7:0]a,b;output equal;reg equal;always@(a or b)if(a>b)equal=1;else equal=0;endmodule 實(shí)驗(yàn)仿真: 測試程序: `timescale 1ns/1ns Verilog實(shí)驗(yàn)報(bào)告 `include “./compare8.v” module test8;reg [7:0]a;reg [7:0]b;wire equal;initial begin a=8'b10000000;b=8'b00000000;#100 a=8'b00001000;b=8'b00001111;#100 a=8'b00001111;b=8'b00011111;#100 a=8'b11111111;b=8'b11111111;#100 a=8'b10101010;b=8'b00001111;#100 $stop;end compare8 m(.equal(equal),.a(a),.b(b));endmodule 仿真結(jié)果: 第二次實(shí)驗(yàn)課 練習(xí)三 利用條件語句實(shí)現(xiàn)計(jì)數(shù)分頻時序電路 實(shí)驗(yàn)?zāi)康模海?)掌握條件語句在簡單時序模塊設(shè)計(jì)中的使用(2)學(xué)習(xí)在Verilog模塊中應(yīng)用計(jì)數(shù)器(3)學(xué)習(xí)測試模塊的編寫、綜合和不同層次的仿真 實(shí)驗(yàn)原理: 在可綜合的Verilog HDL模型中,常用的條件語句有if ?else和case?endcase兩種結(jié)構(gòu),用法和C語言相似。1.if語句(1)if(表達(dá)式)語句 (2)if(表達(dá)式)語句1 else語句2(3)if(表達(dá)式1)語句1; else if(表達(dá)式2)語句2; else if(表達(dá)式3)語句3; Verilog實(shí)驗(yàn)報(bào)告 ?? 2.case語句 (1)case(表達(dá)式) 進(jìn)行所給代碼計(jì)數(shù)分頻器的仿真測試并觀察輸出波形 實(shí)驗(yàn)代碼: modulefdivsion(RESET,F10M,F500K);input F10M,RESET;output F500K;reg F500K;reg [7:0]j;always @(posedge F10M)if(!RESET)begin F500K<=0;j<=0;end else begin if(j==9)begin j<=0;F500K<=~F500K;end else j<=j+1;end endmodule 實(shí)驗(yàn)仿真: 測試程序: `timescale 1ns/100ps `defineclk_cycle 50 moduledivision_top;reg F10M,RESET;wire F500K_clk;always #`clk_cycle F10M=~F10M;initial Verilog實(shí)驗(yàn)報(bào)告 begin RESET=1;F10M=0;#100 RESET=0;#100 RESET=1;#10000 $stop;end fdivsion m0(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk));endmodule 仿真結(jié)果: 練習(xí)五 用always塊實(shí)現(xiàn)較復(fù)雜的組合邏輯電路 實(shí)驗(yàn)?zāi)康模?/p> (1)掌握用always實(shí)現(xiàn)較大組合邏輯電路的方法; (2)進(jìn)一步了解assign與always兩種組合電路實(shí)現(xiàn)方法的區(qū)別和注意點(diǎn);(3)學(xué)習(xí)測試模塊中隨機(jī)數(shù)的產(chǎn)生和應(yīng)用;(4)學(xué)習(xí)綜合不同層次的仿真,并比較結(jié)果。實(shí)驗(yàn)原理: (1)自觸發(fā)always塊: 例:采用非阻塞賦值的自觸發(fā)振蕩器 module osc2(clk);outputclk;regclk;initial #10 clk=0;always @(clk)#10 clk<=~clk;endmodule @(clk)的第一次觸發(fā)之后,非阻塞賦值的RHS表達(dá)式便計(jì)算出來,并把值賦給LHS的時間并安排在更新事件隊(duì)列中。在非阻塞賦值更新事件隊(duì)列被激活之前,又遇到了@(clk)觸發(fā)語句,并且always塊再次對clk的值變化產(chǎn)生反應(yīng)。當(dāng)非阻塞LHS的值在同一時刻被更新時,@(clk)再一次觸發(fā)。 本實(shí)驗(yàn)示例中使用了電平敏感的always塊,所謂電平敏感的觸發(fā)條件:@后的括號內(nèi)電平里表中的任何一個電平發(fā)生變化(與時序邏輯不同,它在@后的括號內(nèi)沒有沿敏感關(guān)鍵詞,如posedge或negedge),就能觸發(fā)always塊的動作。(2)assign與always Verilog實(shí)驗(yàn)報(bào)告 使用assign結(jié)構(gòu)來實(shí)現(xiàn)組合邏輯電路,如果邏輯關(guān)系比較復(fù)雜,不容易理解語句的功能,而適當(dāng)采用always來設(shè)計(jì)組合邏輯,使源代碼語句的功能容易理解。 同一組合邏輯電路分別用always塊和連續(xù)賦值語句assign描述時,代碼的形式大相徑庭,但在always中,若適當(dāng)運(yùn)用default(在case結(jié)構(gòu)中)和else(在if?else結(jié)構(gòu)中)語句時,通常可以綜合為純組合邏輯,盡管被賦值的變量一定要定義為reg型;若不使用default或else對默認(rèn)項(xiàng)進(jìn)行說明,則易生成意想不到的鎖存器,這一點(diǎn)一定注意! 實(shí)驗(yàn)代碼: `define plus 3'd0 `define minus 3'd1 `define band 3'd2 `definebor 3'd3 `defineunegate 3'd4 modulealu(out,opcode,a,b);output[7:0] out;reg[7:0] out;input[2:0] opcode;input[7:0] a,b;always@(opcode or a or b)begin case(opcode)`plus: out=a+b;`minus: out=a-b;`band: out=a&b;`bor: out=a|b;`unegate: out=~a;default: out=8'hx;endcase end endmodule 實(shí)驗(yàn)仿真: 測試程序: `timescale 1ns/1ns `include “./alu.v” moduleaultest;wire[7:0] out;reg[7:0] a,b;reg[2:0] opcode;parameter times=5;initial begin a={$random}%256; Verilog實(shí)驗(yàn)報(bào)告 b={$random}%256;opcode=3'h0;repeat(times)begin #100 a={$random}%256;b={$random}%256;opcode=opcode+1;end #100 $stop;end alu alu1(out,opcode,a,b);endmodule 仿真結(jié)果: 選做 一、利用10MB時鐘設(shè)計(jì)一個單周期波形 實(shí)驗(yàn)內(nèi)容: 利用原有代碼,自己編寫模塊源代碼和測試模塊代碼,利用10M時鐘,設(shè)計(jì)一個單周期形狀的周期波形 實(shí)驗(yàn)代碼: module fdivision2(RESET,clk,out);inputclk,RESET;output out;reg out;reg [15:0]j;always @(posedgeclk)if(!RESET)begin out<=0;j<=0;end else begin if(j==199)begin j<=j+1;out<=~out;end Verilog實(shí)驗(yàn)報(bào)告 else begin if(j==299)begin j<=j+1;out<=~out;end else if(j==499)j<=0;else j<=j+1;end end endmodule 實(shí)驗(yàn)仿真: 測試程序: `timescale 1ns/100ps `defineclk_cycle 50 modulefdivision_top;regclk,RESET;wireout_clk;always #`clk_cycleclk=~clk;initial begin RESET=1;clk=0;#1000 RESET=0;#1000 RESET=1;#100000 $stop;end fdivision2fdivision(.RESET(RESET),.clk(clk),.out(out_clk));endmodule 仿真結(jié)果: Verilog實(shí)驗(yàn)報(bào)告 選做 二、用always塊實(shí)現(xiàn)較復(fù)雜的組合邏輯電路 實(shí)驗(yàn)內(nèi)容: 運(yùn)用always塊設(shè)計(jì)一個8路數(shù)據(jù)選擇器。要求:每路輸入數(shù)據(jù)與輸出數(shù)據(jù)均為4位2進(jìn)制數(shù),當(dāng)選擇開關(guān)(至少3位)或輸入數(shù)據(jù)變化時,輸出數(shù)據(jù)也相應(yīng)的變化。 實(shí)驗(yàn)代碼: module lianxi4(out,opcode,a,b,c,d,e,f,g,h);output[3:0] out;reg[3:0] out;input[2:0] opcode;input[3:0] a,b,c,d,e,f,g,h; always@(opcode or a or b or c or d or e or f or g or h)begin case(opcode)3'd0:out=a;3'd1:out=b;3'd2:out=c;3'd3:out=d;3'd4:out=e;3'd5:out=f;3'd6:out=g;3'd7:out=h;endcase end endmodule 實(shí)驗(yàn)仿真: 測試程序: `timescale 1ns/1ns `include “./lianxi4.v” module lianxi4_t;wire[3:0] out;reg[3:0] a,b,c,d,e,f,g,h;reg[2:0] opcode;parameter times=8;initial begin a={$random}%16;b={$random}%16;c={$random}%16;d={$random}%16;e={$random}%16; Verilog實(shí)驗(yàn)報(bào)告 f={$random}%16;g={$random}%16;h={$random}%16;opcode=3'b0;repeat(times)begin #100 a={$random}%16;b={$random}%16;c={$random}%16;d={$random}%16;e={$random}%16;f={$random}%16;g={$random}%16;h={$random}%16;opcode=opcode+1;仿真結(jié)果: Verilog實(shí)驗(yàn)報(bào)告 第三次實(shí)驗(yàn)課 練習(xí)四 阻塞賦值與非阻塞賦值的區(qū)別 實(shí)驗(yàn)?zāi)康模?/p> (1)通過實(shí)驗(yàn),掌握阻塞賦值與非阻塞賦值的概念與區(qū)別;(2)了解非阻塞與阻塞賦值的不同使用場合; (3)學(xué)習(xí)測試模塊的編寫、綜合和不同層次的仿真。實(shí)驗(yàn)原理: 非阻塞賦值方式:在語句塊中,上面語句所賦的變量值不能立即就為下面的語句所用;塊結(jié)束后才能完成這次賦值操作,而所賦的變量值是上一次賦值所得;在編寫可綜合的時序邏輯模塊時,這是最常用的賦值方法。 阻塞賦值方式:賦值語句執(zhí)行完后,塊才結(jié)束;被賦的值才賦值語句執(zhí)行完后立刻就改變;在時序邏輯中使用時,可能會產(chǎn)生意想不到的結(jié)果。 在always塊中,阻塞賦值可以理解為賦值語句是順序執(zhí)行的,而非阻塞賦值可以理解為賦值語句是并發(fā)執(zhí)行的。在時序邏輯設(shè)計(jì)中,通常使用非阻塞賦值語句,而在實(shí)現(xiàn)組合邏輯的assign結(jié)構(gòu)中,或者always塊結(jié)構(gòu)中都必須采用阻塞賦值語句。 實(shí)驗(yàn)代碼: module blocking(clk,a,b,c);output[3:0] b,c;input [3:0] a;inputclk;reg [3:0] b,c;always@(posedgeclk)begin b=a;c=b;$display(“blocking:a=%d,b=%d,c=%d.”,a,b,c);end endmodule modulenonblocking(clk,a,b,c);output[3:0] b,c;input [3:0] a;inputclk;reg [3:0] b,c;always@(posedgeclk)begin b<=a;c<=b;$display(“nonblocking:a=%d,b=%d,c=%d.”,a,b,c);end endmodule 實(shí)驗(yàn)仿真: Verilog實(shí)驗(yàn)報(bào)告 測試程序: `timescale 1ns/100ps `include“./blocking.v” `include“./nonblocking.v” modulecomparetop;wire [3:0] b1,c1,b2,c2;reg[3:0] a;regclk;initial begin clk=0;forever #50 clk=~clk;end initial begin a=4'h3;$display(“_”);#100 a=4'h7;$display(“_”);#100 a=4'hf;$display(“_”);#100 a=4'ha;$display(“_”);#100 a=4'h2;$display(“_”);$stop;end nonblockingnonblocking(clk,a,b2,c2);blocking blocking(clk,a,b1,c1);endmodule 測試結(jié)果: 思考題3在blocking模塊中實(shí)現(xiàn)對兩種寫法的仿真 實(shí)驗(yàn)內(nèi)容: 在blocking模塊中按如下兩種寫法,仿真與綜合的結(jié)果會有什么樣的變化?做出仿真波形。 實(shí)驗(yàn)代碼: Verilog實(shí)驗(yàn)報(bào)告 module blocking1(clk,a,b,c);output[3:0] b,c;input [3:0] a;inputclk;reg [3:0] b,c;always@(posedgeclk)begin c=b;b=a;end endmodule module blocking2(clk,a,b,c);output[3:0] b,c;input [3:0] a;inputclk;reg [3:0] b,c;always@(posedgeclk)b=a;always@(posedgeclk)c=b;endmodule 實(shí)驗(yàn)仿真: 測試程序: `include“./blocking1.v” `include“./blocking2.v” module top;wire [3:0] b1,c1,b2,c2;reg[3:0] a;regclk;initial begin clk=0;forever #50 clk=~clk;end initial begin a=4'h3;$display(“_”);#100 a=4'h7;$display(“_”);#100 a=4'hf;$display(“_”);#100 a=4'ha;$display(“_”); Verilog實(shí)驗(yàn)報(bào)告 #100 a=4'h2;$display(“_”);$stop;end blocking2 blocking2(clk,a,b2,c2);blocking1 blocking1(clk,a,b1,c1);endmodule 測試結(jié)果: 練習(xí)六 在Verilog HDL中使用函數(shù) 實(shí)驗(yàn)?zāi)康模?/p> (1)了解函數(shù)的定義和在模塊設(shè)計(jì)中的使用;(2)了解函數(shù)的綜合性問題; (3)了解許多綜合器不能綜合復(fù)雜的算術(shù)運(yùn)算。實(shí)驗(yàn)原理: 與一般的程序設(shè)計(jì)語言一樣,Verilog HDL中也可使用函數(shù)以適應(yīng)對不同變量采取同一種運(yùn)算的操作。Verilog HDL函數(shù)在綜合時被理解成具有獨(dú)立運(yùn)算功能的電路,每調(diào)用一次函數(shù)相當(dāng)于改變這部分電路的輸入以得到相應(yīng)的計(jì)算結(jié)果。函數(shù)的目的是返回一個用于表達(dá)式的值。(1)函數(shù)定義 Function<返回值的類型或范圍>(函數(shù)名); <端口說明語句> <變量類型說明語句> Begin <語句> ?? End Endfuction(2)函數(shù)調(diào)用 <函數(shù)名>(<表達(dá)式>,?<表達(dá)式>)實(shí)驗(yàn)內(nèi)容: 采用同步時鐘觸發(fā)運(yùn)算的執(zhí)行,每個clk時鐘周期都會執(zhí)行一次運(yùn)算,并且在測試模塊中,通過調(diào)用系統(tǒng)任務(wù)$display及在時鐘的下降沿顯示每次計(jì)算的結(jié)果。 實(shí)驗(yàn)代碼: moduletryfunct(clk,n,result,reset);output [31:0] result;input [3:0] n; Verilog實(shí)驗(yàn)報(bào)告 inputreset,clk;reg [31:0] result; always @(posedgeclk)begin if(!reset)result<=0;else begin result<=n*factorial(n)/((n*2)+1);end end function [31:0] factorial;input [3:0] operand;reg [3:0] index;begin factorial=operand?1:0;for(index=2;index<=operand;index=index+1)factorial=index*factorial;end endfunction endmodule 實(shí)驗(yàn)仿真: 測試程序: `include “./tryfunct.v” `timescale 1ns/1ns `define clk_cycle 50 module tryfunct_test;reg[3:0] n,i;reg reset,clk;wire [31:0] result; initial begin clk=0;n=0;reset=1;#100 reset=0;#100 reset=1;for(i=0;i<=15;i=i+1) Verilog實(shí)驗(yàn)報(bào)告 begin #200 n=i;end #100 $stop;end always #`clk_cycle clk=~clk; tryfunct m(.clk(clk),.n(n),.result(result),.reset(reset)); endmodule 測試結(jié)果: 練習(xí)七 在Verilog HDL中使用任務(wù)(task) 實(shí)驗(yàn)?zāi)康模?/p> (1)掌握任務(wù)在verilog模塊設(shè)計(jì)中的應(yīng)用; (2)學(xué)會在電平敏感列表的always中使用拼接操作、任務(wù)和阻塞賦值等語句,并生成復(fù)雜組合邏輯的高級方法。實(shí)驗(yàn)原理: 當(dāng)我們希望能夠?qū)⒁恍┬盘栠M(jìn)行運(yùn)算并輸出多個結(jié)果時,采用函數(shù)結(jié)構(gòu)就顯得非常不方便,而任務(wù)結(jié)構(gòu)在這方面的優(yōu)勢則十分突出。任務(wù)本身并不返回計(jì)算值,但它通過類似C語言中的形參與實(shí)參的數(shù)據(jù)變換,非常容易實(shí)現(xiàn)運(yùn)算結(jié)果的調(diào)用。此外,還常常利用任務(wù)來包裝模塊設(shè)計(jì)中的許多復(fù)雜的過程,將許多復(fù)雜的操作步驟用一個命名清晰易懂的任務(wù)隱藏起來,大大提高程序可讀性。(1)任務(wù)和函數(shù)的不同 函數(shù)只能與主模塊共用同一個仿真時間單位,而任務(wù)可以定義自己的仿真時間單位;函數(shù)不能啟動任務(wù)但任務(wù)能啟動其他任務(wù)和函數(shù);函數(shù)至少要有一個輸入變量,而任務(wù)可以沒有或有多個任何類型的變量;函數(shù)返回一個值,任務(wù)則不返回值。(2)任務(wù)定義 Task<任務(wù)名> <端口及數(shù)據(jù)類型聲明語句> <語句1> ?? Endtask(3)任務(wù)調(diào)用 <任務(wù)名>(端口1,端口2,?端口n); 實(shí)驗(yàn)內(nèi)容: Verilog實(shí)驗(yàn)報(bào)告 利用電平敏感的always快和一個比較兩變量大小排序的任務(wù),設(shè)計(jì)出四個(4位)并行輸入數(shù)的高速排序組合邏輯。 實(shí)驗(yàn)代碼: module sort4(ra,rb,rc,rd,a,b,c,d);output[3:0] ra,rb,rc,rd;input[3:0] a,b,c,d;reg[3:0] ra,rb,rc,rd;reg[3:0] va,vb,vc,vd; always @(a or b or c or d)begin {va,vb,vc,vd}={a,b,c,d};sort2(va,vc);sort2(vb,vd);sort2(va,vb);sort2(vc,vd);sort2(vb,vc);{ra,rb,rc,rd}={va,vb,vc,vd};end task sort2;inout[3:0] x,y;reg[3:0] tmp;if(x>y)begin tmp=x;x=y;y=tmp;end endtask endmodule 實(shí)驗(yàn)仿真: 測試程序: `timescale 1ns/100ps `include “sort4.v” moduletask_test;reg[3:0] a,b,c,d;wire[3:0] ra,rb,rc,rd; initial Verilog實(shí)驗(yàn)報(bào)告 begin a=0;b=0;c=0;d=0;repeat(50)begin #100 a={$random}%15;b={$random}%15;c={$random}%15;d={$random}%15;end #100 $stop;end sort4 sort4(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd)); endmodule 測試結(jié)果: 選做一 綜合一個可以計(jì)算整數(shù)平方、立方、階乘的函數(shù) 實(shí)驗(yàn)內(nèi)容: 設(shè)計(jì)一個函數(shù),可以計(jì)算整數(shù)平方、立方、以及不大于5的階乘 實(shí)驗(yàn)代碼: modulelianxi(clk,n,opcode,result,reset);output [7:0] result;input [3:0] n,opcode;inputreset,clk;reg [7:0] result; always @(posedgeclk)begin if(!reset)result<=0;else begin case(opcode)3'd0: result<=pingfang(n); Verilog實(shí)驗(yàn)報(bào)告 3'd1: result<=lifang(n);3'd2: result<=jiecheng(n);default: result=8'hx;endcase end end function [7:0] jiecheng;input [3:0] operand;reg [3:0] index;begin jiecheng=operand?1:0;for(index=2;index<=operand;index=index+1)jiecheng=index*jiecheng;end endfunction function [7:0] pingfang;input [3:0] operand;pingfang=operand*operand;endfunction function [7:0] lifang;input [3:0] operand;lifang=operand*operand*operand;endfunction endmodule 實(shí)驗(yàn)仿真: 測試程序: `include “./lianxi.v” `timescale 1ns/1ns `define clk_cycle 50 module lianxi_test;reg[3:0] n,opcode;regreset,clk;wire [7:0] result;parameter times=20; initial begin clk=0; Verilog實(shí)驗(yàn)報(bào)告 n=0;reset=1;opcode=0;#100 reset=0;#100 reset=1;begin n={$random}%6;opcode={$random}%3;repeat(times)begin #100 n={$random}%6;opcode={$random}%3;end end #1000 $stop;end always #`clk_cycleclk=~clk; lianxi lian(.clk(clk),.n(n),.opcode(opcode),.result(result),.reset(reset)); endmodule 仿真結(jié)果: 第四次實(shí)驗(yàn)課 必做一[練習(xí)題七]設(shè)計(jì)一個串行數(shù)據(jù)檢測器 實(shí)驗(yàn)?zāi)康模?/p> (1)掌握利用有限狀態(tài)機(jī)實(shí)現(xiàn)一般時序邏輯分析的方法;(2)掌握用Verilog編寫可綜合的有限狀態(tài)機(jī)的標(biāo)準(zhǔn)模板;(3)掌握用Verilog編寫狀態(tài)機(jī)模塊的測試文件的一般方法。實(shí)驗(yàn)原理: (1)有限狀態(tài)機(jī) 有限狀態(tài)機(jī)是指輸出取決于過去輸入部分和當(dāng)前輸入部分的時序邏輯電路。一般來說,除了輸入部分和輸出部分外,有限狀態(tài)機(jī)還含有一組具有“記憶”功能的寄存器,這些寄存器的功能是記憶有限狀態(tài)機(jī)的內(nèi)部狀態(tài),它們常被稱為狀態(tài)寄存 Verilog實(shí)驗(yàn)報(bào)告 器。在有限狀態(tài)機(jī)中,狀態(tài)寄存器的的下一個狀態(tài)不僅與輸入信號有關(guān),而且還與該寄存器的當(dāng)前狀態(tài)有關(guān),因此有限狀態(tài)機(jī)又可以認(rèn)為是組合邏輯和寄存器邏輯的一種組合。其中,寄存器邏輯的功能是存儲有限狀態(tài)機(jī)的內(nèi)部狀態(tài);而組合邏輯又可以分為次態(tài)邏輯和輸出邏輯兩部分,次態(tài)邏輯的功能是確定有限狀態(tài)機(jī)的下一個狀態(tài),輸出邏輯的功能是確定有限狀態(tài)機(jī)的輸出。(2)有限狀態(tài)機(jī)設(shè)計(jì) 邏輯抽象,得出狀態(tài)裝換圖;狀態(tài)化簡;狀態(tài)分配;選定觸發(fā)器的類型并求出狀態(tài)方程、驅(qū)動方程和輸出方程;按照方程得出邏輯圖。 在數(shù)字電路中我們已經(jīng)學(xué)習(xí)過通過建立有限狀態(tài)機(jī)來進(jìn)行數(shù)字邏輯的設(shè)計(jì),而在Verilog HDL硬件描述語言中,這種設(shè)計(jì)方法得到進(jìn)一步的發(fā)展。通過Verilog HDL提供的語句,我們可以直觀地設(shè)計(jì)出適合更為復(fù)雜的時序邏輯的電路。實(shí)驗(yàn)內(nèi)容: 設(shè)計(jì)一個串行數(shù)據(jù)檢測器。要求是:連續(xù)4個或4個以上為1時輸出為1,其他輸入情況下為0。編寫測試模塊對設(shè)計(jì)的模塊進(jìn)行各種層次的仿真,并觀察波形,編寫實(shí)驗(yàn)報(bào)告。 實(shí)驗(yàn)代碼: module lianxiti7(x,z,clk,rst,state);inputx,clk,rst;output z;output[2:0]state;reg[2:0]state;wire z; parameter IDLE='d0,A='d1,B='d2,C='d3,D='d4; always@(posedgeclk)if(!rst)begin state<=IDLE;end else case(state)IDLE: state<=x ?A : IDLE;A: state<=x ?B : IDLE;B: state<=x ?C : IDLE;C: state<=x ?D :IDLE;D: state<=x ?state : IDLE; default:state=IDLE;endcase assign z=(state==D);endmodule Verilog實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)仿真: 測試程序: `timescale 1ns/1ns `include “./lianxiti7.v” modulelianxititop;regclk,rst;reg[23:0] data;wire[2:0] state;wirez,x;assign x=data[23];always #10 clk=~clk;always @(posedgeclk)data={data[22:0],data[23]}; initial begin clk=0;rst=1;#2 rst=0;#30 rst=1;data='b1001_1110_0111_1101_0101;#500 $stop;end lianxiti7 m(x,z,clk,rst,state);endmodule 仿真結(jié)果: 必做二 樓梯燈——基本任務(wù) 實(shí)驗(yàn)內(nèi)容: 樓下到樓上依次有3個感應(yīng)燈:燈 1、燈 2、燈3。當(dāng)行人上下樓梯時,各個燈感應(yīng)到后自動點(diǎn)亮,若在8s內(nèi)感應(yīng)信號消失,則點(diǎn)亮8s,若感應(yīng)信號存在時間超過8s,則感應(yīng)信號消失4s后燈自動關(guān)閉。 任務(wù)1:做出如上邏輯電路設(shè)計(jì)并仿真; 任務(wù)2:考慮去抖,對于感應(yīng)信號到達(dá)存在毛刺(小于0.5s),設(shè)計(jì)邏輯并剔出。 實(shí)驗(yàn)代碼: module loutid1(clk10,rst,switch,light); input clk10,rst;input[2:0]switch;output[2:0]light; reg[2:0]state1,state2,state3;reg[7:0]count1,count2,count3;reg[2:0]count_1,count_2,count_3;reg[2:0]light; parameter state1_start=3'b000,state2_start=3'b000,state3_start=3'b000,state1_work=3'b001,state2_work=3'b001,state3_work=3'b001,state1_up=3'b010,state2_up=3'b010,state3_up=3'b010,state1_down=3'b011,state2_down=3'b011,state3_down=3'b011,state1_other=3'b100,state2_other=3'b100,state3_other=3'b100; always@(posedge clk10)if(!rst)begin state1<=state1_start;count1<=8'b0;count_1<=3'b0;end else if(switch[0]=='b1&&count_1<4)count_1<=count_1+1;else case(state1) state1_start: if(switch[0]=='b1)begin state1<=state1_up;count1<=78;end Verilog實(shí)驗(yàn)報(bào)告 else begin state1<=state1_start;light[0]<='b0;end state1_up: begin light[0]<='b1; state1<=state1_work;end state1_work: if(count1>0)begin count1<=count1-1;end else if(switch[0]=='b0)begin state1<=state1_down;end else begin state1<=state1_other; count1<=39;end state1_other: if(switch[0]=='b1) state1<=state1_other;else if(count1>0)begin count1<=count1-1;end else state1<=state1_down; state1_down: begin light[0]<='b0;count_1<=3'b0;state1<=state1_start;end default: state1<=state1_start; endcase always@(posedge clk10)if(!rst)begin state2<=state2_start;count2<=8'b0;count_2<=3'b0;end else if(switch[1]=='b1&&count_2<4)count_2<=count_2+1;else case(state2) state2_start: if(switch[1]=='b1)begin state2<=state2_up;count2<=78;end else begin state2<=state2_start;light[1]<='b0;end state2_work: if(count2>0)begin count2<=count2-1;end else if(switch[1]=='b0)begin Verilog實(shí)驗(yàn)報(bào)告 state2<=state2_down;end else begin state2<=state2_other; count2<=39;end state2_other: if(switch[1]=='b1) state2<=state2_other;else if(count2>0)begin count2<=count2-1;end else state2<=state2_down; state2_down: begin light[1]<='b0; count_2<=3'b0; state2<=state2_start;end state2_up: begin light[1]<='b1; state2<=state2_work;end default: state2<=state2_start; endcase always@(posedge clk10)if(!rst)begin state3<=state3_start;count3<=8'b0;count_3<=3'b0;end else if(switch[2]=='b1&&count_3<4)count_3<=count_3+1;else case(state3) state3_start: if(switch[2]=='b1)begin state3<=state3_up;count3<=78;end else begin state3<=state3_start;light[2]<='b0;end state3_work: if(count3>0)begin count3<=count3-1;end else if(switch[2]=='b0)begin state3<=state3_down;end else begin state3<=state3_other; 實(shí)驗(yàn)仿真: 測試程序: `timescale 10ms/1ms module loutid1_t;reg clk10,rst;reg[2:0] swh;wire[2:0] light; Verilog實(shí)驗(yàn)報(bào)告 count3<=39;end state3_other: if(switch[2]=='b1) state3<=state3_other;else if(count3>0)begin count3<=count3-1;end else state3<=state3_down; state3_down: begin light[2]<='b0; count_3<=3'b0; state3<=state3_start;end state3_up: begin light[2]<='b1; state3<=state3_work;end default: state3<=state3_start; endcase endmodule Verilog實(shí)驗(yàn)報(bào)告 parameter HALF_PERIOD = 5; always #HALF_PERIOD clk10=~clk10; initial begin clk10 = 0; rst = 1; swh=3'b000; #1 rst = 0; #10 rst = 1; #100 swh=3'b000; #100 swh=3'b001;#400 swh=3'b000;#40 swh=3'b001;#500 swh=3'b010;#900 swh=3'b000;#400 swh=3'b100;#400 swh=3'b000;#600 swh=3'b001;#40 swh=3'b000; #1000 $stop;end 仿真結(jié)果: 選做一:樓梯燈——拓展任務(wù) 實(shí)驗(yàn)內(nèi)容: 任務(wù)3:若為節(jié)約能源,下一個燈點(diǎn)亮的同時將自動關(guān)閉上一個燈,作出如上邏輯設(shè)計(jì)并仿真(僅考慮一個人的情況); 任務(wù)4:考慮存在多個人上下樓梯的情況,比如: 行人1已經(jīng)從燈1到達(dá)燈2,燈2受感應(yīng)自動點(diǎn)亮,但此時行人2剛上樓梯到達(dá)燈1的位置,則燈1和燈2都須點(diǎn)亮,更加復(fù)雜一點(diǎn),如果行人2是下樓梯剛到達(dá)燈3位置,作出如上邏輯設(shè)計(jì)并仿真; 實(shí)驗(yàn)代碼: modulelight_All(clk10,rst,switch,light); input clk10,rst;input[2:0]switch;output[2:0]light; reg[2:0]state1,state2,state3;reg[7:0]count1,count2,count3;reg[2:0]count_1,count_2,count_3;reg[2:0]light; parameter state1_start=3'b000,state2_start=3'b000,state3_start=3'b000,state1_work=3'b001,state2_work=3'b001,state3_work=3'b001,state1_up=3'b010,state2_up=3'b010,state3_up=3'b010,state1_down=3'b011,state2_down=3'b011,state3_down=3'b011,state1_other=3'b100,state2_other=3'b100,state3_other=3'b100; always@(posedge clk10)if(!rst)begin state1<=state1_start;count1<=8'b0;count_1<=3'b0;end else if(switch[0]=='b1&&count_1<4)count_1<=count_1+1;else case(state1) state1_start: if(switch[0]=='b1) Verilog實(shí)驗(yàn)報(bào)告 begin state1<=state1_up;count1<=78;end else begin state1<=state1_start;light[0]<='b0;end state1_work: if(count1>0)begin count1<=count1-1; if(switch[0]=='b0&&(state2==3'b010||state3==3'b010))begin light[0]<='b0;state1<=state1_down;end end else if(switch[0]=='b0)begin state1<=state1_down;end else begin state1<=state1_other;count1<=39;end state1_other: if(switch[0]=='b1) state1<=state1_other;else if(count1>0)begin count1<=count1-1;if(switch[0]=='b0&&(state2==3'b010||state3==3'b010))begin light[0]<='b0;state1<=state1_down;end end else state1<=state1_down; state1_down: begin light[0]<='b0;count_1<=3'b0;state1<=state1_start;end state1_up: begin light[0]<='b1;state1<=state1_work;end default: state1<=state1_start; endcase always@(posedge clk10)if(!rst)begin state2<=state2_start;count2<=8'b0;count_2<=3'b0;end else if(switch[1]=='b1&&count_2<4)count_2<=count_2+1;else case(state2) state2_start: if(switch[1]=='b1)begin state2<=state2_up;count2<=78; Verilog實(shí)驗(yàn)報(bào)告 end else begin state2<=state2_start;light[1]<='b0;end state2_work: if(count2>0)begin count2<=count2-1; if(switch[1]=='b0&&(state1==3'b010||state3==3'b010))begin light[1]<='b0;state2<=state2_down;end end else if(switch[1]=='b0)begin state2<=state2_down;end else begin state2<=state2_other;count2<=39;end state2_other: if(switch[1]=='b1) state2<=state2_other;else if(count2>0)begin count2<=count2-1;if(switch[1]=='b0&&(state1==3'b010||state3==3'b010))begin light[1]<='b0; state2<=state2_down;end end else state2<=state2_down; state2_down: begin light[1]<='b0;count_2<=3'b0;state2<=state2_start;end state2_up: begin light[1]<='b1;state2<=state2_work;end default: state2<=state2_start; endcase always@(posedge clk10)if(!rst)begin state3<=state3_start;count3<=8'b0;count_3<=3'b0;end else if(switch[2]=='b1&&count_3<4)count_3<=count_3+1;else case(state3) state3_start: if(switch[2]=='b1)begin state3<=state3_up;count3<=78;end else begin state3<=state3_start; Verilog實(shí)驗(yàn)報(bào)告 light[2]<='b0;end state3_work: if(count3>0)begin count3<=count3-1; if(switch[2]=='b0&&(state1==3'b010||state2==3'b010))begin light[2]<='b0;state3<=state3_down;end end else if(switch[2]=='b0)begin state3<=state3_down;end else begin state3<=state3_other;count3<=39;end state3_other: if(switch[2]=='b1) state3<=state3_other;else if(count3>0)begin count3<=count3-1;if(switch[2]=='b0&&(state1==3'b010||state2==3'b010))begin light[2]<='b0; state3<=state3_down;end end else state3<=state3_down; Verilog實(shí)驗(yàn)報(bào)告 state3_down: begin light[2]<='b0;count_3<=3'b0;state3<=state3_start;end state3_up: begin light[2]<='b1; state3<=state3_work;end default: state3<=state3_start; endcase endmodule實(shí)驗(yàn)仿真: 測試程序: `timescale 10ms/1ms moduletest_light_All;reg clk10,rst;reg[2:0] up,down;wire[2:0] swh;wire[2:0] light; parameter HALF_PERIOD = 5; always #HALF_PERIOD clk10=~clk10; initial begin clk10 = 0; rst = 1; up = 3'b000;down = 3'b000; #1 rst = 0; #10 rst = 1; #100 up = 3'b001;down = 3'b000; #300 up =3'b010;down = 3'b000; #600 up = 3'b010;down = 3'b010; #30 up = 3'b010; #900 up = 3'b100;down = 3'b001; #1000 $stop; end assignswh = up | down; light_Allm5(clk10,rst,swh,light);endmodul仿真結(jié)果: 華大計(jì)科學(xué)院 數(shù)字邏輯課程設(shè)計(jì)說明書 題目: 多功能數(shù)字鐘 專業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 班級: 網(wǎng)絡(luò)工程1班 姓名: 劉群 學(xué)號: 1125111023 完成日期: 2013-9 一、設(shè)計(jì)題目與要求 設(shè)計(jì)題目:多功能數(shù)字鐘 設(shè)計(jì)要求: 1.準(zhǔn)確計(jì)時,以數(shù)字形式顯示時、分、秒的時間。2.小時的計(jì)時可以為“12翻1”或“23翻0”的形式。 3.可以進(jìn)行時、分、秒時間的校正。 二、設(shè)計(jì)原理及其框圖 1.數(shù)字鐘的構(gòu)成 數(shù)字鐘實(shí)際上是一個對標(biāo)準(zhǔn)頻率1HZ)進(jìn)行計(jì)數(shù)的計(jì)數(shù)電路。由于計(jì)數(shù)的起始時間不可能與標(biāo)準(zhǔn)時間(如北京時間)一致,故需要在電路上加一個校時電路。圖 1 所示為數(shù)字鐘的一般構(gòu)成框圖。 圖1 數(shù)字電子時鐘方案框圖 ⑴多諧振蕩器電路 多諧振蕩器電路給數(shù)字鐘提供一個頻率1Hz 的信號,可保證數(shù)字鐘的走時準(zhǔn)確及穩(wěn)定。⑵時間計(jì)數(shù)器電路 時間計(jì)數(shù)電路由秒個位和秒十位計(jì)數(shù)器、分個位和分十位計(jì)數(shù)器及時個位和時十位計(jì)數(shù)器電路構(gòu)成。其中秒個位和秒十位計(jì)數(shù)器、分個位和分十位計(jì)數(shù)器為60 進(jìn)制計(jì)數(shù)器。而根據(jù)設(shè)計(jì)要求,時個位和時十位計(jì)數(shù)器為24 進(jìn)制計(jì)數(shù)器。⑶譯碼驅(qū)動電路 譯碼驅(qū)動電路將計(jì)數(shù)器輸出的8421BCD 碼轉(zhuǎn)換為數(shù)碼管需要的邏輯狀態(tài),并且為保證數(shù)碼管正常工作提供足夠的工作電流。⑷數(shù)碼管 數(shù)碼管通常有發(fā)光二極管(LED)數(shù)碼管和液晶(LCD)數(shù)碼管。本設(shè)計(jì)提供的為LED數(shù)碼管。2.數(shù)字鐘的工作原理 ⑴多諧振蕩器電路 555 定時器與電阻R1、R2,電容C1、C2 構(gòu)成一個多諧振蕩器,利用電容的充放電來調(diào)節(jié)輸出V0,產(chǎn)生矩形脈沖波作為時鐘信號,因?yàn)槭菙?shù)字鐘,所以應(yīng)選擇的電阻電容值使頻率為1HZ。⑵時間計(jì)數(shù)單元 六片74LS90 芯片構(gòu)成計(jì)數(shù)電路,按時間進(jìn)制從右到左構(gòu)成從低位向高位的進(jìn)位電路,并通過譯碼顯示。在六位LED 七段顯示起上顯示對應(yīng)的數(shù)值。⑶校時電源電路 當(dāng)重新接通電源或走時出現(xiàn)誤差時都需要對時間進(jìn)行校正。通常,校正時間的方法是:首先截?cái)嗾5挠?jì)數(shù)通路,然后再進(jìn)行人工出觸發(fā)計(jì)數(shù)或?qū)㈩l率較高的方波信號加到需要校正的計(jì)數(shù)單元的輸入端,校正好后,再轉(zhuǎn)入正常計(jì)時狀態(tài)即可。 根據(jù)要求,數(shù)字鐘應(yīng)具有分校正和時校正功能。因此,應(yīng)截?cái)喾謧€位和時個位的直接計(jì)數(shù)通路,并采用正常計(jì)時信號與校正信號可以隨時切換的電路接入其中。圖8所示即為帶有基本RS 觸發(fā)器的校時電路。 三、元器件 1.實(shí)驗(yàn)中所需的器材 單刀雙擲開關(guān)4 個.5V 電源.共陰七段數(shù)碼管 6 個.74LS90D 集成塊 6 塊.74HC00D 6個 LM555CM 1個 電阻 6個 10uF 電容 2個 2.芯片內(nèi)部結(jié)構(gòu)及引腳圖 圖2 LM555CM集成塊 圖3 74LS90D集成塊 五、各功能塊電路圖 1秒脈沖發(fā)生器主要由555 定時器和一些電阻電容構(gòu)成,原理是利用555 定時器的特性,通過電容的充放電使VC 在高、低電平之間轉(zhuǎn)換。其中555 定時器的高、低電平的門閥電壓分別是2/3VCC 和1/3VCC電容器充電使VC 的電壓大于2/3VCC 則VC 就為高電平,然 而由于反饋?zhàn)饔糜謺闺娙莘烹姟.?dāng)VC 小于1/3VCC 時,VC 就為低電平。同樣由于反饋?zhàn)饔糜謺闺娙莩潆姟Mㄟ^555 定時器的這一性質(zhì)我們就可以通過計(jì)算使他充放電的周期剛好為1S這樣我們就會得到1HZ 的信號。其中555 定時器的一些功能對照后面目錄。其中 555 定時器組成的脈沖發(fā)生器電路見附圖4.圖4 555 定時器組成的脈沖發(fā)生器 由于我們要得到1HZ 的信號,所以我們就可以通過555 定時器充放電一次所需的時間的公式。將那時間設(shè)為1S然后設(shè)定兩個電阻計(jì)算出另外那個電容值.在設(shè)定電阻值時我們要記住將電阻值設(shè)為比較常用的那種電阻值,得到的電容值也盡可能讓它是比較普遍使用 的。這樣就避免了在實(shí)際組裝過程中很難買到當(dāng)初設(shè)定的那電阻和計(jì)算出 的電容值。 在這次設(shè)定中我們設(shè)定的電阻值RA=10KΩ,RB=62kΩ,C=10uF 經(jīng)公式 f = 1.43 ÷【(RA + 2RB)×C 】 可得近似為1HZ。 2、利用一個LED 數(shù)碼管一塊74LS90D 連接成一個十進(jìn)制計(jì)數(shù)器,電路在晶振的作用下數(shù)碼管從0—9 顯示見圖5。 圖5、利用2 片74LS90D 芯片連接成一個六十進(jìn)制電路,電路可從0—59 顯示。第一片74LS90D芯片構(gòu)成10 進(jìn)制計(jì)數(shù)器,第二片74LS90D 芯片構(gòu)成6 進(jìn)制計(jì)數(shù)器。74LS90D 具有異步清零功能。 在第一片74ls90 構(gòu)成的十進(jìn)制計(jì)數(shù)器中,當(dāng)?shù)谑畟€脈沖來到時。此時他的四級觸發(fā)器的狀態(tài)為“1001”。這時他就會自動清零。同時給第二片74ls90 構(gòu)成的6 進(jìn)制計(jì)數(shù)器進(jìn)一,第六個脈沖進(jìn)位到來時,此時第二片74ls90 芯片的觸發(fā)器的狀態(tài)為“0110”,這時QB,QC 均為高電平。將QB 與RO1 相連,將Ro2 與Qc 相連,就會進(jìn)行異步清零。如此循環(huán)就會構(gòu)成60 進(jìn)制計(jì)數(shù)器.見附圖6.圖6 十六進(jìn)制電路 4、利用2 片74LS90D 芯片構(gòu)成24 進(jìn)制計(jì)數(shù)器。一片構(gòu)成二進(jìn)制計(jì)數(shù)器,一片構(gòu)成四進(jìn)制計(jì)數(shù)器。由于74LS90D 芯片清零是由兩個清零端控制的,所以當(dāng)?shù)?4 個脈沖到來時,第一片74lLS90D芯片的Qc 為高電平。第二片74LS90D 芯片的Qb 為高電平,讓第一片74LS90D 芯片的Qc 與兩片芯片的Ro1 相連.讓第二片74ls90 芯片的QB 與兩片芯片的Ro2 相連。當(dāng)?shù)?4 個脈沖到來時就會進(jìn)行異步清零。如此循環(huán)就會構(gòu)成24 進(jìn)制計(jì)數(shù)器。見附圖7.圖7 24進(jìn)制電路 5、數(shù)字鐘電路由于秒信號的精確性和穩(wěn)定性不可能坐到完全準(zhǔn)確無誤,又因?yàn)殡娐分衅渌脑驍?shù)字鐘總會產(chǎn)生走時誤差的現(xiàn)象。所以,電路中就應(yīng)該有校準(zhǔn)時間功能的電路。在這次設(shè)計(jì)中教時電路用的是一個RS 基本觸發(fā)器的單刀雙置開關(guān),每搬動開關(guān)一次產(chǎn)生一個計(jì)數(shù)脈沖.實(shí)現(xiàn)校時功能。見附圖8。 7、利用兩個六十進(jìn)制和一個二十四進(jìn)制連接成一個時、分、秒都會進(jìn)位的電路總圖。見附圖8 圖8 總電路圖 六、心得體會 在這次設(shè)計(jì)中我們深深地體會到了理論跟實(shí)踐的不同,理論學(xué)的再好不會動手那也只能是紙上談兵。我們了解了集成電路芯片的型號命名規(guī)律,懂得了沒有某種芯片時的替代方法,以及在網(wǎng)上查找電子電路資料的方法,掌握了各芯片的邏輯功能及使用方法,進(jìn)一步熟悉了集成電路的引腳安排,掌握了數(shù)字鐘的設(shè)計(jì)方法,明白了數(shù)字鐘的組成原理以及工作原理。掌握了計(jì)數(shù)器的工作原理,以及計(jì)數(shù)器進(jìn)制的組成方法和級聯(lián)方法,實(shí)現(xiàn)了一次理論指導(dǎo)實(shí)踐、理論向?qū)嵺`過渡的跨越,雖然期間遇到一些困難,但這些困難卻增強(qiáng)了我們分析問題、解決問題的能力,使我們以后不僅只學(xué)習(xí)書本中的理論知識,而且知道學(xué)以致用,動過動手實(shí)踐是我們對書本中的理論知識掌握地跟牢固、理解地跟深刻,這對我們今后的工作及學(xué)習(xí)有積極的影響。這次課程設(shè)計(jì)不僅再次復(fù)習(xí)了數(shù)字電子和模擬電子,而且讓我對于芯片的使用更加了解。增加了我的動手操作能力,加深了對該軟件的了解。這就是這次課程設(shè)計(jì)的成果,相信這些實(shí)際的操作經(jīng)驗(yàn)會是我們以后的寶貴財(cái)富。 數(shù)字電子技術(shù)設(shè)計(jì)性實(shí)驗(yàn)報(bào)告 設(shè)計(jì)題目: 專業(yè) 班級 學(xué)號 學(xué)生姓名 指導(dǎo)教師 教師評分 年月日 數(shù)字電子實(shí)習(xí)報(bào)告 班級: 姓名: 學(xué)號: 課程設(shè)計(jì)任務(wù)書 一、設(shè)計(jì)題目 本次課程設(shè)計(jì)的題目為:汽車尾燈模擬控制電路設(shè)計(jì) 二、功能要求: 利用開關(guān)來控制汽車的運(yùn)行和轉(zhuǎn)向。 三、設(shè)計(jì)要求 1.設(shè)計(jì)過程:先寫總體設(shè)計(jì)方案(包括框圖和總電路圖),然后是各個模塊 的設(shè)計(jì)(要求有相應(yīng)的電路圖),結(jié)果分析。2.完成電路硬件制做。3.最后是設(shè)計(jì)總結(jié)。 四、所需器件 74LS76; 雙JK觸發(fā)器 LED:6個; 74LS04:2個; 六非門 74LS138; 3線8線譯碼器 74LS00:2個; 2輸入四個 與非門 74LS10; 3輸入三個 與非門 74LS86; 2輸入四 異或門 開關(guān):2個; 電阻:200Ω,8個; 電源:+5v; 要求查閱相關(guān)芯片資料,用所給芯片設(shè)計(jì)電路 設(shè)計(jì)過程 主電路圖 2.電路結(jié)構(gòu)與原理圖 (1)開關(guān)控制電路(如圖2) 圖2 開關(guān)控制電路 開關(guān)兩端一端接高電平,一端接地(低電平)。74LS86D與74LS138的輸入控制端連接,當(dāng)開關(guān)同時閉合或斷開的時候,輸入相同,74LS86輸出為“0”,則74LS138不譯碼。若兩開關(guān)同時斷開,則74LS04D的輸出為“1”;而74LS10D接有CP脈沖,所以此時74LS00D的輸出完全決定于CP脈沖;當(dāng)兩開關(guān)同時閉合,74LS00D輸出為“1”; B開關(guān)打開;B開關(guān)閉合,A開關(guān)打開時的分析也按照上面的方法來分析實(shí)現(xiàn)。 (2)三進(jìn)制計(jì)數(shù)器電路(如圖3) 圖3 三進(jìn)制計(jì)數(shù)器電路 三進(jìn)制計(jì)數(shù)電路由2個主從JK觸發(fā)器構(gòu)成。第一個主從JK觸發(fā)器的輸出Q1端直接接入74LS138譯碼器的輸入端,第二個主從JK觸發(fā)器的輸出Q2端輸入也直接接入74LS138的輸入端,同時,第二個主從JK觸發(fā)器的另一端輸出直接作為第一個主從JK觸發(fā)器的J端輸入,注意,Q2應(yīng)比Q1的權(quán)高。并且,兩個主從JK觸發(fā)器的K端輸入都是接的高電平,這樣就能使變化后的脈沖的周期為3,從而實(shí)現(xiàn)了三進(jìn)制計(jì)數(shù)。 (3)譯碼電路(如圖4) 圖4 譯碼電路 74LS138譯碼器是一種經(jīng)常使用的3線8線譯碼器,如圖所示,4、5端接地,6端接控制電路提供的控制信號,1、2、3分別第一個和第二個主從JK觸發(fā)器的輸出信號Q1、Q2、和控制電路的控制信號。由于只要求有6個指示燈,所以在74LS138的輸出端只接了6個端口(左轉(zhuǎn)彎:Y0 Y1 Y2;右轉(zhuǎn)彎 :Y4 Y5 Y6)用以控制信號燈。并且,按照以下真值表來實(shí)現(xiàn)。 (4)驅(qū)動電路:如圖5 圖5 驅(qū)動電路 使用發(fā)光二極管來顯示運(yùn)行結(jié)果。發(fā)光二極管正端接5V電源,當(dāng)非門的右邊輸入的是高電平,則經(jīng)過非門以后變成低電平,則發(fā)光二極管亮;當(dāng)非門的右邊輸入的為低電平,則經(jīng)過非門以后變成高電平,則發(fā)光二極管熄滅。第二篇:北航eda實(shí)驗(yàn)報(bào)告數(shù)字部分
第三篇:數(shù)字電子時鐘實(shí)驗(yàn)報(bào)告
第四篇:數(shù)字電子技術(shù)設(shè)計(jì)性實(shí)驗(yàn)報(bào)告
第五篇:數(shù)字電子實(shí)習(xí)報(bào)告