TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
流水灯代码分享 6 X/ q% o$ G$ l0 }/ B
: ^& u; p* @+ q g) u" tmodule countpro(sys_clk,rst_n,led); //接口定义5 r* N u5 b( F. ? m4 `
input sys_clk,rst_n; //输入:系统时钟50MHz,复位输入
+ u; {. A6 h- ]output [2:0] led; //输出:3个led产生流水现象,轮流点亮" G+ o+ b& s3 D- @( w; x
reg [25:0] count; //系统时钟频率过高,需要计数的方式来产生延时,使led保持状态一段时间
$ W, F, h0 N3 ?3 |' breg [2:0] led; //led低电平点亮
2 i% B2 b2 d: H( U5 O0 K3 \reg [1:0] flag; //状态转换的入口,发生变化的时候,点亮另外一个led* X. @. p$ Z% K5 b( b5 F6 [
always @(posedge sys_clk,negedge rst_n)
' Z, g2 R6 `3 \if(!rst_n) //复位,给寄存器赋初值
( j% t# O, T$ S6 I7 v. Abegin4 H7 Y; ]9 Y$ y% ^( c
flag <= 2'b0;
/ B3 W1 U* z- f/ K' i# S: scount <= 26'b0;7 X* j* I4 f, _+ N4 h" y
end- z- ?2 B. b' W$ P1 S& N" R/ s; n+ i
else //sys_clk上升沿到来5 I9 E" d( o# N% Z
begin1 J6 ]6 h( @7 b( k
if( count == 26'b11_1111_1111_1111_1111_1111_1110 ); u- _. _7 F$ \8 y H
begin ! @) m* ^- A- Q
count <= 26'b0; //count归零,便于下次重新开始计数
+ C a& ]; _6 h- O. Fif(flag == 2'b10) //当flag等于2’b10时,flag归零(实际上,当flag==2’b10时,要在下一次归零,即在flag==2’b11时,马上就变成2’b00,而并非当flag==2’b10时马上变为2’b00;)
" j' _6 q4 y8 T8 ?5 q( e, Vflag <= 2'b00;5 m& m% o! i& p( G' b2 g2 X% d
else //否则flag加一7 V$ @! ]. |% ~. z2 [
flag <= flag+2'b01;
4 v6 G5 x, M6 B; O1 Lend! o& }4 K1 Q5 P7 U k* _# P6 f
else
: @& f- Y) o+ R m* G o: i. U8 rcount <= count + 1; //当count没计数到指定值是,count执行加一操作# J/ V) D; a* } p
end
$ @1 A+ q H2 w6 Q, G. I& `2 Lalways @(posedge sys_clk), E) u0 S0 U0 Z9 z" _3 p9 I
begin
' O# n7 a. N6 L2 ]0 G' C1 Hcase(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象
7 B( M9 o8 {- s) j$ r' P2'b00: led <= 3'b011; //点亮第一个灯 低电平点亮9 Y, P7 g4 l/ u$ o) O" n0 L: q
2'b01: led <= 3'b101; //点亮第一个灯 低电平点亮3 f' o& K" G) Z9 V+ l$ n6 W q
2'b10: led <= 3'b110; //点亮第一个灯 低电平点亮
# `- c+ n7 f- e# b6 T& @default:led <= 3'b111; //一般要设置一个缺省状态,三个led全部灭
0 n# v/ l* d) L* ?! j# l" g& Z5 pendcase% F3 |/ I1 ?9 H! A8 s
end
# _% U3 {& ^& L5 l+ f9 o, v0 lendmodule( _9 _) v: ]% ]5 C& J
& _) u1 y: p& Q) L# x |
|