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

KHỐI SDRAM 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 (441.94 KB, 22 trang )

2. KHỐI SDRAM BUFFER
2.1 SƠ ĐỒ KHỐI
Gồm 2 khối PLL và SDRAM Controller:
Hình 9.1: Sơ đồ khối SDRAM BUFFER
Tên Mô tả
RESET Tín hiệu reset hệ thống
CLK_27 Xung clock 27MHz từ kit DE2
CLK
Xung clock 81MHz PLL đưa ra cho các ngõ vào CLK của khối
SDRAM Controller ( chính là tần số đọc của SDRAM WRITE FIFO,
ghi của SDRAM READ FIFO1 và SDRAM READ FIFO2)
SDR_CLK Xuất xung clock 81MHz cho SDRAM
WR_LOAD
RD1_LOAD
RD2_LOAD
Lần lượt là tín hiệu để xóa bất đồng bộ SDRAM WRITE FIFO,
SDRAM READ FIFO1 và SDRAM READ FIFO2 lấy từ chân RST0
của khối Timer trì hoãn ban đầu.
WR_DATA Dữ liệu ảnh đưa vào SDRAM WRITE FIFO do Desize horizon cấp
WR
Cho phép ghi vào SDRAM WRITE FIFO lấy từ chân DATA_VALID
của khối Desize horizon
WR_CLK Xung clock 27MHz từ chân LLC(TD_CLK) của ADV7181B
RD_WRFIFO Cho phép đọc dữ liệu từ SDRAM WRITE FIFO
WRITE_SIDE[8:0] Số từ (Word) hiện có trong SDRAM WRITE FIFO
DATA_IN
Dữ liệu từ SDRAM WRITE FIFO đưa vào Control Center để ghi
SDRAM.
DATA_OUT[15:0]
Dữ liệu Control Center đọc từ SDRAM để xuất ra ngoài qua 1 trong 2
FIFO: SDRAM READ FIFO1, SDRAM READ FIFO2


RD1
RD2
RD1 = ~ RD2: Lần lượt cho phép đọc dữ liệu từ SDRAM READ
FIFO1, SDRAM READ FIFO2 với sự điều khiển của khối VGA
Cotroller thông qua chân Request và VGA_Y.
RD1_CLK
RD2_CLK
Tần số đọc của SDRAM READ FIFO1 và SDRAM READ FIFO2
được là 27MHz từ KIT DE2
READ_SIDE1[8:0]
Số từ (Word) hiện có trong SDRAM READ FIFO1
READ_SIDE2[8:0] Số từ (Word) hiện có trong SDRAM READ FIFO2
WR_RDFIFO1 Cho phép ghi dữ liệu SDRAM READ FIFO1
WR_RDFIFO2
Cho phép ghi dữ liệu SDRAM READ FIFO2
RD1_DATA[15:0]
RD2_DATA[15:0]
Dữ liệu ngõ ra cung cấp cho khối xử lý ảnh YUV
Các chân DQ[15:0], SA[11:0], CKE, CAS_N, RAS_N, SDR_CLK, WE_N, BA[1:0], CS_N[1:0],
DQM[1:0] thì được nối tương ứng vào chip SDRAM có sẵn trên kit DE2.
2.2 MÔ TẢ
Như ta đã biết 1 frame ảnh theo chuẩn ITU656 bao gồm Odd Field và Even Field: khi xuất
ra màn hình thì các line thuộc Odd Field sẽ được hiển thị ở hàng lẻ, còn các line thuộc Even là
hàng chẵn. Nên các line của 2 Field này phải được xuất xen kẽ nhau nhưng trong chuỗi video
ITU656 do ADV7181B xuất ra thì 2 Field được xuất liên tục: xuất xong Odd Field rồi mới tới
Even Field (các frame khi ghi vào SDRAM thì thành 2 Field liên tục) nên để xuất ra các line xen
kẽ thì ta phải tuần tự xuất 1 line từ địa chỉ mà Odd Field được lưu giữ rồi lại xuất tiếp 1 line từ địa
chỉ mà Even Field được lưu giữ.
Dữ liệu trong một frame ảnh sẽ được ghi lần lượt vào SDRAM từ địa chỉ 0 đến địa chỉ
324480 (324480 = 640 x 507, 507 chính là số line của frame được ghi vào SDRAM ,ta bỏ qua 18

line có bit V =1 ), lúc này phần dữ liệu cần xuất ra từ SDRAM chia thành 2 phần (trong 1 frame
theo chuẩn ITU656 thực sự có tới 487 active line, ta xén bớt 7 active line để giảm số line về chuẩn
hiển thị là 480):
• Phần 1: Từ địa chỉ 8320 (640 x 13) đến 161920 (640 x 253) sẽ là các Pixel thuộc Odd Field. Đây
chính là 240 line từ 23 đến 262 trong frame gốc.
• Phần 2: Từ địa chỉ 170880 (640 x 267) đến 324480 (640 x 507) là các Pixel thuộc Even Field. Đây
chính là 240 line từ 286 đến 525 trong frame gốc.
SDRAM hỗ trợ chế độ truy cập dữ liệu theo từng khối (Burst) với chiều dài khối có thể
thay đổi được nhờ vào cài đặt giá trị 3 bit cuối (BL) của thanh ghi mode register bằng cách truy
cập chế độ load mode rồi nhập giá trị cho thanh ghi này qua các chân địa chỉ:
Ở đây đọc và ghi theo từng khối 128 word 16 bit nên nhập BL = 111: chiều dài của
Burts là full page (tức là 256 word với việc sử dụng SDRAM dưới dạng 4M x 16); WT=0: truy
xuất tuần tự (Sequential) dữ liệu trong khối; LTMODE = 011: thời gian chờ (latency) cho tín
hiệu RAS là 3 chu kỳ;
Các Burst dữ liệu của 2 phần trên sẽ được xuất xen kẽ nhau. Ta khởi tạo và chi xuất địa
chỉ cho các phần này như sau:
if(!RESET_N)
begin
rWR_ADDR <= 0;
rWR_MAX_ADDR <= 640*507;
rRD1_ADDR <= 640*13;
rRD1_MAX_ADDR <= 640*253;
rRD2_ADDR <= 640*267;
rRD2_MAX_ADDR <= 640*507;
//chiều dài của khối cần truy xuất
rWR_LENGTH <= 128;
rRD1_LENGTH <= 128;
rRD2_LENGTH <= 128;
end
else

begin
//nếu đã thực hiện xong tác vụ mWR_DONE, mRD_DONE và có cờ báo thực hiện
tác vụ mới đối với một khối WR_MASK[0], RD_MASK[0], RD_MASK[1] thì tăng địa
chỉ khối lên 1 khối và lặp lại cho đến khi vượt quá địa chỉ tối đa thì quay về địa chỉ ban
đầu.
//ghi vào SDRAM
if(WR_LOAD)
begin
rWR_ADDR <= WR1_ADDR;
rWR_LENGTH <= WR1_LENGTH;
end
else if(mWR_DONE&WR_MASK[0])
begin
if(rWR_ADDR<rWR_MAX_ADDR-rWR_LENGTH)
rWR_ADDR <= rWR_ADDR+rWR_LENGTH;
else
rWR_ADDR <= WR_ADDR;
end
//đọc dữ liệu từ phần 1
if(RD1_LOAD)
begin
rRD1_ADDR <= RD1_ADDR;
rRD1_LENGTH <= RD1_LENGTH;
end
else if(mRD_DONE&RD_MASK[0])
begin
if(rRD1_ADDR<rRD1_MAX_ADDR-rRD1_LENGTH)
rRD1_ADDR <= rRD1_ADDR+rRD1_LENGTH;
else
rRD1_ADDR <= RD1_ADDR;

