📄 vgavga.v
字号:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date: 22:47:17 05/29/2008 // Design Name: // Module Name: vgavga // Project Name: // Target Devices: // Tool versions: // Description: //// Dependencies: //// Revision: // Revision 0.01 - File Created// Additional Comments: ////////////////////////////////////////////////////////////////////////////////////module vgavga(clock, vga_h_sync, vga_v_sync, vga_R, vga_G, vga_B,key);input clock;
input [1:0] key;output vga_h_sync, vga_v_sync, vga_R, vga_G, vga_B;wire inDisplayArea;wire [9:0] CounterX;wire [8:0] CounterY;wire clk;hvsync_generator syncgen(.clk(clk), .vga_h_sync(vga_h_sync), .vga_v_sync(vga_v_sync), .inDisplayArea(inDisplayArea), .CounterX(CounterX), .CounterY(CounterY)); my_dcm instance_name ( .CLKIN_IN(clock), .RST_IN(), .CLKFX_OUT(clk), .CLKIN_IBUFG_OUT(), .CLK0_OUT(), .LOCKED_OUT() ); // Draw a border around the screenwire border = (CounterX[9:3]==19) || (CounterX[9:3]==79) || (CounterY[8:3]==0) || (CounterY[8:3]==59);wire R = border;wire G = border;wire B = border;reg vga_R, vga_G, vga_B;always @(posedge clk)beginif(key[1:0]==2'b00)
begin
vga_R<=inDisplayArea;
vga_G<=0;
vga_B<=0;
end
else if(key[1:0]==2'b01)
begin vga_R<=0;
vga_G<=inDisplayArea; vga_B<=0; end
else if(key[1:0]==2'b10)
begin
vga_B<=inDisplayArea; vga_G<=0; vga_R<=0;
end
else
begin
vga_R <= inDisplayArea; vga_G <= inDisplayArea; vga_B <= inDisplayArea;
end
end
/*
vga_R <= R & inDisplayArea;
vga_G <= G & inDisplayArea;
vga_B <= B & inDisplayArea;
reg [8:0] PaddlePosition;reg [2:0] quadAr, quadBr;always @(posedge clk) quadAr <= {quadAr[1:0], quadA};always @(posedge clk) quadBr <= {quadBr[1:0], quadB};always @(posedge clk)if(quadAr[2] ^ quadAr[1] ^ quadBr[2] ^ quadBr[1])begin if(quadAr[2] ^ quadBr[1]) begin if(~&PaddlePosition) // make sure the value doesn't overflow PaddlePosition <= PaddlePosition + 1; end else begin if(|PaddlePosition) // make sure the value doesn't underflow PaddlePosition <= PaddlePosition - 1; endend wire border = (CounterX[9:3]==0) || (CounterX[9:3]==79) || (CounterY[8:3]==0) || (CounterY[8:3]==59);wire paddle = (CounterX>=PaddlePosition+8) && (CounterX<=PaddlePosition+120) && (CounterY[8:4]==27);wire R = border | (CounterX[3] ^ CounterY[3]) | paddle;wire G = border | paddle;wire B = border | paddle;reg [9:0] ballX;reg [8:0] ballY;reg ball_inX, ball_inY;reg [8:0] PaddlePosition;always @(posedge clk)if(ball_inX==0) ball_inX <= (CounterX==ballX) & ball_inY; else ball_inX <= !(CounterX==ballX+16);always @(posedge clk)if(ball_inY==0) ball_inY <= (CounterY==ballY); else ball_inY <= !(CounterY==ballY+16);wire ball = ball_inX & ball_inY; wire border = (CounterX[9:3]==0) || (CounterX[9:3]==79) || (CounterY[8:3]==0) || (CounterY[8:3]==59);wire paddle = (CounterX>=PaddlePosition+8) && (CounterX<=PaddlePosition+120) && (CounterY[8:4]==27);wire BouncingObject = border | paddle; // active if the border or paddle is redrawing itselfreg CollisionX1, CollisionX2, CollisionY1, CollisionY2;always @(posedge clk) if(BouncingObject & (CounterX==ballX ) & (CounterY==ballY+ 8)) CollisionX1<=1;always @(posedge clk) if(BouncingObject & (CounterX==ballX+16) & (CounterY==ballY+ 8)) CollisionX2<=1;always @(posedge clk) if(BouncingObject & (CounterX==ballX+ 8) & (CounterY==ballY )) CollisionY1<=1;always @(posedge clk) if(BouncingObject & (CounterX==ballX+ 8) & (CounterY==ballY+16)) CollisionY2<=1; reg UpdateBallPosition;always @(posedge clk) UpdateBallPosition <= (CounterY==500) & (CounterX==0); // active only once for every video framereg ball_dirX, ball_dirY;always @(posedge clk)if(UpdateBallPosition)begin if(~(CollisionX1 & CollisionX2)) // if collision on both X-sides, don't move in the X direction begin ballX <= ballX + (ball_dirX ? -1 : 1); if(CollisionX2) ball_dirX <= 1; else if(CollisionX1) ball_dirX <= 0; end if(~(CollisionY1 & CollisionY2)) // if collision on both Y-sides, don't move in the Y direction begin ballY <= ballY + (ball_dirY ? -1 : 1); if(CollisionY2) ball_dirY <= 1; else if(CollisionY1) ball_dirY <= 0; endend wire R = BouncingObject | ball | (CounterX[3] ^ CounterY[3]);wire G = BouncingObject | ball;wire B = BouncingObject | ball;reg vga_R, vga_G, vga_B;always @(posedge clk)begin vga_R <= R & inDisplayArea; vga_G <= G & inDisplayArea; vga_B <= B & inDisplayArea;end */endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -