?? ft245_r_w.v
字號:
//*****************************************************
//模塊名稱: FT245_R_W
//模塊功能: FT245BM 讀寫模塊
//版本記錄:
//V 1.0 2008-02-18 謝朝壯
//*****************************************************
//模塊接口
//*****************************************************
module FT245_R_W(
//系統信號
input wire sclk, //sclk為FPGA工作時鐘,默認100MHz.
input wire rst_n, //異步復位信號,低有效.
//FPGA和FT245MB間的USB接口
input wire USB_RXF,
input wire USB_TXE,
output reg USB_RD,
output reg USB_WR,
inout tri [7:0] USB_DATA, //USB和FPGA間的雙向數據庫總線
//模塊內部和其他模塊或器件間的接口
output reg [7:0] RX_data_fm_usb, //其他模塊或器件從本模塊讀取來自USB接口的數據
input wire [7:0] TX_data_to_usb, //其他模塊或器件向本模塊寫入發到USB接口的數據
input wire RD_Enable, //其他模塊或器件從本模塊讀取來自USB接口數據的讀使能,高有效
input wire WR_Enable, //其他模塊或器件向本模塊寫入發到USB接口數據的寫使能,高有效
output reg USB_busy //USB接口忙/空閑狀態信號,高為忙碌,低為空閑
); //處于讀狀態時,由忙碌狀態變為空閑狀表示上一個數據開始有效
//******************************************************
//內部寄存器定義
reg [7:0] data_fm_usb; //從USB接收數據
reg [7:0] data_to_usb; //發送數據到USB
reg [7:0] data_to_usb_buffer; //發送緩沖寄存器
reg [4:0] RD_time_cont; //讀等待時間計數器
reg [4:0] WR_time_cont; //寫等待時間計數器
parameter RX_state0 = 2'b01; //讀狀態0
parameter RX_state1 = 2'b10; //讀狀態1
parameter TX_state0 = 2'b01; //寫狀態0
parameter TX_state1 = 2'b10; //寫狀態1
reg [1:0] RX_state; //讀狀態
reg [1:0] TX_state; //寫狀態
//******************************************************
//本模塊與FT245B間的數據總線
//******************************************************
assign USB_DATA=(USB_WR==1'b1)?data_to_usb:8'bzz;
//******************************************************
//其他模塊與本模塊之間的數據交換
//******************************************************
always@(posedge sclk or negedge rst_n)//接收數據
if(!rst_n)
RX_data_fm_usb <= 8'b00;
else if(RD_Enable == 1'b1)
RX_data_fm_usb <= data_fm_usb;
//////////////////////////////////
always@(posedge sclk or negedge rst_n)//發送數據
if(!rst_n)
data_to_usb_buffer <= 8'b00;
else if(WR_Enable == 1'b1)
data_to_usb_buffer <= TX_data_to_usb;
//******************************************************
//USB接口忙/空閑狀態信號USB_busy處理
//******************************************************
always@(posedge sclk or negedge rst_n)
if(!rst_n)
USB_busy<=1'b0; //狀態機復位到空閑
else if((USB_RXF==1'b0 && RD_Enable == 1'b1)||(USB_TXE==1'b0 && WR_Enable==1'b1))
USB_busy<=1'b1; //狀態機忙碌
else
USB_busy<=1'b0; //狀態機空閑
//******************************************************
//讀/寫FT254BM相關等待時間計數
//******************************************************
always@(posedge sclk or negedge rst_n)
if(!rst_n)
RD_time_cont<=5'b0;
else if(USB_RD==1'b0) //讀使能到來開始計數.
RD_time_cont<=RD_time_cont + 1'b1;
else if(USB_RXF == 1'b1) //USB_RXF沒拉高之前不允許有其他跨讀(寫)操作
RD_time_cont<=5'b0;
//******************************************************
always@(posedge sclk or negedge rst_n)
if(!rst_n)
WR_time_cont<=5'b0;
else if(USB_WR==1'b1) //寫使能到來開始計數.
WR_time_cont<=WR_time_cont + 1'b1;
else if(USB_TXE == 1'b1) //USB_TXE沒拉高之前不允許有其他跨讀(寫)操作
WR_time_cont<=5'b0;
//******************************************************
//本模塊讀FT254BM狀態機
//******************************************************
always@(posedge sclk or negedge rst_n) //sclk為FPGA工作時鐘,默認100MHz.
if(!rst_n)
begin
RX_state<=RX_state0;
USB_RD <=1'b1;
end
else if(USB_RXF==1'b0 && RD_Enable == 1'b1) //RD_Enable 高有效
begin
case(RX_state)
RX_state0:
begin
if(RD_time_cont==5'b0)
USB_RD<=1'b0; //產生讀信號的下降沿
else if(RD_time_cont==5'd5) //產生讀信號的下降沿50ns后轉到讀狀態1
RX_state<=RX_state1;
end
RX_state1:
begin
if(RD_time_cont==5'd6) //產生讀信號的下降沿60ns后讀數據
data_fm_usb<=USB_DATA; //讀FT245BM芯片FIFO的當前字節
else if(RD_time_cont==5'd7) //USB_RD有效脈沖寬度最小為50ns,這里用70ns.
USB_RD<=1'b1;
end
endcase
end
else
begin
RX_state<=RX_state0;
USB_RD<=1'b1;
end
//******************************************************
//本模塊寫FT254BM狀態機
//******************************************************
always@(posedge sclk or negedge rst_n) //sclk為FPGA工作時鐘,默認100MHz.
if(!rst_n)
begin
TX_state<=TX_state0;
USB_WR <=1'b0;
end
else if(USB_TXE==1'b0 && WR_Enable==1'b1) //WR_Enable 高有效
begin
case(TX_state)
TX_state0:
begin
if(WR_time_cont==5'b0)
USB_WR<=1'b1; //產生寫信號的上升沿
else if(WR_time_cont==5'd5) //產生寫信號的上升沿50ns后轉到寫狀態1
TX_state<=TX_state1;
end
TX_state1:
begin
if(WR_time_cont==5'd6) //產生寫信號的上升沿60ns發送數據
data_to_usb <=data_to_usb_buffer; //寫一個字節到FIFO,data_to_usb_buffer為發送緩沖寄存器
else if(WR_time_cont==5'd7) //USB_WR有效脈沖寬度最小為50ns,這里用70ns.
USB_WR <=1'b0;
end
endcase
end
else
begin
TX_state<=TX_state0;
USB_WR <=1'b0;
end
endmodule
//////////////////////////////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -