10.1 SƠ ĐỒ KHỐI:
Hình 10.1: Sơ đồ của khối Convert YCrCb to RGB
Tín Mơ tả
CLK Xung clock 27Mhz từ kit DE2.
RESET Reset hệ thống.
iY[7:0] Thănh phần độ sâng (Luma) của Pixel được tâch ra. iCb[7:0] Thănh phần Cb của Pixel được tâch ra.
iCr[7:0] Thănh phần Cr của Pixel được tâch ra. Red[9:0] Thănh phần Red của Pixel tương ứng. Green[9:0] Thănh phần Green của Pixel tương ứng. Blue[9:0] Thănh phần Blue của Pixel tương ứng.
10.2 MƠ TẢ
Khối năy chuyển đổi từ dạng dữ liệu ảnh YCrCb 8 bit sang dạng RGB 10 bit cho phù hợp với yíu cầu ngõ văo của VGA DAC lă ADV7123. Dưới đđy lă cơng thức chuyển đổi sang dạng RGB 8 bit:
R = 1.164 ( Y - 16 ) + 1.596 ( Cr – 128 ) ;
G = 1.164 ( Y - 16) - 0.392 ( Cb - 128 ) - 0.813 ( Cr - 128 ) ; B = 1.164 ( Y - 16 ) + 2.017 ( Cb – 128 ) ;
Chương 10: Khối Convert YcrCb to RGB
Trang 68
Sau đĩ để cĩ dạng RGB 10 bit thì ta dịch trâi 2 bit ( nhđn 4 ) nín cĩ cơng thức mới: R’ = 4.656 ( Y - 16 ) + 6.384 ( Cr - 128 ) ;
G’ = 4.656 ( Y - 16 ) - 1.568 ( Cb - 128 ) - 3.252 ( Cr - 128 ); B’ = 4.656 ( Y - 16 ) + 8.068 ( Cb - 128 ) ;
Do câc hệ số cĩ dạng thập phđn, trong khi đĩ câc phĩp tôn của phần cứng được tổng hợp chỉ thực hiện trín số nguyín nín khi lăm trịn vă tính tôn thì sai số khâ lớn, vì vậy ta phải nhđn biểu thức trín với một số nguyín H năo đĩ để giảm bớt sai số khi lăm trịn câc hệ số, sau đĩ tính tôn biểu thức rồi chia lại cho H. Số nguyín H ta chọn cĩ dạng
k
2 thì thay vì thực hiện phĩp chia cho A ta chỉ cần dịch phải k bit. Ở đđy ta chọn k = 7 hay H = 128 thì đợ chính xâc của hệ số sẽ đến chữ số thứ 2 sau dấu phẩy. Ta cĩ cơng thức cuối cùng (đê lam trịn để tính tôn trín câc số nguyín) :
oR = (596 Y + 817Cr – 114131) : 128 ;
oG = (596 Y – 200Cb – 416Cr + 69370) : 128 ; oB = (596 Y + 1033Cb – 141781) : 128 ;
Để thực hiện cơng thức trín ta tiến hănh theo câc bước:
1)Nhđn câc thănh phần Y, Cb, Cr với câc hệ số tương ứng rồi cộng chúng lại, sử dụng bộ tổng hợp cộng nhđn ( ALTMULT_ADD ) trong thư viện của Quartus :
Phần Menu >> Tools >> MegaWizard Plug_in Manager… >> Create … tạo custom mới, đặt tín lă MAC3; chọn phần Arithmetic >> ALTMULT_ADD. Với câc thơng số được chọn như sau:
+ Tính oG cần 3 phĩp nhđn : số lượng bộ nhđn lă 3.
+ Y,Cb,Cr lă số 8 bit dương: độ rộng ngõ văo A lă 8, kiểu dữ liệu khơng dấu (Unsigned) + Trong câc hệ số cĩ số đm nín, giâ trị lớn nhất lă 1033 (số 11 bit) : độ rộng ngõ văo B lă
11, kiểu dữ liệu cĩ dấu (signed)
+ Chọn hăm giữa hai bộ nhđn đầu tiín (first pair of multiplier) lă phĩp cộng (Add).
Chương 10: Khối Convert YcrCb to RGB
module MAC_3 (dataa_0, dataa_1, dataa_2, datab_0, datab_1, datab_2, result, aclr0, clock0); Trong đĩ:
+ Ngõ văo điều khiển : xĩa bất đồng bộ aclr0 vă xung clock lăm việc clock0,
+ Câc ngõ văo dữ liệu lă dataa_0; dataa_1; dataa_2 lă câc số 7 bit khơng dấu; datab_0;
datab_1; datab_2 lă câc số 11 bit cĩ dấu;
+ Ngõ ra lă dữ liệu 21 bit cĩ dấu:
result = (dataa_0 × datab_0) + (dataa_1 × datab_1) + (dataa_2 × datab_2)
Chú ý: data_b0, data_b1, data_b2 lă câc hệ số ở cơng thức đê tính ở trín: 596 =254d h,
d h
817 =331 , -200 =F38d h(số bù hai), -416 =E60d h(số bù hai), 1033d=409h.Vậy để thực hiện bước năy ta sẽ gọi câc khối MAC_3 như sau:
MAC_3 u0( iY, iCb, iCr,
11'h254, 11'h000, 11'h331,
X, iRESET, iCLK);
MAC_3 u1( iY, iCb, iCr,
11'h254, 11'hF38, 11'hE60,
Y, iRESET, iCLK);
MAC_3 u2( iY, iCb, iCr,
11'h254, 11'h409, 11'h000,
Z, iRESET, iCLK);
2)Sau đĩ trừ (cộng) với câc số hạng cịn lại rồi chia cho 128 bằng câch dịch phải 7 bit: X_OUT <= ( X - 114131 ) >>7;
Y_OUT <= ( Y + 69370 ) >>7; Z_OUT <= ( Z - 141787 ) >>7;
Chương 10: Khối Convert YcrCb to RGB
Trang 70
Tuy nhiín khi câc giâ trị R, G, B được tính theo cơng thức trín thì cĩ thể lă số đm hoặc vượt quâ1023 (10 bit ) vì vậy ta giới hạn lại giâ trị văo trong khoảng 0 đến 1023: if(X_OUT[13])
oRed<=0;
else if(X_OUT[12:0]>1023)
oRed<=1023;
Thực hiện tương tự với 2 thănh phần cịn lại thì dữ liệu khối xuất ra sẽ lă dạng RGB phù hợp với yíu cầu đặt ra.
Chương 11: Khối VGA Controller