TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
流水灯代码分享
- h. x: v2 e3 i& Q- q
9 m3 Y5 \4 T% C' Gmodule countpro(sys_clk,rst_n,led); //接口定义
% T" h0 H+ o/ K" z, s6 Minput sys_clk,rst_n; //输入:系统时钟50MHz,复位输入# H* ]. L# ?+ i- h$ U( f
output [2:0] led; //输出:3个led产生流水现象,轮流点亮; X a# A* p9 V1 y
reg [25:0] count; //系统时钟频率过高,需要计数的方式来产生延时,使led保持状态一段时间$ a; l: I" m3 L
reg [2:0] led; //led低电平点亮: P2 T% b, A( Q/ Y& W. s
reg [1:0] flag; //状态转换的入口,发生变化的时候,点亮另外一个led
0 f& n' }& s! G+ ialways @(posedge sys_clk,negedge rst_n)) k) O8 I8 \' G' S/ S* L" g" c4 H
if(!rst_n) //复位,给寄存器赋初值, G# w: }# c& x0 v5 `( B
begin
' Z1 A; N/ z$ x; sflag <= 2'b0;4 g/ _; d+ E1 ~5 w$ ~
count <= 26'b0;- ^/ j f0 S3 q
end6 w7 S9 N. ^8 I1 Q
else //sys_clk上升沿到来- B4 F+ k& i3 [: _( f {. w
begin* S& P; L, W4 @# M9 ?
if( count == 26'b11_1111_1111_1111_1111_1111_1110 )
3 f# m/ k) c- ibegin " R4 Z* k" v- C1 X0 s! E
count <= 26'b0; //count归零,便于下次重新开始计数
3 q* l0 N6 ^9 @( Jif(flag == 2'b10) //当flag等于2’b10时,flag归零(实际上,当flag==2’b10时,要在下一次归零,即在flag==2’b11时,马上就变成2’b00,而并非当flag==2’b10时马上变为2’b00;)
% ]2 u, `; G* ]+ f( Rflag <= 2'b00;
) r% X, @* g& ]+ Q3 S0 w ^; F8 u# Selse //否则flag加一) H( I1 q, N- f" W* E! o
flag <= flag+2'b01;
1 a& n4 G8 ~4 R+ ?5 X" }end
. ?3 R3 z8 {3 C, z6 i! ~else
# J. } y0 D( X- N, b7 {$ ~count <= count + 1; //当count没计数到指定值是,count执行加一操作
4 f8 V$ B/ S+ }end
. w; e( C4 S2 _& b( S6 b4 falways @(posedge sys_clk)
% x9 W4 o6 b! P' j4 Zbegin$ B: I4 M6 {$ ~
case(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象$ X/ K: m& |6 d8 ~4 d. g; N5 v$ K! ?
2'b00: led <= 3'b011; //点亮第一个灯 低电平点亮" y% N* {- ~3 V+ a o' g9 u
2'b01: led <= 3'b101; //点亮第一个灯 低电平点亮. f3 K8 `& _& z- h
2'b10: led <= 3'b110; //点亮第一个灯 低电平点亮+ T: `. U( Z1 K0 D- a8 s% y
default:led <= 3'b111; //一般要设置一个缺省状态,三个led全部灭7 f" F5 `0 I' U% |5 D4 H
endcase" Q. V, p2 i" o# e
end! `6 T/ t; ^2 k3 |; q
endmodule
0 } }' A0 |- I8 ]2 Z" i; S3 k9 ]& C! s5 d% a( _+ I
|
|