|
這是小弟寫的倒數器
`timescale 1ns/1ns8 \* |$ }) O: {3 R
module reciprocal_counter_96_11_29 (# }% E0 {1 G5 \" g6 M2 ~4 D5 i
clk,
% ?" v; X* C: J2 y! `, C* X reset,
; O% A( Q( a6 |) B- a* i min_1,
( U3 `8 g* V5 ], N% a, y, t2 x U, G min_5,2 e2 N) T. H' ^& A5 @/ [0 N# C
min_10,3 D4 J' E0 N8 x0 ~# Z. w2 o
start,* u! A+ v" m2 X6 q% w
reset_ext,
& P" V- K8 Q( w! A( U ok( Q7 n& p1 y1 a6 W4 L2 f
//外部腳位定義-------------------------------------+ r6 ?* u2 a# @( B( a
input clk , reset ; //系統 clk reset2 z" [$ D% i" O0 |4 d6 M7 x4 H
input min_1 , min_5 , min_10; //設定每按一次1加1按5加一次5按10加一次10; O" d3 A5 A b2 i3 F) ~. h
input start; //開始倒數鍵0 L6 G0 t% A2 \, q1 T3 U! @
input reset_ext; //強制歸零並停止倒數
7 m( A. }0 m9 d. Qinput ok; //用來關掉alarm鬧鈴
5 f2 \5 A2 _. l g//宣告內部暫存器---------------------------------------6 e1 k8 H7 X# [5 e- b P- x* q
wire clk , reset , min_1 , min_5 , min_10 , start , reset_ext; //宣告clk , reset , min_1 , min_5
8 d7 U/ S( I; ? // min_10 , start , reset_ext為連接線
R% }- G( a4 u2 D7 o0 areg [9:0]counter; //宣告counter為暫存器
" {. Z' ^& T+ a" Q, Q8 |0 mreg min_1_b; //宣告min_1_b為暫存器
8 H& \1 j$ K2 F O' u3 f; o6 Kreg min_1_bb; //宣告min_1_bb為暫存器! m/ c/ M. R1 M7 X* |, r
wire pulse_1; //宣告pulse_1為連接線 B" y" n6 |6 O- P3 Z
reg min_5_b; //宣告min_5_b為暫存器4 [! Z0 z" `6 V; Q. n
reg min_5_bb; //宣告min_5_bb為暫存器 - L0 U$ {* i) A s
wire pulse_5; //宣告pulse_5為連接線
$ Y* v6 b# h/ g3 l1 Lreg min_10_b; //宣告min_10_bb為暫存器 ( x8 H$ d4 Y' H6 b
reg min_10_bb; //宣告min_10_bb為暫存器
2 m, H9 L7 K, i6 ]wire pulse_10; //宣告pulse_10為連接線
( f7 E( l0 C. g7 o8 a3 E, @3 Rreg alarm; //宣告alarm為暫存器 5 z. ? ~* E1 J
reg ok_b; //關掉alarm鬧鈴的暫存器- q! t/ K4 f9 o
reg ok_bb; //關掉alarm鬧鈴的暫存器$ _3 a$ Z5 M O: Q
wire pulse_ok; //關掉alarm鬧鈴的訊號
0 K$ }( O) [! W+ t9 `1 ^: d+ ?reg reset_ext_b; //關掉外部歸零的暫存器
0 I; L: l T$ L( _reg reset_ext_bb; //關掉外部歸零的暫存器
; Q) r& [5 j3 d# S1 F0 m. Qwire pulse_reset_ext; //關掉外部歸零的訊號8 X& A, R3 X: c% t& Y
reg count_d ; //宣告啟動alarm用* F8 Z$ H6 [* B9 ^/ _. w9 ^
reg count_dd ; //宣告啟動alarm用3 L% t! [* o( ~1 \
wire pulse_d ; //宣告啟動alarm用
* E3 L$ t( O3 N. Y; x: M. c, M# areg [7:0]led ;
( v, ^4 @' v1 L8 c% Y! ?" `: T* K0 g3 m& t: U9 M" j' x
assign pulse_1 = min_1_b & ~min_1_bb;, ?; d4 p% i! ~2 h4 {8 `- e
assign pulse_5 = min_5_b & ~min_5_bb;) | c2 K" H! O
assign pulse_10 = min_10_b & ~min_10_bb;
5 D3 {/ r. U9 rassign pulse_d = count_d & ~count_dd ;
& M# X) j8 [6 C: rassign pulse_ok = ok_b & ~ok_bb;
, y; h F% ^; M3 j+ r \% Yassign pulse_reset_ext = reset_ext_b & ~reset_ext_bb;0 N5 i. m" A, t+ o% E* k
//-----------------------------------------------------+ _+ ]3 f2 j0 y5 l6 k
//計數跟倒數$ J3 ^# ^+ b4 q. _
//-----------------------------------------------------
, J; A' o' e9 ^: c1 falways @ (posedge clk or negedge reset)# X+ m0 L" s4 s) Z8 @
begin& `* R1 A+ K: |% r4 k+ i. B
if(~reset); P; j2 E' K0 F
counter <= 0; //把counter 設初始值為零
* P+ G/ o2 [/ }; X7 e2 G else if(pulse_1) //
* X( O$ g6 {: {. D counter <= counter + 1; //6 R' Z: k) C X1 p' W0 V Y; f
else if(pulse_5) //設定counter按1 and 5 and 10的累加# b! _0 y9 i! P5 z8 f3 K9 Z
counter <= counter + 5; //# }6 I/ ]8 j4 \
else if(pulse_10) //
/ O1 n4 E8 ^! b( r: K7 W counter <= counter + 10; // l+ o8 w( k: f7 R3 c, Z; M0 W4 U
else if(counter >0 & start) //設定counter開始倒數
% j1 }2 A' Q8 ~/ V counter <= counter - 1 ; // " l9 O, o7 g: P" K O) a
else if(pulse_reset_ext) //設定reset_ext強制關掉所有目前正在執行的動作% ~; F W. u" ]! g3 f- F$ F! S* ^$ M# C
counter <= 0 ;
( \/ ^$ P9 t) w6 |/ Yend
2 V ?" M( S7 Q: H3 ^. L9 A" y
- Y$ }! {( R/ d! O9 U5 D0 l
6 G7 b) h9 L/ O. k( ], Q8 A
6 p7 l; |1 J& x% E7 j# ^/ |//------------------------------------------------------" P4 P' r' w, @& ]
//led_counter1 H6 J; M# F' e3 W# c& [* r
//------------------------------------------------------
8 d' }! p: Z; o! s b
@2 V( [' g* p3 }& B0 }% Q" X# W5 d: e) j0 ]3 a$ r& p
# i& R: V P2 y) e
P& O$ N' l, ^+ K5 G( y# m//-------------------------------------------------------
( u8 W. g/ N, q4 t, ?3 z//alarm鬧鈴
5 l) ]- N9 _0 w9 m//------------------------------------------------------
6 P$ I: O5 K `/ M+ h `/ ialways @ (posedge clk or negedge reset )! D+ L" |6 h# v7 S! Y% G; Y
begin
- {8 z; n& r2 q7 p* h if(~reset)
% N3 A# }5 }2 C3 v5 t( G; y' T5 ? alarm <= 0 ; //設定alarm鬧鈴初始值為零) k9 J1 c f9 l4 r; }, }
else if(pulse_ok) //設定當pulse_ok為1時成真,alarm為0關掉鬧鈴
' N( m7 G" w, p0 i! f7 D) m. v alarm <= 0 ; //
+ `0 I7 r6 R) S' k else if(pulse_d) //設定在counter倒數數到零零零時鬧鈴為1聲響起
9 i; ?. L- B c9 J' _0 B7 } alarm <= 1 ; 8 T- w6 B, A7 ]8 _
end
0 Y4 j3 o% V2 W//-----------------------------------------------------$ t& l. {3 s' I( q* ~" Q
//count_d# u6 A- ]) f/ i8 j8 A
//---------------------------------------------------- B% T' H1 _' X% q* O
always @ (posedge clk or negedge reset) $ ?1 m8 t ]' a: v8 Q F6 c7 R
begin/ g1 i7 q8 R( X L7 K
if(~reset)
+ a% N6 u) c$ W7 d" K& J4 j count_d <= 0;, l3 `: m& {3 U
else if(start & counter == 2)
# D( [+ ^. Q0 T. _ count_d <= 1 ;
( r) X1 a2 r5 {// else if(pulse_reset_ext)
& \& z+ H& r' D/ Y7 T' d9 Q B else
% Q4 s$ h* ~& ^' J% R! P count_d <= 0;
8 v$ K1 a' @1 ?* X
6 [8 O% U6 b8 S/ }4 I + R) W) ^' R7 ?$ a0 ]8 q: K- `
6 q9 ~( v. j# W4 xend
( Q2 }7 A: A- L; [7 ] }$ S x//--------------------------------------------------------------/ U- F6 k2 n9 c: p8 R% s0 K
//count_dd, L: w* V1 e- h$ K. H+ ?8 K
//--------------------------------------------------------------
' C3 a* F7 v8 Zalways @ (posedge clk or negedge reset) J# U' v, l, c/ F- y2 {, ]! C
begin
9 C2 y$ j$ G8 m, N if(~reset)) U8 E$ {0 F/ a" {6 U
count_dd <= 0 ;% J1 y2 n5 _. k& D6 [% ~ ~, P
else if (start & counter == 1)
3 T+ X( s# L! R8 r( K' D count_dd <= count_d ;, M/ D! T6 d# C% q
// else if(pulse_reset_ext)& V" h+ r4 b% q& }
else
2 G/ L) \& H& f3 d" ^; p0 i) e2 R- A% { count_dd <= 0;
* d! B, b, U* R. l% M
2 F, p; w6 V u5 c; rend
# q5 S& {. L1 z: Y0 n
' j% u) r3 q- M續1 |
|