原创 很好玩的一段verilog代码

2011-1-1 17:05 1282 8 8 分类: FPGA/CPLD
VGA显示/640*480/60Hz刷新频率
代码如下一共三段
 
1段
 
module VGA_ball(clk,rst_n,VGA_B,VGA_G,VGA_R,VGA_BLANK_N,VGA_CLK,VGA_SYNC_N,VGA_HS,VGA_VS,ball_bump);
 
input                      clk,rst_n;
 
output                     ball_bump;
output[7:0]                    VGA_R,VGA_G,VGA_B;
wire[7:0]                    VGA_R,VGA_G,VGA_B;
output                          VGA_SYNC_N;
output                          VGA_BLANK_N;
output                          VGA_CLK;
 
 
output                          VGA_HS,VGA_VS;
wire                             VGA_HS,VGA_VS;
 
assign      VGA_BLANK_N=1'b1;
assign      VGA_SYNC_N=1'b0;
assign      VGA_CLK=clk;
     
wire[9:0]   Hs_cnt,Vs_cnt;
 
     
 
VGA_play   V_play(
                     .clk(clk),
                     .rst_n(rst_n),
                     .Hs(VGA_HS),
                     .Vs(VGA_VS),
                     .Hs_cnt(Hs_cnt),
                     .Vs_cnt(Vs_cnt)
                     );
     
VGA_data    V_data(
                     .clk(clk),
                     .rst_n(rst_n),
                     .VGA_R(VGA_R),
                     .VGA_G(VGA_G),
                     .VGA_B(VGA_B),
                     .Hs_cnt(Hs_cnt),
                     .Vs_cnt(Vs_cnt),                      
                     .ball_bump(ball_bump)
                 );
 
endmodule
 
 
 
 
 
2段
 
module VGA_data(clk,rst_n,VGA_R,VGA_G,VGA_B,Hs_cnt,Vs_cnt,ball_bump);
 
input clk,rst_n;
input [9:0] Hs_cnt;
input [9:0] Vs_cnt;
output [7:0]VGA_R,VGA_G,VGA_B;
wire   [7:0]VGA_R,VGA_G,VGA_B;
output ball_bump;
 
 
reg     clk_data;
//////////////////////////////////////////////
integer ii;
   always @(posedge clk)begin
 
       if(!rst_n)              begin clk_data<=0;ii<=0;end
   
       else if(ii==200000)     begin clk_data<=~clk_data;ii<=0;end
   
       else ii<=ii+1;
    end
///////////////////////////////////
reg     clk_cir;
integer iiii;
   always @(posedge clk)begin
 
       if(!rst_n)             iiii<=0;
   
       else if(iiii==400000)     begin clk_cir<=~clk_cir;iiii<=0;end
   
       else iiii<=iiii+1;
    end
///////////////////////////////////
 
reg [23:0] RGB;
assign {VGA_R,VGA_G,VGA_B} = RGB;
 
////////////////////// ball_1 /////////////////////////////
reg [9:0]x1,y1;
reg x_dir1,y_dir1;
always @(posedge clk_data or negedge rst_n)
begin
   
   if(!rst_n) x_dir1 <=1;  
   else if (x1==50 )
    x_dir1 <=1;
   else if (x1==589 )
   x_dir1 <= 0;
   else
   x_dir1 <= x_dir1;
   end
   
always @(posedge clk_data or negedge rst_n)
begin
   if(!rst_n) y_dir1 <=1;  
   else if (y1==50 )
   y_dir1 <=1;
   else if (y1==429 )
   y_dir1 <= 0;
   else    
   y_dir1<= y_dir1;
   end
   
   
always @(posedge clk_data or negedge rst_n)
begin
if (!rst_n)x1<=50;
else if(x_dir1 )
   x1 <=x1+1;
   else  
   x1<=x1-1;end
   
always @(posedge clk_data or negedge rst_n )
   begin
if (!rst_n)y1<=50;  
    else if(y_dir1 )
   y1 <=y1+1;
   else
   y1<=y1-1;end
 
////////////////////// ball_2 /////////////////////////////
 
reg [9:0]x2,y2;
reg x_dir2,y_dir2;
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n) x_dir2 <=1;
   else  
    begin if (x2==50)
         x_dir2 <=1;
         else if (x2==589)
         x_dir2 <= 0;    
         else
          x_dir2 <=  x_dir2;
    end
end
   
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n)    y_dir2 <=1;  
else  
    begin  
        if (y2==50)
        y_dir2 <=1;
        else if (y2==429)
        y_dir2 <=0;
        else    
        y_dir2 <= y_dir2;
   end
end
   
   
always @(posedge clk_data or negedge rst_n)
begin
if (!rst_n)x2<=320;
else if(x_dir2 )
   x2 <=x2+1;
   else  
   x2<=x2-1;end
   
always @(posedge clk_data or negedge rst_n )
   begin
if (!rst_n)y2<=240;  
    else if(y_dir2 )
   y2 <=y2+1;
   else
   y2<=y2-1;end
 
     
 /////////////////////ball_3//////////////////////////////
