Tình hình là do mình đang làm luận văn về xử lý ảnh nên chắc sẽ hỏi nhiều ở đây. Hôm nay là vấn đề đầu tiên gặp phải >"<. Mình đang thiết kế khối tách 3 phần R G B ( mỗi phần 8 bits) của từng pixels riêng, data vào đọc từ SRAm 256K x 16 bits nên sẽ có 16 bits, và cũng do 16bits lẻ nên phải đọc 1 lúc 2 điểm ảnh rồi mới tách, chân add_read gửi đến SRAM địa chỉ đọc và lấy data về chân indata. Module mình sẽ có các port như vầy
1 hình 180 * 180 * 3 bytes = 97200 bytes, mỗi lần đọc 2 điểm ảnh tương đương 6 bytes, do đó cần đọc 16200 lần, đọc xong sẽ bỏ chân CEn để ngưng đọc. Như vậy indata đủ 6bytes thì sẽ tách.
Và... ai thấy code sai ở đâu chỉ dùm mình ^^". Các phép toán + * integer gán vào sstd_logic mình đã viết riêng 1 package, nên các bạn đừng thắc mắc, code không báo lỗi, chỉ có mô phỏng ra sai thôi, có lẽ hiểu sai vấn đề >"< . Theo như code thì address mặc định từ ) và sẽ tăng lên từ từ, nhưng address mình o tăng, các chân R G B cũng không đúng luôn T.T
Code:
entity Color_split is port ( CK: in std_logic; indata: in std_logic_vector ( 15 downto 0); g1: out std_logic_vector (7 downto 0); b1: out std_logic_vector (7 downto 0); r1: out std_logic_vector (7 downto 0); g2: out std_logic_vector (7 downto 0); b2: out std_logic_vector (7 downto 0); r2: out std_logic_vector (7 downto 0); add_read: out std_logic_vector ( 17 downto 0); CEn: out std_logic); end Color_split;
Code:
Library ieee; Use ieee.std_logic_1164.all; Use ieee.std_logic_arith.all; Use ieee.std_logic_unsigned.all; USE WORK.MATH.ALL; entity Color_split is port ( CK: in std_logic; indata: in std_logic_vector ( 15 downto 0); g1: out std_logic_vector (7 downto 0); b1: out std_logic_vector (7 downto 0); r1: out std_logic_vector (7 downto 0); g2: out std_logic_vector (7 downto 0); b2: out std_logic_vector (7 downto 0); r2: out std_logic_vector (7 downto 0); add_read: out std_logic_vector ( 17 downto 0); CEn: out std_logic); end Color_split; architecture behav of Color_split is signal x: integer; signal i: integer; signal data1: std_logic_vector ( 15 downto 0); signal data2: std_logic_vector ( 15 downto 0); signal data3: std_logic_vector ( 15 downto 0); begin process (CK) begin if rising_edge (CK) then i <= 0; x<= 3*i; if ( x < 16200) then CEn <= '0'; add_read <=(x + 0); data1 <= indata; add_read <=(x + 1 ); data2 <= indata; add_read <=(x + 2 ); data3 <= indata; b1 <= data1 ( 15 downto 8); g1 <= data1 ( 7 downto 0); r1 <= data2 ( 15 downto 8); b2 <= data2 ( 7 downto 0); g2 <= data3 ( 15 downto 8); r2 <= data3 ( 7 downto 0); i <= i + 1; else CEn <= '1'; end if; end if; end process; end behav;

. Em chưa có kit nên học chay thui,chán chết.Nhưng mà em nghĩ nếu làm xử lý ảnh thì fải xài micro blaze zì đó chứ,cứ VHDL chay thì mệt lắm.
). Không rõ là bạn sử dụng RAM ngoài hay tự tạo ra RAM bên trong board FPGA. Nếu không bắt buộc dùng RAM ngoài thì mình nghĩ bạn nên tự tạo ra RAM 24 bits (8 bits R + 8 bits G + 8 bits B) bên trong FPGA để tiện cho việc lưu giữ và truy xuất dữ liệu màu R, G, B.
Comment