You are on page 1of 23

Khái niệm

- Idle: Không read/write nhưng nội dung bộ nhớ được bảo tồn -> được dùng để giảm power
comsumpsiom

- Master: Dùng để khởi tạo quá trình truyền (ghi) dữ liệu


+ Bộ điều khiển màn hình: nó sẽ đọc dữ liệu từ vùng nhớ chứa dữ liệu đẩy lên màn
hình
+ GPU, CPU

- Slave: Đáp ứng với yêu cầu truyền (có nguồn gốc từ Matsr)
+ SRAM, DRAM, Cache mà CPU, hay DMA sẽ ghi dữ liệu lên đó

- Avalon Bus: Giúp phân xử dữ liệu thực hiện trong hệ thống (Có thể hiểu giống 74138 trong
cấu trúc SRAM môn Kiến trúc BUS). Ngoài ra còn ngắt, giải mã địa chỉ
+ Ví dụ CPU đang truyền dữ liệu (trao đổi) với DRAM thì DMA đâu thể vào được vì
không thể đáp ứng cho DMA -> cần quá trình phân xử
+ Master không được phép truy xuất trực tiếp đến Slave mà phải thông qua Avalon
Bus (hoặc 1 số BUS khác hiện nay)
+ Ngắt khi có 2 master cùng thực hiện thì nó sẽ ngắt 1 trong 2 tùy theo ưu tiên do
Bus thiết lập.
+ Instruction Memory (Slave) dành riêng cho CPU (Master) nên không cần quá trình
phân xử từ Avalon BUS.
+ Avalon sẽ lớn nhỏ tùy hệ thống
+ Tín hiệu giao tiếp với Slave: Read/Write, Chipselect
- Byteenable: đường Bus là 32 bits, mà mình chỉ dùng có 8 bits thôi => Dùng 4 bits dùng cho
byteenable, BE0, BE1, BE2, BE3 quyết định enable đọc ghi 4 byte

- Các tín hiệu giữa Slave với Avalon trong PIO SW, LEDR:
+ ChipSelect:
 Từ Avalon qua Slave
 Lựa chọn Slave
 Tạo ra từ giải mã địa chỉ
+ Xung Clock
 Từ Avalon qua Slave
 Đồng bộ
 Chỉ định các hoạt động đồng thời với nhau
+ Reset
 Thiết lập hệ thống ở trạng thái mặc định
+ Read
 Từ Avalon qua Slave
 Dùng để yêu cầu đọc dữ liệu từ Slave
+ Write
 Từ Avalon qua Slave
 Dùng để yêu cầu ghi dữ liệu từ Slave
+ Readdata
 Từ Slave qua Avalon
 Trả dữ liệu trả về từ Slave cho Avalon
 Read 1bit, còn Readdata là 8-bit, 16-bit hay 32-bit
+ Writedata
 Từ Avalon qua Slave
 Dữ liệu mà Avalon ghi lên Slave
+ Address
 Nếu Slave mình là SRAM thì ta cần tín hiệu địa chỉ để chọn thanh ghi

- So sánh quá trình read/write từ Avalon đến Slave:

+ Cả 2 quá trình như nhau tuy nhiên Readdata sẽ xuất hiện khi có dữ liệu từ Slave
còn Writedata sẽ có dữ liệu trong xuất quá trình write.

- Làm sao Avalon phân biệt được các example:

+ Tín hiệu Write or Read

+ Tín hiệu Wait request hoặc wait được set (mặc định 0)
- Example 14, Latency:

Là delay số chu kỳ đọci, ví dụ tại A nó cho phép đọc thì tại chu kỳ C (chu kỳ thứ 2 sau
A) sẽ có dữ liệu.

Câu hỏi

Vì sao FPGA nhiều chân?


 Khả năng xử lý song song: MCU tại 1 thời diểm chỉ truy xuất đến 1 ô nhớ vì dùng address chung
(bus chung) nhưng ở FPGA một lúc nó có thể truy xuất đồng thời có thể LCD, SRAM, …. Nó sẽ
không bị “nghẹt cổ trai” -> nhiều đường nhỏ xử lý -> nhanh hơn -> performance cao hơn ->
Master và Slave chạy đồng thời.

