Trang 71
CHƯƠNG 11: KHỐI VGA CONTROLLER
11.1 SƠ ĐỒ KHỐI
Hình 11.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ì hỗ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 640x480 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 .
Chương 11: Khối VGA Controller
Trang 72
11.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:
Chương 11: Khối VGA Controller
Trang 73
Từ các thơng số định thì cho chuẩn VGA 640x480 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:
1) Đố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.
Chương 11: Khối VGA Controller
Trang 74
2) Đố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 tồ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.
11.3 MƠ TẢ
Khối sẽ tạo các tín hiệu điều khiển cho ADV 7123 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 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
Chương 11: Khối VGA Controller
Trang 75
+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 Horizontal 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ín 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 < V_BLANK));
//oRequest lên 1 ở thời gian hiển thị frame trong 1 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 tố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.