You are on page 1of 23

Chương trình học SOC

========================= Buổi đầu ================================


- Nội dung chính:
+ SoPC: System on a Programmable Chip
( Hệ thống trên một chip lập trình được)
Programmable Chip = FPGA: linh kiện thiết kế logic
1. Thiết kế phần cứng: ( Giống như chúng ta thiết kế MCU) bao gồm CPU + Bộ
nhớ +
Các giao tiếp ngoại vi + Các thành phần phần cứng khác.
(AES,FPU,...)
2. Viết phần mềm trên phần cứng đã thiết kế.
* Kiến thức cần thiết:
- Ngôn ngữ thiết kế phần cứng HDL (VHDL, Verilog HDL...)
- Kiến thức hiểu biết về phần cứng: Cấu trúc máy tính, vi điều khiển, sự
phối hợp giữa
các thành phần bên trong một hệ thống.
- Ngôn ngữ C, cách lập trình sao cho hiệu quả( kỹ thuật lập trình,
CTDL&GT)...
- Hệ điều hành(OS).

+ SoC: System on Chip


(Hệ thống trên một chip)
==================5/10/2021======================
1. Phát triển hệ thống nhanh => các hãng FPGA họ tạo ra môi trường tích
hợp hệ
thống dùng các IP sẵn có.
2. CPU + Tập lệnh + Trình biên dịch + HĐH: Được hỗ trợ sẵn bởi hãng sản
xuất.
- FPGA có sẵn các CPU ARM bên trong ( chúng ta đang dùng CPU NIOS)
ARM = Hard core
SoC FPGA
3. Nhờ có FPGA chúng ta có thể phát triển IP riêng cho chúng ta và tích
hợp vào hệ thống
thiết kế.
- Bài tập:
1. Verilog HDL để thực hiện 1 counter 16-bit.
2. Mô phỏng counter dùng modelsim (cộng thêm).
3. Cài đặt tool thiết kế SoPC.
**************************************************************************
*****************
- Tại sao FPGA chậm hơn so với MCU về tốc độ?
Ans: Vì FPGA có nhiều nguồn phải bỏ trống, sinh ra delay nhiều, dẫn đến
tốc độ chậm.
- Tại sao công suất FPGA lớn hơn MCU?
Ans: vì FPGA có nhiều phần hơn, vì phải nuôi nhiều nguồn hơn -> dẫn đến
công suất tiêu thụ bắt buộc phải lớn để nuôi những nguồn ko dùng đến.
- Giá thành FPGA cao hơn.
* MCU nhanh, nhờ tốc độ + lập trình -> linh hoạt.
- FPGA linh hoạt ở phần cứng, MCU linh hoạt ở phần mềm.
* Sự tồn tại của SoPC:
(1) Giá thành
(2) Tốc độ
Nếu chỉ xét về mặc Tích hợp hệ thống: FPGA < MCU
Nhưng quan trọng: Để thiết kế ra IP mới? Giả sử: Verilog HDL cho mã hóa
mật mã.
- CPU: Address, Data, Control Bus dùng chung cho Memory + IO.
Nhưng FPGA thường là riêng.
- FPGA chân nhiều và nối riêng, không dùng chung?
Ans: Khả năng xử lý song song.
- Trở ngại lớn nhất của nhà phát triển FPGA: FPGA (HDL) + MCU (lập trình)
+ OS + Driver
**************************************************************************
*****************
==========================12/10/2021===============================
- ARM bên trong SoC FPGA là hardcore còn NIOS là softcore.
- Tần số hoạt động của hardcore sẽ lớn hơn softcore.

+ Master: Khởi tạo quá trình truyền dữ liệu


+ Slave(bộ nhớ): Đáp ứng với yêu cầu truyền dữ liệu( có nguồn gốc từ
Master). SRAM, DRAM, Cache
+ Avalon Bus Module: đóng vai trò phân xử bus, ngắt, giải mã địa chỉ,...
- Tại sao DMA là Master, mà k phải là Slave?
==> Khởi tạo quá trình đọc từ source, đi qua destination và khởi tạo quá
trình ghi dữ liệu.
- Vd về Master: GPU,
- Master và Slave không kết nối trực tiếp được, mà phải thông qua Avalon.
- FPGA nhiều chân, cặp Master+ Slave chạy đồng thời.
** Đọc EX1/27, EX2/30, EX3/31, EX4/33

=================================2/11/2021===========================
- Giữa 1 slave và Avalon trong Lab3 có các tín hiệu giao tiếp:
1. Chip select: hướng từ Avalon đến Slave, dùng để lựa chọn slave khi chip
select của slave
đó được kích hoạt.
2. Xung clock: từ Avalon --> Slave, đồng bộ kích hoạt hệ thống, làm cho hệ
thống hoạt động đồng thời với nhau.
Điều khiển hệ thống thông qua cạnh lên hoặc cạnh xuống.
3. Reset( tích cực mức 1)/ Reset_n(tích cực mức 0): từ Avalon --> Slave,
được active khi khởi tạo
hệ thống.
4. Read(Read_n): Avalon --> Slave, dùng để xác lập yêu cầu đọc dữ liệu từ
Slave ==> Avalon yêu cầu
đọc dữ liệu từ Slave khi Avalon active tín hiệu read (read_n).
5. Write: Avalon --> Slave, xác lập yêu cầu Avalon muốn ghi dữ liệu vào
Slave.
6. ReadData: từ Slave --> Avalon, là dữ liệu trả về từ Slave cho Avalon.
Read: 1bit, ReadData: 8bit, 16bit, 32bit.
7. WriteData: từ Avalon --> Slave, Avalon dùng WriteData để ghi dữ liệu
lên Slave.
Write: 1bit, WriteData: 8bit, 16bit, 32bit.
8. Address
9. Byte enable: 16 bit = 2byte sẽ có thêm 2 bit gọi BE0 và BE1
=================================9/11/2021===========================
- Chip select do avalon giải mã địa chỉ tạo ra, nên giữa master và avalon
ko có tín hiệu chip select.
- Address từ master gửi ra.
- Hoạt động write với read giống nhau, lưu ý vì hoạt động write chủ động
quá trình truyền dữ liệu, nên
writedata xuất hiện ngay khi yêu cầu writedata được gửi ra, nên writedata
tồn tại suốt trong quá trình
truyền dữ liệu cho đến khi kết thúc. Còn read, lúc đó readdata từ Slave
trở về, nên readdata xuất hiện lúc nào
là do Slave có dữ liệu gửi ra.
- Bài tập: Viết lại code lab3, với đường bus là 64 bit. Thêm address lựa
chọn đường bus nào.

=================================16/11/2021===========================
- Ex 10: Tín hiệu address từ Master gửi xuống Avalon và tín hiệu Address
từ Avalon gửi xuống Slave
có mối liên hệ:
+
write1 = chipselect1 && write
write2 = chipselect2 && write
Chipselect1 và Chipselect2 được tạo ra từ mạch giải mã địa chỉ (giải mã 1
phần trong các tín hiệu
địa chỉ mà master gửi ra)

Master: Gởi ra 4 tín hiệu address A3,A2,A1,A0


4 Slave. Mỗi Slave có 4 thanh ghi ( 4 vị trí đọc/ghi)
Master: A3,A2,A1,A0, Read, write, ReadData, WriteData.
Slave: A1, A0, Read, Write, ReadData, WriteData.

A3 A2
00 -> CS0
01 -> CS1
10 -> CS2
11 -> CS3
A3 A2 A1 A0
0000 Thanh ghi 0 của Slave0: A1 A0 chọn 1 trong 4 thanh ghi của Slave0
0001 Thanh ghi 1 của Slave0
0010 Thanh ghi 2 của Slave0
0011 Thanh ghi 3 của Slave0
0100 Thanh ghi 0 của Slave1
0101 Thanh ghi 1 của Slave1
0101 Thanh ghi 1 của Slave1

Phần địa chỉ cao dùng để giải mã địa chỉ tạo chipselect, còn phần địa chỉ
thấp dùng để
- waitrequest là tín hiệu bắt tay, dùng để thông báo quá trình xử lý khi
Slave xử lí xong, sẽ báo về
cho Avalon, sau đó Avalon báo về cho Master. Tín hiệu waitrequest = 0 thì
readdata sẽ bắt đầu quá trình
lấy dữ liệu.

=================================30/11/2021===========================
Ex16: Tín hiệu Flush: xóa yêu cầu tín hiệu đã được chấp nhận trước đó.
- Video Timing:
Vd: 640x480
1 hàng có 640 pixel
có 480 hàng
- Hoặc là 800x600, 1024x768.
- 1 pixel = 3 byte, gồm 3 thành phần màu R G B
Thường dùng là: 1 pixel = 16bit: 5R 6G 5B
Khi đưa ra màn hình: RRRRR111 GGGGGG11 BBBBB111 (1: tăng độ đậm)
=================================7/12/2021===========================
8-16-32: số bus
Thay vì dùng 1 pixel là 24-bit thì ta giảm xuống dùng 16 bit
RRRRRRRR - GGGGGGGG - BBBBBBBB
8-8-8
thay thành 5-6-5
khi đưa ra DAC
RRRRR111-GGGGGG11-BBBBB111
=> VGA Driver sẽ thêm 3 bit 1 cho R, 2 cho G và 3 cho B
chuyển từ 16-bit thành 24-bit
32-bit
1 lần đọc 32-bit => được 2 pixel
* Line Buffer:
Hỏi:
Line buffer chứa được bao nhiêu byte?
Nhìn theo các tín hiệu ghi (32-bit) và nhìn theo các tín hiệu đọc(16-bit).
Đường Ghi:
input [31:0] data
input [8:0] wraddress;
input wrclock;
input wren;
Đường Đọc:
input [9:0] rdaddress;
input rdclock;
output [15:0] q;
Như vậy:
Ghi 1 lần 4 bytes,
tổng cộng có 9 tín hiệu địa chỉ =>2^9 ô nhớ để ghi
2^9 ô nhớ
mỗi ô là 4 byte
2^9*2^2 byte = 2^11 byte
=2KBytes
------------
Đọc 1 lần 2 byte, có 10 tín hiệu địa chỉ --> có 2^10 ô nhớ để đọc.
Mỗi ô là 2 byte --> 2^10 * 2^1 = 2^11 bytes = 2KBytes

