|
本帖最後由 card_4_girt 於 2012-7-26 11:24 PM 編輯
( N+ S4 z. d" A" B& v' r0 J5 `
+ S' X( S) S7 L7 c$ Q: e6 Clucky大,感覺您的程式有些錯誤,在此我更正一下,您參考看看3 P" f% Y0 C2 Z+ E* }
首先關於您提到的Syntax錯誤,應該是您忘記把reg [2:0] cont後面加上";"所致
% K( m+ s6 ~- c- ]* Q" m$ ^那個錯誤的意思是在always區塊附近少了分號 (對不同行或不同類型輸出入之分界)或逗號(對相同類型的輸出入分界)! O# G1 l& \- K: ]$ ?; o
% v% D8 B% Z D1 t1 ?; M5 S% tmodule led_shift(clk,reset,led);//reset應該要加入input當會比較好,比較合理
! C, p2 e9 C9 O0 h7 G' Winput clk;
) q. ^; g1 {( f9 ninput reset;' Q. L0 K" s9 J. y* w# b
output [7:0] led;
/ u, q1 A8 d3 a0 dreg [3:0] rdd; //rdd如果沒用到就不用設
) S" B0 W0 ?+ j: @$ Y8 d1 U$ W9 G- treg [7:0] led;& r/ X# X% d1 M3 A) ]9 _
reg [2:0] cont; //記得要加分號
. X% a% A/ B7 y/ k4 V: ialways@(posedge clk) //同步計數程序宣告
. l; k" T6 I- G* i; X# H begin
3 ~2 {5 E) X( |1 n if (reset) cont = 0;$ S8 }1 v1 e+ p2 [9 L$ b
else cont = cont + 1;
0 h9 @- J: C( p* V end5 M# u# u! c, a
; `; J/ R2 a3 m8 Zalways@(posedge clk)- s& m+ Y+ R! ?/ n
begin
+ |. {* h, [; S0 s: | case(cont)
) }& \& \! b! b' }2 ~ 3'b000 : led = 8'b00000001; //cont為3 bit register,不是2 bit,後面的也應一併更改
1 |. b: _( i* v& p+ B 3'b001 : led = 8'b00000010;
) ^$ j9 Z4 J/ a; z+ _& K8 k 3'b010 : led = 8'b00000100;9 v- Z6 t4 w8 S! V. S7 R M( ~
3'b011 : led = 8'b00001000;3 O9 ~ w! W v/ C+ ^# C
3'b100 : led = 8'b00010000;
* ^3 H# e6 s h 3'b101 : led = 8'b00100000;" Q6 k# N& Z- E" T P. ^: L
3'b110 : led = 8'b01000000;2 Y4 @6 C) l6 W5 h, ^
3'b111 : led = 8'b10000000;/ r6 M( b9 u4 A
default : led = 8'b00000000; //設default避免出現無法預期的值,使用case最好要有,以防萬一1 e) v* e3 T% i9 T! c
endcase" D0 x% G* ?& ?
end* K( a$ @+ W( _* x6 m
: X/ h6 p! v) |- B. X0 ]endmodule
( n" I+ h. d1 E7 r* b+ a
' i \2 k2 q* @7 \ d+ K順便附上電路與模擬檔案/ s }1 A* U( x6 z, G- ]
電路檔(led_shift.v)與模擬檔(test_led_shift.v):! r! Z) y$ u/ D3 O0 ~/ f
, h, p6 I2 K4 \% \ p
模擬結果:. x% E0 W& p4 o
(這裡reset = 1超過1個clock週期[也可不要超過1個clock週期],所以在2週期後才開始計數,reset = 0之後便每過一個clock週期就上數一次)
, @5 e, ?* p3 j; [ |
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號?申請會員
x
評分
-
查看全部評分
|