基于FPGA驱动VGA显示图片的小问题

         学习VGA显示图片的过程中,遇到了一个小问题,我在显示屏上开了一个60x60的框,放了一张图片进去显示,但是最终的结果如下图所示。

  出现了一个竖黑边,看了看代码,分析了一下逻辑没问题,然而看这个显示那肯定是有问题的,然后仿真了一下看看,时序图如下。

正确的时序

错误的时序

  我这是的是当行计数器记到200和场计数器记到200的时候显示ROM中的数据,在显示屏中开出一个60x60的正方形显示区域,对比上两幅图可得,第二幅图在当行计数器计数到200的时候lcd_data本应该是ROM里的数据,但是却输出的是16’h00,这是因为我原始的代码写的是当行计数器记到200的时候给ROM地址加1,然后有个使能信号将ROM的输出读出,但是实际上行计数记到200的同时ROM地址已经加1,那么ROM的第一个数据就没法读出来,然后从第二个数据开始显示,即每一行的第一个数据都没有给出所以最终会显示出一个竖黑边,那么这个问题怎么解决呢?很简单,就是在行计数器记到199的时候给使能信号,所以当显示屏显示第200个数据的时候,ROM的第一个数据正好读出,代码如下:显示结果如下

 1 //---------------------------------------------
 2 //addra
 3 always @(posedge clk or negedge rst_n)begin
 4     if(!rst_n)
 5         addra <= 16'd0;
 6     else if(addra == 3600 - 1'b1)
 7         addra <= 16'd0;
 8     else if(lcd_x >= 200 && lcd_x < 260 && lcd_y >= 200 && lcd_y < 260)
 9         addra <= addra + 1'b1;
10     else
11         addra <= addra;
12 end
13 
14 //-----------------------------------------------------------------------
15 //pic_en
16 reg     pic_en;
17 always @(posedge clk or negedge rst_n)begin
18     if(!rst_n)
19         pic_en <= 1'b0;
20     else if(lcd_x >= 200 && lcd_x < 260 && lcd_y >= 200 && lcd_y < 260)
21         pic_en <= 1'b1;
22     else 
23         pic_en <= 1'b0;
24 end
25 
26 //-----------------------------------------------------------------------
27 //data_en
28 reg     data_en;
29 always @(posedge clk or negedge rst_n)begin
30     if(!rst_n)
31         data_en <= 1'b0;
32     else if(lcd_x >= 199 && lcd_x < 259 && lcd_y >= 200 && lcd_y < 260)
33         data_en <= 1'b1;
34     else 
35         data_en <= 1'b0;
36 end    
37     
38 //lcd_data    
39 reg     [15:0]    lcd_data_r0;
40 reg     [15:0]    lcd_data_r1;
41     
42 always @(posedge clk or negedge rst_n)begin
43     if(!rst_n)
44         lcd_data_r0 <= 16'b0;
45     else if(lcd_y > 0 && lcd_y <= 150)
46         lcd_data_r0 <= `WHITE;
47     else if(lcd_y > 150 && lcd_y <= 350)
48         lcd_data_r0 <= `GREEN;
49     else if(lcd_y > 350 && lcd_y <= 480)
50         lcd_data_r0 <= `BLUE;
51     else 
52         lcd_data_r0 <= 16'b0;
53 end
54
55 always @(posedge clk or negedge rst_n)begin
56     if(!rst_n)
57         lcd_data_r1 <= 16'b0;
58     else if(pic_en == 1'b1)
59         lcd_data_r1 <= douta;
60     else
61         lcd_data_r1 <= 16'b0;
62 end
63     
64 //assign lcd_data = (pic_en == 1'b1)? `CYAN: lcd_data_r0;//开出一个紫颜色的框
65 
66 assign lcd_data = (pic_en == 1'b1)? lcd_data_r1: lcd_data_r0;
转载请注明出处:NingHeChuan(宁河川)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小鄧子的技术博客专栏

【译】Android技术栈,1#架构

本文是如何开发一款具有扩展性,维护性和测试性的Android应用专题的第一篇。本专题将会涉及到一些设计模式和类库的使用方式,减少Android Develope...

823
来自专栏求索之路

从零开始写一个抖音app——基本架构与MVPs

我的话还是同意正方的观点的,所以我抛弃了使用多年的双手二指禅,花了一周的业余时间练习标准打字指法。现在大家看见的这篇文章就是用标准指法打出来的。速度的话这一周时...

1402
来自专栏码代码的陈同学

Java基础之SPI机制

在前几天的译文 Java中的类加载器 中有部分关于ContextClassLoader的内容,涉及到SPI机制,本文将学习下相关知识。

982
来自专栏ATYUN订阅号

NLP研究者的福音—spaCy2.0中引入自定义的管道和扩展

以前版本的spaCy很难拓展。尤其是核心的Doc,Token和Span对象。他们没有直接实例化,所以创建一个有用的子类将涉及很多该死的抽象(想想FactoryF...

3549
来自专栏冰霜之地

Weex 事件传递的那些事儿

在前两篇文章里面分别谈了Weex如何在Native端初始化的和Weex是如何高效的渲染Native的原生UI的。Native这边还缺一块,那就是Native产生...

1254
来自专栏美团技术团队

细说ReactiveCocoa的冷信号与热信号系列(2)

ReactiveCocoa(简称RAC)是最初由GitHub团队开发的一套基于Cocoa的FRP框架。冷信号与热信号的概念很容易混淆并造成一定的问题。鉴于这个问...

2937
来自专栏跟着阿笨一起玩NET

你可能不需要 jQuery!使用原生 JavaScript 进行开发

  很多的 JavaScript 开发人员,包括我在内,都很喜欢 jQuery。因为它的简单,因为它有很多丰富的插件可供使用,和其它优秀的工具一样,jQuery...

471
来自专栏安智客

图说ARMv8架构特点

ARMv8是ARM重点发展的一个架构。有一些年头了!我们来了解下! 本文介绍了ARMv8-a中的一些概念! ? 从ARMv7开始,ARM公司面向三个市场:应用、...

2297
来自专栏腾讯玄武实验室的专栏

IE 沙箱拖拽安全策略解析

在本文中,笔者将以一个攻击者的视角,尝试各种途径来突破 IE 沙箱的这一安全策略,通过分析所遇到的障碍,达到对IE沙箱拖拽安全策略进行详细解析的目的。

1941
来自专栏前端杂货铺

不要使用浏览器嗅探,尽量使用特性检测和特性模拟

平淡的描述   在js中,能使用特征监测就尽量不要使用浏览器嗅探。嗅探浏览器目的是判断可否使用这个对象或者API,但是抛开浏览器 的各个版本的userAgent...

2905

扫码关注云+社区