KHỐI I2C VIDEO CONFIG2.1 SƠ ĐỒ KHỐI Hình 6.1: Sơ đồ khối I2C_Video_Config ICLK Xung Clock 50MHz từ kit DE2 RESET Tín hiệu Reset hệ thống I2C_SCLK Ngõ ra chứa xung Clock cung cấp cho ADV7
Trang 12 KHỐI I2C VIDEO CONFIG
2.1 SƠ ĐỒ KHỐI
Hình 6.1: Sơ đồ khối I2C_Video_Config
ICLK Xung Clock 50MHz từ kit DE2
RESET Tín hiệu Reset hệ thống
I2C_SCLK Ngõ ra chứa xung Clock cung cấp cho ADV7181B
I2C_DATA Port 2 chiều để cấu hình các giá trị thanh ghi của ADV7181B
Hình 6.2: Dạng sóng để truyền dữ liệu và cấu trúc ghi với giao thức I2C
2.2 MÔ TẢ
Vai trò của khối chỉ là ghi giá trị vào các thanh ghi của ADV7181B nên có thể chọn xung clock làm việc của khối là 20KHz nhờ vào bộ chia tần số 50MHz Địa chỉ Slaver của ADV7181B
là 40h nên ta sử dụng cách gán mI2C_DATA là kiểu dữ liệu cần truyền trên Bus và LUT_DATA chứa địa chỉ của thanh ghi và giá trị cần nạp
Khi reset, bắt đầu cấu hình lại cho ADV7181B bằng cách xóa giá trị các bộ đếm và cờ Sau
đó để nạp giá trị cho các thanh ghi ta sử dụng máy trạng thái sau:
always@(posedge mI2C_CTRL_CLK or negedge iRST_N) begin
Trang 2if (!iRST_N) begin LUT_INDEX<= 0;
mSetup_ST <= 0;
mI2C_GO <= 0; end else
begin if(LUT_INDEX<LUT_SIZE)
//LUT_SIZE là số lần nạp giá trị cho các thanh ghi cần thiết
//LUT_INDEX là biến đếm để ánh xạ đến địa chỉ của các thanh ghi và giá trị cần nạp.
begin case(mSetup_ST) 0: begin
//nhập chuỗi dữ liệu cần truyền để đặt giá trị cho các thanh ghi
mI2C_DATA <= {8’h40,LUT_DATA};
mI2C_GO <= 1;
mSetup_ST <= 1;
end 1: begin
If(mI2C_END)
//mI2C_END là cờ báo khi truyền hết chuỗi dữ liệu
begin
//có xác nhận ACK là đã nạp xong giá trị cho một thanh ghi từ //ADV thì nhảy tới trạng thái 2
if(!mI2C_ACK) mSetup_ST <= 2;
//không có xác nhận thì nhảy về trạng thái 0
else mSetup_ST <= 0;
mI2C_GO <= 0;
end end
Trang 32: begin
//tăng LUT_INDEX lên 1 để nhảy đến thay ghi mới rồi quay về trạng thái 0
LUT_INDEX <= LUT_INDEX + 1;
mSetup_ST <= 0;
end endcase end
end end
Ta chỉ cần đặt giá trị cho một thanh ghi cần thiết nên không thực hiện việc tăng dần địa chỉ thanh ghi mà sẽ ánh xạ từ LUX_INDEX đến LUX_DATA nhờ vào lệnh case, chẳng hạn như khi LUX_INDEX=27 để nạp giá trị 8’50 vào thanh ghi địa chỉ 8’h00 ta có cấu trúc:
case(LUX_INDEX):
27: LUT_DATA <= 16’h0050;
Để AVD7181B có thể phát hiện chuẩn video NTSC thì ta sẽ nạp các giá trị cho các thanh ghi theo bảng giá trị cài đặt ở phần mô tả ADV7181B Tuy nhiên khi truyền chuỗi này trên bus ta cần phải thêm các bit đồng bộ: 1 bit cho trạng thái IDE, 2 bit để thiết lặp cờ START, 3 bit để chờ ACK cho ADV xác nhận, 3 bit để thiết lặp cờ STOP và báo kết thúc chuỗi, vì vậy thực sự chuỗi dài 33 bit:
case(SD_COUNTER)
6’d0 : begin ACK1=0; ACK2=0; ACK3=0; END=0;SDO=1;SCLK=1;end
//thiết lặp cờ START
6’d1 : begin SD=I2C_DATA;SDO=0;end
6’d2 : SCLK=0;
//địa chỉ SLAVER của ADV7181B
6’d3 : SDO=SD[23];
6’d4 : SDO=SD[22];
6’d5 : SDO=SD[21];
6’d6 : SDO=SD[20];
6’d7 : SDO=SD[19];
6’d8 : SDO=SD[18];
Trang 46’d9 : SDO=SD[17];
6’d10 : SDO=SD[16];
//thả nổi đường truyền nhập để ACK từ ADV7181B qua port 2 chiều I2C_DATA
6’d20 : SDO=1’bz;
//giá trị cần ghi vào thanh ghi
6’d21 : begin SDO=SD[7]; ACK2=I2C_SDAT;end
6’d22 : SDO=SD[6];
6’d23 : SDO=SD[5];
6’d24 : SDO=SD[4];
6’d25 : SDO=SD[3];
6’d26 : SDO=SD[2];
6’d27 : SDO=SD[1];
6’d28 : SDO=SD[0];
//thả nổi đường truyền nhập ACK từ ADV7181B qua port 2 chiều I2C_DATA
6’d29 : SDO=1’bz;
//thiết lặp cờ STOP và báo kết thúc chuỗi
6’d30 : begin SDO=1’b0; SCLK=1’b0; ACK3=I2C_SDAT;end
6’d31 : SCLK=1’b1;
6’d32 : begin SDO=1’b1;END=1;end
endcase
Trong đó SD_COUTER thực hiện đếm từ 0 đến 63, như vậy việc nạp cho một thanh ghi chỉ thực hiện trong 33 chu kỳ đầu còn 30 chu kỳ sau thì bus ở trạng thái IDE (SCLK=1 va SDO=1)
để chờ chu kỳ tiếp theo Đồng thời để đảm bảo được yêu cầu về dạng sóng trên chân I2C_SCLK
và xác nhận (ACK) đã nạp xong thanh ghi, ta thực hiện:
wire I2C_SCLK = SCLK | (((SD_COUTER>=4) &
(SD_COUTER<=30))? ~CLOCK : 0 );
wire ACK=ACK1 | ACK2 | ACK3;
// khi xét xác nhận đã nạp xong thanh ghi ta sử dụng giá trị bù của //ACK (tích cực mức thấp), chỉ xác nhận khi có đủ 3 xác nhận ACK1, //ACK2, ACK3
Và dạng sóng thu được trên chân I2C_SCLK như sau (END từ 0 lên 1 chỉ ra rằng đã nạp xong giá trị cho một thanh ghi):
Trang 5Hình 6.4: dạng sóng mô phỏng trên chân I2C_SCLK