幾年前我做了一個sobel過濾器。要做到這一點,我寫了一個管道,讓在每個時鐘週期9個像素:
architecture rtl of matrix_3x3_builder_8b is
type fifo_t is array (0 to 2*IM_WIDTH + 2) of std_logic_vector(7 downto 0);
signal fifo_int : fifo_t;
begin
p0_build_5x5: process(rst_i,clk_i)
begin
if(rst_i = '1')then
fifo_int <= (others => (others => '0'));
elsif(rising_edge(clk_i))then
if(data_valid_i = '1')then
for i in 1 to 2*IM_WIDTH + 2 loop
fifo_int(i) <= fifo_int(i-1);
end loop;
fifo_int(0) <= data_i;
end if;
end if;
end process p0_build_5x5;
data_o1 <= fifo_int(0*IM_WIDTH + 0);
data_o2 <= fifo_int(0*IM_WIDTH + 1);
data_o3 <= fifo_int(0*IM_WIDTH + 2);
data_o4 <= fifo_int(1*IM_WIDTH + 0);
data_o5 <= fifo_int(1*IM_WIDTH + 1);
data_o6 <= fifo_int(1*IM_WIDTH + 2);
data_o7 <= fifo_int(2*IM_WIDTH + 0);
data_o8 <= fifo_int(2*IM_WIDTH + 1);
data_o9 <= fifo_int(2*IM_WIDTH + 2);
end rtl;
在這裏,您閱讀像素的圖像像素來構建你的3x3矩陣。管道填充時間較長,但一旦完成,每個時鐘脈衝都有一個新的矩陣。
每個BlockRAM字中使用了多少位?你使用RGB還是黑白?您也可以使用外部存儲器來存儲圖像(QDR-SSRAM或DDR-SDRAM),並將圖像的一部分複製到本地快速BlockRAM中。該解決方案可擴展至FullHD及以上版本。 – Paebbels
請注意,[Sobel](http://en.wikipedia.org/wiki/Sobel_operator)是一個可分離的過濾器,因此您可以將過濾作爲兩個一維卷積進行。您可以分別處理圖像的行和列,而不是在二維鄰域中加載9個像素。 – dhanushka
該照片是每像素12位,我使用RGB –