verilog图象翻转大作业工作总结
Verilog部分的工作,我想应该把它分为结构设计和代码书写两部分(不知道我称之为“结构设计”是不是有些小题大做了,但对我来说这是花费了最多心血的一部分);而代码书写的过程和结构设计相比,完全可以称作小菜一碟了,呵呵。
从看到这个功能描述开始,我便开始琢磨如何设计出一套完全可以找到硬件相对应的结构;256×256个象素点如何不用for循环就能实现其转换?我想,这是最核心的问题。可惜这个最核心的问题不是通过我的独立思考得到的最佳答案,而是要感谢老师的启发:计数器!16位的计数器的计数端实际上是在分时给出各象素的序列号!(序列号:从图片的左下到右上依次为0、1、2、…65535)
从计数器上得到了象素的序列号,剩下的工作就是找到旋转后的序列号和原序列号之间的关系了,关键在于找到以序列号标识的每个象素的行号和列号。当然,通过对序列号除以256等的方法也很容易计算出行列号,但我意外的发现,前述那个计数器在给出序列号的同时,其高八位便是该象素的行号(最下面一行的行号为0),低八位是该象素的列号(最左侧一列的列号为0),这个发现实在让我激动了好几天呵呵~ 这样一来,只需要通过『(255-列号)×256+行号』的运算,便可以得到旋转后该象素的序列号,于是便有了图中的shifted_addr这个模块。
序列号之间的转换关系找到了,于是我想把原始图象的数据按顺序存到一个RAM(65536×24bit)中RAM1,将RAM1中的数据按照时钟依次送出到数据总线;送出的数据存入到RAM2中,而存入RAM2的数据的地址由shift_addr这个模块经转换后送出,转存结束后,RAM2的0到65535单元中依次存放着经旋转后的图象的象素信息,将其$fwrite输出即可。
结构设计结束。不知道我描述的是否能看懂,表达能力不好,总觉得说不清楚…汗…
不会用画电路原理图的软件,只好用photoshop画了一个结构图,可以更容易的看清楚各模块的大致功能以及模块和模块之间的联系。
我想这样的结构划分已经尽了我最大的可能将使它们更接近于可综合风格代码(虽然我并不是特别清楚所谓“可综合风格代码”到底是什么概念)。原本想将$fread和$fwrite从纯粹硬件描述的模块(RAM1和RAM2这两块)中分离出来,但最终还是因为找不到接口的方法而放弃了。现在还不太明白的一个地方的是:系统任务和函数应该不是可以综合出电路的吧,那么综合器会怎样处理模块中的这些部分?
关于$fread这个系统函数的使用。对那句“尽信书不如无书”的古语有了深刻的认识。我们初步决定用$fread直接读取bmp文件中的二进制数据。从图书馆的一本书上看到了$fread的格式$fread(file,reg,”%b”),在modelsim中却无论如何也读不进去数据。到google里搜关键词$fread+verilog,看到了各种各样的版本,甚至到IEEE上down了那本传说中的《IEEE Standard Hardware Description Language Based on the Verilog Hardware Description Language(1995)》(可惜没找到IEEE的verilog2001的手册)…经过漫长的查找和尝试,发现$fread(file,reg)这才是这种情况下的可用格式。虽然在$fread这个问题上遇到了很大的障碍,但这个解决问题的过程以及成功后的喜悦是无法比拟的。
写代码的过程还算比较顺利,我想我已经尽我最大的可能将这些代码按照一定的书写风格来写,虽然以我现在简陋的认识,并不是很清楚什么样的风格是最好的,但却已经是我现有水平的最周全考虑了…见笑…希望得到老师的指点谢谢!
这些东西是我们趁元旦放假的三天完成的。准备考试的事便被搁置到了一边。元旦不熄灯,几乎每天都到凌晨才睡。看着问题一个一个被攻克直到最后成功,这样的成就感和开心难以表达~ 史老师的verilog课给了我们两次小组合作去完成一件工作的机会,每一次都让我们有很大很大的收获。非常感谢史老师。
我想,和我从这门verilog课本身学到的东西与得到的快乐相比,明天即将到来的考试如何,已经不重要了。
因为超热爱数字电路,所以超热爱verilog。
黄贝
2007-1-3
Tags: