module ft60x_top(
input sys_clk_i,//50mINPUT
// system control
input Rstn_i,//fpga reset
output USBSS_EN,//power enable
output wire LED_o,
// FIFO interface
(*mark_debug = "true"*)(* KEEP = "TRUE" *)input CLK_i,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [7:0] DATA_io7_0,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [7:0] DATA_io15_8,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [7:0] DATA_io23_16,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [7:0] DATA_io31_24,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [3:0] BE_io,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)input wire RXF_N_i, // ACK_N
(*mark_debug = "true"*)(* KEEP = "TRUE" *)input wire TXE_N_i,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)output reg OE_N_o,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)output reg WR_N_o, // REQ_N
(*mark_debug = "true"*)(* KEEP = "TRUE" *)output SIWU_N_o,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)output reg RD_N_o,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)output WAKEUP_o,
(*mark_debug = "true"*)(* KEEP = "TRUE" *)output [1:0] GPIO_o
);
assign USBSS_EN = 1'b1;
assign WAKEUP_o = 1'b1;
assign GPIO_o = 2'b10;//00:245模式;11:4通道模式
assign SIWU_N_o = 1'b0;
//assign DATA_io7_0=8'hff;
//assign DATA_io23_16=8'hff;
//assign DATA_io31_24=8'hff;
//assign OE_N_o=0;//245模式下有用
//assign RD_N_o=0;//245模式下有用
wire rstn;
(*mark_debug = "true"*)(* KEEP = "TRUE" *) wire [35:0] FIFO_Din;
(*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [35:0] FIFO_Dout;
(*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [7:0] data_out7_0;//总线往外输出的数据组,可以为指令或输出数据
(*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [7:0] data_out15_8;
(*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [7:0] data_out23_16;
(*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [7:0] data_out31_24;
(*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [3:0] Be_out;
(*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [7:0] commond_out7_0;
(*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [7:0] commond_out15_8;
(*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [7:0] commond_out23_16;
(*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [7:0] commond_out31_24;
(*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [3:0] commond_Be_out;
(*mark_debug = "true"*) (* KEEP = "TRUE" *) wire [3 :0] BE_RD;
(*mark_debug = "true"*) reg [ 3:0] BE_WR;
(*mark_debug = "true"*) wire FIFO_F,FIFO_V;
(*mark_debug = "true"*) reg [7:0] mode4ch_state;
(*mark_debug = "true"*) wire FIFO_WR;
(*mark_debug = "true"*) wire FIFO_RD;
assign FIFO_Din = ((!RXF_N_i)&&( mode4ch_state==8'd3)) ? {BE_io,DATA_io31_24,DATA_io23_16,DATA_io15_8,DATA_io7_0} : 36'd0;//read data dir
assign FIFO_WR =((!RXF_N_i)&&( mode4ch_state==8'd3)) ? 1'd1:1'd0;
assign FIFO_RD =((TXE_N_i)&&(!RXF_N_i)&&(mode4ch_state==8'd7)) ? 1'd1:1'd0;
assign DATA_io7_0 = ((TXE_N_i)&&(mode4ch_state==8'd3)) ? 8'bz: data_out7_0 ;
assign DATA_io15_8 = ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? data_out15_8:8'bz ;
assign DATA_io23_16 = ((TXE_N_i)&&(mode4ch_state==8'd3)) ? 8'bz: data_out23_16 ;
assign DATA_io31_24 = ((TXE_N_i)&&(mode4ch_state==8'd3)) ? 8'bz: data_out31_24 ;
assign BE_io = ((TXE_N_i)&&(mode4ch_state==8'd3)) ? 4'bz : Be_out;// write data
//assign data_out = (!TXE_N_i) ? commond_out:FIFO_Dout;// write data dir
//assign data_out7_0 = (!RXF_N_i && ()mode4ch_state==8'd7) ? FIFO_Dout[7:0] :commond_out7_0;// write data dir
//assign data_out15_8 = (!RXF_N_i && mode4ch_state==8'd7) ? FIFO_Dout[15:8] :commond_out15_8;
//assign data_out23_16 = (!RXF_N_i && mode4ch_state==8'd7) ? FIFO_Dout[23:16]:commond_out23_16;
//assign data_out31_24 = (!RXF_N_i && mode4ch_state==8'd7) ? FIFO_Dout[31:24]:commond_out31_24;
//assign Be_out = (!RXF_N_i && mode4ch_state==8'd7) ? FIFO_Dout[35:32]:commond_Be_out;
assign data_out7_0 = ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[7:0] :commond_out7_0;// write data dir
assign data_out15_8 = ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[15:8] :commond_out15_8;
assign data_out23_16 = ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[23:16]:commond_out23_16;
assign data_out31_24 = ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[31:24]:commond_out31_24;
assign Be_out = ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[35:32]:commond_Be_out;
//assign BE_RD = (mode4ch_state==2'd1) ? BE_io : 4'd0;
//assign FIFO_RD = (!WR_N_o)&&(!TXE_N_i);
reg RXF_N_i_r0;
always @(posedge CLK_i)begin
RXF_N_i_r0 <= RXF_N_i;
end
reg [7:0] data_ch;
reg [15:0] test_cnt;
always @(posedge CLK_i)begin
if(!rstn)begin
mode4ch_state <= 8'd1;
test_cnt<=8'd0;
data_ch<=8'd1;
commond_out7_0<=8'hff;
commond_out23_16<=8'hff;
commond_out31_24<=8'hff;
commond_Be_out<=4'hf;
WR_N_o <= 1'b1;
end
else begin
case(mode4ch_state)
1:begin
if(RXF_N_i && DATA_io15_8==8'hef)begin//通道1数据写入FPGA请求
WR_N_o <= 1'b0;
data_ch<=8'd1;
mode4ch_state<=8'd2;
commond_out7_0<=8'h01;//1通道
commond_out23_16<=8'hff;
commond_out31_24<=8'hff;
commond_Be_out<=4'h0;
end
else if(RXF_N_i && DATA_io15_8==8'hdf)begin//通道2数据写入FPGA请求
WR_N_o <= 1'b0;
data_ch<=8'd2;
mode4ch_state<=8'd2;
commond_out7_0<=8'h02;//2通道
commond_out23_16<=8'hff;
commond_out31_24<=8'hff;
commond_Be_out<=4'h0;
end
else if(RXF_N_i && DATA_io15_8==8'hfe)begin//通道1数据可以读出FPGA
WR_N_o <= 1'b0;
data_ch<=8'd1;
mode4ch_state<=8'd5;//跳转到状态机5执行数据读出
commond_out7_0<=8'h01;
commond_out23_16<=8'hff;
commond_out31_24<=8'hff;
commond_Be_out<=4'h1;
end
else if(RXF_N_i && DATA_io15_8==8'hfd)begin//通道2数据可以读出FPGA
WR_N_o <= 1'b0;
data_ch<=8'd2;
mode4ch_state<=8'd5;
commond_out7_0<=8'h02;
commond_out23_16<=8'hff;
commond_out31_24<=8'hff;
commond_Be_out<=4'h1;
end
else begin
WR_N_o <= 1'b1; //请求读取数据,
commond_out7_0<=8'hff;
commond_out23_16<=8'hff;
commond_out31_24<=8'hff;
commond_Be_out<=4'hf;
end
end
2:begin
if(TXE_N_i)begin
mode4ch_state<=8'd3;
end
end
3:begin
if(!RXF_N_i_r0 && RXF_N_i)begin
mode4ch_state<=8'd1;
end
end
4:begin//FPGA读数据状态,通过RXF_N确定数据段
// if(test_cnt==16'd700) begin//TXE_N_i抬高时数据已经全部的完成
if(RXF_N_i && DATA_io15_8==8'hfe)begin
WR_N_o <= 1'b0;
mode4ch_state<=8'd5;
commond_out7_0<=8'h01;
commond_out23_16<=8'hff;
commond_out31_24<=8'hff;
commond_Be_out<=4'h1;
end
else begin
WR_N_o <= 1'b1; //请求读取数据,
commond_out7_0<=8'hff;
commond_out23_16<=8'hff;
commond_out31_24<=8'hff;
commond_Be_out<=4'hf;
end
end
5:begin
// if(TXE_N_i)begin
mode4ch_state<=8'd6;
// end
end
6:begin
// if(!RXF_N_i_r0 && RXF_N_i)begin
mode4ch_state<=8'd7;
end
7:begin
if(!RXF_N_i_r0 && RXF_N_i)begin
mode4ch_state<=8'd1;
end
end
endcase
end
end
led_running led_running(
.clk(CLK_i),
.RSTn(rstn),
.led_out(LED_o)
);
// fifo master
wire [35:0] FIFO_Dout_ch1,FIFO_Dout_ch2;
assign FIFO_Dout= (data_ch==8'd1) ? FIFO_Dout_ch1:FIFO_Dout_ch2;
//assign FIFO_Dout= 36'hfffffffff;
wire [15:0] data_count_ch1,data_count_ch2;
fifo_generator_0 fifo_inst_ch1 (
.clk(CLK_i), // input wire clk
.srst(!rstn), // input wire srst
.din(FIFO_Din), // input wire [15 : 0] din
.wr_en(FIFO_WR && data_ch==8'd1), // input wire wr_en
.rd_en(FIFO_RD && data_ch==8'd1), // input wire rd_en
.dout(FIFO_Dout_ch1), // output wire [15 : 0] dout
.full(FIFO_F), // output wire full
// .empty(FIFO_E), // output wire empty
.valid(FIFO_V), // output wire valid
.data_count(data_count_ch1)
);
fifo_generator_0 fifo_inst_ch2 (
.clk(CLK_i), // input wire clk
.srst(!rstn), // input wire srst
.din(FIFO_Din), // input wire [15 : 0] din
.wr_en(FIFO_WR && data_ch==8'd2), // input wire wr_en
.rd_en(FIFO_RD && data_ch==8'd2), // input wire rd_en
.dout(FIFO_Dout_ch2), // output wire [15 : 0] dout
.full(), // output wire full
// .empty(FIFO_E), // output wire empty
.valid(), // output wire valid
.data_count(data_count_ch2)
);
ila_0 ila_0 (
.clk(CLK_i),
.probe0({RXF_N_i,TXE_N_i,WR_N_o,RD_N_o,mode4ch_state[2:0],FIFO_WR,test_cnt}),
//.probe1({DATA_io7_0,DATA_io15_8,DATA_io23_16,DATA_io31_24,BE_io}),
.probe1({FIFO_Din,FIFO_WR,FIFO_RD,FIFO_Dout_ch1}),
.probe2({data_count_ch1,data_count_ch2})
);
Delay_rst #(
.num(20'hffff0)
)
Delay_rst_inst
(
.clk_i(CLK_i),
.rstn_i(Rstn_i),
.rst_o(rstn)
);
//assign rstn=Rstn_i;
endmodule