已解决
FPGA project : rom_vga_jump
来自网友在路上 174874提问 提问时间:2023-09-26 19:00:18阅读次数: 74
最佳答案 问答题库748位专家为你答疑解惑
只有vga_pix 模块代码与rom_vga不同,所以只上传了这个模块的代码与仿真代码。
// #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 definewire rden_w ;wire [13:0] address_w;wire [15:0] data_pic ; // 图片的像素// reg signal definereg [15:0] data_pix; // 10 个彩条reg rden ; // 读使能信号超前图像数据一个时钟周期。reg [13:0] address ; // 在读使能信号拉高,每个时钟周期自加一,0 ~ PIC_SIZE - 1reg 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) beginif(~vga_rst_n) begindata_pix <= 10'h3ff ;end else begin // 有简便写法 ( H_VALID / 10 ) * nif((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 ;elseif((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 ;endend// reg rden ; // wire rden_w ;always @(posedge vga_clk or negedge vga_rst_n) begin if(~vga_rst_n) beginrden <= 1'b0 ;end else beginif(((pix_y >= y_move) && (pix_y <= (y_move + V_PIC - 1))) && ((pix_x >= x_move) && (pix_x <= (x_move + H_PIC - 1)))) beginrden <= 1'b1 ;end else beginrden <= 1'b0 ;endendendassign rden_w = rden ;// reg [13:0] address ;always @(posedge vga_clk or negedge vga_rst_n) beginif(~vga_rst_n) beginaddress <= 0 ;end else beginif(rden == 1'b1) beginif(address == PIC_SIZE - 1) beginaddress <= 0 ;end else beginaddress <= address + 1'b1 ;endend else beginaddress <= address ;endendendassign address_w = address ;// reg pic_vald;always @(posedge vga_clk or negedge vga_rst_n) beginif(~vga_rst_n) beginpic_vald <= 1'b0 ;end else beginpic_vald <= rden ;endend// reg [9:0] x_move ;always @(posedge vga_clk or negedge vga_rst_n) beginif(~vga_rst_n) beginx_move <= 10'd0 ;end else beginif(pix_x == H_VALID - 1 && x_flag == 1'b0 && pix_y == V_VALID - 1) beginx_move <= x_move + 1'b1 ;end else beginif(pix_x == H_VALID - 1 && x_flag == 1'b1 && pix_y == V_VALID - 1) beginx_move <= x_move - 1'b1 ;end else beginx_move <= x_move ;endendendend// reg x_flag ;always @(posedge vga_clk or negedge vga_rst_n) beginif(~vga_rst_n) beginx_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)) beginx_flag <= ~x_flag ;end else beginx_flag <= x_flag ;endendend// reg [9:0] y_move ;always @(posedge vga_clk or negedge vga_rst_n) beginif(~vga_rst_n) beginy_move <= 10'd0 ;end else beginif(pix_x == H_VALID - 1 && y_flag == 1'b0 && pix_y == V_VALID - 1) beginy_move <= y_move + 1'b1 ;end else beginif(pix_x == H_VALID - 1 && y_flag == 1'b1 && pix_y == V_VALID - 1) beginy_move <= y_move - 1'b1 ;end else beginy_move <= y_move ;endendendend// reg y_flag ;always @(posedge vga_clk or negedge vga_rst_n) beginif(~vga_rst_n) beginy_flag <= 1'b0 ;end else beginif((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)) beginy_flag <= ~y_flag ;end else beginy_flag <= y_flag ;endendend// 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 beginsys_clk = 1'b1 ;sys_rst_n <= 1'b0 ;#(CYCLE) ;sys_rst_n = 1'b1 ;endalways #(CYCLE / 2) sys_clk = ~sys_clk ;endmodule
查看全文
99%的人还看了
猜你感兴趣
版权申明
本文"FPGA project : rom_vga_jump":http://eshow365.cn/6-14119-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!