FPGA project : rom_vga_jump

只有vga_pix 模块代码与rom_vga不同,所以只上传了这个模块的代码与仿真代码。

FPGA project : rom_vga_jump_第1张图片

FPGA project : rom_vga_jump_第2张图片

 FPGA project : rom_vga_jump_第3张图片

// #define   BLACK     0x0000       //   黑色    
// #define   NAVY      0x000F       //    深蓝色  
// #define   DGREEN    0x03E0       //  深绿色  
// #define   DCYAN     0x03EF       //   深青色  
// #define   MAROON    0x7800       //   深红色      
// #define   PURPLE    0x780F       //   紫色  
// #define   OLIVE     0x7BE0       //   橄榄绿      
// #define   LGRAY     0xC618       //  灰白色
// #define   DGRAY     0x7BEF       //  深灰色      
// #define   BLUE      0x001F       //  蓝色    
// #define   GREEN     0x07E0       //  绿色          
// #define   CYAN      0x07FF       //  青色  
// #define   RED       0xF800       //  红色       
// #define   MAGENTA   0xF81F       //  品红    
// #define   YELLOW    0xFFE0       //  黄色        
// #define   WHITE     0xFFFF       //  白色  
// rgb 565
module vga_pix (
    input           wire            vga_clk   ,
    input           wire            vga_rst_n ,
    input           wire    [9:0]   pix_x     ,
    input           wire    [9:0]   pix_y     ,

    output          wire    [15:0]  pix_data  
);

    // parameter  
    parameter   PIC_SIZE= 14'd1_0000 ,
                H_PIC   = 10'd100  ,
                V_PIC   = 10'd100  ,
                H_VALID = 10'd640  ,
                V_VALID = 10'd480  ;
    parameter   RED     = 16'hF800 ,
                ORANGE  = 16'hFC00 ,
                YELLOW  = 16'hFFe0 ,
                GREEN   = 16'h07e0 ,
                QING    = 16'h07FF ,
                BLUE    = 16'h001F ,
                PURPLE  = 16'hF81F ,
                BLACK   = 16'h0000 ,
                WHITE   = 16'hFFFF ,
                GRAY    = 16'hD69A ;

    // wire signal define
    wire            rden_w   ;
    wire    [13:0]  address_w;
    wire    [15:0]  data_pic ; // 图片的像素

    // reg signal define
    reg     [15:0]  data_pix; // 10 个彩条
	reg 	        rden    ; // 读使能信号超前图像数据一个时钟周期。
	reg 	[13:0]  address ; // 在读使能信号拉高,每个时钟周期自加一,0 ~ PIC_SIZE - 1
    reg             pic_vald; // 图片使能
    reg     [9:0]   x_move  ; // x轴方向的,偏移量
    reg             x_flag  ; // 为0 表示向右移动;为1 表示向左移动。
    reg     [9:0]   y_move  ;
    reg             y_flag  ; // 为0 表示向下移动;为1 表示向上移动。
    
    // reg     [15:0]  data_pix; // 10 个彩条
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            data_pix <= 10'h3ff ;
        end else begin // 有简便写法 ( H_VALID / 10 ) * n
            if((pix_x >= 10'd0) && (pix_x <= H_VALID / 10 - 1'b1))
                data_pix <= RED ;
            else 
            if((pix_x >= H_VALID / 10) && (pix_x <= (H_VALID / 10) * 2 - 1'b1))
                data_pix <= ORANGE ;
            else
            if((pix_x >= (H_VALID / 10) * 2) && (pix_x <= (H_VALID / 10) * 3 - 1'b1))
                data_pix <= YELLOW ;
            else 
            if((pix_x >= (H_VALID / 10) * 3) && (pix_x <= (H_VALID / 10) * 4 - 1'b1))
                data_pix <= GREEN ;
            else 
            if((pix_x >= (H_VALID / 10) * 4) && (pix_x <= (H_VALID / 10) * 5 - 1'b1))
                data_pix <= QING ;
            else 
            if((pix_x >= (H_VALID / 10) * 5) && (pix_x <= (H_VALID / 10) * 6 - 1'b1))
                data_pix <= BLUE ;
            else 
            if((pix_x >= (H_VALID / 10) * 6) && (pix_x <= (H_VALID / 10) * 7 - 1'b1))
                data_pix <= PURPLE ;
            else 
            if((pix_x >= (H_VALID / 10) * 7) && (pix_x <= (H_VALID / 10) * 8 - 1'b1))
                data_pix <= BLACK ;
            else 
            if((pix_x >= (H_VALID / 10) * 8) && (pix_x <= (H_VALID / 10) * 9 - 1'b1))
                data_pix <= WHITE ;
            else 
            if((pix_x >= (H_VALID / 10) * 9) && (pix_x <= H_VALID - 1'b1) )
                data_pix <= GRAY ;
            else 
                data_pix <= BLACK ;
        end
    end
	// reg 	        rden    ; 
    // wire         rden_w  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin 
        if(~vga_rst_n) begin
            rden <= 1'b0 ;
        end else begin
            if(((pix_y >= y_move) && (pix_y <= (y_move + V_PIC - 1))) && ((pix_x >= x_move) && (pix_x <= (x_move + H_PIC - 1)))) begin
                rden <= 1'b1 ;
            end else begin
                rden <= 1'b0 ;
            end
        end
    end
    assign rden_w = rden ;
	// reg 	[13:0]  address ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            address <= 0 ;
        end else begin
            if(rden == 1'b1) begin
                if(address == PIC_SIZE - 1) begin
                    address <= 0 ;
                end else begin
                    address <= address + 1'b1 ;
                end
            end else begin
                address <= address ;
            end
        end
    end
    assign address_w = address ;
    // reg             pic_vald;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            pic_vald <= 1'b0 ;
        end else begin
            pic_vald <= rden ;
        end
    end
    // reg     [9:0]   x_move  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            x_move <= 10'd0 ;
        end else begin
            if(pix_x == H_VALID - 1 && x_flag == 1'b0 && pix_y == V_VALID - 1) begin
                x_move <= x_move + 1'b1 ;
            end else begin
                if(pix_x == H_VALID - 1 && x_flag == 1'b1 && pix_y == V_VALID - 1) begin
                    x_move <= x_move - 1'b1 ;
                end else begin
                    x_move <= x_move ;
                end
            end
        end
    end
    // reg             x_flag  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            x_flag <= 1'b0 ;
        end else begin 
            if((pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && x_move == (H_VALID - H_PIC - 2) && x_flag == 1'b0) 
            || (pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && x_move == 0 && x_flag == 1'b1)) begin
                x_flag <= ~x_flag ;
            end else begin
                x_flag <= x_flag ;
            end
        end
    end
    // reg     [9:0]   y_move  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            y_move <= 10'd0 ;
        end else begin
            if(pix_x == H_VALID - 1 && y_flag == 1'b0 && pix_y == V_VALID - 1) begin
                y_move <= y_move + 1'b1 ;
            end else begin
                if(pix_x == H_VALID - 1 && y_flag == 1'b1 && pix_y == V_VALID - 1) begin
                    y_move <= y_move - 1'b1 ;
                end else begin
                    y_move <= y_move ;
                end
            end
        end
    end
    // reg             y_flag  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            y_flag <= 1'b0 ;
        end else begin
            if((pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && y_move == (V_VALID - V_PIC - 1) && y_flag == 1'b0) 
            || (pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && y_move == 0 && y_flag == 1'b1)) begin
                y_flag <= ~y_flag ;
            end else begin
                y_flag <= y_flag ;
            end
        end
    end
    // wire    [15:0]  data_pic;
/*****************output signal*******************************************/
    // reg     [15:0]  pix_data  
    assign pix_data = (pic_vald == 1'b1) ? data_pic : data_pix ;
/****************新增代码*******************/
rom_pic rom_pic_insert(
	.address        ( address_w ),
	.clock          ( vga_clk   ),
	.rden           ( rden_w    ),
	.q              ( data_pic  )
);

endmodule 
`timescale 1ns/1ns
module test_top ();
    reg             sys_clk     ;
    reg             sys_rst_n   ;

    wire    [15:00] rgb         ;
    wire            hsync       ;
    wire            vsync       ;


top top_insert(
    .sys_clk            ( sys_clk   ) ,
    .sys_rst_n          ( sys_rst_n ) ,

    .rgb                ( rgb       ) ,
    .hsync              ( hsync     ) ,
    .vsync              ( vsync     ) 
);
    defparam    top_insert.vga_pix_insert_top.H_VALID = 60   , 
                top_insert.vga_pix_insert_top.V_VALID = 50   , 
                top_insert.vga_pix_insert_top.H_PIC   = 10   , 
                top_insert.vga_pix_insert_top.V_PIC   = 10   , 
                top_insert.vga_pix_insert_top.PIC_SIZE= 100  ;


    defparam    top_insert.vga_ctrl_insert_top.H_SYNC  = 10'd2  , 
                top_insert.vga_ctrl_insert_top.H_BACK  = 10'd2  , 
                top_insert.vga_ctrl_insert_top.H_LEFT  = 10'd2  , 
                top_insert.vga_ctrl_insert_top.H_VALID = 10'd60 , 
                top_insert.vga_ctrl_insert_top.H_RIGHT = 10'd2  ,
                top_insert.vga_ctrl_insert_top.H_FORNT = 10'd2  , 
                top_insert.vga_ctrl_insert_top.H_TOTAL = 10'd70 ; 

    defparam    top_insert.vga_ctrl_insert_top.V_SYNC  = 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_BACK  = 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_TOP   = 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_VALID = 10'd50 ,
                top_insert.vga_ctrl_insert_top.V_BOTTOM= 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_FRONT = 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_TOTAL = 10'd60 ;

    parameter   CYCLE = 20 ;
    initial begin
        sys_clk      = 1'b1 ;
        sys_rst_n   <= 1'b0 ;
        #(CYCLE)            ;
        sys_rst_n    = 1'b1 ;
    end
    always #(CYCLE / 2) sys_clk = ~sys_clk ;

endmodule

 FPGA project : rom_vga_jump_第4张图片

你可能感兴趣的:(野火征途pro,fpga开发)