Image DMA
Giao tiếp với Avalon:
readdatavalid,
waitrequest,
address_to_sram,
data_from_sram,
read_to_sram,
Giao tiếp với line buffer:
// line buffer signals
data_to_buffer,
address_to_buffer,
write_to_buffer
Các tín hiệu tương ứng với waveform Ex16/65.
readdatavalid = ,
waitrequest = ,
address_to_sram = address(avalon),
data_from_sram = readdata(avalon),
read_to_sram = read_n(avalon),

Các thanh ghi cần có trong card màn hình:


Thanh ghi lưu trữ giá trị về độ phân giải
Baseaddress (starting address): chứa địa chỉ đầu của ảnh trong bộ nhớ để
image_dma lấy và chạy.
Start (và Stop nếu cần): Control hệ thống để hệ thống biết khi nào chạy,
khi nào ngừng và biết thời điểm để hiển thị dữ liệu.
Cần có thêm thanh ghi Status: phản ánh hệ thống đang làm việc gì.

Giả sử địa chỉ đầu của ảnh trong bộ nhớ là BaseAddress


Thì địa chỉ của Line thứ 0 là ?
Thì địa chỉ của Line thứ 1 là ?
Giả sử độ phân giải là 640x480
(địa chỉ đầu)
(địa chỉ cuối)

Line 0:
Địa chỉ đầu: BaseAddress, cuối: BaseAddress + (640*2) -1
Line 1
Địa chỉ đầu: BaseAddress + (640*2), cuối BaseAddress + (640*4) -1
Mỗi line cách nhau: Số pixel/hàng *2( vì 1 pixel là 2byte)
NPPL: Number Pixel Per Line

Soạn đề cương SOC


Thời gian 60 phút, đề đóng.
1. Khái niệm về hệ thống nhúng.
2. Các thành phần của 01 hệ thống nhúng.
3. các yếu tố ảnh hưởng.
4. Hệ thống nhúng dùng FPGA và MCU.
- Khái niệm FPGA:

5. Giải thích các dạng sóng của Master và Slave(đã học).


Slave Read:
Ex1: page 27: Fundamental Slave Read Transfers
Ex2: page 29: Slave Read Transfer with One Fixed Wait State
Ex3: page 31: Slave Read Transfer with Multiple Fixed Wait States
Ex4: page 33: Slave Read Transfer with Peripheral-Controlled Wait States
Slave Write:
Ex6: page 37: Fundamental Slave Write Transfer(trường hợp lý tưởng).
"Không quan tâm setup-time"
Ex7: page 40: Slave Write Transfer with One Fixed Wait State
Ex8: page 42: Slave Write Transfer with Peripheral-Controlled Wait States.
( wait-request).
Master Read:
- Waitrequest là input.
Ex10: page 49: Master Read Transfer with no Wait State.
A: Các giá trị sau tác động của clk A thì được đưa ra trên bus để gửi cho
avalon.
Cần 1 delay để các giá trị được đưa từ master lên bus, thời gian từ A đến
B là thời gian chuyển mạch của
các thanh ghi bên trong master.
B: Master sẽ gửi ra các tín hiệu address, byteenable và read_n.
C: Avalon sẽ trả dữ liệu trở về.
D: Do wait-request không active, có ý nghĩa là dữ liệu từ avalon trả về đã
có, thì khi đó master sẽ lấy dữ liệu
ở cạnh lên của xung clock tại D và quá trình yêu cầu đọc kết thúc, và
chuẩn bị cho chu kì đọc tiếp theo.
Ex11: page 50: Master Read Transfer with Wait States.
-
Ex16: page 65: Master Read Transfer with Latency
Master Write:
Ex12: page 52: Fundamental Master Write Transfer

