插件支持always块的自动插入,如果用户要插入时序always块,需要在端口声明中标志时钟和异步复位信号(仅支持单时钟域)。
例如:
input mea_clk; // clock
input mea_rst_n; // reset
在末行命令模式下输入Alpp,则会在当前光标下一行,插入:
always @(posedge mea_clk or posedge mea_rst_n) begin
if (mea_rst_n) begin
end
else begin
end
end
同理,Alpn对应(posedge mea_clk or negedge mea_rst_n)
Alnp对应(negedge mea_clk or posedge mea_rst_n)
Alnn对应(negedge mea_clk or negedge mea_rst_n)
Alp对应(posedge mea_clk)
Aln对应(negedge mea_clk)
Al对应always (*) begin
支持一下四种类型的变量声明:
1)时序always块中的寄存器变量reg
2)组合always块中的组合reg变量reg
3)assign语句中的网表wire
4)例化模块的输出端口wire
用户在使用变量是需要在至少一个赋值语句的左边或者右边给出该变量的位宽,例如:
A <= 2'b01;
B[3:0] <= 0;
C[5] = 1'b1;
除非在其它语句给出了更高的位宽,否则变量A,B,C的位宽分别为2,4,6。插件支持参数位宽,位宽需要出现在等式左边,例如:
D[WIDTH:0] = 5;
E[2*WIDTH-1] = 1'b1;
变量D和E的位宽分别为WIDTH+1和2*WIDTH。
插件会在/ * autodefine * /之后声明所有变量。
该功能和Emacs的自动例化非常类似。如果子模块的RTL文件不在当前目录下,需要一个列表文件来提供文件所在路径,列表文件的名字即为当前模块的文件名,扩展名为vc。
例如:
inst0 u0(/ * autoinst * /);
inst1 u1(/ * autoinst * /);
点击Verilog->AutoInst之后,
inst0 u0(/ * autoinst * /
//Inputs
.clk (clk),
.rst_n (rst_n),
.din_valid
(din_valid),
.din (din[7:0]),
//Outputs
.dout_valid
(dout_valid),
.dout (dout[7:0]));
i
在非ANSI
C风格的端口声明之外,还需要声明端口列表。显然这是一项没有意义的工作,由电脑完成更好一些。我们用来代替端口列表。
例如:
module example(/ *autoarg* /);
// comment
input
in_0; //comment
input [PAR0-1:0]
in_bus0; //comment
input
[3:0]
in_bus1; //comment
input
in_1; //comment
input [PAR1-1:0]
in_bus2; //comment
input
in_0_n; //comment
input
随着设计复杂度的增加,在书写代码中枯燥的重复性的劳动会越来越多。例如,例化若干个有上百个端口的子模块,这个工作没有任何创造性可言,而且几乎100%会出错误。在verilog中每用到一个新变量都要实现声明,而一个比较复杂的设计,有成百上千个变量都不稀奇。如果没有一个自动化的辅助书写工具,一个设计者花费在简单重复工作的时间甚至会大于花费在创造性工作上的时间!
对于这个问题Emacs提供了一些非常有用的功能,比如自动例化。可惜,Emacs界面并不十分友好,而且其提供的功能也十分有限。
相对于Emacs,Vim更为普遍,至少我更偏爱Vim。我想花些时间写一个自动化的Verilog编辑插件是很有必要的。
下载地址:
http://www.vim.org/scripts/script.php?script_id=2372
bmp格式的文件就是文件头+RGB数据,所以从bmp文件很容易转成RGB。jpeg图像是编码之后的YUV数据,需要先jpeg解码才能得到YUV数据,至于YUV和RGB的转换,有固定的公式。网上有一套工具YUVviewer可以很方便的在bmp,RGB和YUV之间转换。大家可以去下载。
中值滤波器属于非线性空间滤波器,用于除去图像中的椒盐噪声。中值滤波器只适用于灰度RGB图像(对于YUV图像,应该只需要对Y进行处理),一个有趣现象:对于彩色RGB图像进行中值滤波,得到的输出接近于灰色图像。中值滤波的算法核心就是找出中间值。对于一个3x3的块,只需要找的这样一个值:1)有4个比它小;2)有4个比它大。而不需要进行泡沫排序。对于图像的边界,一般有两种处理方法:边界扩展和不处理。为了跟具有普遍性,此IP不考虑边界问题。
中值滤波器的主要开销在于line buffer,通常line
buffer需要存储图像的一行像素。对于3x3块的滤波,就需要两个line
buffer,这对于大尺寸图像是一笔很大的开销。我认为,对于这个问题有两种解决办法:1)和其它模块共享buffer,实际限制会比较多,也会影响系统的工作频率;2)把大图像分成小块来处理,这样做IO接口的设计会比较复杂,对于带宽也有一定影响。
本文的IP为Slave模式,输入为8bit,支持断续传输。实际应用中,需要设计一个IO
interface。使用了6级流水线,处理速度可以达到1pixel/cycle。
作为一个IP,这个设计可能没有太多价值,毕竟实际情况千差万别。但是,我想,作为一个学习的例子还