TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
流水灯代码分享
2 i& t4 n8 g: W+ \3 L4 C/ @) Z5 o; M' n" ?
module countpro(sys_clk,rst_n,led); //接口定义0 a0 o1 s( D0 ~ C
input sys_clk,rst_n; //输入:系统时钟50MHz,复位输入9 ]3 f2 h+ ]) Y {2 \& Y
output [2:0] led; //输出:3个led产生流水现象,轮流点亮+ `, p4 ?1 _: s2 w: v+ E, n$ |
reg [25:0] count; //系统时钟频率过高,需要计数的方式来产生延时,使led保持状态一段时间
( s6 O) V9 P; o! B: v1 u( c Sreg [2:0] led; //led低电平点亮 L" l! S0 ]9 O C- w% U: \
reg [1:0] flag; //状态转换的入口,发生变化的时候,点亮另外一个led' |! ~+ |0 E- ^1 V( F' ~' N' j1 u
always @(posedge sys_clk,negedge rst_n)& Y4 u: S, Q5 p7 ^# @9 b- X
if(!rst_n) //复位,给寄存器赋初值/ F4 g( B9 F4 D" A# A/ S/ s
begin) A1 V, q" }/ Z- Z6 g, ^ @- \) ~# Z
flag <= 2'b0;
0 l( _8 g$ p p9 J5 Mcount <= 26'b0;2 q6 m$ c, r, e# C6 W
end* w# p) ?1 f. \; M3 m: B* _
else //sys_clk上升沿到来, G$ y- L9 N" @4 j4 P1 @
begin
; I1 b; r T" x$ G3 Y" C3 |if( count == 26'b11_1111_1111_1111_1111_1111_1110 )' N# [ A' M3 B
begin 7 q. `* W/ F7 `8 {; c
count <= 26'b0; //count归零,便于下次重新开始计数3 r1 f {$ k0 ?7 O% @. N' o
if(flag == 2'b10) //当flag等于2’b10时,flag归零(实际上,当flag==2’b10时,要在下一次归零,即在flag==2’b11时,马上就变成2’b00,而并非当flag==2’b10时马上变为2’b00;)) d: }: E5 k. D* i1 x
flag <= 2'b00;
: k' Q# i% w) F5 p9 relse //否则flag加一
* e) ~4 k& N9 ?4 Nflag <= flag+2'b01;
2 n! l" X3 \% D0 d' j! Send5 M$ H, \% d5 G8 Y& F# E; m* C
else. e: f& I5 l+ G# d& G
count <= count + 1; //当count没计数到指定值是,count执行加一操作- y* e+ M5 ]& ~1 \$ e& h
end( F- m8 s0 d/ d5 x. y) o
always @(posedge sys_clk)
, b4 d' R5 `7 X6 z$ \begin3 Z) o$ G0 [6 f; L" A# M) a7 X2 K
case(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象' H; t: R) F' s) ^& k X
2'b00: led <= 3'b011; //点亮第一个灯 低电平点亮
: T0 W1 j' ?/ s( H2'b01: led <= 3'b101; //点亮第一个灯 低电平点亮
/ W: B, N+ c" ]1 R% C% t# J; z2'b10: led <= 3'b110; //点亮第一个灯 低电平点亮
) e- R* b' G5 y" zdefault:led <= 3'b111; //一般要设置一个缺省状态,三个led全部灭) R& R3 k1 D& {9 Y- y" z' k6 ?$ K. [
endcase
% H: s" v( i: g9 p' Bend
$ x: [, @/ y$ M& wendmodule+ X6 G$ N e8 R5 q" _$ k
2 @3 b! W5 v" M7 H: |9 c |
|