Ex13: page 53: Fundamental Master Write Transfer with Two Wait Requests.
-----------------
Ex14: page 58: Slave Read transfer with Latency(thời gian trễ).
- Cạnh lên đầu tiên: bắt đầu hoạt động Read, Avalon sẽ gửi ra address,
read_n, và chipselect.
- Tại cạnh B: vì wait-request active(=1) nên Slave không chấp nhận yêu cầu
đọc từ Avalon, nên Avalon phải duy
trì yêu cầu đọc đó.
- Tại cạnh C: wait-request=0, do đó hàm ý rằng Slave đã chấp nhận yêu cầu
đọc của Avalon.
- Cạnh lên tại D: Vì read_n = 1 và chipselect = 0 nên Avalon không gửi ra
yêu cầu đọc.
- Cạnh lên tại E: Vì read_n = 1 và chipselect = 0 nên Avalon không gửi ra
yêu cầu đọc, nhưng tại cạnh này, Avalon
lấy dữ liệu data1, vì nó delay 2 chu kì.
- Cạnh lên tại G: Vì read_n = 0, chipselect = 1 và wait-request = 0 nên
Slave đã chấp nhận yêu cầu đọc dữ liệu của Avalon.
- Cạnh lên tiếp theo: Vì read_n = 0, chipselect = 1 và wait-request = 0
nên Slave đã chấp nhận yêu cầu đọc dữ liệu của Avalon.
- Cạnh lên tại H: Vì read_n = 1 và chipselect = 0 nên Avalon không gửi ra
yêu cầu đọc, nhưng tại cạnh này, Avalon
lấy dữ liệu data2, vì nó delay 2 chu kì.
- Cạnh lên tại I: Vì read_n = 1 và chipselect = 0 nên Avalon không gửi ra
yêu cầu đọc, nhưng tại cạnh này, Avalon
lấy dữ liệu data3, vì nó delay 2 chu kì.
Ex15: page 60: Slave Read transfers with Variable Latency.

6. Viết 1 slave đơn giản(giống vga_register_bank).


7. Phân tích chức năng của các khối: vga_drive, vga_register_bank,
image_dma, line_buffer. (File Lancelot_User_Manual).
- vga_drive: chuyển 16-bit thành 24-bit và tạo ra HS, VS tương ứng với
timing và lấy số pixel(1 pixel) từ line_buffer để đẩy ra DAC.
- vga_register_bank: chứa các thanh ghi để điều khiển hoạt động của hệ
thống, bao gồm các thanh ghi như sau:
+ Thanh ghi lưu trữ giá trị về độ phân giải
+ Baseaddress (starting address): chứa địa chỉ đầu của ảnh trong bộ nhớ để
image_dma lấy và chạy.
+ Start (và Stop nếu cần): Control hệ thống để hệ thống biết khi nào chạy,
khi nào ngừng và biết thời điểm để hiển thị dữ liệu.
+ Cần có thêm thanh ghi Status: phản ánh hệ thống đang làm việc gì.
- image_dma: có chức năng đọc từng hàng từ bộ nhớ chứa ảnh và ghi vào
line_buffer. Đọc 1 lần 32-bit và ghi 1 lần 32-bit.
- line_buffer: đảm bảo sự ổn định của dữ liệu, vì dữ liệu đưa ra vga_drive
bị ràng buộc chặt chẽ bởi timing.
Line_buffer là bộ nhớ mà nó sẽ đường ghi dô là 32-bit nhưng đường đọc là
16-bit.

https://www.youtube.com/watch?v=DDLR7_B0EBk : soc 9-11


https://www.youtube.com/watch?v=IKfa9oZepLQ : soc 16-11

Soạn câu hỏi cuối kì

Chương 1 Các khái niệm cơ bản

I. Tổng quan về hệ thống nhúng

1. Khái niệm về hệ thống nhúng

Một hệ thống nhúng bao gồm phần cứng và phần mềm và có thể có thêm
một số thành phần khác (về điện tử, cơ khí …) được thiết kế để thực hiện một
chức năng chuyên dụng nào đó. Thông thường thì một hệ thống nhúng là một
thành phần của một hệ thống lớn.
Về mặt lý thuyết, một chức năng chuyên dụng được thực hiện bởi một hệ
thống nhúng nào đó có thể được thực hiện bằng một mạch tích hợp chuyên
dụng tương ứng mà không cần một bộ xử lý (và phần mềm của nó). Tuy nhiên,
một hệ thống nhúng thường có một bộ xử lý và phần mềm sẽ giúp cho chúng
có sự linh hoạt và hiệu quả cần thiết.

2. Các thành phần của một hệ thống nhúng

Về cơ bản, một hệ thống nhúng có các thành phần chung được trình bày như Hình
1.1.
Hình 1.1: Các thành phần chung của một hệ thống
nhúng

Bộ nhớ bao gồm bộ nhớ chỉ đọc (ROM – Read Only Memory) thường được
dùng để chứa chương trình khởi động và các dữ liệu cố định và bộ nhớ truy
xuất ngẫu nhiên (RAM – Random Access Memory) dùng để chứa chương trình
ứng dụng và các kết quả tính toán trung gian. Những hệ thống không cần nhiều
bộ nhớ thì bộ nhớ sẽ tích hợp chung với bộ xử lý vào trong một vi mạch, nếu
một hệ thống cần bộ nhớ thì bộ nhớ sẽ là các vi mạch nhớ riêng biệt với bộ xử
lý.