end
//đọc dữ liệu từ phần 2
if(RD2_LOAD)
begin
rRD2_ADDR <= RD2_ADDR;
rRD2_LENGTH <= RD2_LENGTH;
end
else if(mRD_DONE&RD_MASK[1])
begin
if(rRD2_ADDR<rRD2_MAX_ADDR-rRD2_LENGTH)
rRD2_ADDR <= rRD2_ADDR+rRD2_LENGTH;
else
rRD2_ADDR <= RD2_ADDR;
end
end
Trước hết cần tạo một khối điều khiển việc ghi và đọc SDRAM xen kẽ nhau, mỗi lần đọc
hay ghi dữ liệu sẽ thao tác trên từng Burst có chiều dài là 128 từ (Word) theo thứ tự ưu tiên (chờ
thao tác hiện thời hoàn thành rồi mới thực hiện thao tác tiếp theo):
- Đọc 1 khối từ SDRAM rồi ghi vào SDRAM READ FIFO1 để xuất chuỗi Pixel thuộc Odd Frame.
- Đọc 1 khối từ SDRAM rồi ghi vào SDRAM READ FIFO2 để xuất chuỗi Pixel thuộc Even Frame.
- Ghi 1 khối từ SDRAM WRITE FIFO vào SDRAM.
Ở trên ta thực hiện 3 thao tác xen kẽ nhau, vì vậy để dữ liệu có thể đồng bộ nhập, xuất dữ
liệu với các khối khác thì phải cung cấp tần số làm việc cho SDRAM và tần số truy xuất dữ liệu
giữa các khối FIFO và SDRAM gấp 3 lần tần số clock của các khối khác. Để tạo các xung clock
này ta sử dụng thư viện của Quartus để tạo khối PLL :
Phần Menu >> Tools >> MegaWizard Plug_in Manager… >> Create… tạo một custom
mới, đặt tên là SDRAM_PLL, chọn phần I/O >> ALTCLKILOCK, ta không sử dụng các chân
đồng bộ mà chỉ nhập các thông số cho tần số ngõ vào và tần số ngõ ra như sau: inclk0 là 27MHz;
c0 chọn tần số là 81MHz với pha ban đầu là 0; c1 tần số là 81 MHz với pha ban đầu trễ 3ns (bù trừ
với khảng thời gian điều khiển các tín hiệu đồng bộ để truy cập SDRAM).

Chân c0 sẽ cung cấp tần số đọc tần số cho SDRAM WRITE FIFO để ghi dữ liệu vào
SDRAM, tần số ghi cho SDRAM READ FIFO1 và SDRAM READ FIFO2 để ghi dữ liệu được
xuất ra từ SDRAM. Chân c1 cung cấp tần số làm việc cho SDRAM.
Đồng thời khi thực hiện 1 tác vụ ta cần phải trì hoãn các tác vụ khác một khoảng thời gian
được mô tả theo giãn đồ sau (chưa xét tác động của RD1 và RD2):
Hình 9.2: Giản đồ định thì cho chu kỳ truy xuất giữa SDRAM và các FIFO
Vì vậy để đảm bảo truy xuất đúng dữ liệu thì cần phải có các FIFO có chiều dài 384 ( tức
là 128 x 3 ). Tuy nhiên trong thư viện của Quarus chỉ có FIFO dài 384 Word nên sẽ tạo một FIFO
dài 512 Word như sau:
Phần Menu >> Tools >> MegaWizard Plug_in Manager… >> Create … tạo một custom
mới, đặt tên là SDRAM_WRITE_FIFO, chọn phần Memory Compiler >> FIFO chọn độ rộng dữ
liệu là 16bit, chiều dài ( deep ) là 512 Words. Làm tương tự để tạo các khối
SDRAM_READ_FIFO1 và SDRAM_READ_FIFO2.
Khi sử dụng FIFO dài 512 Word ta phải có 1 số thay đổi trong thiết kế, tuy nhiên các thay
đổi này tương đối đơn giản như tăng tần số xung clock lên 108 MHz, sử dụng thêm 1 tác vụ ghi
trống (WR2) để đảm bảo dữ liệu xuất ra đung theo yêu cầu.
Thực hiện ghi và xuất từng khối dữ liệu xen kẽ từ SDRAM như sau:
//ghi vào SDRAM READ FIFO1 các Pixel thuộc line Odd frame
if( (READ_SIDE1< rRD1_LENGTH) )
begin
mADDR <= rRD1_ADDR;
mLENGTH <= rRD1_LENGTH;
WR_MASK <= 2'b00;
RD_MASK <= 2'b01;
mWR <= 0;
mRD <= 1;
end
//ghi vào SDRAM READ FIFO2 các Pixel thuộc line Even frame
else if( (READ_SIDE2< rRD2_LENGTH) )
begin

mADDR <= rRD2_ADDR;
mLENGTH <= rRD2_LENGTH;
WR_MASK <= 2'b00;
RD_MASK <= 2'b10;
mWR <= 0;
mRD <= 1;
end
//đọc dữ liệu từ SDRAM WRITE FIFO và ghi vào SDRAM
else if( (WRITE_SIDE>= rWR_LENGTH)&& (rWR_LENGTH!=0) )
begin
mADDR <= rWR_ADDR;
mLENGTH <= rWR_LENGTH;
WR_MASK <= 2'b01;
RD_MASK <= 2'b00;
mWR <= 1;
mRD <= 0;
end
end

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×