設(shè)計(jì)背景:
USB(Universal Serial Bus2.0,通用串行總線)是一種應(yīng)用在計(jì)算機(jī)領(lǐng)域的新型接口技術(shù)。USB接口具有傳輸速度更快,支持熱插拔以及連接多個(gè)設(shè)備的特點(diǎn)。目前已經(jīng)在各類外部設(shè)備中廣泛的被采用。USB接口有三種:USB1.1,USB2.0和USB3.0。理論上USB1.1的傳輸速度可以達(dá)到12Mbps,而USB2.0則可以達(dá)到速度480Mbps,并且可以向下兼容USB1.1。
設(shè)計(jì)原理:
本次的設(shè)計(jì)主要設(shè)計(jì)我們用用的開發(fā)板是我們至芯出的第一代開發(fā)板,其中的USB芯片C是ypress的FX2LP系列中的CY7C68013A代,詳細(xì)的介紹不多說,見Cypress的官網(wǎng):在這里我就簡(jiǎn)化的給大家做一個(gè)簡(jiǎn)單介紹。
FX2的設(shè)計(jì)架構(gòu)如下圖,內(nèi)嵌480MBit/s的收發(fā)器,鎖相環(huán)PLL,串行接口引擎SIE——集成了整個(gè)USB 2.0協(xié)議的物理層。為適應(yīng)USB 2.0的480MBit/s的速率,F(xiàn)IFO端點(diǎn)可配置成2,3,4個(gè)緩沖區(qū)。 配置用的是“軟配置”——USB固件可由USB總線下載,片上不需集成ROM。擁有四個(gè)FIFO接口,可工作在內(nèi)部或外部時(shí)鐘下。端點(diǎn)和FIFO接口的應(yīng)用使外部邏輯和USB總線可高速連接。
基于FX2LP的USB開發(fā),包括三部分:固件程序、驅(qū)動(dòng)、上位機(jī)軟件。
固件程序我們?cè)?/span>kiil中寫出來,然后配置到我們的芯片中,固件的開發(fā)對(duì)我們FPGA工程師來說是不用寫的,是別的工程師配置好芯片我們拿來用的,其主要的配置過程如下圖:先上電復(fù)位,然后初始化我們的寄存器變量,然后調(diào)用配置函數(shù),打開中斷后,判斷是否接受到了我們的配置包,如果接收到了就調(diào)用TD_POLL()函數(shù),這個(gè)是函數(shù)是不停的執(zhí)行掃描我們的端點(diǎn)等。然后判斷我們的芯片是否掛起,如果掛起就叫醒芯片,如果沒有就一直調(diào)用TD_POLL函數(shù),這樣完成我們所需要的配置。
我們的項(xiàng)目是要把我們的FX2配置成從FIFO的模式, 配置為單片機(jī)工作時(shí)鐘24M,端點(diǎn)2輸出,字節(jié)1024,端點(diǎn)6輸入,字節(jié)1024,信號(hào)全設(shè)置為低電平有效等。我們的模塊驅(qū)動(dòng)時(shí)鐘我們配置成內(nèi)部輸出時(shí)鐘,也就是讓FX2給我們的設(shè)計(jì)當(dāng)做時(shí)鐘源,輸出一個(gè)最大的配置時(shí)鐘48M的時(shí)鐘。
在這邊說一下,我們的FX2的數(shù)據(jù)存儲(chǔ)區(qū)叫端點(diǎn),有512,1024字節(jié)兩個(gè)存儲(chǔ)大小之分。
從FIFO的說明:
當(dāng)有一個(gè)與FX2芯片相連的外部邏輯只需要利用FX2做為一個(gè)USB 2.0接口而實(shí)現(xiàn)與主機(jī)的高速通訊,而它本身又能夠提供滿足Slave FIFO要求的傳輸時(shí)序,可以做為Slave FIFO主控制器時(shí),即可考慮用此傳輸方式。
Slave FIFO傳輸?shù)氖疽鈭D如下:
在這種方式下,FX2內(nèi)嵌的8051固件的功能只是配置Slave FIFO相關(guān)的寄存器以及控制FX2何時(shí)工作在Slave FIFO模式下。一旦8051固件將相關(guān)的寄存器配置完畢,且使自身工作在Slave FIFO模式下后,外部邏輯(如FPGA)即可按照Slave FIFO的傳輸時(shí)序,高速與主機(jī)進(jìn)行通訊,而在通訊過程中不需要8051固件的參與。
FX2系列的有3種封裝方式,我們我的開發(fā)板用的是56引腳的封裝方式的電路圖,其電路圖如下所示:
端口介紹:
IFCLK:FX2輸出的時(shí)鐘,可做為通訊的同步時(shí)鐘;
SLCS:FIFO的片選信號(hào),外部邏輯控制,當(dāng)SLCS輸出高時(shí),不可進(jìn)行數(shù)據(jù)傳輸;
SLOE:FIFO輸出使能,外部邏輯控制,當(dāng)SLOE無效時(shí),數(shù)據(jù)線不輸出有效數(shù)據(jù);
SLRD:FIFO讀信號(hào),外部邏輯控制,同步讀時(shí),F(xiàn)IFO指針在SLRD有效時(shí)的每個(gè)IFCLK的上升沿遞增。
SLWR:FIFO寫信號(hào),外部邏輯控制,同步寫時(shí),在SLWR有效時(shí)的每個(gè)IFCLK的上升沿時(shí)數(shù)據(jù)被寫入,F(xiàn)IFO指針遞增
FD[15:0]:數(shù)據(jù)線;
FIFOADR[1:0]:選擇四個(gè)FIFO端點(diǎn)的地址線,外部邏輯控制。
FLAGA,B,C端點(diǎn)的空滿標(biāo)志位
我們的開發(fā)驅(qū)動(dòng)大家可以在網(wǎng)上找,然后根據(jù)自己系統(tǒng)裝上合適的驅(qū)動(dòng),或者在我們的至芯論壇上搜EZ-USB,就可以看到我們老師發(fā)的帖子來講解驅(qū)動(dòng)的安裝。
我們的上位機(jī)軟件用的是官方的開發(fā)工具,只有如下的安裝包
然后安裝第一個(gè)和第二個(gè)就好了。
設(shè)計(jì)代碼:
讀模塊:
0moduleusb_rd(pi_clk,pi_rst_n,pi_usb_flagb,pi_usb_flagc, pio_usb_data,
1 po_usb_oe_n,po_usb_rd_n,po_usb_address,po_usb_wr_n,led);
2
3 inputpi_clk;
4 inputpi_rst_n;
5 inputpi_usb_flagb; //端點(diǎn)2標(biāo)志信號(hào)
6 inputpi_usb_flagc;//端點(diǎn)6標(biāo)志信號(hào)
7 inout[15:0]pio_usb_data;//輸入輸出端口
8
9 outputregpo_usb_oe_n;//讀標(biāo)志信號(hào)
10 outputregpo_usb_rd_n;//寫使能
11 outputregpo_usb_wr_n;//讀使能
12 outputreg[1:0]po_usb_address;//端點(diǎn)地址選擇
13 outputregled; //接收標(biāo)志正確指示燈
14
15 reg[15:0]temp_data;
16 reg[9:0]count;
17 reg[2:0]state;
18
19 assignpio_usb_data =(state ==10)?1:16'hzzzz; //讀數(shù) 據(jù),可以一直釋放數(shù)據(jù)總線的控制權(quán)
20
21 always@(posedgepi_clk ornegedgepi_rst_n)
22 if(!pi_rst_n)
23 begin
24 state <=0;
25 po_usb_oe_n <=1;
26 po_usb_rd_n <=1;
27 count <=0;
28 po_usb_wr_n <=1;
29 temp_data <=0;
30 end
31 else
32 case(state)
33 0 : state <=1;
34
35 1 : begin
36 po_usb_address <=2'b00;//地址指向端點(diǎn)2
37 state <=2;
38 end
39
40 2 : if(!pi_usb_flagb) //判斷端點(diǎn)2已經(jīng)滿
41 begin
42 po_usb_rd_n <=0;
43 state <=3;
44 po_usb_oe_n <=0;
45 end
46 else
47 state <=2;
48
49 3 : begin
50 if(count <512-1) //接收1024字節(jié)的數(shù) 據(jù)
51 begin
52 count <=count +1'b1;
53 end
54 else
55 begin
56 count <=0;
57 state <=4;
58 end
59 if(count ==2)
60 begin
61 temp_data <=pio_usb_data;
62 end
63 end
64
65 4 : begin
66 po_usb_rd_n <=1;
67 po_usb_oe_n <=1;
68 state <=0;
69 end
70
71 default: state <=0;
72 endcase
73
74 always@(*)
75 if(!pi_rst_n)
76 led <=1;
77 elseif(temp_data ==16'h33ff)//判斷我們接收數(shù)據(jù)是否正確
78 led <=0;
79
80endmodule
寫模塊:
0moduleusb_wr(pi_clk,pi_rst_n,pi_usb_flagb,pi_usb_flagc, pio_usb_data,
1 po_usb_oe_n,po_usb_wr_n,po_usb_address,po_usb_rd_n);
2
3 inputpi_clk;
4 inputpi_rst_n;
5 inputpi_usb_flagb; //端點(diǎn)2標(biāo)志信號(hào)
6 inputpi_usb_flagc; //端點(diǎn)6標(biāo)志信號(hào)
7 inout[15:0]pio_usb_data; //輸入輸出端口
8
9 outputregpo_usb_oe_n; //讀標(biāo)志信號(hào)
10 outputregpo_usb_wr_n; //寫使能
11 outputregpo_usb_rd_n; //讀使能
12 outputreg[1:0]po_usb_address; //端點(diǎn)地址選擇
13
14 reg[15:0]temp_data;
15 reg[2:0]state;
16
17 //在狀態(tài)的3,拿回?cái)?shù)據(jù)總線控制全,給寫入數(shù)據(jù)
18 assignpio_usb_data =(state ==3)?temp_data :16'hzzzz;
19
20 always@(posedgepi_clk ornegedgepi_rst_n)
21 if(!pi_rst_n)
22 begin
23 state <=0;
24 po_usb_oe_n <=1;
25 po_usb_wr_n <=1;
26 temp_data <=0;
27 po_usb_rd_n <=1;
28 end
29 else
30 case(state)
31 0 : state <=1;
32
33 1 : begin
34 po_usb_address <=2'b10;//地址指向端點(diǎn)6
35 state <=2;
36 end
37
38 2 : if(!pi_usb_flagc) //判斷端點(diǎn)6已經(jīng)空
39 begin
40 po_usb_wr_n <=0;
41 state <=3;
42 end
43 else
44 state <=2;
45
46 3 : if(temp_data <256-1) //發(fā)送1024 字節(jié)的數(shù)據(jù)
47 temp_data <=temp_data +1'b1;
48 else
49 begin
50 temp_data <=0;
51 state <=4;
52 end
53
54 4 : begin
55 po_usb_wr_n <=1;
56 state <=0;
57 end
58
59 default: state <=0;
60 endcase
61
62endmodule
上位機(jī)測(cè)試:
我們安裝好驅(qū)動(dòng)和下載的上位機(jī)軟件,然后在下面的界面中,點(diǎn)擊”LGEEPROM”按鈕,下載我們寫好的的.IIC固件。
然后在下面的頁面中會(huì)出現(xiàn)先選擇other endpt xfers選項(xiàng)
會(huì)出現(xiàn)我們的4個(gè)端點(diǎn),然后我們選擇寫入的端點(diǎn)或者讀的端點(diǎn)執(zhí)行讀寫操作
寫的端點(diǎn)是6端點(diǎn),我們選擇這個(gè)端點(diǎn),我們的寫入端點(diǎn)是1024個(gè)字節(jié),我設(shè)置的是512字節(jié),也就是寫入2次就可以寫滿了,
如下圖,和我們代碼中寫入數(shù)據(jù)值是一樣的。
讀操作也就是要讀我們的端點(diǎn)2,我們先要給端點(diǎn)一個(gè)數(shù),然后才能讀我們的端點(diǎn),我們寫入我們圖中顯示的數(shù),因?yàn)槲覀冊(cè)O(shè)計(jì)的是讀出的數(shù)如果第三個(gè)數(shù)位33ff 就讓我們的燈亮,值得一說的是,我們上位機(jī)顯示的時(shí)候是把低位顯示到了前面,高位顯示到了后面,我們一個(gè)包是1024字節(jié),后面的數(shù)自動(dòng)補(bǔ)零,讀出數(shù)據(jù)后可以看到我們的led燈亮,驗(yàn)證出我們的設(shè)計(jì)正確。
-
FPGA
+關(guān)注
關(guān)注
1643文章
21960瀏覽量
614066
發(fā)布評(píng)論請(qǐng)先 登錄
如何使用USB2.0將數(shù)據(jù)從fpga傳輸?shù)絇C?
調(diào)試CX3 USB3.0兼容USB2.0出圖的問題求解
在automaster和autoslave項(xiàng)目中如何配置參數(shù)來滿足usb3.0和usb2.0的數(shù)據(jù)傳輸?
是否可以與USB2.0集線器 (CYUSB2302) 共享USB2通道SS線路直接到USB3.0端口?
推薦一款USB2.0 MTT 2.0HUB SL6243
有沒有ASM3354 USB2.0口轉(zhuǎn)SATA的bridge?
TUSB121x USB2.0電路板指南

ARK3399 USB2.0 PC攝像頭控制器規(guī)格書
德州儀器USB2.0設(shè)備用晶體的選擇和規(guī)格

FPGA + USB2.0 PHY USB3300 實(shí)現(xiàn)高速USB2UART
USB 2.0信號(hào)質(zhì)量測(cè)試

CYUSB3014是否會(huì)自動(dòng)調(diào)整工作模式USB3.0還是USB2.0?
請(qǐng)問ESP32-S3 USB HOST是否支持USB2.0?
Fcx3 usb2.0攝像頭分辨率問題求解
矽力杰USB2.0接口ESD保護(hù)方案

評(píng)論