1. 程式人生 > >FX2LP與FPGA的簡單批量回環

FX2LP與FPGA的簡單批量回環

設計時 接口 pla 地址 gif 圖片 上升沿 diff 目標

我需求將FPGA處理的視頻數據通過USB發送給電腦,先實現一個小目標,做一個簡單的數據回環。

利用賽普拉斯EZ-USB FX2LP系列USB2.0的接口控制器,固件配置好為異步批量模式,並通過官方提供的Control Center進行測試。

技術分享圖片

上圖是FX2LP連接至FPGA時所需的硬件連接

它們之間的接口信號說明如下

  • FLAGA    OUT FIFO空標誌位,高電平表示非空
  • FLAGC    IN FIFO滿標誌位,高電平表示不滿
  • SLCS     片選信號,低電平有效
  • SLOE   輸出使能,低電平有效
  • SLRD 讀控制,低電平有效
  • SLWR 寫控制,低電平有效
  • FIFOADR[1:0] FIFO地址選擇,2‘b00為OUT FIFO地址,2‘b10為IN FIFO地址
  • FD[15:0] 雙向數據信號

設計時參看規格書給出的時序圖

技術分享圖片

技術分享圖片

從時序圖中,大致可以看出在異步模式下,數據是在SLWR和SLRD的上升沿讀入讀出,

技術分享圖片

設計時序如上圖,時鐘選取為10MHz

下面附上具體代碼

技術分享圖片
module usb_loop(
    input    sys_clk_p    ,
    input    sys_clk_n    ,
    input    reset_n        ,
    
    input    usb_flaga    ,
    
input usb_flagc , output reg [1:0] usb_fifoaddr , output reg usb_slcs , output reg usb_sloe , output reg usb_slrd , output reg usb_slwr , inout [15:0] usb_fd );
reg usb_fd_en; reg [15:0] usb_data; // Clock // differential clock -> single clock -> 10MHz clock wire sys_clk ; IBUFGDS buf_clk ( .I (sys_clk_p ), .IB (sys_clk_n ), .O (sys_clk ) ); pll_10 u_pll_10 ( .clk_in1 (sys_clk ), // 200Mhz .clk_out1 (clk_10 ) // 10Mhz ); // count reg flag_cnt; reg [2:0] cnt; wire add_cnt; wire end_cnt; always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) cnt <= 0; else if(add_cnt) begin if(end_cnt) cnt <= 0; else cnt <= cnt + 1; end end assign add_cnt = flag_cnt; assign end_cnt = add_cnt && cnt == 6 - 1; always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) flag_cnt <= 0; else if(flag_cnt == 0 && usb_flaga == 1 && usb_flagc == 1) flag_cnt <= 1; else if(end_cnt) flag_cnt <= 0; end always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) usb_slcs <= 1; else usb_slcs <= 0; end /* cnt 0 1 2 3 4 5 addr 0 0 0 2 2 2 slrd 1 0 1 1 1 1 sloe 1 0 1 1 1 1 slwr 1 1 1 1 0 1 */ always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) usb_fifoaddr <= 0; else if(add_cnt && cnt == 3 - 1) usb_fifoaddr <= 2b10; else if(end_cnt) usb_fifoaddr <= 0; end always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) usb_slrd <= 1; else if(add_cnt && cnt == 1 - 1) usb_slrd <= 0; else if(add_cnt && cnt == 2 - 1) usb_slrd <= 1; end always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) usb_sloe <= 1; else if(add_cnt && cnt == 1 - 1) usb_sloe <= 0; else if(add_cnt && cnt == 2 - 1) usb_sloe <= 1; end always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) usb_slwr <= 1; else if(add_cnt && cnt == 4 - 1) usb_slwr <= 0; else if(add_cnt && cnt == 5 - 1) usb_slwr <= 1; end assign usb_fd = (usb_fd_en) ? usb_data : 16hz; always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) usb_data <= 0; else if(add_cnt && cnt == 2 - 1) usb_data <= usb_fd; end always @(posedge clk_10 or negedge reset_n) begin if(reset_n == 0) usb_fd_en <= 0; else if(add_cnt && cnt == 3 - 1) usb_fd_en <= 1; else if(end_cnt) usb_fd_en <= 0; end endmodule
View Code

FX2LP與FPGA的簡單批量回環