reg [9:0]x3,y3;
reg x_dir3,y_dir3;
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n) x_dir3 <=1;
   else  
    begin if (x3==50)
         x_dir3 <=1;
         else if (x3==589)
         x_dir3 <= 0;    
         else
          x_dir3 <=  x_dir3;
    end
end
   
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n)    y_dir3 <=1;  
else  
    begin  
        if (y3==50)
        y_dir3 <=1;
        else if (y3==429)
        y_dir3 <=0;
        else    
        y_dir3 <= y_dir3;
   end
end
   
   
always @(posedge clk_data or negedge rst_n)
begin
if (!rst_n)     x3<=400;
else if(x_dir3 )
   x3 <=x3+1;
   else  
   x3<=x3-1;end
   
always @(posedge clk_data or negedge rst_n )
   begin
if (!rst_n)y3<=120;  
    else if(y_dir3 )
   y3 <=y3+1;
   else
   y3<=y3-1;end
 
 
 
 ////////////////////ball_4/////////////////////////////
 
 
reg [9:0]x4,y4;
reg x_dir4,y_dir4;
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n) x_dir4 <=1;
   else  
    begin if (x4==50)
         x_dir4 <=1;
         else if (x4==589)
         x_dir4 <= 0;    
         else
          x_dir4 <=  x_dir4;
    end
end
   
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n)    y_dir4 <=1;  
else  
    begin  
        if (y4==50)
        y_dir4 <=1;
        else if (y4==429)
        y_dir4 <=0;
        else    
        y_dir4 <= y_dir4;
   end
end
   
   
always @(posedge clk_data or negedge rst_n)
begin
if (!rst_n)     x4<=555;
else if(x_dir4 )
   x4 <=x4+1;
   else  
   x4<=x4-1;end
   
always @(posedge clk_data or negedge rst_n )
   begin
if (!rst_n)y4<=532;  
    else if(y_dir4 )
   y4 <=y4+1;
   else
   y4<=y4-1;end
 
 
 //////////////////////ball_5///////////////////////////
 
 reg [9:0]x5,y5;
reg x_dir5,y_dir5;
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n) x_dir5 <=1;
   else  
    begin if (x5==50)
         x_dir5 <=1;
         else if (x5==589)
         x_dir5 <= 0;    
         else
          x_dir5 <=  x_dir5;
    end
end
   
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n)    y_dir5 <=1;  
else  
    begin  
        if (y5==50)
        y_dir5 <=1;
        else if (y5==429)
        y_dir5 <=0;
        else    
        y_dir5 <= y_dir5;
   end
end
   
   
always @(posedge clk_data or negedge rst_n)
begin
if (!rst_n)     x5<=132;
else if(x_dir5 )
   x5 <=x5+1;
   else  
   x5<=x5-1;end
   
always @(posedge clk_data or negedge rst_n )
   begin
if (!rst_n)y5<=100;  
    else if(y_dir5 )
   y5 <=y5+1;
   else
   y5<=y5-1;end
 
 
 
 
 //////////////////////ball_5///////////////////////////
 
 reg [9:0]x6,y6;
reg x_dir6,y_dir6;
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n) x_dir6 <=1;
   else  
    begin if (x6==50)
         x_dir6 <=1;
         else if (x6==589)
         x_dir6 <= 0;    
         else
          x_dir6 <=  x_dir6;
    end
end
   
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n)    y_dir6 <=1;  
else  
    begin  
        if (y6==50)
        y_dir6 <=1;
        else if (y6==429)
        y_dir6 <=0;
        else    
        y_dir6 <= y_dir6;
   end
end
   
   
always @(posedge clk_data or negedge rst_n)
begin
if (!rst_n)     x6<=232;
else if(x_dir6 )
   x6 <=x6+1;
   else  
   x6<=x6-1;end
   
always @(posedge clk_data or negedge rst_n )
   begin
if (!rst_n)y6<=200;  
    else if(y_dir6 )
   y6 <=y6+1;
   else
   y6<=y6-1;end
 
 
  //////////////////////ball_7///////////////////////////
 
reg [9:0]x7,y7;
reg x_dir7,y_dir7;
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n) x_dir7 <=1;
   else  
    begin if (x7==50)
         x_dir7 <=1;
         else if (x7==589)
         x_dir7 <= 0;    
         else
          x_dir7 <=  x_dir7;
    end
end
   
always @(posedge clk_data or negedge rst_n)
begin
if(!rst_n)    y_dir7 <=1;  
else  
    begin  
        if (y7==50)
        y_dir7 <=1;
        else if (y7==429)
        y_dir7 <=0;
        else    
        y_dir7 <= y_dir7;
   end
end
   
   
always @(posedge clk_data or negedge rst_n)
begin
if (!rst_n)     x7<=232;
else if(x_dir7 )
   x7 <=x7+1;
   else  
   x7<=x7-1;end
   
