module countpro(sys_clk,rst_n,led); //接口定义 input sys_clk,rst_n; //输入:系统时钟50MHz,复位输入 output [2:0] led; //输出:3个led产生流水现象,轮流点亮 reg [25:0] count; //系统时钟频率过高,需要计数的方式来产生延时,使led保持状态一段时间 reg [2:0] led; //led低电平点亮 reg [1:0] flag; //状态转换的入口,发生变化的时候,点亮另外一个led
always @(posedge sys_clk,negedge rst_n) if(!rst_n) //复位,给寄存器赋初值 begin flag <= 2'b0; count <= 26'b0; end else //sys_clk上升沿到来 begin if( count == 26'b11_1111_1111_1111_1111_1111_1110 ) begin count <= 26'b0; //count归零,便于下次重新开始计数 if(flag == 2'b10) //当flag等于2’b10时,flag归零(实际上,当flag==2’b10时,要在下一次归零,即在flag==2’b11时,马上就变成2’b00,而并非当flag==2’b10时马上变为2’b00;) flag <= 2'b00; else //否则flag加一 flag <= flag+2'b01; end else count <= count + 1; //当count没计数到指定值是,count执行加一操作 end always @(posedge sys_clk) begin case(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象 2'b00: led <= 3'b011; //点亮第一个灯 低电平点亮 2'b01: led <= 3'b101; //点亮第一个灯 低电平点亮 2'b10: led <= 3'b110; //点亮第一个灯 低电平点亮 default:led <= 3'b111; //一般要设置一个缺省状态,三个led全部灭 endcase end endmodule
|