bresenham算法的FPGA的实现2
在上一篇里http://www.cnblogs.com/sepeng/p/4045593.html 《bresenham算法的FPGA的实现1》已经做了一个整体框架的布局,但是那个程序只是支持|k|<1.要想全屏支持,就还需要对这个程序做修改,觉得自己的修改方式很繁琐,期望大家的指点,有高质量的code出现。算法的原理部分在上一篇中已经给出
/*
date:2014/10/23
version : QuartusII + de1-soc cyclone V
designer : pengxiaoen
funtion : 实现bresenham 算法在象限对直线的计算
说明:(1) in_en 至少是2个clock才能保证前面模块数据装载的成功 */ module bresenham (
clock ,
reset ,
xs_in , //输入的X 点的起始坐标
ys_in , // 输入的Y 点的起始坐标
xe_in , //输入X点的终止坐标
ye_in , //输入Y 点的终止坐标
in_en , //当前输入信号有效标志 1:有效 0:无效 x_ou, //输出的X 点的坐标
y_ou, // 输出的Y 点的坐标
fini_flag //计算完成标志位
);
input clock ,reset ;
input in_en ;
input [:] xs_in ,xe_in ;
input [:] ys_in ,ye_in ; output reg [:] x_ou ;
output reg [:] y_ou ;
output reg fini_flag ; wire [:] dx ; // X方向上的变化量
wire [:] dy ; //Y方向上的变化量
reg signed [:] pi ; //算法pi wire [:] Xmin ;
wire [:] Xmax ;
wire [:] Ymin ;
wire [:] Ymax ;
wire x_dir ; //X走向标志
wire y_dir ; //Y走向标志
wire cha_flag ; //coordinate change flag
//
assign x_dir= (xs_in<xe_in)? 'd0 : 1'd1 ; //0: 递增方向
assign y_dir= (ys_in<ye_in)? 'd0 : 1'd1 ; //1: 递减方向
assign Xmin = (xs_in<xe_in)? xs_in : xe_in ;
assign Xmax = (xs_in<xe_in)? xe_in : xs_in ;
assign Ymin = (ys_in<ye_in)? ys_in : ye_in ;
assign Ymax = (ys_in<ye_in)? ye_in : ys_in ; assign dx = Xmax-Xmin; //得出X方向上的差值
assign dy = Ymax-Ymin; //得出Y方向上的差值
assign cha_flag = (dx>dy) ? 'd0:1'd1 ; //0:右手坐标系 1:左手坐标系 reg signed [:] x_cnt ; // 坐标计数 有符号运算
//**********************************************************
always @ (posedge clock )
if(!reset)
begin
x_cnt <= 'd0 ;
fini_flag <= 'd0 ;
end
else if(cha_flag) //旋转,将X与Y 颠倒过来
begin
if(in_en)
begin
x_cnt <= {'b0,ys_in} ;
fini_flag <= 'd0 ;
end
else if (x_cnt==ye_in) // 运算完毕
fini_flag <= 'd1 ;
else x_cnt <= x_cnt + {{{y_dir}},'d1};
end
else
begin
if(in_en)
begin
x_cnt <= xs_in ;
fini_flag <= 'd0 ;
end
else if (x_cnt==xe_in) // 运算完毕
fini_flag <= 'd1 ;
else x_cnt <= x_cnt + {{{x_dir}},'d1};
end //算法的具体实现部分
always @(posedge clock )
if(!reset)
begin
y_ou <= 'd0 ;
x_ou <= 'd0 ;
end
else if ((!fini_flag) && (!in_en)) //运算标志正在运算,并且装载数据完成
begin
if(pi[])
begin
if(cha_flag) //坐标旋转,X,Y 颠倒
begin
pi <= pi+(dx<<) ;
y_ou <= x_cnt[:] ;
end
else
begin
pi <= pi+(dy<<) ;
x_ou <= x_cnt ;
end end
else
begin
if(cha_flag) //坐标旋转,X,Y 颠倒
begin
pi <= pi + (dx<<) - (dy<<) ;
x_ou <= x_ou + {{{x_dir}},'d1};
y_ou <= x_cnt[:] ;
end
else
begin
pi <= pi + (dy<<) - (dx<<) ;
y_ou <= y_ou + {{{y_dir}},'d1};
x_ou <= x_cnt ;
end end
end
else
begin
if(cha_flag) pi<= (dx<<)-dy ; //坐标旋转,X,Y 颠倒
else pi<= (dy<<)-dx ;
y_ou <= ys_in ;
x_ou <= xs_in ;
end endmodule
附上测试代码
`timescale 1ns/1ps module bresenham_tb ; reg clock ,reset ;
reg in_en ;
reg [:] xs_in ,xe_in ;
reg [:] ys_in ,ye_in ; wire [:] x_ou ;
wire [:] y_ou ;
wire fini_flag ; bresenham U1_bresenham(
.clock (clock),
.reset (reset),
.xs_in (xs_in),
.ys_in (ys_in),
.xe_in (xe_in),
.ye_in (ye_in),
.in_en (in_en), .x_ou (x_ou),
.y_ou (y_ou),
.fini_flag (fini_flag)
); always # clock = ~clock ; initial
begin
clock = 'd0 ; reset =1'd0 ; in_en = 'd0 ;
xs_in = 'd0 ; xe_in = 10'd0 ;
ys_in = 'd0 ; ye_in = 9'd0 ; # reset = ;
in_en = ;
xs_in = ; xe_in = ;
ys_in = ; ye_in = ;
# in_en = ;
# ; // k = 1/2 验证 正方向 in_en = ;
xs_in = ; xe_in = ;
ys_in = ; ye_in = ;
# in_en = ;
# ; // k = 1/2 验证 反方向 in_en = ;
xs_in = ; xe_in= ;
ys_in = ; ye_in= ;
# in_en = ; // k = -1/2 验证 正方向
# in_en = ;
xs_in = ; xe_in= ;
ys_in = ; ye_in= ;
# in_en = ; // k = -1/2 验证 反方向
# in_en = ;
xs_in = ; xe_in= ;
ys_in = ; ye_in= ;
# in_en = ; // k = 2 验证
# in_en = ;
xs_in = ; xe_in= ;
ys_in = ; ye_in= ;
# in_en = ; // k = -2 验证
#
$stop ; end endmodule
欢迎大家提出bug 或者修改意见
bresenham算法的FPGA的实现2的更多相关文章
- bresenham算法的FPGA的实现1
接着上一篇的 计算实现给出屏幕上任意两个点,求出这两个点之间直线上的所有的点.http://www.cnblogs.com/sepeng/p/4042464.html 这种直接算法的确是被鄙视了 强大 ...
- 《图形学》实验七:中点Bresenham算法画椭圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
- 《图形学》实验五:改进的Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...
- 《图形学》实验四:中点Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...
- 利用canvas实现的中点Bresenham算法
Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...
- 通过Bresenham算法实现完成矢量线性多边形向栅格数据的转化
1.实验目的与要求 目的:通过本次实验,完成矢量线性多边形向栅格数据的转化过程: 要求:采用VC++6.0实现. 2.实验方法 采用Bresenham算法实现 3.实验材料 直线的定义:y = x/3 ...
- Bresenham算法画填充圆及SDL代码实现
画圆是计算机图形操作中一个非常重要的需求.普通的画圆算法需要大量的浮点数参与运算,而众所周知,浮点数的运算速度远低于整形数.而最终屏幕上影射的像素的坐标均为整形,不可能是连续的线,所以浮点数运算其实纯 ...
- 基于Bresenham算法画圆
bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的 画圆x^2+y^2=R^2 将他分为8个部分,如上图 1. 只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这 ...
随机推荐
- 我的Fedora环境
Fedora现在也更新到了第20个版本,只是在15+以后的版本,大多数操作,都是大同小异的,也不必特意去关注版本号,只有对应到具体的软件,可能会因为库的版本,有或多或少的区别. 之前每次都喜欢按照一些 ...
- 模拟美萍加密狗--Rockey2虚拟狗(二)
按好了WDK,看了一天的DSF例子GenericHID,直接头大了,就能改个VID,PID让美萍识别成R2的狗.其他的什么各种描述符,根本无从下手,怪不得网上没有驱动模拟的加密狗,确实太复杂了,特别像 ...
- cocos2d-x中的尺寸之三
通过上面两个文章的分析,我们在这个博文里做个总结: CCEGLView::getFrameSize()返回的是窗口相对于屏幕像素的尺寸,这个尺寸,只要窗口没变化,值就不会变化 CCDirector:: ...
- File类常用方法
File类是IO中常用的类 先介绍几个常用的方法: public boolean canRead(),public boolean canWrite() 测试当前文件是否可读可写,若是则返回true ...
- beini破解无线
软件介绍 当你的笔记本有无线网卡却不能上网的时刻,也许你会很焦急. 又或许你的隔壁就有无线网络可以接的时刻,但你却由于米有密码而不能上网.下面我将简介一款可以令你惊讶的软件,奶瓶 有了奶瓶以上疑问都可 ...
- 分页:T-SQL存储过程和EF存储过程的使用
首先准备好分页的T-SQL语句: create proc usp_activityFenYe @pageIndex int, @pageSize int, @pageCount int output ...
- ppt类似工具AxeFile使用心得
一个所谓的傻瓜式过渡效果自动生成工具.定义好展示窗口大小,加入时序.所谓的闪烁效果,也是相当的滑稽. 是一个非专业的简单的快速PPT工具. 但是体现的确是扁平化的设计思路,很值得深思. ------ ...
- jquery 上下滑动效果
<script type="text/javascript"> var myar = setInterval('AutoScroll(".li_gundong ...
- java的大数类
java中的大数类,真的很方便,不用自己再写计算的函数,先写一个简单的例子,以后再补充 注意大数初始化的时候,参数十字符型的,如果传进去的变量十一个数字,需要加上一个空字符即:+"" ...
- 「C」 数组、字符串、指针
一.数组 (一)数组 概念:用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. (二)数组的定义 格式: 类型 数组名[元素个数 ...