Em chào các bác,
Em là mem mới, đang tập tọe tìm hiểu về Vi điện tử nên trong bài này có chỗ nào "hỏi ngu" mong các bác bỏ qua và tận tình giúp đỡ em với nhé .
Em đang tìm hiểu về loại bộ nhớ FIFO không đồng bộ này. Theo em hiểu thì nó hoạt động với 2 xung đồng hồ khác nhau phục vụ cho việc đọc và ghi dữ liệu vào FIFO riêng rẽ.
Em cũng thử code bằng VHDL theo Guide Asynchronous FIFO 6.1 của Xilinx nhưng còn một số chỗ chưa được hiểu rõ lắm nên muốn hỏi các bác ạ.
Code của em đây:
Mấy chỗ em bôi đen là mấy chỗ em còn đang "lăn tăn" - không biết giải quyết thế nào. Cụ thể là:
- Khi đọc một dữ liệu ra ngoài FIFO thì con trỏ read tăng lên 1 hay vẫn giữ nguyên? (vì theo em hiểu là khi FIFO thực hiện đọc một dữ liệu cũng là lấy dữ liệu ra khỏi FIFO luôn, vậy để lần đọc tiếp theo được thực hiện thì FIFO vẫn ở nguyên vị trí cũ là đọc được phần tử khác, cho đến khi gặp cờ empty)
- Việc truyền dữ liệu và đọc dữ liệu ra khỏi FIFO như em viết trên kia có đúng ko ạ? Đoạn -- writing and reading memory processes
Em mới "vỡ lòng" VHDL được một thời gian thôi nên code còn hạn chế lắm. Các bác xem rồi giúp em với ạ. Em cảm ơn nhiều nhiều
PS: Bác nào có code của thằng này thì gửi lên cho em tham khảo với nhá, em tìm thử trên mạng nhưng không thấy có hoặc toàn code bằng Verilog (mà Verilog thì em mù tịt ). Hoặc các bác cứ hướng dẫn để em tự sửa cũng được
Em là mem mới, đang tập tọe tìm hiểu về Vi điện tử nên trong bài này có chỗ nào "hỏi ngu" mong các bác bỏ qua và tận tình giúp đỡ em với nhé .
Em đang tìm hiểu về loại bộ nhớ FIFO không đồng bộ này. Theo em hiểu thì nó hoạt động với 2 xung đồng hồ khác nhau phục vụ cho việc đọc và ghi dữ liệu vào FIFO riêng rẽ.
Em cũng thử code bằng VHDL theo Guide Asynchronous FIFO 6.1 của Xilinx nhưng còn một số chỗ chưa được hiểu rõ lắm nên muốn hỏi các bác ạ.
Code của em đây:
Code:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity FIFO is generic( DEPTH : natural := 128; WIDTH : natural := 4 ); port( Reset : in std_logic; -- reset to default FIFO wclk : in std_logic; -- write clock rclk : in std_logic; -- read clock DataIn : in std_logic_vector(WIDTH -1 downto 0); -- Data input WriteEnable : in std_logic; -- write enable flag DataOut : out std_logic_vector(WIDTH -1 downto 0); -- Data output ReadEnable : in std_logic; -- read enable flag empty : out std_logic; -- FIFO is empty full : out std_logic -- FIFO is full ); end entity FIFO; architecture structural of FIFO is function bitcount(n : in natural) return natural is variable tmp : unsigned(4 downto 1); variable cnt : natural; begin tmp := conv_unsigned(n, 4); cnt := 4; for dummy in 4 downto 1 loop if (tmp(cnt) = '0') then cnt := cnt -1; end if; end loop; return cnt; end function bitcount; constant ADEPTH : natural := bitcount(DEPTH -1); -- 256 entries: range 255 downto 0 type Memory is array (DEPTH -1 downto 0) of std_logic_vector(WIDTH -1 downto 0); signal Mem : Memory; signal rpt, wpt : unsigned(ADEPTH -1 downto 0); signal wr_cnt,rd_cnt : unsigned(ADEPTH downto 0); begin -- write pointer U1_write_point: process(wclk, Reset) begin if (Reset = '0') then wpt <= (others => '0'); elsif (wclk'event and wclk = '1') then if (WriteEnable = '1') then wpt <= wpt +1; end if; end if; end process U1_write_point; -- read pointer U2_read_point: process(rclk, Reset) begin if (Reset = '0') then rpt <= (others => '0'); elsif (rclk'event and rclk = '1') then if (ReadEnable = '1') then rpt <= rpt +1; end if; end if; end process U2_read_point; -- writing and reading memory processes write_mem: process(wclk) begin if (wclk'event and wclk = '1') then if (WriteEnable = '1') then Mem(conv_integer(wpt)) <= DataIn; -- writing synchronous with write clock end if; end if; end process write_mem; read_mem: process(rclk) begin if (rclk'event and rclk = '1') then if (ReadEnable = '1') then DataOut <= Mem(conv_integer(rpt)); -- synchronous with read clock end if; end if; end process read_mem; -- counting words in fifo count_fifo_write: process(wclk, Reset, wr_cnt, WriteEnable) variable count : unsigned(ADEPTH downto 0); begin count := wr_cnt; if (WriteEnable = '1') then count := count +1; end if; if (Reset = '0') then wr_cnt <= (others => '0'); else wr_cnt <= count; end if; end process count_fifo_write; count_fifo_read: process(rclk, Reset, rd_cnt, ReadEnable) variable count : unsigned(ADEPTH downto 0); begin count := rd_cnt; if (ReadEnable = '1') then count := count +1; end if; if (Reset = '0') then rd_cnt <= (others => '0'); else rd_cnt <= count; end if; end process count_fifo_read; -- status flags empty <= '1' when (wr_cnt = 0) else '0'; full <= wr_cnt(ADEPTH); end architecture structural;
- Khi đọc một dữ liệu ra ngoài FIFO thì con trỏ read tăng lên 1 hay vẫn giữ nguyên? (vì theo em hiểu là khi FIFO thực hiện đọc một dữ liệu cũng là lấy dữ liệu ra khỏi FIFO luôn, vậy để lần đọc tiếp theo được thực hiện thì FIFO vẫn ở nguyên vị trí cũ là đọc được phần tử khác, cho đến khi gặp cờ empty)
- Việc truyền dữ liệu và đọc dữ liệu ra khỏi FIFO như em viết trên kia có đúng ko ạ? Đoạn -- writing and reading memory processes
Em mới "vỡ lòng" VHDL được một thời gian thôi nên code còn hạn chế lắm. Các bác xem rồi giúp em với ạ. Em cảm ơn nhiều nhiều
PS: Bác nào có code của thằng này thì gửi lên cho em tham khảo với nhá, em tìm thử trên mạng nhưng không thấy có hoặc toàn code bằng Verilog (mà Verilog thì em mù tịt ). Hoặc các bác cứ hướng dẫn để em tự sửa cũng được
Comment