Trang 67
CHƯƠNG 10: KHỐI CONVERT YCRCB TO RGB
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
Trang 69 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.