Tải bản đầy đủ (.docx) (19 trang)

Tìm hiểu chi tiết về fifo buffer

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (649.84 KB, 19 trang )

ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA ĐIỆN TỬ-VIỄN THÔNG

BÁO CÁO CHUYÊN ĐỀ KỸ THUẬT
ĐIỆN TỬ
ĐỀ TÀI : FIFO BUFFER

GVHD : Thầy Huỳnh Việt Thắng
NHÓM 4

2.

Đà Nẵng, 2021
1


Lời nói đầu
Ngày nay, việc sử dụng FPGA như một giải pháp cung cấp môi trường làm việc hiệu
quả cho các ứng dụng thực tế. Tính linh động cao trong quá trình thiết kế cho phép
FPGA giải quyết những bài toán phức tạp mà trước kia chỉ thực hiện nhờ phần mềm
máy tính. Ngồi ra, nhờ mật độ cổng logic cao, FPGA được ứng dụng cho những bài
tốn địi hỏi khối lượng tính tốn lớn và cho phép người dùng có khả năng can thiệp
sâu vào hệ thống. Qua quá trình tìm hiểu, nhóm chúng em đã thực hiện được ứng
dụng bộ đệm FIFO trên FPGA nhằm hướng tới việc sử dụng FPGA như một công cụ
để giải quyết bài tốn truyền, nhận và xử lý tín hiệu. Để phục vụ cho múc đích này,
nhóm chúng em đã tìm hiểu chi tiết về FIFO và thực hiện đề tài thiết kế được bộ đệm
dùng ngôn ngữ mô tả phần cúng HVDL dưới đây.

2



I . Giới thiệu về FPGA Basys3 Artix-7:
-

4 cổng Pmod: 3 cổng Pmod 12 chân tiêu chuẩn, 1 cổng Pmod tiêu chuẩn/tín

-

hiệu XADC.
Màn hình 4 chữ số led 7 đoạn.
16 công tắc và 16 đèn led, 5 button.
Cổng kết nối cho USB, bàn phím, thẻ nhớ.
Cổng VGA 12 bit, cổng USB-UART
Cổng USB-JTAG kỹ thuật số để lập trình và giao tiếp FPGA.
Bộ chuyển đổi tương tự- kỹ thuật số trên chip (XADC).

II . Bộ nhớ đệm FIFO:
-

FIFO (First-In-First-Out) là một khối nhớ đệm đặc biệt, r ất hay ứng d ụng
trong các hệ thống truyền dẫn số, dùng làm các khối đệm trong các thi ết
bị lưu trữ.

3


-

Dữ liệu nào ghi vào trước thì được đọc ra trước. Khi được cho phép ghi,
dữ liệu bên ngoài sẽ ghi vào bộ nhớ đệm. Khi có tín hiệu cho phép đ ọc, d ữ
liệu sẽ được đọc từ bộ nhớ đệm ra ngoài theo thứ tự đã ghi. Tùy theo yêu

cầu cụ thể mà FIFO có thể được thiết kế bằng các cách khác nhau.

H1.1 Sơ đồ khái niệm về bộ nhớ đệm FIFO

-

Các thành phần bộ nhớ nằm trong vòng tròn với hai con trỏ write (ghi) và
read (đọc). Đầu tiên ta có 2 con trỏ ghi và đọc ở đầu vòng tròn. Ta tăng
lần lượt con trỏ đọc lên để ghi dữ liệu vào bộ đệm. Sau khi đã ghi được

4


một ơ nhỏ trong vịng trịn ta bắt đầu tăng con trỏ đọc lên để đọc dữ li ệu
ra. Cứ như thế cho hết vòng tròn ta được dữ liệu ra y nh ư giá tr ị d ữ li ệu
-

ban đầu.
Bộ đệm này cũng gồm 2 flags ( cờ ): empty( rỗng ) và full ( đầy).
 Flags full là trạng thái khi con trỏ ghi đã thực hiện ghi dữ liệu được
một vòng tròn và gặp con trỏ đọc tại vịng trịn thứ 2. Nói cách khác,
con trỏ đọc trùng với con trỏ ghi khi vòng quay con tr ỏ ghi l ớn h ơn
con trỏ đọc 1 vịng. Dữ liệu chưa được đọc ra mà đã có tín hi ệu ghi
vào ơ nhớ đó. Khi đó ta sẽ không được phép ghi dữ liệu vào nữa.
 Flags empty: là trạng thái con trỏ đọc trùng v ới con tr ỏ ghi khi c ả 2
con trỏ cùng một vịng. Dữ liệu chưa được ghi vào đã có tín hiệu
đọc ra => xem như dữ liệu cũng bị mất.

