写在前面的话
做很多图像算法的时候,我们经常需要用到模板运算(如sobel图像边缘检测、中值滤波、均值滤波等等),处理这些问题的时候,我们可以借助altera提供的移位寄存器IP核来简化我们的设计,从而提高设计效率。本节,梦翼师兄和大家一起学习这个适合用于模板运算的移位寄存器IP核的用法。
功能要求
假设数据在一个ROM中以如下图所示的方式存放,列加行的值作为该数的地址(如e的地址就是8+1=9)。
address |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
0 |
a |
d |
g |
j |
m |
p |
aa |
bb |
8 |
b |
e |
h |
k |
n |
q |
dd |
cc |
16 |
c |
f |
i |
l |
o |
r |
ee |
ff |
24 |
s |
t |
u |
v |
w |
rr |
gg |
hh |
…… |
y |
z |
uu |
vv |
ww |
|
ii |
jj |
在图像处理领域,要实现Sobel或者均值滤波等算法,则需要按照3*3矩阵的格式提取数据,如下图所示:(现在想要每次取出3列数据为一组,如第一列数据:a、b、c 第二列数据:d、e、f 第三列数据:g、h、i)
解决方案:在这儿我想给大家介绍一个叫做Shift_register的 IP核来实现这种功能,而且还有很重要的一点就是我们可以利用这种方法来实现流水线操作,我们暂且就将其看做是移位寄存的“FIFO”吧。
如果我们将该IP核配置成如下图所示的两个“FIFO”,那么我们从ROM中取数的原理就可以用下图表示:
有两个“FIFO”,长度都是8。ROM中的数据从in端口输入,每次地址加一。
用一个计数器cnt作为ROM的地址线,cnt每增加1,ROM就会输出新的数据并通过in[7:0]端口进入shift_register,同时shift_register中的所有数据就会同步向前移位一次,当计数到16时:
下一个时钟到来时候开始同时取值shiftout0、shiftout1、shiftout2
操作步骤
首先建立一个深度为256,字节位宽为8,初始值为0到255的ROM IP核(参考:5.2节)。
接下来设置移位寄存器的IP核:
在右侧的IP核搜索的编辑区,键入shift,在菜单栏中找到并双击【Shift register】
选择语言类型为Verilog,并命名,然后点击【OK】