Ngoài ra, các hệ thống nhúng còn có các giao tiếp vào/ ra. Các giao tiếp
ngõ vào thường là các cảm biến, các tín hiệu truyền thông, các nút nhấn … và
các giao tiếp ngõ ra thường là các bộ hiển thị, các tín hiệu truyền thông, hoặc
các tín hiệu dùng để điều khiển các thành phần khác…

Hình 1.2: Mô hình phần mềm trong một hệ thống nhúng


Các Driver thiết bị là các mô đun phần mềm nhúng chứa các hàm điều khiển
các thiết bị phần cứng tương ứng, điều này giúp chương trình ứng dụng có thể
truy xuất đến phần cứng mà không cần quan tâm đến cấu trúc phần cứng bên
dưới.
Trong một hệ thống nhúng có nhiều chức năng hơn (và phức tạp hơn) thì sẽ
cần thêm một số thành phần nữa chẳng hạn như hệ điều hành thời gian thực
(Real - time operation system - RTOS) và các thư viện hỗ trợ giao tiếp.

3. Các yếu tố ảnh hưởng đến lựa chọn trong thiết kế một hệ thống nhúng

Bên cạnh giá thành của sản phẩm, các yếu tố ảnh hưởng đến thiết kế thường bao gồm
7 yếu tố:

Khả năng xử lý:

Một trong những thông số thể hiện tốc độ xử lý của một bộ xử lý là triệu lệnh
trên giây (Millions of instructions per second – MIPS). Thông thường, nếu
MIPS lớn thì tốc độ xử lý nhanh hơn nếu xét ở cùng một ngữ cảnh (kiến trúc
phần cứng, kiến trúc tập lệnh, kích thước thanh ghi…). Hiện nay, các máy tính
đa năng thường có các bộ xử lý lớn (32-bit, 64-bit) nhưng các hệ thống nhúng
vẫn có thể dùng các bộ xử lý có số bit ít hơn (chẳng hạn như 8-bit, 16-bit).
Bộ nhớ

Một hệ thống nhúng cần bộ nhớ (ROM và RAM) cần để lưu trữ mã lệnh và dữ
liệu cần cho ứng dụng. Người thiết kế cần ước lượng dung lượng bộ nhớ cần
thiết cho phần mềm dự kiến được phát triển. Cũng cần lưu ý là dung lượng bộ
nhớ cần dùng có thể ảnh hưởng đến việc lựa chọn bộ xử lý tương ứng. Bộ xử
lý có các tín hiệu địa chỉ n – bit thì dung lượng bộ nhớ tối đa là 2^n ô nhớ.
Số lượng đơn vị sản phẩm

Giá thành của sản phẩm và giá thành để tạo ra sản phẩm được quyết định chủ
yếu bởi số lượng đơn vị sản phẩm được sản xuất và được bán ra.
Công suất tiêu thụ

Là lượng công suất tiêu thụ trong quá trình hoạt động. Điều này cực kỳ quan
trọng trong các hệ thống nhúng, nhất là các thiết bị cầm tay sử dụng Pin. Một
đơn vị thường dùng để so sánh là mW/MIPS (Miliwatts/MIPS). Giá trị này
càng lớn thì công suất tiêu thụ càng lớn. Việc hướng đến công suất tiêu thụ
thấp còn dẫn đến các đặc trưng khác của các thiết bị cầm tay như ít toả nhiệt,
kích thước Pin nhỏ, nhẹ, kích thước nhỏ và thiết kế cơ khí đơn giản.
Chi phí phát triển sản phẩm

Bao gồm chi phí thiết kế phần mềm và phần cứng.

Thởi gian tồn tại của sản phẩm

Thời gian tồn tại của sản phẩm quyết định tất cả các khía cạnh của thiết kế, từ
việc lựa chọn các thành phần phần cứng, thời gian phát triển hệ thống và sản
xuất ra sản phẩm cho đến giá thành.
Độ tin cậy

Có những loại sản phẩm không cần phải đảm bảo hoạt động đúng 100% thời
gian (ví dụ như đồ chơi của trẻ em…) nhưng có những sản phẩm đòi hỏi độ
chính xác tuyệt đối (ví dụ như các loại khóa cửa …).

Hệ thống nhúng dùng FPGA và MCU

FPGA là một linh kiện logic khả trình chứa mảng hai chiều của các tế bào logic đa năng
(có thể cấu hình thực hiện các chức năng logic khác nhau) và các chuyển mạch có thể lập
trình được.

FPGA
Điểm so sánh Microcontroller

Thiết kế hệ thống phần cứng Rất thấp Rất cao

Rất cao
Thiết kế phần mềm Rất cao

Cao
Giá linh kiện phần cứng Thấp đến trung bình

Tốc độ vận hành Trung bình Cao

Độ cứng của hệ thống Trung bình Cao

Thời gian xoay vòng Cao Trung bình

