91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示

發布時間:2020-08-03 15:24:17 來源:網絡 閱讀:6055 作者:shugenyin 欄目:系統運維

1. 概述 

本設計采用FPGA技術,將CMOS攝像頭(LVDS接口)的視頻數據經過采集、存儲、幀率轉換及格式轉換,最終通過USB2.0接口顯示在電腦屏幕上。


2. 硬件系統框圖

CMOS采用一款全局曝光芯片,FPGA采用ALTERA公司的CYCLONE IV,FLASH采用EPCS64,DDR2采用Hynix公司的1Gb內存條,USB2.0采用Cypress公司的68013芯片。


FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示

3. FPGA邏輯框圖

FPGA各部分邏輯模塊如下圖所示:

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示


LVDS Decode,解碼CMOS攝像頭視頻數據;

I2C Master,配置CMOS芯片;

DDR2 Control,配置與控制DDR2芯片組,實現讀寫仲裁;

FIFO Write,將采集到的視頻數據跨時鐘域地寫進DDR2中;

FIFO Read,將DDR2中的數據跨時鐘域地讀出給后續圖像處理模塊;

Frame Buffer,負責FIFO Write和FIFO Read的調度,實現幀率轉換;

USB Control,接受USB PHY的請求,通過FIFO Read向DDR2索取數據,并自定義打包發送給USB PHY芯片。


4. 全局曝光

全局曝光是針對逐行曝光的改進,在逐行曝光下,sensor是按照行為單位進行逐行曝光,這樣當被攝物體和sensor存在高速的相對運動時,圖像會發生形狀和顏色的變形,如下圖所示:

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示 

而全局曝光則是以幀為單位進行曝光,可以拍攝到高速運動的物體且沒有變形。


5. LVDS解碼

攝像頭芯片提供差分串行接口(LVDS),支持1/2/4個Data lane來傳輸圖像8/10/12 bit數據。這里以4個data lane,同步信號內嵌的模式為例,介紹其傳輸時序。

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示


6. CMOS配置

CMOS sensor支持最高130萬像素,240幀的視頻輸出。

