VGA显示正圆
接着上次的随笔,既然VGA时序已经实现了,那么就显示点东西看看吧。
想显示个圆,但是无从下手,参考了这篇文章:https://user.qzone.qq.com/1241003385/blog/1543804422
仔细阅读了这篇文章后才理解所谓显示圆的算法很简单,圆的标准方程是(x - a) ² + (y - b) ² = r ²,只要控制显示范围满足圆的方程就可以了。
当(x-a)2+(y-b)2<=r2区域是圆内,(x-a)2+(y-b)2>=r2的区域就是圆外。
这里显示圆的半径是50个像素点,并且以屏幕正中心为原点所以需要满足条件:
distance = (x-a)*(x-a) + (y-b)*(y-b) = (h_cnt-96-48 -320) *(h_cnt-96-48-320) +(v_cnt-2-33 -240) *(v_cnt-2-33 -240);
其中96,48为行显示区域以外,320为显示行的中心,2,33为场显示区域以外,320为显示列的正中心。
如果distance小于r2=(50)2=2500 ,说明在圆内,否则在圆外。
代码如下:
- module vga_driver(
- clk ,
- rst_n ,
- vga_hys ,
- vga_vys ,
- vga_rgb
- );
- parameter DATA_W = 16;
- parameter LCD_GREEN = 16'b00000_111111_00000;
- parameter LCD_WHITE = 16'b11111_111111_11111;
- input clk ;
- input rst_n ;
- output vga_hys ;
- output vga_vys ;
- output [DATA_W-1:0] vga_rgb ;
- reg vga_hys;
- reg vga_vys;
- reg [DATA_W-1:0]vga_rgb;
- reg [9:0] cnt_hys;
- reg [9:0] cnt_vys;
- reg [19:0] distance;
- reg green_area;
- reg valid_area;
- wire add_cnt_hys;
- wire end_cnt_hys;
- wire add_cnt_vys;
- wire end_cnt_vys;
- wire vga_clk;
- VGA_PLL U0(
- .inclk0 (clk),
- .c0 (vga_clk)
- );
- always @(posedge vga_clk or negedge rst_n)begin
- if(!rst_n)begin
- cnt_hys <= 0;
- end
- else if(add_cnt_hys)begin
- if(end_cnt_hys)
- cnt_hys <= 0;
- else
- cnt_hys <= cnt_hys + 1;
- end
- end
- assign add_cnt_hys = 1;
- assign end_cnt_hys = add_cnt_hys && cnt_hys== 800-1;
- always @(posedge vga_clk or negedge rst_n)begin
- if(!rst_n)begin
- cnt_vys <= 0;
- end
- else if(add_cnt_vys)begin
- if(end_cnt_vys)
- cnt_vys <= 0;
- else
- cnt_vys <= cnt_vys + 1;
- end
- end
- assign add_cnt_vys = end_cnt_hys;
- assign end_cnt_vys = add_cnt_vys && cnt_vys==525-1 ;
- always @(posedge vga_clk or negedge rst_n)begin
- if(rst_n==1'b0)begin
- vga_hys <= 0;
- end
- else if(add_cnt_hys && cnt_hys == 96-1)begin
- vga_hys <= 1;
- end
- else if(end_cnt_hys)begin
- vga_hys <= 0;
- end
- end
- always @(posedge vga_clk or negedge rst_n)begin
- if(rst_n==1'b0)begin
- vga_vys <= 0;
- end
- else if(add_cnt_vys && cnt_vys == 2-1)begin
- vga_vys <= 1;
- end
- else if(end_cnt_vys)begin
- vga_vys <= 0;
- end
- end
- always @(*)begin
- distance = ((cnt_hys-96-48-320)*(cnt_hys-96-48-320))+((cnt_vys-2-33-240)*(cnt_vys-2-33-240));
- end
- always @(*)begin
- green_area = distance < 2500;
- end
- always @(*)begin
- valid_area = cnt_hys >= (96+48)&&cnt_hys <(96+48+640) && cnt_vys >= (2+33)&&cnt_vys<(2+33+480);
- end
- always @(posedge vga_clk or negedge rst_n)begin
- if(rst_n==1'b0)begin
- vga_rgb <= 16'h0;
- end
- else if(valid_area)
- begin
- if(green_area)
- begin
- vga_rgb <= LCD_GREEN;
- end
- else begin
- vga_rgb <= LCD_WHITE;
- end
- end
- else begin
- vga_rgb <= 0;
- end
- end
- endmodule
- 显示效果如下图

- 中间调试的过程中出现过错误,错误的显示效果是:

- 经过排查发现问题出在distance定义的长度上,给distance赋值比自身长度大的数据,导致数据丢失就会产生这样的结果,同样的修改distance的长度反而有意外收获。



VGA显示正圆的更多相关文章
- VGA显示
VGA控制器的编写主要是了解VGA的显示标准和时序,如1024X768@60Hz,确定时钟频率(65MHz=1344X806X60),列像素时间等于时钟周期,扫描从左到右.从上到下(类似于电视扫描PA ...
- 基于FPGA的VGA显示设计(一)
前言 FPGA主要运用于芯片验证.通信.图像处理.显示VGA接口的显示器是最基本的要求了. 原理 首先需要了解 : (1)VGA接口协议:VGA端子_维基百科 .VGA视频传输标准_百度 引脚1 RE ...
- [deviceone开发]-do_ImageView实现正圆的示例
一.简介 我们经常需要用一个正圆形状的图片来设置头像,在do平台这个比较容易,就是通过设置圆角来实现,但是有几个小技巧需要解释一下 主要组件:do_ImageView 二.效果图 三.相关下载 htt ...
- 移动端 css实现自适应正圆 ( 宽高随着手机屏幕宽度自适应 )
序言:应朋友要求随手写了一下移动端 css实现自适应正圆 ( 宽高随着手机屏幕宽度自适应 ) ,以备后用 LESS代码: .adaptive-circle { margin: 50px auto 0; ...
- VmodCAM图像采集 VGA显示
先上图 总体框图 效果图 效果不是很好,因为暂时用的是zedboard自带的VGA,其只能RGB只有3*3*3的彩色度 VmodCAM原理图 VmodCAM的zedboard管脚约束见:http:// ...
- vga显示彩条
vga显示驱动程序可分为扫描行列和行列同步两个部分 //注意:只有在有效区域内给vga赋值才会有颜色变化 assign vga_b = isready ? vga_s[:] :'d0; assign ...
- 基于FPGA的VGA显示静态图片
终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...
- 基于FPGA的Uart接收图像数据至VGA显示
系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...
- 纠错:基于FPGA串口发送彩色图片数据至VGA显示
今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...
随机推荐
- 多线程(三) 同步synchronized
五.同步 1.锁 多线程程序一般是为了完成一些相同的工作而存在的,因此有时间也会共享一些资源,例如对象.变量等等,此时如果不对各个线程进行资源协调,就会出现一些冲突,从而导致程序功能失效.例如下面的示 ...
- Java介绍、环境的搭建及结构化程序
一.Java 简介及环境配置: JDK和JRE的区别:JRE(Java Runtime Environment)Java运行时环境有些程序运行需要Java环境,因此JRE只是给客户端使用的. JDK( ...
- MHA监控进程异常退出(MHA版本:0.56)
最近遇到一个非常诡异的问题,mha后台进程自己中断退出了.以下是报错:Mon Dec 21 20:16:07 2015 - [info] OK.Mon Dec 21 20:16:07 2015 - [ ...
- LINUX笔记之二常用命令(权限管理命令)
1. +增加权限:-去掉权限:=直接赋权. r(4)w(2)x(1) 重点掌握:通过数字授权,例如rxwr-xr--是754 例题:用root用户创建目录并在此目录新建文件,之后更改新文件的权限为77 ...
- http的get与post
1.http请求 http有两种报文,请求报文 (发送请求,可能包含数据)和响应报文(服务器响应请求获取数据).一个http请求报文由请求行,请求头部,空行和请求正文(数据)四个部分组成. HTTP请 ...
- (转载)Ant自动编译打包android项目
1 Ant自动编译打包android项目 1.1 Ant安装 ant的安装比较简单,下载ant压缩包 http://ant.apache.org (最新的为1.9.3版本),下载之后将其解压 ...
- 修改 Linux 服务器时间
1.当前时间 [app@127-0-0-1 shine]$ date Wed Oct 23 11:44:30 CST 2019 2.修改时间 [app@127-0-0-1 shine]$ date - ...
- SpringBoot项目中,WebSocket的使用(观察者设计模式)
1.什么是WebSocket(选择至菜鸟教程(点击跳转),观察者模式) WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和 ...
- K8S容器探针
容器探针 探针是由 kubelet对容器执行的定期诊断.要执行诊断, kubelet 调用由容器实现的 Handler .有三种类型的处理程序: ExecAction :在容器内执行指定命令 ...
- Spring boot之JPA/Hibernate/Spring Data
1.什么是JPA? JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA(Java Per ...