Câu 5. Giải thích các dạng sóng của Slave và Master đã học.
Slave Read:
Ex1: page 27: Fundamental Slave Read Transfers 

A: Chu kì đầu tiên của đường bus bắt đầu bằng cạnh lên của xung clock.
B: Avalon gửi tín hiệu address và read_n đến cho Slave.
C: Avalon bus giải mã địa chỉ và truyền tín hiệu Chipselect tới Slave.
D: Slave trả về tín hiệu readdata cho Avalon.
E: Avalon lấy tín hiệu readdata ở cạnh lên tiếp theo của xung clock, quá trình đọc dữ liệu
kết thúc.
 Tại đây vì sao lại có chipselect tới vị trí C mới có ?
- Tại vì là do bộ giải mã địa chỉ sinh ra delay nên tới C mới có.

Ex2: page 29: Slave Read Transfer with One Fixed Wait State 
A: Chu kì đầu tiên của đường bus bắt đầu bằng cạnh lên của xung clock.
B: Avalon gửi tín hiệu address và read_n đến cho Slave.
C: Avalon giải mã địa chỉ và truyền tín hiệu chipselect đến Slave
D: Cạnh lên của xung clk đánh dấu sự kết thúc của chu kì đầu tiên và thời gian trễ là 1
chu kì. 
E: Chuẩn bị trả về tín hiệu readdata tại cạnh lên tiếp theo của xung clk.
F: Avalon bus lấy tín hiệu readdata tại cạnh lên này và quá trình đọc dữ liệu kết thúc.
Ex3: page 31: Slave Read Transfer with Multiple Fixed Wait States

A: Chu kì đầu tiên của đường bus bắt đầu bằng cạnh lên của xung clock.
B: Avalon gửi tín hiệu address và read_n đến cho Slave.
C: Avalon giải mã địa chỉ và truyền tín hiệu chipselect đến Slave
D: : Cạnh lên của xung clk đánh dấu sự kết thúc của chu kì đầu tiên và thời gian trễ là 1
chu kì. 
E: Cạnh lên xung clk này đánh dấu thời gian trễ là 2 chu kì.
F: Chuẩn bị trả về tín hiệu readdata khi có cạnh lên thứ 3.
G: Avalon bus lấy tín hiệu readdata tại cạnh lên này và quá trình đọc dữ liệu kết thúc. 
Ex4: page 33: Slave Read Transfer with Peripheral-Controlled Wait States
A: Chu kì đầu tiên của đường bus bắt đầu bằng cạnh lên của xung clock.
B: Avalon gửi tín hiệu address và read_n đến cho Slave.
C: Avalon giải mã địa chỉ và truyền tín hiệu chipselect đến Slave
D: Slave active tín hiệu waitrequest trước cạnh lên tiếp theo của xung clk.
E: Waitrequest vẫn còn ở mức 1.
F-G: Waitrequest vẫn còn ở mức 1.
H: Slave bắt đầu có dữ liệu readdata.
I: Slave sẽ kéo waitrequest xuống.
J: Vì waitrequest được kéo xuống nên Avalon sẽ lấy tín hiệu readdata tại cạnh lên này và
quá trình đọc dữ liệu kết thúc.
Ex14: page 58: Slave Read transfer with Latency(thời gian trễ).
- Cạnh lên đầu tiên: bắt đầu hoạt động Read, Avalon sẽ gửi ra address, read_n, và
chipselect.
- Tại cạnh B: vì wait-request active(=1) nên Slave không chấp nhận yêu cầu đọc từ
Avalon, nên Avalon phải duy trì yêu cầu đọc đó.
- Tại cạnh C: wait-request=0, do đó hàm ý rằng Slave đã chấp nhận yêu cầu đọc của
Avalon.
- Cạnh lên tại D: Vì read_n = 1 và chipselect = 0 nên Avalon không gửi ra yêu cầu đọc.
- Cạnh lên tại E: Vì read_n = 1 và chipselect = 0 nên Avalon không gửi ra yêu cầu đọc,
nhưng tại cạnh này, Avalon lấy dữ liệu data1, vì nó delay 2 chu kì.
- Cạnh lên tại G: Vì read_n = 0, chipselect = 1 và wait-request = 0 nên Slave đã chấp
nhận yêu cầu đọc dữ liệu của Avalon.
- Cạnh lên tiếp theo: Vì read_n = 0, chipselect = 1 và wait-request = 0 nên Slave đã chấp
nhận yêu cầu đọc dữ liệu của Avalon.
- Cạnh lên tại H: Vì read_n = 1 và chipselect = 0 nên Avalon không gửi ra yêu cầu đọc,
nhưng tại cạnh này, Avalon lấy dữ liệu data2, vì nó delay 2 chu kì.
- Cạnh lên tại I: Vì read_n = 1 và chipselect = 0 nên Avalon không gửi ra yêu cầu đọc,
nhưng tại cạnh này, Avalon lấy dữ liệu data3, vì nó delay 2 chu kì.

