Professional Documents
Culture Documents
Ôn tập SOC
Ôn tập SOC
=================================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)
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),
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
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.
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.
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…
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ố:
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
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 …).
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
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
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ì.
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
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