SpiWriteRegister(0x01,0x03,0x01);// soft reset
SpiWriteRegister(0x01,0x00,0x00);SpiWriteRegister(0x30,0x34,0x01);SpiWriteRegister(0x30,0x35,0xc2);
SpiWriteRegister(0x33,0x0b,0x4c);SpiWriteRegister(0x36,0x64,0x09);SpiWriteRegister(0x36,0x38,0x82);
SpiWriteRegister(0x3d,0x08,0x00);SpiWriteRegister(0x36,0x40,0x03);SpiWriteRegister(0x36,0x28,0x07);
SpiWriteRegister(0x32,0x05,0x93); //rnc
SpiWriteRegister(0x36,0x20,0x42);SpiWriteRegister(0x36,0x23,0x06);SpiWriteRegister(0x36,0x27,0x02);
SpiWriteRegister(0x36,0x21,0x28);SpiWriteRegister(0x36,0x3b,0x00);SpiWriteRegister(0x36,0x33,0x24);
SpiWriteRegister(0x36,0x34,0xff);  //fpn optimize
SpiWriteRegister(0x34,0x16,0x10);SpiWriteRegister(0x3e,0x03,0x0b);SpiWriteRegister(0x3e,0x08,0x03);
SpiWriteRegister(0x3e,0x09,0x20);SpiWriteRegister(0x3e,0x01,0x23);
SpiWriteRegister(0x3e,0x14,0xb0);SpiWriteRegister(0x33,0x0b,0x40);SpiWriteRegister(0x3e,0x08,0x3f);
SpiWriteRegister(0x36,0x3b,0x80);SpiWriteRegister(0x36,0x23,0x07);SpiWriteRegister(0x50,0x00,0x01);
SpiWriteRegister(0x3e,0x01,0x00);SpiWriteRegister(0x3e,0x02,0x30);SpiWriteRegister(0x32,0x0c,0x05);
SpiWriteRegister(0x32,0x0d,0x46);SpiWriteRegister(0x32,0x0e,0x02);
SpiWriteRegister(0x32,0x0f,0x58);SpiWriteRegister(0x36,0x38,0x85);SpiWriteRegister(0x33,0x06,0x50);
SpiWriteRegister(0x33,0x0b,0x68);SpiWriteRegister(0x33,0x08,0x10);SpiWriteRegister(0x3e,0x01,0x00);
SpiWriteRegister(0x36,0x3b,0x00);SpiWriteRegister(0x36,0x63,0xf8);SpiWriteRegister(0x36,0x64,0x0a);
SpiWriteRegister(0x36,0x33,0x27);SpiWriteRegister(0x30,0x3a,0x3a);
SpiWriteRegister(0x30,0x3a,0x3a);SpiWriteRegister(0x30,0x3a,0x3a);SpiWriteRegister(0x30,0x3a,0x3a);
SpiWriteRegister(0x36,0x3b,0x00);SpiWriteRegister(0x34,0x16,0x38);SpiWriteRegister(0x3e,0x08,0x23);
SpiWriteRegister(0x3c,0x00,0x41); //FIFO RESET for mipi
SpiWriteRegister(0x30,0x19,0x00);
SpiWriteRegister(0x30,0x31,0x0a); // 10bit
SpiWriteRegister(0x30,0x00,0x00);SpiWriteRegister(0x30,0x01,0x00);SpiWriteRegister(0x30,0x39,0x20);
SpiWriteRegister(0x30,0x3a,0x31);SpiWriteRegister(0x30,0x3b,0x02);SpiWriteRegister(0x30,0x3c,0x08);
SpiWriteRegister(0x4b,0x00,0xa2); //must 
SpiWriteRegister(0x30,0x22,0x19); //must
SpiWriteRegister(0x30,0x3f,0x01); //must
SpiWriteRegister(0x30,0x30,0x04); //must
SpiWriteRegister(0x30,0x2b,0xa0); //must
SpiWriteRegister(0x36,0x20,0x43);SpiWriteRegister(0x36,0x21,0x18);SpiWriteRegister(0x45,0x01,0xc0);
SpiWriteRegister(0x45,0x02,0x16); //br recieve inv off
SpiWriteRegister(0x36,0x23,0x07);SpiWriteRegister(0x50,0x00,0x01);SpiWriteRegister(0x36,0x20,0x43);
SpiWriteRegister(0x33,0x00,0x30);SpiWriteRegister(0x3e,0x01,0x14);SpiWriteRegister(0x36,0x3b,0x80);
SpiWriteRegister(0x36,0x64,0x0a);SpiWriteRegister(0x3e,0x08,0x23);
SpiWriteRegister(0x34,0x16,0x00);SpiWriteRegister(0x36,0x33,0x20);
SpiWriteRegister(0x36,0x33,0x23);SpiWriteRegister(0x32,0x11,0x0c);SpiWriteRegister(0x3e,0x0f,0x05);
SpiWriteRegister(0x36,0x3b,0x08); //fpn
SpiWriteRegister(0x36,0x33,0x22); //nvdd
SpiWriteRegister(0x33,0x02,0x0c);//rst go low
SpiWriteRegister(0x33,0x83,0x0a);// pbias en rise edge
SpiWriteRegister(0x36,0x23,0x04);
SpiWriteRegister(0x33,0x82,0x0f); //sa fall edge
SpiWriteRegister(0x3e,0x0f,0x84);  //gain
SpiWriteRegister(0x3e,0x0e,0x03);  //gain
SpiWriteRegister(0x3e,0x08,0x27);SpiWriteRegister(0x3e,0x08,0x23);SpiWriteRegister(0x36,0x64,0x05);
SpiWriteRegister(0x33,0x0b,0x68);
SpiWriteRegister(0x36,0x38,0x84);SpiWriteRegister(0x5b,0x00,0x02);SpiWriteRegister(0x5b,0x01,0x03);
SpiWriteRegister(0x5b,0x02,0x01);SpiWriteRegister(0x5b,0x03,0x01);SpiWriteRegister(0x36,0x3b,0x02);
SpiWriteRegister(0x36,0x32,0x54);SpiWriteRegister(0x36,0x33,0x32);SpiWriteRegister(0x34,0x16,0x0e);
SpiWriteRegister(0x36,0x64,0x0e);SpiWriteRegister(0x36,0x63,0x88);SpiWriteRegister(0x33,0x0b,0x50);
SpiWriteRegister(0x36,0x22,0x06); //blksun
SpiWriteRegister(0x36,0x30,0xb3);SpiWriteRegister(0x34,0x16,0x11);SpiWriteRegister(0x01,0x00,0x01);