Vì sao DMA là Master?


 Vì nó khởi tạo quá trình đọc từ nguồn add và ghi sang đích add

Có thể nhiều CS hoạt động cùng lúc không?


 Có. Vì xử lý song song.

Avalon BUS sử dụng chung Readdata và Writedata không?


 Một cái slave nó có thể vừa đọc vừa ghi đồng thời -> bộ nhớ vừa đọc vừa ghi đồng thời: EX:
Bingbong buffer, có 2 vùng nhớ, muốn truyền dữ liệu từ Internet lên màn hình thì mình có vùng
nhớ đệm video, vùng nhớ video mình chưa làm 2. Một vùng cho internet ghi lên chính vùng
nhớ đó, bộ DMA hiển thị dữ liệu lên màn hình sẽ đọc vùng nhớ thứ 2, vùng nhớ 1 và 2 bằng
nhau. Khi mà data nó ghi xong vùng nhớ 1 nó sẽ Sw qua ghi vào vùng nhớ 2 thì DMA sẽ sw đọc
vùng nhớ 1 còn thằng Internet sẽ đọc vùng nhớ 2.

Tại Example 1, vì sao tại A cạnh lên xung clock gởi yêu cầu các tín hiệu điều khiển nhưng tại sao
tới B các tính hiệu mới có gia trị thực sự?
 Có thể hiểu tín hiệu được gửi thông qua flipflop, khi có cạnh lên xung, tín hiệu nằm sẵn ở input
sẽ được đưa qua output, tuy nhiên thực tế mọi flipflop đều có thời gian trễ. Thời gian từ A tới B
hay A tới C đều là thời gian trễ của các tín hiệu.

Tại Example 1, vì sao tín hiệu CS lại có thời gian trễ nhiều hơn?
 Do cần phải qua giải mã địa chỉ
Vì sao đa số tín hiệu chọn tác động mức 0?
 Liên quan đến nhiễu và công suất tiêu thụ, nó sẽ tốn điện nhiều hơn khi active 1. Bên cạnh đó,
mức 1 gần nhiễu hơn.

Vì sao Master không có ChipSelect?


 Vì CS được tạo ra từ Avalon thông qua quá trình giải mã địa chỉ từ Master.
Vì sao cần có Line Buffer?
 Nếu VGA lấy dữ liệu từ SRAM nhanh, cần là có ngay thì không cần. Tuy nhiên, thực tế nó cần vì
dữ liệu lấy ra cho VGA Driver phải đều đều đặn. Đảm bảo sự ổn định vì dữ liệu đầu ra luôn phải
có theo Timing HS,VS

Một vấn đề xảy ra khi HS, VS phụ thuộc vào độ pixel nếu ta hard 1 độ pixel nhất định là một bad
idea. Thêm nữa, nếu Image DMA đọc hình ảnh, nó sẽ cần xác định địa chỉ đầu và độ dài pixel tức
là độ pixel, nó hard như vậy cũng là 1 bad idea. Vậy để giải quyết vấn đề đó ta cần làm gì?
 Cũng như mọi hệ thống đang sử dụng, để giải quyết vấn đề chúng ta cần dùng thanh ghi. EX:
JTAG UART, người ta thiết kế thanh ghi có thể set giá trị bps lên đó và hệ thống sẽ lấy đó để
chạy, khiến cho linh hoạt hơn và tất quả phải qua cấu hình. Thanh ghi (thanh ghi cấu hình) cần
dùng:
+ Thanh ghi lưu trữ giá trị về độ phân giải.
+ Thanh ghi chứa Base address (chứa địa chỉ đầu của add)
+ Thanh ghi Start (stop nếu cần) -> cần để ngăn ngừa nó start liên tục hay bật máy lên cái start -
> vậy thì dữ liệu hay độ phân giải ở đâu để hiện thị

SIMPLE VERILOG CODE OF SLAVE


