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;
Comment