always @(posedge clk_data or negedge rst_n )
   begin
if (!rst_n)y7<=100;  
    else if(y_dir7 )
   y7 <=y7+1;
   else
   y7<=y7-1;end
 
 
 //////////////////////////////////////////////////////
 reg     dir_dir;
 integer jj;  
 always @(posedge clk_cir or negedge rst_n )
    begin
    if (!rst_n)        begin  jj<=0;dir_dir<=0; end
    else if(dir_dir==0) begin if(jj==200) dir_dir<=1; else jj<=jj+1;end
     else    if(dir_dir==1) begin if(jj==0  ) dir_dir<=0; else jj<=jj-1;end
     else ;
     end
 
 ///////////////////////////////////////////////////////
 
 reg[2:0] cir;
 always @(negedge dir_dir or negedge rst_n )
 if (!rst_n)     cir<=0;
 else if(cir==6) cir<=0;
 else            cir<=cir+1;
 
//////////////////////////////////////////////////////
reg [19:0] A,B,C,D,E,F,G,H;
always @( posedge clk )
    begin
    A=((Hs_cnt-x1)*(Hs_cnt-x1)+(Vs_cnt-y1)*(Vs_cnt-y1));
    B=((Hs_cnt-x2)*(Hs_cnt-x2)+(Vs_cnt-y2)*(Vs_cnt-y2));
     C=((Hs_cnt-x3)*(Hs_cnt-x3)+(Vs_cnt-y3)*(Vs_cnt-y3));
     D=((Hs_cnt-x4)*(Hs_cnt-x4)+(Vs_cnt-y4)*(Vs_cnt-y4));
     E=((Hs_cnt-x5)*(Hs_cnt-x5)+(Vs_cnt-y5)*(Vs_cnt-y5));
     F=((Hs_cnt-x6)*(Hs_cnt-x6)+(Vs_cnt-y6)*(Vs_cnt-y6));
     G=((Hs_cnt-x7)*(Hs_cnt-x7)+(Vs_cnt-y7)*(Vs_cnt-y7));
     H=((Hs_cnt-320)*(Hs_cnt-320)+(Vs_cnt-240)*(Vs_cnt-240));
    end
 
     
always @( posedge clk or negedge rst_n )
begin
    if(!rst_n)   RGB=24'h000000;  
     
    else if(A<=2500||B<=2500||C<=2500||D<=2500||E<=2500||F<=2500||G<=2500||H<=jj*jj)  
     begin  
     if(A<=2500)      RGB=24'hff0000;  
     else if(B<=2500) RGB=24'h0000ff;  
     else if(C<=2500) RGB=24'h00ff00;
     else if(D<=2500) RGB=24'hffff00;  
     else if(E<=2500) RGB=24'h00ffFF;
     else if(F<=2500) RGB=24'hFF00FF;
     else if(G<=2500) RGB=24'hFFFFFF;
     else if(H<=jj*jj)begin case(cir)
                                 0: RGB=24'hff0000;
                                          1: RGB=24'h0000ff;
                                          2: RGB=24'h00ff00;
                                          3: RGB=24'hffff00;
                                          4: RGB=24'h00ffFF;
                                          5: RGB=24'hFF00FF;
                                  default: RGB=24'hFFFFFF;
                                  endcase
                             end  
     else ;
     end
     
     
    else             RGB=24'h000000;
end  
 
 
 
endmodule
 
 
三段
 
 
 
module VGA_play(clk,rst_n,Hs,Vs,Hs_cnt,Vs_cnt);
 
 
input   clk,rst_n;
output  Hs,Vs;
output  [9:0] Hs_cnt;
output  [9:0] Vs_cnt;
reg      Hs,Vs;
 
wire [9:0] Hs_cnt;
wire [9:0] Vs_cnt;
integer    i,j;
 
reg     clk_25M;
 
/////////////////////////////////////////////
always @(posedge clk or negedge rst_n)
if(!rst_n) clk_25M<=0;
else       clk_25M<=clk_25M+1;
 
 
////////////////////////////////////////////
always @(posedge clk_25M or negedge rst_n)
begin
 
   if(!rst_n)begin j<=0;i<=0;end
   
   else if(i==799)
        begin
            i<=0;
            if(j==524)j<=0;
            else j<=j+1;
          end
   else i<=i+1;
   
end
////////////////////////////////////////////  
always @(posedge clk_25M or negedge rst_n)
begin
 
     if(!rst_n) Hs<=1;
   
     else if(i==656)  Hs<=0;
   
     else if(i==752)  Hs<=1;
   
   else Hs<=Hs;
   
end
//////////////////////////////////////////////  
always @(posedge clk_25M or negedge rst_n)
begin
 
     if(!rst_n) Vs<=1;
   
     else if(j==491) Vs<=0;
   
   else if(j==493)   Vs<=1;
   
   else Vs<=Vs;
end
/////////////////////////////////////////////              
assign Hs_cnt = i;
assign Vs_cnt = j;  
 
 
endmodule
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条