在DSP项目中,需要读取图像文件并将其加载到用于功能模拟的图像处理算法的VHDL实现。此外,存在许多情况下,在用于板载验证的合成期间将图像加载到FPGA中。
此VHDL教程是告诉您如何在综合或仿真期间可以将图像加载到FPGA的块存储器中的VHDL中的图像。

自从 VHDL无法读取诸如BMP,JPG,TIF等的图像文件,需要将图像转换为二进制文本文件,以便VHDL可以使用Textio VHDL包读取它们。
要将图像转换为二进制文本文件,可以使用MATLAB或C.一旦图像二进制文本文件准备就绪,您可以将其复制到项目文件夹中。
然后,在VHDL中,可以使用以下功能读取二进制文本文件:
-- by FPGA4student.com impure function init_mem(mif_file_name : in string) return mem_type is file mif_file : text open read_mode is mif_file_name; variable mif_line : line; variable temp_bv : bit_vector(DATA_WIDTH-1 downto 0); variable temp_mem : mem_type; begin for i in mem_type'range loop readline(mif_file, mif_line); read(mif_line, temp_bv); temp_mem(i) := to_stdlogicvector(temp_bv); end loop; return temp_mem; end function;
有人指出,您需要在VHDL代码中包含Textio包“使用 std.textio。全部“那么,要将二进制文本文件中的图像数据加载到块内存中,只需将以下行添加到VHDL代码:
signal ram_block: mem_type := init_mem(IMAGE_FILE_NAME);
现在,让我们做一个用于在VHDL中读取图像的示例代码。为简单起见,让我们假设以下是我们从灰度映像转换的二进制文本文件的内容。
00001111 11100000 00000011 10101010 00110011 11001100 11101110 00000000 00001111 11110000 11000011 00000100 11111000 10001000 01111000 10001010
然后,将图像二进制文件另存为“image_file.mif”并将其放到项目文件夹中。现在,编写VHDL代码以读取此图像二进制文本文件,并在合成或仿真期间将其初始化为块内存。
以下是将图像文件读入FPGA的VHDL代码。代码是合成的。
library ieee; 使用 ieee.std_logic_1164.ALL; 使用 ieee.numeric_std.ALL; 使用 std.textio。all; -- FPGA4student.com: FPGA/Verilog/VHDL projects for students -- VHDL tutorial: How to Read images in VHDL entity read_image_VHDL is generic ( ADDR_WIDTH : integer := 4; DATA_WIDTH : integer := 8; IMAGE_SIZE : integer := 15; IMAGE_FILE_NAME : string :="IMAGE_FILE.MIF" ); port( clock: IN STD_LOGIC; data: IN std_logic_vector ((DATA_WIDTH-1) DOWNTO 0); rdaddress: IN STD_logic_vector((ADDR_WIDTH-1) downto 0); wraddress: IN STD_logic_vector((ADDR_WIDTH-1) downto 0); we: IN STD_LOGIC; re: IN STD_LOGIC; q: OUT std_logic_vector ((DATA_WIDTH-1) DOWNTO 0)); end read_image_VHDL; architecture behavioral of read_image_VHDL is TYPE mem_type IS ARRAY(0 TO IMAGE_SIZE) OF std_logic_vector((DATA_WIDTH-1) DOWNTO 0); impure function init_mem(mif_file_name : in string) return mem_type is file mif_file : text open read_mode is mif_file_name; variable mif_line : line; variable temp_bv : bit_vector(DATA_WIDTH-1 downto 0); variable temp_mem : mem_type; begin for i in mem_type'range loop readline(mif_file, mif_line); read(mif_line, temp_bv); temp_mem(i) := to_stdlogicvector(temp_bv); end loop; return temp_mem; end function; signal ram_block: mem_type := init_mem(IMAGE_FILE_NAME); signal read_address_reg: std_logic_vector((ADDR_WIDTH-1) downto 0) := (others=>'0'); begin process (clock) begin if (rising_edge(clock)) then if (we = '1') then ram_block(to_integer(unsigned(wraddress))) <= data; end if; if (re = '1') then q <= ram_block(to_integer(unsigned(rdaddress))); end if; end if; end process; end behavioral;
要验证图像二进制文本文件是否正确读取,让我们在模拟中写一个测试禁止以测试它。以下是在VHDL中读取图像的试验台:
LIBRARY ieee; USE ieee.std_logic_1164.ALL; 使用 ieee.numeric_std.all; -- FPGA4student.com: FPGA/Verilog/VHDL projects for students -- VHDL tutorial: How to Read images in VHDL ENTITY tb_read_image_vhdl IS END tb_read_image_vhdl; ARCHITECTURE behavior OF tb_read_image_vhdl IS COMPONENT read_image_VHDL PORT( clock : IN std_logic; data : IN std_logic_vector(7 downto 0); rdaddress : IN std_logic_vector(3 downto 0); wraddress : IN std_logic_vector(3 downto 0); we : IN std_logic; re : IN std_logic; q : OUT std_logic_vector(7 downto 0) ); END COMPONENT; --Inputs signal clock : std_logic := '0'; signal data : std_logic_vector(7 downto 0) := (others => '0'); signal rdaddress : std_logic_vector(3 downto 0) := (others => '0'); signal wraddress : std_logic_vector(3 downto 0) := (others => '0'); signal we : std_logic := '0'; signal re : std_logic := '0'; --Outputs signal q : std_logic_vector(7 downto 0); -- Clock period definitions constant clock_period : time := 10 ns;
signal i: integer; BEGIN -- Read image in VHDL uut: read_image_VHDL PORT MAP ( clock => clock, data => data, rdaddress => rdaddress, wraddress => wraddress, we => we, re => re, q => q ); -- Clock process definitions clock_process :process begin clock <= '0'; wait for clock_period/2; clock <= '1'; wait for clock_period/2; end process; -- Stimulus process stim_proc: process begin data <= x"00"; rdaddress <= x"0"; wraddress <= x"0"; we <= '0'; re <= '0'; wait for 100 ns; re <= '1'; for i in 0 to 15 loop rdaddress <= std_logic_vector(to_unsigned(i, 4)); wait for 20 ns; end loop; wait; end process; END;
现在,是时候运行模拟并检查图像二进制文本文件是否正确加载到块内存中。下图表明图像被正确读取到FPGA的块RAM中。
要在块存储器中读取图像数据以测试图像处理设计,只需提供读取地址并启用内存读数。以下仿真波形显示二进制文本文件中的图像数据在块RAM的输出端口正确读出。