Ex15: page 60: Slave Read transfers with Variable Latency.


Ở đây khác xíu readdataavalid từ slave trả về, dữ liệu đọc từ slave đã sẵn sang cho
Avalon lấy
A: Ở cạnh lên của chu kì đầu tiên, Avalon sẽ gửi ra yêu cầu đọc bởi tập hợp các địa
chỉ. Tín hiệu read_n chưa đọc dữ liệu, và chipselect chưa chọn slave. Tín hiệu
waitrequest chưa active nên address, byte_enable chỉ chờ để nhận dữ liệu.
Readdatavalid chưa có dữ liệu.
B: waitrequest = 0, read_n = 0, chipselect = 1, nên slave chấp nhận đọc ở địa chỉ
address thứ nhất, trong khi readdatavalid chưa sẵn sàng nên readdata chưa trả về dữ
liệu.
C: waitrequest = 0, read_n = 0, chipselect = 1, nên slave chấp nhận đọc ở địa chỉ
address thứ hai, trong khi readdatavalid chưa sẵn sàng nên readdata chưa trả về dữ
liệu.
D: waitrequest = 1, nên slave chưa chấp nhận đọc ở địa chỉ address thứ 3. 
F: waitrequest = 0, slave chấp nhận yêu cầu đọc ở địa chỉ thứ 3. Readdata valid bật
lên, slave trả về tín hiệu ở readdata, slave đã chuẩn bị dữ liệu xong, avalon sẽ lấy tín
hiệu. Vì tín hiệu đang chờ trả về từ address 1 nên tại F, Slave sẽ trả về Avalon tín hiệu
data 1.
G: waitrequest = 0, slave chấp nhận yêu cầu đọc ở địa chỉ thứ 4. Readdata valid bật
lên, slave trả về tín hiệu ở readdata, slave đã chuẩn bị dữ liệu xong, avalon sẽ lấy tín
hiệu. Vì tín hiệu đang chờ trả về từ address 2 nên tại G, Slave sẽ trả về Avalon tín
hiệu data 2.
H: waitrequest = 0, slave chấp nhận yêu cầu đọc ở địa chỉ thứ 5. Readdata valid bật
lên, slave trả về tín hiệu ở readdata, slave đã chuẩn bị dữ liệu xong, avalon sẽ lấy tín
hiệu. Vì tín hiệu đang chờ trả về từ address 3 nên tại G, Slave sẽ trả về Avalon tín
hiệu data 3.
I: waitrequest = 1, nên slave không chấp nhận yêu cầu đọc địa chỉ. Nhưng vì
readdatavalid vẫn bật lên, nên slave vẫn trả về tín hiệu ở readdata. Vì tín hiệu đang
chờ trả về từ address 4 nên tại I, Slave sẽ trả về Avalon tín hiệu data 4.
J: waitrequest = 1, nên slave không chấp nhận yêu cầu đọc địa chỉ. Read_n = 1,
chipselect = 0 và readdatavalid = 0 nên Slave không trả về tín hiệu.
K: waitrequest = 1, nên slave không chấp nhận yêu cầu đọc địa chỉ. Nhưng vì
readdatavalid  bật lên, nên slave vẫn trả về tín hiệu ở readdata. Vì tín hiệu đang chờ
trả về từ address 5 nên tại K, Slave sẽ trả về Avalon tín hiệu data 5.
Kết thúc quá trình đọc dữ liệu.

Slave Write:
Ex6: page 37: Fundamental Slave Write Transfer(trường hợp lý tưởng). "Không
quan tâm setup-time"

A: Bắt đầu quá trình ghi dữ liệu tại cạnh lên đầu tiên của xung clk.
B: Avalon chuẩn bị truyền các tín hiệu address, byteenable_n và write_n đến Slave.
C: Avalon giải mã địa chỉ và gửi tín hiệu chipselect đến Slave.
D: Tại cạnh lên này, Avalon ghi dữ liệu writedata lên Slave và quá trình ghi kết thúc.
Ex7: page 40: Slave Write Transfer with One Fixed Wait State

A: Bắt đầu quá trình ghi dữ liệu tại cạnh lên đầu tiên của xung clk.
B: Avalon chuẩn bị truyền các tín hiệu address, byteenable_n và write_n đến Slave.
C: Avalon giải mã địa chỉ và gửi tín hiệu chipselect đến Slave.
D: Cạnh lên của clk kết thúc trạng thái chờ đầu tiên và tất cả tín hiệu của slave được giữ
nguyên
E: Tại cạnh lên này, Avalon ghi dữ liệu writedata lên Slave và quá trình ghi kết thúc. 

Ex8: page 42: Slave Write Transfer with Peripheral-Controlled Wait States. ( wait-
request).

