四、硬件的设计
本章开始设计滤波器内部的各个部份,说明如下。
4.1 边界处理器
在设计边界处理器之前,我们必须先考虑周期性对称延伸的几种情况。包括有上下周期性对称延伸、左右周期性对称延伸,最后一种则是两个情况同时发生的时候。
先考虑上下周期性对称延伸,发生在指定像素为第一列或是最后一列之任意像素。左右周期性对称延伸,则是发生在指定像素为第一行或是最后一行之任意像素。而两种情况会同时发生在指定像素为图片的四个端点时。
4.1.1 上下周期性对称延伸
要解决上下周期性对称延伸之问题,只要在指定像素为第一列及最后一列时,将DIN_1复制到DIN_3或是将DIN_3复制到DIN_1。在上边界时,必须要等到扫描到第二列才能复制;下边界时,则直接复制从内存读出的数据。
4.1.2 左右周期性对称延伸
与上下周期性对称延伸之问题类似,因此解决方法也类似,只要将所读入的数据贴到左侧或右侧即可。在左边界时,必须要等到扫描到第二行像素时才能复制它当成延伸;在右边界时,想要取得已经扫瞄过的像素当成延伸则需要利用到缓存器。
我们可以发现,必须要等到扫描第二列第二行时,边界处理器才会有第一次的输出(DIN_1、DIN_2与DIN_3是同时输出的)。因此,可设计出如图4.3之架构。
4.1.3 两种情况同时发生
当两种情况同时发生时,延伸之方法如图2.6所表示。
4.2 内存
从图3.6的储存方式来看,虽然扫描时一次是一个像素值,不过利用缓存器并且合成,储存时便可一次存两个像素值,并且可以在输入前取DEven为YU;Dodd为YV。而输出时也可利用缓存器并且做分解,如图4.4所示。
在控制读写方面,需要注意的是当扫描到偶数列时,储存奇数列之内存的读写脚位会一直维持在读的状态;而扫瞄到奇数列时,储存偶数列之内存的读写脚位也会一直维持在读的状态。
4.3 计算处理器
依照图2.4做拆解运算,如图4.5(a)(b)(c),可以看出只需要两个1x3的滤波器和一些缓存器就可以完成图2.4的拆解动作。
因此计算处理器的设计上最为简单,其中大部分是由组合电路所组成。如图4.6所示。
其中的缓存器R1与R2是为了将ALU_1所计算出的结果暂存起来,如图4.7。ALU_1及ALU_2的作用是为了做加权函数的计算,输出为 DIN_1 + 2*DIN_2 + DIN_3 ,但须注意的是ALU_1输出及ALU_2输入位大小的设定,以免发生溢位。最后再将ALU_2的输出向右位移4位(函数计算中的除以16),DOUT即为做完加权计算的Y值。
五、设计与验证之流程
在本章节中,我们将简单的介绍LPF设计流程,接着,会利用一组的测试数据,来验证仿真结果是否正确。
5.1 设计流程
如图5.1所示,一开始先考虑架构之功能,接着使用硬件描述语言Verilog HDL 实现功能之设计,经过编译程序确定语法无误后,再模拟结果。若有问题,则回头寻找错误;若没有问题,则完成全部设计之流程。
5.2 模拟及验证
完成RTL之后,接着要模拟及验证结果是否正确。首先要先将.ppm档转换成.dat档,因为这是Verilog HDL中testbench所能够读取的档案。我们除了用Verilog HDL来模拟421低通滤波器之外,也使用C语言仿真421低通滤波器,并将两者输出之结果储存成.dat档来比较。若结果无误,则转换回.ppm檔。
5.3 波型图
当模拟完成之后,使用Verdi观察波型图。
5.3.1 低通滤波器
图5.3(a)(b)说明了当读取数据为图片的开头之前或结尾之后时,VS会为1;否则为0。当读取数据为图片每行的开头之前或结尾之后时,HS会为1;否则为0。
5.3.2 边界处理器
在之前提到边界处理器需要利用到缓存器并位移。如图5.4所表示,R1、R4、R7、R10分别为DIN_1延迟一个、两个、三个及四个频率周期;R2、R5、R8、R11分别为DIN_2延迟一个、两个、三个及四个频率周期;而R3、R6、R9、R12分别为DIN_3延迟一个、两个、三个及四个频率周期。
图5.4 边界处理器
5.3.3 内存
内存在控制读写方面,需要注意的是当扫描到偶数列时,储存奇数列之内存的读写脚位会一直维持在读的状态;而扫瞄到奇数列时,储存偶数列之内存的读写脚位也会一直维持在读的状态。图5.5(a)是扫描到奇数列时,而图5.5(b)则是为扫描到偶数列时。可注意到WEn的差异性。
图5.5(a) 储存偶数列之内存
图5.5(b) 储存偶数列之内存
5.3.4 计算处理器
可以看出利用缓存器的位移便只需要两个1x3的滤波器即可达到原本要求之函数加权计算。
图5.6 计算处理器