line
小君童靴说头儿给了他一个project,实现给出屏幕上任意两个点,求出这两个点之间直线上的所有的点。觉得这个很好玩,就自己也写了一点code
/*
date : 2014/10/21
version : QuartusII 14.0 + DE1-SOC(cycloneV)
function: 输入两个点 Xmax = 1023 Ymax = 511 ,计算出中间点的坐标 说明 : (1)1023=0x3ff (10bit) 511 = 0x1ff (9bit)
(2)直线方程: y=kx+m ;
(3)第116行 装载Ymin值的时候-1, 要求输入Ymin不可以小于1:如
果这个地方不剪掉1,会导致输出有(Ymax-Ymin)个脉冲的延时
(4)现象三的原因是 144 行的判定方法导致。判定当前点为合适点的
方式是第二次离直线最近,第一次prev2_dm 较大,第三次curr_dm也较大,116
行不减1就无法满足“远,近,远”的判定,从而一直扫到最后都找不到合适点。
(5)本程序的计算方式是最直接的运算,计算量大,浪费硬件资源,更
好的算法等待大家的指点
(6)由于计算输出延时了三个周期,如150行,所以最后三个点无法覆盖到。
*/ module line (
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 signed [:] dx ; // X方向上的变化量
wire signed [:] dy ; //Y方向上的变化量
reg signed [:] line_k ; // 用来存储线条的斜率
reg signed [:] line_m ; // 直线的常数项
reg signed [:] curr_m ; //当前m值
reg [:] curr_dm ; //当前的m偏差量
reg [:] prev1_dm ; //上一次的m偏差量
reg [:] prev2_dm ; //上上一次m的偏差量
reg point_flag ; //找到当前最近点的标志位 wire signed [:] Xmin ;
wire signed [:] Xmax ;
wire signed [:] Ymin ;
wire signed [:] Ymax ; assign dx = xe_in-xs_in; //得出X方向上的差值
assign dy = ye_in-ys_in; //得出Y方向上的差值 //求得所需的直线就在这么一个矩形框内,针对这个矩形框进行运算
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 ; //绝对值函数
function [:] abs (input signed[:] data1, input signed [:] data2 );
abs = (data1>data2) ? (data1-data2):(data2-data1);
endfunction //*********斜率的计算,并且扩大了2^6次方倍,并得出M值的2^6倍的大小******************
always @ (posedge clock)
if(!in_en)
begin
//line_k <= 16'd0 ;
//line_m <= 16'd0 ;
end
else
begin
line_k <= (dy<<)/(dx) ;
line_m <= (ye_in<<) - line_k*xe_in ;
end reg [:] x_cnt ; // X 坐标计数
reg [:] y_cnt ; // Y 坐标计数
//*********************矩形框X方向上计数*********************************
always @ (posedge clock )
if(!reset)
begin
x_cnt <= 'd0 ;
fini_flag <= 'd0 ;
end
else if (in_en) //装载Xmin值
begin
x_cnt <= Xmin + 'd1 ;
fini_flag <= 'd0 ;
end
else if (x_cnt == Xmax) //矩形框扫描完毕
begin
fini_flag <= 'd1 ;
end
else if ((y_cnt==Ymax)||(point_flag)) //列扫描完毕,x+1
begin
x_cnt <= x_cnt + 'd1 ;
fini_flag <= 'd0 ;
end //********************矩形框Y方向上计数 **************
always @ (posedge clock )
if(!reset)
begin
y_cnt <= 'd0 ;
end
else if (in_en) //装载Ymin值
begin
y_cnt <= Ymin - 'd1 ;
end
else if ((y_cnt == Ymax)||(point_flag)) //列扫描完毕重新装载运算
begin
y_cnt <= Ymin ;
end
else begin
y_cnt <= y_cnt + 'd1 ;
end always @ (posedge clock )
if ((!reset) || (in_en))
begin
x_ou <= 'd0 ;
y_ou <= 'd0 ;
point_flag <= 'd0 ;
prev1_dm <= 'd0 ;
prev2_dm <= 'd0 ;
curr_dm <= 'd0 ;
end
else if (!fini_flag)
begin
//point_flag <= 1'd0 ;
curr_m <= (y_cnt<<)-(x_cnt*line_k) ;
prev1_dm <= curr_dm ;
prev2_dm <= prev1_dm;
curr_dm <= abs(curr_m , line_m) ;
if((prev1_dm<curr_dm) &&(prev1_dm < prev2_dm)) //当前点在远离直线,以上一次的点有效
begin
point_flag <= 'd1 ; //找到最近点,x,y跳转,结束x列的查找
prev1_dm <= 'h00 ;
curr_dm <= 'h00 ;
prev2_dm <= 'h00 ;
x_ou <= x_cnt;
y_ou <= y_cnt - 'd3 ;
end
else point_flag <= 'd0 ;
end
else begin
point_flag <= 'd0 ;
prev1_dm <= 'h00 ;
curr_dm <= 'h00 ;
prev2_dm <= 'h00 ;
x_ou <= 'd0 ;
y_ou <= 'd0 ;
end endmodule
附上测试tb
`timescale 1ns/1ps module line_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 ; line U1_line(
.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 = ;
# ;
# ;
in_en = ;
xs_in = ; xe_in= ;
ys_in = ; ye_in= ;
# in_en = ;
# $stop ; end endmodule
其实我听到这个project第一反应是软件中的两个for循环查找差值最小的点,再对应到HDL中想到的是generate,generate写到一半才发现输出怎么办,难道先让结果放到memory里面再慢慢取出来?觉得这么做是不是太繁琐了,于是叉掉重现写。
第二次想到的是用if else 实现软件中的for,写了n久都觉得这个逻辑关系很纠结,if else 都嵌套了。再加一层嵌套就不利于维护了,证明这个架构是不行的。
最后一想不是可以用计数器实现for吗,哎,是不是最近一直在看C,怎么把HDL设计思想和C 想混合了。对于大师来说我的这个思维历程很搞笑,对于菜鸟的我来说是第一次亲身感受到了软硬件代码设计思想的差异—— 以前只是书上说自己没有感触到
line的更多相关文章
- ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id
出现场景:当点击"分类"再返回"首页"时,发生error退出 BUG描述:Caused by: java.lang.IllegalArgumentExcep ...
- Error on line -1 of document : Premature end of file. Nested exception: Premature end of file.
启动tomcat, 出现, ( 之前都是好好的... ) [lk ] ERROR [08-12 15:10:02] [main] org.springframework.web.context.Con ...
- 关于xml加载提示: Error on line 1 of document : 前言中不允许有内容
我是在java中做的相关测试, 首先粘贴下报错: 读取xml配置文件:xmls\property.xml org.dom4j.DocumentException: Error on line 1 of ...
- Eclipse "Unable to install breakpoint due to missing line number attributes..."
Eclipse 无法找到 该 断点,原因是编译时,字节码改变了,导致eclipse无法读取对应的行了 1.ANT编译的class Eclipse不认,因为eclipse也会编译class.怎么让它们统 ...
- Linix登录报"/etc/profile: line 11: syntax error near unexpected token `$'{\r''"
同事反馈他在一测试服务器(CentOS Linux release 7.2.1511)上修改了/etc/profile文件后,使用source命令不能生效,让我帮忙看看,结果使用SecureCRT一登 ...
- [LeetCode] Line Reflection 直线对称
Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given ...
- [LeetCode] Tenth Line 第十行
How would you print just the 10th line of a file? For example, assume that file.txt has the followin ...
- [LeetCode] Max Points on a Line 共线点个数
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- "Installation failed !" in GUI but not in CLI (/usr/bin/winusb: line 78: 18265 Terminated )
"Installation failed !" in GUI but not in CLI (/usr/bin/winusb: line 78: 18265 Terminated ...
- How to build .apk file from command line(转)
How to build .apk file from command line Created on Wednesday, 29 June 2011 14:32 If you don’t want ...
随机推荐
- 射频识别技术漫谈(21)——RC系列射频芯片的天线设计
个人感觉使用RC系列射频芯片开发卡片读写器,主要的关键点有两个,分别涉及硬件和软件.软件上的关键是如何正确设置RC系列射频芯片内部的64个寄存器,硬件上的关键则是RC系列射频芯片的天线设计.天线提供了 ...
- java csv 文件 操作类
一个CSV文件操作类,功能比较齐全: package tool; import java.io.BufferedReader; import java.io.BufferedWriter; impor ...
- ALV的html表头
在ALV的function的exporting里添加属性: I_CALLBACK_HTML_TOP_OF_PAGE = alv_top_of_page 定义form响应上述ALV属性 *&-- ...
- 宣布发布 Windows Azure ExpressRoute,宣告与 Level 3 建立全新的合作伙伴关系并推出关于其他 Azure 服务令人振奋的更新
在我们与世界各地的客户和合作伙伴交谈时,总会听到他们说,希望找到一个提供商帮助他们最大限度地发挥内部部署投资的作用并且能够利用云的灵活性.这是我们构建混合云策略和云操作系统愿景的基本原则.本着我 ...
- hdoj 1247 Hat’s Words(字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 思路分析:题目要求找出在输入字符串中的满足要求(该字符串由输入的字符串中的两个字符串拼接而成)的 ...
- MySQl 存储过程+游标
DROP PROCEDURE IF exists pro_Insertflightplan_stat; create procedure pro_Insertflightplan_stat(exec ...
- 建立&修改视图
一.建立视图 IF OBJECT_ID('Sales.OrderTotalsByYear', 'V') IS NOT NULL DROP VIEW Sales.OrderTotalsByYear; G ...
- UIScrollView的几个要点总结
从你的手指touch屏幕开始,scrollView开始一个timer,如果: 1. 150ms内如果你的手指没有任何动作,消息就会传给subView. 2. 150ms内手指有明显的滑动(一个sw ...
- JavaScript基础知识----基本语法
JavaScript 语句 JavaScript 语句向浏览器发出的命令.语句的作用是告诉浏览器该做什么. 分号 ; 分号用于分隔 JavaScript 语句. 通常我们在每条可执行的语句结尾添加分号 ...
- 简单的webservice
Hi,大家好! 今天主要和大家分享,如何搭建一个Web服务,做Android开发,不可避免会涉及到客户端开发,我们怎么样来实现一个服务端,怎么样来实现一个客户端,并相互传递数据.就算调用别人的服务时, ...