OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4106|回复: 0

分享:使用双口ram,来进行vga单色字符显示

[复制链接]

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
发表于 2019-6-18 15:19:04 来自手机 | 显示全部楼层 |阅读模式
// 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
2019-06-18_15.17.53.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 07:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表