LƯU ĐỒ GIẢI THUẬT:

Một phần của tài liệu Luận văn thiết kế hệ thống xử lý video trên FPGA(CycloneII) (Trang 38 - 43)

PHẦN III: NỘI DUNG THIẾT KẾ CHƯƠNG 5: Khối I2C_VIDEO_CONFIG

5.2LƯU ĐỒ GIẢI THUẬT:

5.3 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 từ tần số 50MHz. Địa chỉ Slaver của ADV7181B lă 40h nín ta sử dụng câch gân mI2C_DATA <= {8’h40, LUT_DATA}. Với mI2C_DATA lă chuỗi 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:

Chương 5: Khối I2C_Video_Config

Trang 38

always@(posedge mI2C_CTRL_CLK or negedge iRST_N) begin if(!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 vă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 1 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 2: begin

Chương 5: Khối I2C_Video_Config

// Tăng LUT_INDEX lín 1 để nhảy đến thanh 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 số 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’h50 văo thanh ghi có địa chỉ 8’h00 ta có cấu trúc:

case(LUX_INDEX):

27: LUT_DATA <= 16'h0050;

Để ADV7181B 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ờ 3 ACK do 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]; (adsbygoogle = window.adsbygoogle || []).push({});

Chương 5: Khối I2C_Video_Config

Trang 40

6'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'd11 : SDO=1'bz;

//Địa chỉ thanh ghi cần nạp

6'd12 : begin SDO=SD[15]; ACK1=I2C_SDAT; end 6'd13 : SDO=SD[14]; 6'd14 : SDO=SD[13]; 6'd15 : SDO=SD[12]; 6'd16 : SDO=SD[11]; 6'd17 : SDO=SD[10]; 6'd18 : SDO=SD[9]; 6'd19 : SDO=SD[8];

// 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_COUNTER thực hiện đếm từ 0 -> 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 =

Chương 5: Khối I2C_Video_Config

1 vă SDO = 1) để chờ chu kỳ ghi 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_COUNTER >= 4) & (SD_COUNTER <=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ự 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):

Chương 6: Khối Timer trì hoên ban đầu

Trang 42

Một phần của tài liệu Luận văn thiết kế hệ thống xử lý video trên FPGA(CycloneII) (Trang 38 - 43)