FT601多通道模式驱动代码

[复制链接]
 楼主| 高剑辉 发表于 2021-8-11 15:01 | 显示全部楼层 |阅读模式
这两天在做FT601的USB3.0控制,发现网上大多数代码都是245单通道模式,这里提供多通道模式的loopback参考代码,在米联客的开发板上已经跑通了,请多多指教。。。。。
  1. module ft60x_top(
  2. input                 sys_clk_i,//50mINPUT
  3. // system control
  4. input                  Rstn_i,//fpga reset
  5. output                 USBSS_EN,//power enable   
  6. output wire LED_o,
  7. // FIFO interface     
  8. (*mark_debug = "true"*)(* KEEP = "TRUE" *)input          CLK_i,

  9. (*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [7:0]   DATA_io7_0,
  10. (*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [7:0]   DATA_io15_8,
  11. (*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [7:0]   DATA_io23_16,
  12. (*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [7:0]   DATA_io31_24,
  13. (*mark_debug = "true"*)(* KEEP = "TRUE" *)inout [3:0]    BE_io,

  14. (*mark_debug = "true"*)(* KEEP = "TRUE" *)input  wire    RXF_N_i,   // ACK_N
  15. (*mark_debug = "true"*)(* KEEP = "TRUE" *)input  wire    TXE_N_i,
  16. (*mark_debug = "true"*)(* KEEP = "TRUE" *)output reg     OE_N_o,
  17. (*mark_debug = "true"*)(* KEEP = "TRUE" *)output reg     WR_N_o,    // REQ_N
  18. (*mark_debug = "true"*)(* KEEP = "TRUE" *)output         SIWU_N_o,
  19. (*mark_debug = "true"*)(* KEEP = "TRUE" *)output reg     RD_N_o,
  20. (*mark_debug = "true"*)(* KEEP = "TRUE" *)output          WAKEUP_o,
  21. (*mark_debug = "true"*)(* KEEP = "TRUE" *)output [1:0]    GPIO_o

  22. );

  23. assign USBSS_EN = 1'b1;   
  24. assign WAKEUP_o = 1'b1;
  25. assign GPIO_o   = 2'b10;//00:245模式;11:4通道模式   
  26. assign SIWU_N_o = 1'b0;

  27. //assign DATA_io7_0=8'hff;
  28. //assign DATA_io23_16=8'hff;
  29. //assign DATA_io31_24=8'hff;
  30. //assign OE_N_o=0;//245模式下有用
  31. //assign RD_N_o=0;//245模式下有用

  32. wire rstn;

  33. (*mark_debug = "true"*)(* KEEP = "TRUE" *) wire [35:0] FIFO_Din;
  34. (*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [35:0] FIFO_Dout;

  35. (*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [7:0] data_out7_0;//总线往外输出的数据组,可以为指令或输出数据
  36. (*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [7:0] data_out15_8;
  37. (*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [7:0] data_out23_16;
  38. (*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [7:0] data_out31_24;
  39. (*mark_debug = "true"*)(* KEEP = "TRUE" *)wire [3:0] Be_out;

  40. (*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [7:0] commond_out7_0;
  41. (*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [7:0] commond_out15_8;
  42. (*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [7:0] commond_out23_16;
  43. (*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [7:0] commond_out31_24;
  44. (*mark_debug = "true"*)(* KEEP = "TRUE" *) reg [3:0] commond_Be_out;

  45. (*mark_debug = "true"*) (* KEEP = "TRUE" *) wire [3 :0] BE_RD;

  46. (*mark_debug = "true"*) reg [ 3:0] BE_WR;
  47. (*mark_debug = "true"*) wire FIFO_F,FIFO_V;
  48. (*mark_debug = "true"*) reg [7:0] mode4ch_state;
  49. (*mark_debug = "true"*) wire FIFO_WR;
  50. (*mark_debug = "true"*) wire FIFO_RD;

  51. 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
  52. assign FIFO_WR    =((!RXF_N_i)&&( mode4ch_state==8'd3)) ? 1'd1:1'd0;
  53. assign FIFO_RD    =((TXE_N_i)&&(!RXF_N_i)&&(mode4ch_state==8'd7)) ? 1'd1:1'd0;

  54. assign DATA_io7_0    =  ((TXE_N_i)&&(mode4ch_state==8'd3)) ? 8'bz: data_out7_0 ;
  55. assign DATA_io15_8   =  ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? data_out15_8:8'bz  ;
  56. assign DATA_io23_16  =  ((TXE_N_i)&&(mode4ch_state==8'd3)) ? 8'bz: data_out23_16 ;
  57. assign DATA_io31_24  =  ((TXE_N_i)&&(mode4ch_state==8'd3)) ? 8'bz: data_out31_24 ;
  58. assign BE_io     =  ((TXE_N_i)&&(mode4ch_state==8'd3)) ? 4'bz : Be_out;// write data

  59. //assign data_out  =  (!TXE_N_i) ? commond_out:FIFO_Dout;// write data dir
  60. //assign data_out7_0    =  (!RXF_N_i && ()mode4ch_state==8'd7) ? FIFO_Dout[7:0]  :commond_out7_0;// write data dir
  61. //assign data_out15_8   =  (!RXF_N_i && mode4ch_state==8'd7) ? FIFO_Dout[15:8] :commond_out15_8;
  62. //assign data_out23_16  =  (!RXF_N_i && mode4ch_state==8'd7) ? FIFO_Dout[23:16]:commond_out23_16;
  63. //assign data_out31_24  =  (!RXF_N_i && mode4ch_state==8'd7) ? FIFO_Dout[31:24]:commond_out31_24;
  64. //assign Be_out         =  (!RXF_N_i && mode4ch_state==8'd7) ? FIFO_Dout[35:32]:commond_Be_out;
  65. 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
  66. assign data_out15_8   =  ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[15:8] :commond_out15_8;
  67. assign data_out23_16  =  ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[23:16]:commond_out23_16;
  68. assign data_out31_24  =  ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[31:24]:commond_out31_24;
  69. assign Be_out         =  ((TXE_N_i)&&(mode4ch_state==8'd7 || mode4ch_state==8'd6)) ? FIFO_Dout[35:32]:commond_Be_out;
  70. //assign BE_RD    =  (mode4ch_state==2'd1) ? BE_io   : 4'd0;
  71. //assign FIFO_RD    = (!WR_N_o)&&(!TXE_N_i);

  72. reg RXF_N_i_r0;
  73. always @(posedge CLK_i)begin
  74.           RXF_N_i_r0 <= RXF_N_i;
  75.           end
  76. reg [7:0] data_ch;
  77. reg [15:0] test_cnt;
  78. always @(posedge CLK_i)begin
  79.     if(!rstn)begin
  80.         mode4ch_state <= 8'd1;
  81.         test_cnt<=8'd0;
  82.         data_ch<=8'd1;
  83.         commond_out7_0<=8'hff;
  84.         commond_out23_16<=8'hff;
  85.         commond_out31_24<=8'hff;      
  86.         commond_Be_out<=4'hf;   
  87.         WR_N_o <= 1'b1;
  88.     end
  89.     else begin
  90.         case(mode4ch_state)
  91.         1:begin
  92.           if(RXF_N_i && DATA_io15_8==8'hef)begin//通道1数据写入FPGA请求
  93.             WR_N_o <= 1'b0;
  94.             data_ch<=8'd1;
  95.             mode4ch_state<=8'd2;
  96.             commond_out7_0<=8'h01;//1通道
  97.             commond_out23_16<=8'hff;
  98.             commond_out31_24<=8'hff;      
  99.             commond_Be_out<=4'h0;  
  100.             end
  101.           else if(RXF_N_i && DATA_io15_8==8'hdf)begin//通道2数据写入FPGA请求
  102.               WR_N_o <= 1'b0;
  103.               data_ch<=8'd2;
  104.               mode4ch_state<=8'd2;
  105.               commond_out7_0<=8'h02;//2通道
  106.               commond_out23_16<=8'hff;
  107.               commond_out31_24<=8'hff;      
  108.               commond_Be_out<=4'h0;  
  109.               end
  110.               else if(RXF_N_i && DATA_io15_8==8'hfe)begin//通道1数据可以读出FPGA
  111.                     WR_N_o <= 1'b0;
  112.                     data_ch<=8'd1;
  113.                     mode4ch_state<=8'd5;//跳转到状态机5执行数据读出
  114.                     commond_out7_0<=8'h01;
  115.                     commond_out23_16<=8'hff;
  116.                     commond_out31_24<=8'hff;      
  117.                     commond_Be_out<=4'h1;
  118.                     end
  119.                else if(RXF_N_i && DATA_io15_8==8'hfd)begin//通道2数据可以读出FPGA
  120.                     WR_N_o <= 1'b0;
  121.                     data_ch<=8'd2;
  122.                     mode4ch_state<=8'd5;
  123.                     commond_out7_0<=8'h02;
  124.                     commond_out23_16<=8'hff;
  125.                     commond_out31_24<=8'hff;      
  126.                     commond_Be_out<=4'h1;
  127.                     end
  128.                    else begin
  129.                     WR_N_o <= 1'b1; //请求读取数据,
  130.                     commond_out7_0<=8'hff;
  131.                     commond_out23_16<=8'hff;
  132.                     commond_out31_24<=8'hff;      
  133.                     commond_Be_out<=4'hf;           
  134.                     end         
  135.         end
  136.         2:begin
  137.                if(TXE_N_i)begin
  138.                mode4ch_state<=8'd3;  
  139.                end         
  140.        end
  141.         3:begin
  142.                if(!RXF_N_i_r0 && RXF_N_i)begin
  143.                mode4ch_state<=8'd1;  
  144.                end         
  145.        end
  146.        4:begin//FPGA读数据状态,通过RXF_N确定数据段           
  147. //           if(test_cnt==16'd700) begin//TXE_N_i抬高时数据已经全部的完成
  148.             if(RXF_N_i && DATA_io15_8==8'hfe)begin
  149.              WR_N_o <= 1'b0;
  150.              mode4ch_state<=8'd5;
  151.              commond_out7_0<=8'h01;
  152.              commond_out23_16<=8'hff;
  153.              commond_out31_24<=8'hff;      
  154.              commond_Be_out<=4'h1;
  155.              end
  156.             else begin
  157.              WR_N_o <= 1'b1; //请求读取数据,
  158.              commond_out7_0<=8'hff;
  159.              commond_out23_16<=8'hff;
  160.              commond_out31_24<=8'hff;      
  161.              commond_Be_out<=4'hf;           
  162.              end   
  163.         end
  164.         5:begin
  165. //        if(TXE_N_i)begin
  166.         mode4ch_state<=8'd6;  
  167. //       end     
  168.         end
  169.         6:begin
  170. //               if(!RXF_N_i_r0 && RXF_N_i)begin
  171.                mode4ch_state<=8'd7;  
  172.                end  
  173.        7:begin
  174.                if(!RXF_N_i_r0 && RXF_N_i)begin
  175.        mode4ch_state<=8'd1;  
  176.                end           
  177.        end
  178.         endcase                 
  179.     end
  180. end


  181.   led_running led_running(
  182. .clk(CLK_i),
  183. .RSTn(rstn),
  184. .led_out(LED_o)
  185. );
  186. // fifo master
  187. wire [35:0] FIFO_Dout_ch1,FIFO_Dout_ch2;
  188. assign FIFO_Dout= (data_ch==8'd1) ? FIFO_Dout_ch1:FIFO_Dout_ch2;
  189. //assign FIFO_Dout= 36'hfffffffff;
  190. wire [15:0] data_count_ch1,data_count_ch2;
  191. fifo_generator_0 fifo_inst_ch1 (
  192.   .clk(CLK_i),      // input wire clk
  193.   .srst(!rstn),    // input wire srst
  194.   .din(FIFO_Din),      // input wire [15 : 0] din
  195.   .wr_en(FIFO_WR && data_ch==8'd1),  // input wire wr_en
  196.   .rd_en(FIFO_RD && data_ch==8'd1),  // input wire rd_en
  197.   .dout(FIFO_Dout_ch1),    // output wire [15 : 0] dout
  198.   .full(FIFO_F),    // output wire full
  199. // .empty(FIFO_E),  // output wire empty
  200.   .valid(FIFO_V),  // output wire valid
  201.   .data_count(data_count_ch1)
  202. );

  203. fifo_generator_0 fifo_inst_ch2 (
  204.   .clk(CLK_i),      // input wire clk
  205.   .srst(!rstn),    // input wire srst
  206.   .din(FIFO_Din),      // input wire [15 : 0] din
  207.   .wr_en(FIFO_WR && data_ch==8'd2),  // input wire wr_en
  208.   .rd_en(FIFO_RD && data_ch==8'd2),  // input wire rd_en
  209.   .dout(FIFO_Dout_ch2),    // output wire [15 : 0] dout
  210.   .full(),    // output wire full
  211. // .empty(FIFO_E),  // output wire empty
  212.   .valid(),  // output wire valid
  213.   .data_count(data_count_ch2)
  214. );

  215. ila_0 ila_0 (
  216. .clk(CLK_i),
  217. .probe0({RXF_N_i,TXE_N_i,WR_N_o,RD_N_o,mode4ch_state[2:0],FIFO_WR,test_cnt}),
  218. //.probe1({DATA_io7_0,DATA_io15_8,DATA_io23_16,DATA_io31_24,BE_io}),
  219. .probe1({FIFO_Din,FIFO_WR,FIFO_RD,FIFO_Dout_ch1}),
  220. .probe2({data_count_ch1,data_count_ch2})
  221. );

  222. Delay_rst #(
  223.     .num(20'hffff0)
  224. )
  225. Delay_rst_inst
  226. (
  227.     .clk_i(CLK_i),
  228.     .rstn_i(Rstn_i),
  229.     .rst_o(rstn)
  230. );

  231. //assign rstn=Rstn_i;
  232.    
  233. endmodule
gujunjie594 发表于 2021-8-18 23:11 来自手机 | 显示全部楼层
你好,最近也准备调这个,能交流一下吗QQ2766270522
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部