H2.2 Mơ hình hoạt động của FIFO


III. MƠ TẢ BÀI TỐN:
-

Thiết kế bộ nhớ đệm FIFO 16 ơ nhớ, mỗi ô nhớ 8 bit bao gồm 2 trang thái
full và empty.

5


-

Bộ nhớ đệm FIFO gồm các module:
 Register file
 Con trỏ ghi (write_pointer)
 Con trỏ đọc (read_pointer)
 2 cờ trạng thái Full (đầy) và Empty (rỗng)

clk
rst
wr
rd
data_in [7:0]

data_out
FIFO buffer

fifo_empty

H 2.1 Sơ đồ các tín hiệu giao tiếp của FIFO
-


-

[7:0]
fifo_full

Ngõ vào input:
 clk: xung clock đọc và ghi dữ liệu.
 rst : reset tích cực mức thấp.
 wr: tín hiệu cho phép ghi dữ liệu vào FIFO.
 rd : tín hiệu chó phép đọc dữ liệu từ FIFO.
 data_in : bus dữ liệu ghi vào
Ngõ ra output:
 data_out: bus dữ liệu được đọc ra
 fifo_full: Fifo báo trạng thái đầy
 fifo_empty: Fifo báo trạng thái rỗng

6


Sơ đồ khối của mạch báo trạng thái full và empty
 rptr [4:0] : địa chỉ của con trỏ đọc
 wptr [4:0] : địa chỉ của con trỏ ghi

Sơ đồ khối của register file
 fifo_wr : tín hiệu cho phép ghi khi bộ nhớ khơng đầy và có tín hiệu wr

7



Sơ đồ khối con trỏ đọc read pointer

Sơ đồ khối con trỏ ghi write pointer

8


III. THỰC HIỆN
3.1 Chương trinh VHDL thực hiện thiết kế
Library IEEE;
USE IEEE.Std_logic_1164.all;
-----------------------------------------------------------------------entity Top_level is
port(
data_out : out std_logic_vector(7 downto 0);
fifo_full, fifo_empty : out std_logic;
clk :in std_logic;
rst: in std_logic;
wr :in std_logic;
rd: in std_logic;
data_in: in std_logic_vector(7 downto 0)
);
end Top_level;
architecture Behavioral of Top_level is
component write_pointer
port(
wptr : out std_logic_vector(4 downto 0);
fifo_wr: out std_logic;
clk :in std_logic;
rst: in std_logic;
wr :in std_logic;

fifo_full: in std_logic
);
end component;
component read_pointer
port(
rptr : out std_logic_vector(4 downto 0);
fifo_rd: out std_logic;
clk :in std_logic;
rst: in std_logic;
rd :in std_logic;
fifo_empty: in std_logic
);
end component;
component register_1
port(
data_out : out std_logic_vector(7 downto 0);
rptr: in std_logic_vector(4 downto 0);
clk :in std_logic;

9


fifo_wr: in std_logic; -- tin hieu cho phep ghi
wptr :in std_logic_vector(4 downto 0);
data_in: in std_logic_vector(7 downto 0)

);
end component;
component state_FIFO
port(

fifo_full, fifo_empty: out std_logic;
wptr, rptr: in std_logic_vector(4 downto 0)
);
end component;
signal empty, full: std_logic;
signal wptr,rptr: std_logic_vector(4 downto 0);
signal fifo_wr,fifo_rd: std_logic;
begin
writee_pointer: write_pointer port map
(
wptr => wptr,
fifo_wr => fifo_wr,
wr => wr,
fifo_full => full,
clk => clk,
rst => rst
);
readd_pointer: read_pointer port map
( rptr => rptr,
fifo_rd => fifo_rd,
rd => rd ,
fifo_empty => empty,
clk => clk,
rst => rst );
register_file: register_1 port map
(
data_out => data_out,
data_in => data_in,
clk => clk,
fifo_wr => fifo_wr,

wptr => wptr,
rptr => rptr
);
state_FIFO_unit: state_FIFO port map
(
fifo_full => full,
fifo_empty => empty,
wptr => wptr,

10


3.2

rptr => rptr
);
fifo_empty <= empty;
fifo_full <= full;
end Behavioral;
CHƯƠNG TRÌNH TEST BENCH MÔ

PHỎNG

3.3

KẾT QUẢ

Sơ đồ tổng hợp phần cứng của bộ nhớ đệm FIFO
Kết quả mô phỏng


11