A: Bắt đầu quá trình ghi dữ liệu tại cạnh lên đầu tiên của xung clk.
B: Avalon chuẩn bị truyền các tín hiệu address, byteenable_n và write_n đến Slave.
C: Avalon giải mã địa chỉ và gửi tín hiệu chipselect đến Slave.
D: Slave kéo waitrequest xuống trước cạnh lên tiếp theo của xung clock.
E: Waitrequest được active và bắt đầu trạng thái chờ.
F-G: Waitrequest vẫn ở mức 1.
H: Slave bắt tín hiệu writedata.
I: Slave kéo wairequest xuống.
J: Tại cạnh lên này, Avalon ghi dữ liệu writedata lên Slave và quá trình ghi kết thúc. 
Master Read:
- Waitrequest là input.
Ex10: page 49: Master Read Transfer with no Wait State.
A: Các giá trị sau tác động của clk A thì được đưa ra trên bus để gửi cho avalon.
Cần 1 delay để các giá trị được đưa từ master lên bus, thời gian từ A đến B là thời gian
chuyển mạch của các thanh ghi bên trong master.
B: Master sẽ gửi ra các tín hiệu address, byteenable và read_n.
C: Avalon sẽ trả dữ liệu readdata trở về.
D: Do wait-request không active, có ý nghĩa là dữ liệu từ avalon trả về đã có, thì khi đó
master sẽ lấy dữ liệu ở cạnh lên của xung clock tại D và quá trình yêu cầu đọc kết thúc,
và chuẩn bị cho chu kì đọc tiếp theo.
+ Master gửi address qua thì thực chất chia làm hai phần một phần qua mạch giải mã địa
chỉ trong Avalon và tạo CS để lựa chọn slave tương ứng một phần đi qa tạo tín hiệu địa
chỉ để chọn slave

Ex11: page 50: Master Read Transfer with Wait States.


A: 
Ex16: page 65: Master Read Transfer with Latency  

Master Write:
Ex12: page 52: Fundamental Master Write Transfer
A: Tại cạnh lên của xung clock đầu tiên, waitrequest = 1, write_n = 1 nên là Master chưa
chấp nhận yêu cầu ghi dữ liệu mà chỉ kiểm tra yêu cầu ghi dữ liệu từ Avalon.
B: Sau khi delay một khoản thời gian từ A, thì tại B bắt đầu ghi dữ liệu nhưng
waitrequest = 1 nên Master chưa chấp nhận quá trình ghi dữ liệu.
C: Waitrequest = 0, write_n = 0, nên bắt đầu quá trình ghi dữ liệu lên Avalon và quá trình
ghi kết thúc.

Ex13: page 53: Fundamental Master Write Transfer with Two Wait Requests.

Câu 7: Phân tích chức năng của các khối: vga_driver, vga_register_bank,
image_dma, line_buffer.
- vga_driver: chuyển 16-bit thành 24-bit R-G-B bằng cách thêm 3 bit 1 vào R, 2 cho G
và 3 vào B và tạo ra HS, VS tương ứng với timing và lấy số pixel(mỗi lần lấy 1 pixel) từ
line_buffer để đẩy ra DAC và hiển thị hình ảnh.
- vga_register_bank: chứa các thanh ghi để điều khiển hoạt động của hệ thống, để cho
hệ thống có thể đọc được nhiều độ phân giải khác nhau của ảnh, bao gồm các thanh ghi
như sau:
+ Thanh ghi lưu trữ giá trị về độ phân giải.
+ Baseaddress (starting address): chứa địa chỉ đầu của ảnh trong bộ nhớ để image_dma
lấy và chạy.
+ Start (và Stop nếu cần): Control hệ thống để hệ thống biết khi nào chạy, khi nào ngừng
và biết thời điểm để hiển thị dữ liệu.
+ Cần có thêm thanh ghi Status: phản ánh hệ thống đang làm việc gì.
- image_dma: có chức năng đọc từng hàng từ bộ nhớ chứa ảnh và ghi vào line_buffer.
Đọc 1 lần 32-bit và ghi 1 lần 32-bit.
- line_buffer: chứa dữ liệu được ghi vào từ image-dma, đảm bảo sự ổn định của dữ liệu
vì dữ liệu đưa ra vga_driver bị ràng buộc chặt chẽ bởi timing. Dữ liệu được ghi và đọc
tuần tự, không diễn ra ồ ạt. Do dữ liệu phải đồng bộ theo HS,VS nên dữ liệu được đưa
vào và lấy ra của line buffer theo kiểu FIFO.
Line_buffer là bộ nhớ mà nó sẽ có đường ghi dô là 32-bit nhưng đường đọc là 16-bit. 

ĐỀ:
Đối với readdata thì từ slave gửi về Avalon r từ Avalon gửi về master nên đối với master thì readdata thì
là input còn slave là out put

Đối với writedata thì master gửi dữ liệu ra Avalon rồi Avalon gửi về slave cho nên đối với master thì nó là
out put và slave là input

Bài tạp code trong video 8 cuối.

You might also like