KHỐI CONVERT YCRCB TO RGB

7 689 1
KHỐI CONVERT YCRCB TO RGB

Đang tải... (xem toàn văn)

Thông tin tài liệu

2. KHỐI CONVERT YCRCB TO RGB 2.1SƠ ĐỒ KHỐI Hình 11.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. 2.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 ) ; 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 toá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 toá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 toán biểu thức rồi chia lại cho H. Số nguyên H ta chọn có dạng 2 k 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 (đã làm tròn để tính toá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: • 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). Khi tổng hợp xong ta được một khối với khai báo như sau : 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 d = 254 h , 817 d = 331 h , -200 d = F38 h (số bù hai), -416 d = E60 h (số bù hai), 1033 d = 409 h .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); 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; 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. 3. KHỐI VGA CONTROLLER 3.1 SƠ ĐỒ KHỐI Hình 12.1: Sơ đồ của khối VGA Controller Tên Mô tả CLK Xung clock 27Mhz từ kit DE2. RESET Tín hiệu reset do khối Timer trì hoãn ban đầu cung cấp. oRequest Tín hiệu điều khiển cho phép xuất dữ liệu từ SDRAM BUFFER và lưu các giá trị của Line Pixel vào khối Line Buffer. oVGA_BLANK oVGA_SYNC oVGA_VS oVGA_HS Các chân này được gắn tương ứng vào chip giải mã ADV7123 và cổng VGA trên kit DE2 để đồng bộ việc xuất ra monitor các frames ảnh. Do xuất ảnh theo chuẩn VGA 640 x 480 nên chân VGA_SYNC luôn phải đặt ở mức cao để đảm bảo việc đồng bộ. VGA_X[0] Cho biết vị trí của Pixel là chẵn hay lẻ để điều khiển việc tách các thành phần Y, Cr, Cb trong khối xử lý ảnh YUV VGA_Y[0] Cho biết Line sẽ hiện thị trên màn hình là thuộc Odd Frame hay Even Frame để chọn dữ liệu đưa ra từ SDRAM BUFFER Các chân dữ liệu iRed, iGreen, iBlue được nối trực tiếp với ngõ ra VGA_R, VGA_G, VGA_B. Ngõ ra oVGA_CLOCK là nghịch đảo của ngõ vào CLK . 3.2 LƯU ĐỒ GIẢI THUẬT Giải thuật tạo tín hiệu đồng bộ để giao tiếp với VGA là tạo các bộ đếm với các thông số chuẩn để tạo ra các tín hiệu đồng bộ theo giản đồ thời gian: Hình 12.2: Vùng hiển thị trong một chu kỳ quét với tình hiệu reset từ hệ thống Từ các thông số định thì cho chuẩn VGA 640 x 480 60Hz ở trên, do xung clock trong thiết kế có tần số 27Mhz nên ta chọn các giá trị tương ứng cho các thông số như sau: a) Đối với VGA_HS (tín hiệu đồng bộ quy định thời gian hiển thị 1 hàng trong 1 chu kỳ quét ngang): H_FRONT = 16, H_SYNC = 96, H_BACK = 48, H_ACT = 640 Như vậy khi hiển thị xong 1 hàng thì phải chờ 1 khoảng thời gian là H_BLANK = H_FRONT + H_SYNC + H_BACK = 160 (đơn vị là số chu kỳ xung clock) thì hiển thị hàng mới. Lúc này thời gian quét ngang là: H_TOTAL = H_BLANK + H_ACT = 800. b) Đối với VGA_VS(tín hiệu đồng bộ quy định thời gian hiển thị 1 frame trong 1 chu kỳ quét toàn bộ màn hình): V_FRONT = 11; V_SYNC = 2; V_BACK = 31; V_ACT = 480 Như vậy khi hiển thị xong 1 frame thì phải chờ 1 khoảng thời gian là: V_BLANK = V_FRONT + V_SYNC + V_BACK = 44 (đơn vị là chu kỳ xung quét ngang VGA_HS) thì hiển thị frame mới. Thời gian quét màn hình là: V_TOTAL = V_BLANK + V_ACT= 524. Lưu đồ giải thuật tạo VGA_VS cũng được thực hiện tương tự chỉ khác là V_Cont được đếm lên sau mỗi cạnh lên của VGA_HS. 3.3 MÔ TẢ Khối sẽ tạo các tín hiệu điều khiển cho ADV7123 và đồng bộ việc truy xuất, xử lý dữ liệu với các khối khác dựa trên các tín hiệu định thì quét ngang và quét dọc như sao: Tạo tín hiệu quét ngang VGA_HS với bộ đếm lên H_Cont : always@(posedge iCLK or negedge iRST_N) begin if(!iRST_N) begin H_Cont <= 0; oVGA_HS <= 1; end else begin if( H_Cont < H_TOTAL ) H_Cont <= H_Cont+1'b1; else H_Cont <= 0; //đưa VGA_HS về 0 tương ứng với khoảng thời gian Horizontal SYNC if(H_Cont == H_FRONT-1) oVGA_HS <= 1'b0; if(H_Cont == H_FRONT+H_SYNC-1) oVGA_HS <= 1'b1; end end Tạo tín hiệu quét dọc VGA_VS với bộ đếm V_Cont theo cạnh lên của VGA_HS: always@(posedge oVGA_HS or negedge iRST_N) begin if(!iRST_N) begin V_Cont <= 0; oVGA_VS <= 1; end else begin if(V_Cont < V_TOTAL) V_Cont <= V_Cont+1'b1; Else V_Cont <= 0; //đưa VGA_HS về 0 tương ứng với khoảng thời gian Hrizontal SYNC if(V_Cont == V_FRONT-1) oVGA_VS <= 1'b0; if(V_Cont == V_FRONT+V_SYNC-1) oVGA_VS <= 1'b1; end end Sau đó xuất các tính hiệu điều khiển khác: //tích cực tín hiệu BLANK để xóa các Flicker: assign oVGA_BLANK = ~((H_Cont < H_BLANK) || (V_Cont <_BLANK)); //oRquest lên 1 ở thời gian hiển thị frame trong một chu kỳ quét màn hình: assign oRequest = ( ( H_Cont >= H_BLANK && H_Cont < H_TOTAL ) && ( V_Cont>=V_BLANK && V_Cont<V_TOTAL ) ); //tính toán vị trí X,Y của Pixel trong frame (X : vị trí pixel trong hàng và Y : //vị trí hàng trong frame) : assign oCurrent_X = (H_Cont>=H_BLANK)? H_Cont-H_BLANK : 11'h0; assign oCurrent_X = (V_Cont>=V_BLANK)? V_Cont-V_BLANK : 11'h0; Như vậy kể từ khi bắt đầu quét 1 frame thì phải chờ 1 khoảng thời gian có độ dài là (V_BLANK × H_TOTAL) + H_ BLANK = 35360 (chu kỳ) thì oRequest mới được tích cực. 4. KẾT LUẬN 5. TÀI LIỆU THAM KHẢO [1]. Stuart Sutherland, Simon Davidmann, Peter Flake, System Verilog for Design. [2]. DAVID R. SMITH, PAUL D. FRANZON, verilog styles for Synthesis of Digital Systems. [3]. D. Vanden Bout, VGA Generator for the XSA Boards, XESS Corporation, October 12, 2004. [4]. J. BHASKER, A Verilog HDL Primer. [5]. T. R. PADMANABHAN, B. BALA TRIPURA SUNDARI, Design Through Verilog HDL. [6]. FPGA Design with Verilog. [7]. Peter J. Ashenden, Digital Design. . 2. KHỐI CONVERT YCRCB TO RGB 2.1SƠ ĐỒ KHỐI Hình 11.1: Sơ đồ của khối Convert YCrCb to RGB Tên Mô tả CLK Xung clock 27Mhz. 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. 3. KHỐI VGA CONTROLLER 3.1 SƠ ĐỒ KHỐI Hình 12.1: Sơ đồ của khối VGA Controller

Ngày đăng: 04/10/2013, 00:20

Hình ảnh liên quan

Hình 11.1: Sơ đồ của khối Convert YCrCb to RGB - KHỐI CONVERT YCRCB TO RGB

Hình 11.1.

Sơ đồ của khối Convert YCrCb to RGB Xem tại trang 1 của tài liệu.
Hình 12.1: Sơ đồ của khối VGA Controller - KHỐI CONVERT YCRCB TO RGB

Hình 12.1.

Sơ đồ của khối VGA Controller Xem tại trang 4 của tài liệu.
Hình 12.2: Vùng hiển thị trong một chu kỳ quét với tình hiệu reset từ hệ thống - KHỐI CONVERT YCRCB TO RGB

Hình 12.2.

Vùng hiển thị trong một chu kỳ quét với tình hiệu reset từ hệ thống Xem tại trang 5 của tài liệu.

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan