| 
 | 
 
module led(rst,clk,dout); 
 
input rst,clk;//输入:复位,50M时钟 
output [3:0] dout;//四位数据输出,连led灯 
reg [3:0] dout; 
 
reg [2:0] c_state,n_state; 
parameter idle=3'b000; 
parameter st1=3'b001; 
parameter st2=3'b011; 
parameter st3=3'b010; 
parameter st4=3'b110; 
 
reg [25:0] divide_count;//分频计数值 
reg divide_clk;//分频信号线 
reg [3:0] cnt;//计数寄存器 
/* 
always @(posedge clk or negedge rst) 
    begin 
       if(!rst) 
         begin 
          divide_count <=26'b0; 
          divide_clk <=1'b0; 
         end 
      else if(divide_count == 50000000) 
         begin 
          divide_count <=26'b0; 
          divide_clk <=~divide_clk; 
         end 
     else 
          divide_count <=divide_count+1'b1; 
    end 
*/ 
always @(posedge clk or negedge rst) 
begin 
        if(!rst) 
        begin 
                c_state<=idle; 
        end 
        else 
        begin 
                c_state<=n_state; 
        end 
end 
 
always @(posedge clk or negedge rst) 
begin 
        if(!rst) 
        begin 
                cnt<=0; 
                dout<=4'b1111; 
                n_state<=idle; 
        end 
        else 
        begin 
                case(c_state) 
                idle: 
                begin 
                        dout<=4'b1110; 
                        n_state<=st1; 
                end 
                st1: 
                begin 
                        dout<=dout ^ 4'b0001; 
                        cnt<=cnt+1'b1; 
                        if(cnt<3) 
                        begin 
                                 
                                n_state<=st1; 
                        end 
                        else 
                        begin 
                                cnt<=1'b0; 
                                dout<=4'b1101; 
                                n_state<=st2; 
                        end 
                end 
                st2: 
                begin 
                        dout<=dout ^ 4'b0010; 
                        cnt<=cnt+1'b1; 
                        if(cnt<3) 
                        begin 
                                 
                                n_state<=st2; 
                        end 
                        else 
                        begin 
                                cnt<=1'b0; 
                                dout<=4'b1011; 
                                n_state<=st3; 
                        end 
                end 
                st3: 
                begin 
                        dout<=dout ^ 4'b0100; 
                        cnt<=cnt+1'b1; 
                        if(cnt<3) 
                        begin 
                                 
                                n_state<=st3; 
                        end 
                        else 
                        begin 
                                cnt<=1'b0; 
                                dout<=4'b0111; 
                                n_state<=st4; 
                        end 
                end 
                st4: 
                begin 
                        dout<=dout ^ 4'b1000; 
                        cnt<=cnt+1'b1; 
                        if(cnt<3) 
                        begin 
                                 
                                n_state<=st4; 
                        end 
                        else 
                        begin 
                                cnt<=1'b0; 
                                dout<=4'b1110; 
                                n_state<=st1; 
                        end 
                end 
                default: 
                begin 
                end 
                endcase 
        end 
end 
endmodule 
这个程序是要实现每一个led灯轮流闪两下,但是出来的结果却是有时候好几个灯同时闪,总之时序是乱的。想了好久了,都没搞出来,望大虾们指点迷津!先谢了 |   
 
 
 
 |