7. USB2.0 PHY

Cypress公司的EZ-USB FX2是世界上第一款集成USB2.0的微處理器,它集成了USB2.0收發器、SIE(串行接口引擎)、增強的8051微控制器和可編程的外圍接口。

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示


8. USB Slave FIFO傳輸

當有一個與芯片相連主控只需要利用FX2做為一個USB2.0接口而實現與主機的高速通訊,而它本身又能夠提供滿足Slave FIFO要求的傳輸時序時,可采用Slave FIFO傳輸方式。

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示

這種方式下,內嵌的8051固件只負責配置Slave FIFO相關的寄存器以及控制FX2何時工作在Slave FIFO模式下。

在Slave FIFO模式下,主控邏輯與FX2的連接如下圖所示:

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示

  • IFCLK: FX2 輸出的時鐘,可做為通訊的同步時鐘

  • FLAGA/FLAGB/FLAGC/FLAGD: FX2 輸出的FIFO狀態信息,如滿,空等

  • SLCS:FIFO的片選信號,外部邏輯控制,當 SLCS 輸出高時,不可進行數據傳輸

  • SLOE:FIFO輸出使能,外部邏輯控制,當 SLOE 無效時,數據線不輸出有效數據

  • SLRD:FIFO 讀信號,外部邏輯控制,同步讀時,FIFO指針在SLRD 有效時的每個IFCLK的上升沿遞增,異步讀時, FIFO 讀指針在 SLRD 的每個有效—無效的跳變沿時遞增

  • SLWR:FIFO 寫信號,外部邏輯控制,同步寫時,在 SLWR 有效時的每個 IFCLK 的上升沿時數據被寫入, FIFO指針遞增,異步寫時,在SLWR的每個有效—無效的跳變沿時數據被寫入,FIFO寫指針遞增

  • PKTEND:包結束信號,外部邏輯控制,在正常情況下,外部邏輯向 FX2 的 FIFO 中寫數,當寫入FIFO端點的字節數等于FX2固件設定的包大小時,數據將自動被打成一包進行傳輸,但有時外部邏輯可能需要傳輸一個字節數小于 FX2 固件設定的包大小的包,這時它只需在寫入一定數目的字節后,聲明此信號,此時 FX2 硬件不管外部邏輯寫入了多少字節,都自動將之打成一包進行傳輸

  • FD[15:0]:數據線;

  • FIFOADR[1:0]:選擇四個 FIFO 端點的地址線,外部邏輯控制

這里設置FIFO為異步寫模式,連接的接口如下圖所示:

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示

標準的異步寫模式的狀態機如下圖所示:

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示

IDLE:當寫事件發生時,進入狀態1;

狀態1:使FIFOADR[1:0]指向IN FIFO,進入狀態2;

狀態2:如果FIFO滿,進入等待,否則進入狀態3;

狀態3:獲取數據,使能SLWR,再無效,進入狀態4;

狀態4:如需繼續傳遞數據,進入狀態2,否則進入IDLE。


9. USB驅動開發

開發EZ-USB驅動程序需要用到微軟的WDW DDK和VC++,DDK可從http://www.microsoft.com/hwdev獲得。這里我們直接使用Cypress提供的一套驅動程序,足以滿足一般項目需求。以WIN7 64位驅動為例,需以下三個文件:

cyusb.sys、cyusbfx1_fx2lp.cat、cyusbfx1_fx2lp.inf。

其中需要我們修改的是cyusbfx1_fx2lp.inf文件,在其中添加我們的PID/VID和描述符(Shugen_VIP Device)。

;for x64 platforms
[Device.NTamd64]
%VID_2017&PID_0328.DeviceDesc%=CyUsb, USB\VID_2017&PID_0328

[Strings]
CYUSB_Provider    = "Cypress"
CYUSB_Company     = "Cypress Semiconductor Corporation"
CYUSB_Description = "Cypress Generic USB Driver"
CYUSB_DisplayName = "Cypress USB Generic"
CYUSB_Install     = "Cypress CYUSB Driver Installation Disk"
VID_2017&PID_0328.DeviceDesc="Shugen_VIP Device"
CYUSB.GUID="{AE18AA60-7F6A-11d4-97DD-00010229B959}"
CYUSB_Unused      = "."

