EDA
課程設(shè)計
姓名:
學(xué)號:
班級:自動化
設(shè)計題目
多功能數(shù)字鐘電路設(shè)計
設(shè)計任務(wù)及要求
多功能數(shù)字鐘應(yīng)該具有的功能有:顯示時—分—秒、小時和分鐘可調(diào)等基本功能。整個鐘表的工作應(yīng)該是在1Hz信號的作用下進(jìn)行,這樣每來一個時鐘信號,秒增加1秒,當(dāng)秒從59秒跳轉(zhuǎn)到00秒時,分鐘增加1分,同時當(dāng)分鐘從59分跳轉(zhuǎn)到00分時,小時增加1小時,小時的范圍為0~23時。
在實驗中為了顯示的方便,由于分鐘和秒鐘顯示的范圍都是從0~59,所以可以用一個3位的二進(jìn)制碼顯示十位,用一個四位的二進(jìn)制碼(BCD碼)顯示個位,對于小時因為他的范圍是從0~23,所以可以用一個2位的二進(jìn)制碼顯示十位,用一個4位的二進(jìn)制碼(BCD碼)顯示個位。
實驗中由于七段碼管是掃描的方式
顯示,所以雖然時鐘需要的是1Hz時鐘信號,但是掃描需要一個比較高頻率的信號,因此為了得到準(zhǔn)確的1Hz信號,必須對輸入的系統(tǒng)時鐘50Mhz進(jìn)行分頻。
調(diào)整時間的按鍵用按鍵模塊的S1和S2,S1調(diào)節(jié)小時,每按下一次,小時增加一個小時;S2調(diào)整分鐘,每按下一次,分鐘增加一分鐘。另外用S8按鍵作為系統(tǒng)時鐘復(fù)位,復(fù)位后全部顯示00—00—00。
三.基于Verilog
HDL語言的電路設(shè)計、仿真與綜合(一)頂層模塊
本程序采用結(jié)構(gòu)化設(shè)計方法,將其分為彼此獨(dú)立又有一定聯(lián)系的三個模塊,如圖1所示:
圖1:頂層結(jié)構(gòu)框圖
(二)子模塊
1.分頻器
分頻器的作用是對50Mhz的系統(tǒng)時鐘信號進(jìn)行分頻,得到頻率為1000hz的信號,作為顯示器的輸入信號。
源程序如下:
module
fenpin(input
CP,output
CPout);
reg
CPout;
reg
[31:0]
Cout;
reg
CP_En;
always
@(posedge
CP)
//將50MHz分頻為1kHz
begin
Cout
<=
(Cout
==
32'd50000)
?
32'd0
:
(Cout
+
32'd1);
CP_En
<=
(Cout
==
32'd50000)
?
1'd1
:
1'd0;
CPout
<=
CP_En;
end
endmodule
功能仿真波形如圖2所示(以五分頻為例):
2.控制器和計數(shù)器
控制器的作用是,調(diào)整小時和分鐘的值,并能實現(xiàn)清零功能。計數(shù)器的作用是實現(xiàn)分鐘和秒鐘滿60進(jìn)1,小時則由23跳到00。當(dāng)?shù)竭_(dá)59分55秒的時候,LED燈會閃爍來進(jìn)行報時。因為控制器和計數(shù)器的驅(qū)動信號頻率均為1Hz,故從分頻器輸出的信號進(jìn)入控制器后,要進(jìn)行二次分頻,由1Khz變?yōu)?Hz。
if(Clk_En)
begin
if(R1==1)
begin
if(Hour<24)
Hour=Hour+1;
if(Hour==24)
begin
Hour=0;
end
R1=0;
end
if(R2==1)
begin
if(Minute<60)
Minute=Minute+1;
if(Minute==60)
begin
Minute=0;
if(Hour<24)
Hour=Hour+1;
if(Hour==24)
begin
Hour=0;
End
end
R2=0;
end
if(Second<60)
Second=Second+1;
if(Second==60)
begin
Second=0;
if(Minute<60)
Minute=Minute+1;
源程序如下:
module
kongzhiqi(CPout,S1,S2,RET,Hour,Minute,Second,LED);
input
CPout,S1,S2,RET;
output
[5:0]
Hour;
output
[5:0]
Minute;
output
[5:0]
Second;
output
LED;
reg
[5:0]
Hour;
reg
[5:0]
Minute;
reg
[5:0]
Second;
reg
R1;
reg
R2,R8,LED;
reg
[10:0]
Cout;
reg
Clk_En;
always@(posedge
CPout)
begin
if(S1==0)
begin
R1=1;
end
if(S2==0)
begin
R2=1;
end
if(RET==0)
begin
R8=1;
end
Cout=(Cout==32'd1000)?32'd0:(Cout
+
32'd1);
Clk_En=(Cout==32'd1000)?1'd1:1'd0;
LED=1;
end
else
LED=0;
if(R8==1)//清零
begin
Hour=0;
Minute=0;
Second=0;
R8=0;
end
end
end
endmod
if(Minute==60)
begin
Minute=0;
if(Hour<24)
Hour=Hour+1;
if(Hour==24)
begin
Hour=0;
end
end
end
if((Minute==59)&&(Second>55))
begin
if(LED==1)
LED=0;
else
功能仿真波形如圖3所示:
3.顯示器
顯示器的作用是將時—分—秒的值在數(shù)碼管上依次顯示出來。從分頻器輸出的1Khz的信號作為數(shù)碼管的掃描信號。SEL
表示三個數(shù)碼管選擇位,它的取值表示八個數(shù)碼管,從左至右依次是111~000。LEDGA表示七段數(shù)碼管,它的取值決定特定位數(shù)上顯示的數(shù)字。
源程序如下:
4'b0000:
Led
=
7'b0111_111;
4'b0001:
Led
=
7'b0000_110;
4'b0010:
Led
=
7'b1011_011;
4'b0011:
Led
=
7'b1001_111;
4'b0100:
Led
=
7'b1100_110;
4'b0101:
Led
=
7'b1101_101;
4'b0110:
Led
=
7'b1111_101;
4'b0111:
Led
=
7'b0000_111;
4'b1000:
Led
=
7'b1111_111;
4'b1001:
Led
=
7'b1101_111;
default:
Led
=
7'b0000_000;
endcase
if(SEL==3'b100)
Led=7'b1000_000;
if(SEL==3'b011)
case(shiwei2)
4'b0000:
Led
=
7'b0111_111;
4'b0001:
Led
=
7'b0000_110;
4'b0010:
Led
=
7'b1011_011;
4'b0011:
Led
=
7'b1001_111;
4'b0100:
Led
=
7'b1100_110;
module
xianshi(CPout,Hour,Minute,Second,SEL,LEDAG);
input
CPout;
input
Hour,Minute,Second;
output
SEL,LEDAG;
reg
[2:0]
SEL;
reg
[6:0]
Led;
reg
[3:0]
shi1,ge1,shi2,ge2,shi3,ge3;
always
@(posedge
CPout)
begin
shiwei1=Hour/10;
gewei1=Hour%10;
shiwei2=Minute/10;
gewei2=Minute%10;
shiwei3=Second/10;
gewei3=Second%10;
if(SEL==3'b110)
case(shiwei1)
4'b0000:
Led
=
7'b0111_111;
4'b0001:
Led
=
7'b0000_110;
4'b0010:
Led
=
7'b1011_011;
4'b0011:
Led
=
7'b1001_111;
4'b0100:
Led
=
7'b1100_110;
4'b0101:
Led
=
7'b1101_101;
4'b0110:
Led
=
7'b1111_101;
4'b0111:
Led
=
7'b0000_111;
4'b1000:
Led
=
7'b1111_111;
4'b1001:
Led
=
7'b1101_111;
default:
Led
=
7'b0000_000;
endcase
if(SEL==3'b101)
case(gewei1)
default:
Led
=
7'b0000_000;
endcase
if(SEL==3'b111)
case(gewei3)
4'b0000:
Led
=
7'b0111_111;
4'b0001:
Led
=
7'b0000_110;
4'b0010:
Led
=
7'b1011_011;
4'b0011:
Led
=
7'b1001_111;
4'b0100:
Led
=
7'b1100_110;
4'b0101:
Led
=
7'b1101_101;
4'b0110:
Led
=
7'b1111_101;
4'b0111:
Led
=
7'b0000_111;
4'b1000:
Led
=
7'b1111_111;
4'b1001:
Led
=
7'b1101_111;
default:
Led
=
7'b0000_000;
endcase
SEL
=
SEL
+
3'd1;
end
assign
LEDAG=Led;
endmodule
4'b0101:
Led
=
7'b1101_101;
4'b0110:
Led
=
7'b1111_101;
4'b0111:
Led
=
7'b0000_111;
4'b1000:
Led
=
7'b1111_111;
4'b1001:
Led
=
7'b1101_111;
default:
Led
=
7'b0000_000;
endcase
if(SEL==3'b010)
case(gewei2)
4'b0000:
Led
=
7'b0111_111;
4'b0001:
Led
=
7'b0000_110;
4'b0010:
Led
=
7'b1011_011;
4'b0011:
Led
=
7'b1001_111;
4'b0100:
Led
=
7'b1100_110;
4'b0101:
Led
=
7'b1101_101;
4'b0110:
Led
=
7'b1111_101;
4'b0111:
Led
=
7'b0000_111;
4'b1000:
Led
=
7'b1111_111;
4'b1001:
Led
=
7'b1101_111;
default:
Led
=
7'b0000_000;
endcase
if(SEL==3'b001)
Led=7'b1000_000;
if(SEL==3'b000)
case(shiwei3)
4'b0000:
Led
=
7'b0111_111;
4'b0001:
Led
=
7'b0000_110;
4'b0010:
Led
=
7'b1011_011;
4'b0011:
Led
=
7'b1001_111;
4'b0100:
Led
=
7'b1100_110;
4'b0101:
Led
=
7'b1101_101;
4'b0110:
Led
=
7'b1111_101;
4'b0111:
Led
=
7'b0000_111;
4'b1000:
Led
=
7'b1111_111;
4'b1001:
Led
=
7'b1101_111;
總結(jié)體會
這次課程設(shè)計雖然只有短短的四天,但我的收獲卻很大。通過這次實習(xí),我掌握了EDA設(shè)計的基本流程(即設(shè)計輸入—編譯—調(diào)試—仿真—下載),領(lǐng)會了自頂而下結(jié)構(gòu)化設(shè)計的優(yōu)點(diǎn),并具備了初步的EDA程序設(shè)計能力。
我感覺,這個程序最難的地方在于頂層模塊的設(shè)計,因為頂層模塊需要將各個子模塊按照電路原理有機(jī)地結(jié)合起來,這需要扎實的理論功底,而這正是我所欠缺的。相比而言,子模塊的設(shè)計就容易多了,因為Verilog語言和C語言有很多相似之處,只要明白了實驗原理,就不難完成,水平的高下只體現(xiàn)在程序的簡潔與否。Verilog源程序的編寫很容易出現(xiàn)錯誤,這就需要耐心的調(diào)試。因為很多情況下,一長串的錯誤往往是由一個不經(jīng)意的小錯誤引起的。當(dāng)程序?qū)艺{(diào)屢錯的時候,最好和其他同學(xué)溝通交流一下,他們不經(jīng)意的一句話,就可能給我啟發(fā),使問題迎刃而解。
這次實習(xí),給我感觸最深的還是行為態(tài)度問題。人的能力有大有小,但只要端正態(tài)度,不拋棄,不放棄,任何人都能取得令自己滿意的成績。在此,我由衷的感謝在這次課程設(shè)計中給了我巨大幫助的老師和同學(xué)們!