用于在Verilog中读取图像,可以找到教程 这里.
推荐的 VHDL项目:
1. 什么是fpga? VHDL如何在FPGA上使用
2. FIFO内存的VHDL代码
3. FIR筛选器的VHDL代码
4. 8位微控制器的VHDL代码
5. 矩阵乘法的VHDL代码
6. 用于开关尾圈计数器的VHDL代码
7. FPGA上数字闹钟的VHDL代码
8. 8位比较器的VHDL代码
9. 如何使用VHDL将文本文件加载到FPGA中
10。 D触发器的VHDL代码
11. 完整加法器的VHDL代码
12. VHDL中的PWM发生器,具有可变占空比
13。 ALU的VHDL代码
14。 VHDL代码用于测试台的计数器
15。 16位ALU的VHDL代码
16。 vhdl的变速器设计
17。 VHDL中的非线性查找表实现
18。 VHDL中的加密协处理器设计
推荐的 VHDL项目:
1. 什么是fpga? VHDL如何在FPGA上使用
2. FIFO内存的VHDL代码
3. FIR筛选器的VHDL代码
4. 8位微控制器的VHDL代码
5. 矩阵乘法的VHDL代码
6. 用于开关尾圈计数器的VHDL代码
7. FPGA上数字闹钟的VHDL代码
8. 8位比较器的VHDL代码
9. 如何使用VHDL将文本文件加载到FPGA中
10。 D触发器的VHDL代码
11. 完整加法器的VHDL代码
12. VHDL中的PWM发生器,具有可变占空比
13。 ALU的VHDL代码
14。 VHDL代码用于测试台的计数器
15。 16位ALU的VHDL代码
16。 vhdl的变速器设计
17。 VHDL中的非线性查找表实现
18。 VHDL中的加密协处理器设计
20。 FPGA时钟分频器的VHDL代码
你能帮助我吗?
回复删除我可以'T实施设计。我收到了1警告
先感谢您。
你能分享警告吗?您是否将图像转换为上面的文本格式?
删除此评论已被作者删除。
回复删除