module switches //no Add, no byteenable
(
input iClk,
input iReset_n,
input iChip_select_n,
input iRead_n,
input [31:0] iSwitches_data, //32 bits này lấy từ bên ngoài
//Và trả dữ liệu về Avalon
//có thể hiểu, slave nằm giữa
//Một bên giao tiếp với Avalon
//Một bên giao tiếp với 32 bits bên ngoài

output reg [31:0] oSwitches_reg //readdata


);
always@(posedge iClk, negedge iReset_n)
begin
if(~iReset_n)
begin
oSwitches_reg <= 32'd0;
end
else
begin
if(~iChip_select_n & ~iRead_n)
begin
oSwitches_reg <= iSwitches_data;
end
end
end
endmodule
module red_leds
(
input iClk,
input iReset_n,
input iChip_select_n,
input iWrite_n,
input [31:0] iRed_leds_data,
output reg [31:0] oRed_leds
);
always@(posedge iClk, negedge iReset_n)
begin
if(~iReset_n)
begin
oRed_leds <= 32'd0;
end
else
begin
if(~iChip_select_n & ~iWrite_n)
begin
oRed_leds <= iRed_leds_data;
end
end
end
endmodule
READ/WRITE MASTER-SLAVE THROUGH AVALON
And lots of examples, please read mnl_avalon_bus_old_but_good.pdf
VIDEO – VGA

640x480
8000x600
1024x768

1pixel = 2bytes
VGA là chuẩn analog nhưng hình ảnh lưu trữ trong máy tính là Digital

Giá trị Pixel được lưu trong Master Registers


Colour Table là bộ chuyển đổi màu nếu có
Muốn đẩy 1 frame(từ pixel đầu tiên đến cuối cùng) ra, thì tín hiệu VS phải xuống mức thấp trong
khoảng thời gian C rồi lên cao trong thời gian F.
- HS để xác định dữ liệu của 1 hàng
- VS để xác định dữ liệu của 1 cây khung
- Màn hình được phân thành từng hàng, khi nào bắt đầu 1 hàng kết thúc 1 hàng là HS quyết
định, còn khi nào bắt đầu và kết thúc 1 khung ảnh trong mà hình thì VS quyết định
- Quét frame ít nhất 30frame/s
- 640x480 là 480 hàng và 640 frame
- Thời gian xuống 0 rồi lên 1 là thời gian để thiết kế hệ thống ổn đinh
- VS sẽ đồng bộ trước HS
- Dấu vô cực trong bảng time là us
- 2 Line Buffer là BingBong Buffer 1 thằng ghi 1 thằng đọc -> Trong kiến trúc Master có tốc độ
ghi nhanh và sử dụng kỹ thuật giả mẫu down sample nên chỉ sử dụng 1 line buffer -> VGA ->
Video DAC
- 24 bits pixel thành 16 bits pixel = RRRRR111 GGGGGG11 BBBBB111 -> Colour Table -> tốc độ
truyền giảm'

Đỏ là yêu cầu, xanh là đường đi


- VGA Driver dùng để tạo ra HS, VS theo số pixel của nó và pixel được lấy từ Line Buffer.
- Ảnh được lưu trữ từng hàng tại SRAM.
- Đầu vào là ảnh được lưu trong bộ nhớ, đầu ra của nó là những pixel được đồng bộ bằng HS,
VS
- DMA đọc hàng ( Hàng được truyền từ SRAM -> ASF sang DMA) rồi đưa qua Line Buffer
(write) rồi qua VGA Driver, dữ liệu đầu ra đó sẽ được gửi đi tương ứng với HS, VS tạo ra.
Xong hàng rồi đọc hàng mới rồi cứ thế.
- Image DMA là trái tim của model
- Có thể thấy DMA gửi 2-pixel nhưng Line Buffer chỉ cho ra 1 pixel tức nó ghi dần từng hàng
từng hàng hay từng pixel. => ghi 2 nhưng đọc 1-pixel trong Line Buffer
- Sau cùng là đầu ra VGA Drive sẽ ra 24 bits.
- Do line Buffer 1 ô là 32bits nên 1 lần ghi nó tăng 1 nhưng với dữ liệu mà DMA Image đọc là
từ SRAM nó có 1 ô 8 bits nên 1 lần đọc nó tăng lên 4 thay vì 1. Chú ý
- Do line Buffer 1 ô là 32bits nên 1 lần ghi nó tăng 1 nhưng với dữ liệu mà DMA Image đọc là
từ SRAM nó có 1 ô 8 bits nên 1 lần đọc nó tăng lên 4 thay vì 1. Chú ý
-

You might also like