Dạng sóng mơ phỏng
VI. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI
FIFO là một khối nhớ đệm đặc biệt, có thể được sử dụng cho bất kỳ mục đích nào sau
đây:
-

Chuyển đổi dữ liệu trong các miền Clocks.
Dữ liệu đệm trước khi gửi nó ra khỏi chip (ví dụ DRAM hoặc SRAM).
Buffering dữ liệu cho phần mềm để xem xét tại một số thời gian sau đó.
Lưu trữ dữ liệu để xử lý sau.

Có rất nhiều ứng dụng phải sử dụng tới bộ đệm FIFO như trong các hệ thống
truyền dẫn số, dùng làm các khối đệm trong các thiết bị lưu trữ. Ví dụ điển hình

nhất là khi bạn xem video trên Youtube, trình duyệt sẽ ln load trước nội dung
video vào bộ đềm và từ từ đọc ra để hiển thị. Trong các tác vụ với MCU, chủ
yếu ta sẽ sử dụng bộ đệm để nhận data từ các giao thức truyền như UART, SPI,
I2C,…

12


Tài liệu tham khảo
Xilinx.com
Website: />Pong P.Chu, RTL Hardware design using vhdl coding for efficiency, portability,
and scalability, 2006.


Phụ lục (code)
Register file:
Library IEEE;
USE IEEE.Std_logic_1164.all;
USE ieee.numeric_std.ALL;
---------------------------------------------------entity register_1 is
port(
data_out : out std_logic_vector(7 downto 0);
rptr: in std_logic_vector(4 downto 0);
clk :in std_logic;
fifo_wr: in std_logic;
wptr :in std_logic_vector(4 downto 0);
data_in: in std_logic_vector(7 downto 0)
);
end register_1;
architecture Behavioral of register_1 is
type mem_array is array (0 to 15) of std_logic_vector(7 downto 0);
signal data_out2: mem_array;
begin

13


process(clk)
begin
if(rising_edge(clk)) then
if(fifo_wr ='1') then
data_out2(to_integer(unsigned(wptr(3 downto 0)))) <= data_in;
end if;
end if;

end process;
data_out <= data_out2(to_integer(unsigned(rptr(3 downto 0))));
end Behavioral;
Cờ báo trạng thái FIFO :
Library IEEE;
USE IEEE.Std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
----------------------------------------------------------------------entity state_FIFO is
port(
fifo_full, fifo_empty: out std_logic;
wptr, rptr: in std_logic_vector(4 downto 0)
);
end state_FIFO;
architecture Behavioral of state_FIFO is
signal fbit_comp: std_logic;
signal pointer_equal: std_logic;
signal full, empty: std_logic;
begin
fbit_comp <= wptr(4) xor rptr(4);
pointer_equal <= '1'
when (wptr(3 downto 0) = rptr(3 downto 0)) else '0';
full <= fbit_comp and pointer_equal;

14


empty <= (not fbit_comp) and pointer_equal;
fifo_full <= full;
fifo_empty <= empty;

end Behavioral;

Con trỏ ghi write pointer:
Library IEEE;
USE IEEE.Std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
-------------------------------------------------------------------entity write_pointer is
port(
wptr : out std_logic_vector(4 downto 0);
fifo_wr: out std_logic;
clk :in std_logic;
rst: in std_logic;
wr :in std_logic;
fifo_full: in std_logic
);
end write_pointer;
architecture Behavioral of write_pointer is
signal we: std_logic;
signal write_addr:std_logic_vector(4 downto 0);
begin
fifo_wr <= we;
we <= (not fifo_full) and wr;
wptr <= write_addr;
process(clk,rst)

15


begin

if(rst='0') then
write_addr <= (others => '0');
elsif(rising_edge(clk)) then
if(we='1') then
write_addr <= write_addr + "00001";
end if;
end if;
end process;
end Behavioral;
Con trỏ đọc read pointer:
Library IEEE;
USE IEEE.Std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
---------------------------------------------------entity read_pointer is
port(
rptr : out std_logic_vector(4 downto 0);
fifo_rd: out std_logic;
clk :in std_logic;
rst: in std_logic;
rd :in std_logic;
fifo_empty: in std_logic
);
end read_pointer;
architecture Behavioral of read_pointer is
signal re: std_logic;
signal read_addr:std_logic_vector(4 downto 0);
begin
rptr <= read_addr;


16


fifo_rd <= re ;
re <= (not fifo_empty) and rd;
process(clk,rst)
begin
if(rst ='0') then
read_addr <= (others => '0');
elsif(rising_edge(clk)) then
if(re='1') then
read_addr <= read_addr + "00001";
end if;
end if;
end process;
end Behavioral;

17



×