在設備管理器中安裝好的驅動如下:

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示


10. 固件程序開發

USB2.0的固件程序開發在KEIL下完成,在工程中添加EZUSB的USBJmp.OBJ和EZUSB.LIB兩個目標和庫文件,工程下有三個重要源文件:

  • fw.c, FirmWare的縮寫,USB協議方面的通信都是在這里完成的,包括上電枚舉、重枚舉、喚醒及調用用戶程序等。

  • periph.c,用戶代碼在這里完成,Cypress已經為我們搭好了框架。文件中包括void TD_Init(void)、void TD_Poll(void)、BOOL DR_VendorCmnd(void)、void ISR_Ep0in(void) interrupt 0~void ISR_Ep8inout(void) interrupt 0 函數。

  • dscr.51,USB描述符文件,包括了設備描述符、接口描述符、端點描述符、字符串等。

這里為了實現USB PHY芯片和FPGA的同步,需要用視頻的場同步信號vsync來做同步,使用68013的INT0引腳實現中斷觸發,具體中斷函數如下:

void ISR_EXTR0(void) interrupt  0 //using 0
{
	if(frame_sign == 1){
	   PA1 = 1; //Enable p_w_picpath input	
	}
	else	
	{
		PA1 = 0; //Disable p_w_picpath input	
		//Reset FIFO of EDP2
		SYNCDELAY;
		FIFORESET = 0x80;// activate NAK-ALL to avoid race conditions
		SYNCDELAY;
		FIFORESET = 0x02;// reset, FIFO 2
		SYNCDELAY;
		FIFORESET = 0x00;// deactivate NAK-AL
		SYNCDELAY;
	}
}

設計好代碼后,編譯生成HEX文件(用于在線調試,下載到ram中)和IIC文件(用于固化EEPROM)。


11. 固化代碼

將KEIL編譯生成的IIC文件固化到EEPROM中需要使用CYPRESS提供的CyConsole工具,具體使用方法如下圖所示:

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示

如果固化成功,重啟后可以在CyConsole中看到USB2.0設備的具體信息:

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示


12. 上位機DEMO軟件

在Windows下可以使用VC++開發應用軟件,在設計68013上位機程序的過程中,需要用到CPYRESS官方提供的API函數和驅動程序。開發包地址如下:

http://www.cypress.com/documentation/software-and-drivers/suiteusb-34-usb-development-tools-visual-studio

支持的操作系統:

Windows 2000(w2K) Windows XP (wxp) Windows Vista (wlh) Windows 7

支持的CPU類型:

x86(32bit-i386) x64(64bit-amd64)

開發過程需要使用cyapi.h和cyapi.lib兩文件。CyAPI 控制函數類主要包括 8 個控制類:

傳輸端點控制類 CCyBulkEndPoint、控制傳輸端點類CCyControlEndPoint 、 中 斷 傳 輸 端 點 控 制 類 CCyInterruptEndPoint 、 同 步 傳 輸 端 點 控 制 類CCyIsocEndPoint、設備控制類 CCyUSBDevice、配置信息類 CCyUSBConfig、端點控制類 CCyUSBEndPoint和接口控制類 CCyUSBInterface。具體的使用方法可以參考Cypress CyAPI Programmer's Reference


13. 最終結果

下圖為用手機拍攝的風扇的圖片,已經完全看不到扇葉的形狀。

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示

下圖為設計的板卡拍攝的圖片,從圖中可以看出扇葉的形狀,盡管風扇在高速旋轉。

FPGA設計——全局曝光CMOS圖像采集與USB2.0顯示


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屯昌县| 耒阳市| 隆子县| 土默特左旗| 黄平县| 巫溪县| 兰溪市| 封丘县| 泊头市| 西安市| 文水县| 荔浦县| 宁蒗| 舞阳县| 化德县| 上饶县| 思茅市| 新巴尔虎右旗| 阿鲁科尔沁旗| 东方市| 定日县| 朝阳区| 马鞍山市| 聂荣县| 偏关县| 台安县| 武邑县| 丰台区| 简阳市| 德清县| 杭锦旗| 布拖县| 云和县| 阳泉市| 海丰县| 饶阳县| 黄龙县| 龙游县| 洱源县| 游戏| 南安市|