中级会员
- 积分
- 479
- 金钱
- 479
- 注册时间
- 2016-1-20
- 在线时间
- 48 小时
|
// Modified by: 正点原子
//****************************************************************************************//
module vga_display(
input sys_clk,
input vga_clk,
input sys_rst_n,
input [ 9:0] pixel_xpos,
input [ 9:0] pixel_ypos,
input [7:0] uart_data,
input uart_en,
output reg [15:0] pixel_data
);
//parameter define
parameter H_DISP = 10'd640;//分辨率——行
parameter V_DISP = 10'd480;//分辨率——列
localparam POS_X = 10'd0;
localparam POS_Y = 10'd0;
localparam WIDTH = 10'd640;//宽度
localparam HEIGHT = 10'd480;//高度
localparam RED = 16'b11111_000000_00000;//字符颜色
localparam BLUE = 16'b00000_000000_11111; //字符区域背景色
localparam BLACK = 16'b00000_000000_00000; //屏幕背景色
reg [15:0] byte_cnt;//MAX 38400
reg [15:0] ram_addr_rd;
//wire define
wire [ 9:0] x_cnt;
wire [ 9:0] y_cnt;
wire [7:0 ] ram_data;
reg uart_en_d0;
reg uart_en_d1;
wire en_flag;
//捕获uart_en上升沿,得到一个时钟周期的脉冲信号
assign en_flag = (~uart_en_d1) & uart_en_d0;
//对发送使能信号uart_en延迟两个时钟周期
always @(posedge vga_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
uart_en_d0 <= 1'b0;
uart_en_d1 <= 1'b0;
end
else begin
uart_en_d0 <= uart_en;
uart_en_d1 <= uart_en_d0;
end
end
ram_2port u_ram_2port(
.clock(vga_clk),
.data(uart_data),
.rdaddress(ram_addr_rd),
.wraddress(byte_cnt),
.wren(en_flag),
.q(ram_data)
);
always @(posedge vga_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
byte_cnt <= 0;
end
else begin
if(en_flag)
begin
if(byte_cnt<80*480-1)
byte_cnt<=byte_cnt+1;
else
byte_cnt<=0;
end
else
;
end
end
//*****************************************************
//** main code
//*****************************************************
assign x_cnt = pixel_xpos - POS_X; //像素点相对于字符区域起始点水平坐标
assign y_cnt = pixel_ypos - POS_Y; //像素点相对于字符区域起始点竖直坐标
//给字符数组赋值,显示汉字“正点原子”,汉字大小为16*16
always @(posedge vga_clk) begin
end
//给不同的区域绘制不同的颜色
always @(posedge vga_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
begin
pixel_data <= BLACK;
ram_addr_rd <= 0;
end
else begin
if((pixel_xpos >= POS_X) && (pixel_xpos < POS_X + WIDTH)
&& (pixel_ypos >= POS_Y) && (pixel_ypos < POS_Y + HEIGHT)) begin
if(ram_data[(pixel_xpos%8)])
pixel_data <= RED; //绘制字符为红色
else
pixel_data <= BLACK; //绘制字符区域背景为蓝色
end
else
pixel_data <= BLACK; //绘制屏幕背景为黑色
if(pixel_xpos==640-1 && pixel_ypos==480-1 )
ram_addr_rd<=0;
else
begin
if(pixel_xpos%8==6 && pixel_xpos>0)//提前1个时钟,不然会部分花屏
ram_addr_rd<=ram_addr_rd+1;
end
end
end
endmodule |
-
|