Advertisement
peregrin5

rvfpga.sv

Feb 7th, 2021
1,206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // SPDX-License-Identifier: Apache-2.0
  2. // Copyright 2019 Western Digital Corporation or its affiliates.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15.  
  16. //********************************************************************************
  17. // $Id$
  18. //
  19. // Function: SweRVolf toplevel for Nexys A7 board
  20. // Comments:
  21. //
  22. //********************************************************************************
  23.  
  24. `default_nettype none
  25. module rvfpga
  26.   #(parameter bootrom_file  = "")
  27.    (input wire         clk,
  28.     input wire         rstn,
  29.     output wire [12:0] ddram_a,
  30.     output wire [2:0]  ddram_ba,
  31.     output wire        ddram_ras_n,
  32.     output wire        ddram_cas_n,
  33.     output wire        ddram_we_n,
  34.     output wire        ddram_cs_n,
  35.     output wire [1:0]  ddram_dm,
  36.     inout wire [15:0]  ddram_dq,
  37.     inout wire [1:0]   ddram_dqs_p,
  38.     inout wire [1:0]   ddram_dqs_n,
  39.     output wire        ddram_clk_p,
  40.     output wire        ddram_clk_n,
  41.     output wire        ddram_cke,
  42.     output wire        ddram_odt,
  43.     output wire        o_flash_cs_n,
  44.     output wire        o_flash_mosi,
  45.     input wire         i_flash_miso,
  46.     input wire         i_uart_rx,
  47.     output wire        o_uart_tx,
  48.     inout wire [15:0]  i_sw,
  49.     output reg [15:0]  o_led,
  50.     output reg [7:0]   AN,
  51.     output reg         CA, CB, CC, CD, CE, CF, CG, DP,
  52.     output wire        o_accel_cs_n,
  53.     output wire        o_accel_mosi,
  54.     input wire         i_accel_miso,
  55.     output wire        accel_sclk,
  56.     inout wire         i_btn_u,
  57.     inout wire         i_btn_d,
  58.     inout wire         i_btn_l,
  59.     inout wire         i_btn_r,
  60.     inout wire         i_btn_c
  61.     );
  62.  
  63.     wire [15:0]     gpio_out;
  64.     wire            cpu_tx,litedram_tx;
  65.     wire            litedram_init_done;
  66.     wire            litedram_init_error;
  67.  
  68.     localparam RAM_SIZE     = 32'h10000;
  69.  
  70.     wire clk_core;
  71.     wire rst_core;
  72.     wire user_clk;
  73.     wire user_rst;
  74.  
  75.  
  76.     clk_gen_nexys clk_gen (
  77.         .i_clk (user_clk),
  78.         .i_rst (user_rst),
  79.         .o_clk_core (clk_core),
  80.         .o_rst_core (rst_core)
  81.     );
  82.  
  83.     clk_gen_75M clk_gen_75M
  84.     (
  85.         .o_clk_75M(o_clk_75M),              // output o_clk_75M
  86.         .reset(user_rst),                   // input reset
  87.         .i_clk_100M(clk)               // Clock in ports
  88.     );
  89.  
  90.  
  91.     AXI_BUS #(32, 64, 6, 1) mem();
  92.     AXI_BUS #(32, 64, 6, 1) cpu();
  93.  
  94.     assign cpu.aw_atop = 6'd0;
  95.     assign cpu.aw_user = 1'b0;
  96.     assign cpu.ar_user = 1'b0;
  97.     assign cpu.w_user = 1'b0;
  98.     assign cpu.b_user = 1'b0;
  99.     assign cpu.r_user = 1'b0;
  100.     assign mem.b_user = 1'b0;
  101.     assign mem.r_user = 1'b0;
  102.  
  103.     axi_cdc_intf
  104.     #(.AXI_USER_WIDTH (1),
  105.         .AXI_ADDR_WIDTH (32),
  106.         .AXI_DATA_WIDTH (64),
  107.         .AXI_ID_WIDTH   (6))
  108.     cdc (
  109.         .src_clk_i  (clk_core),
  110.         .src_rst_ni (~rst_core),
  111.         .src        (cpu),
  112.         .dst_clk_i  (user_clk),
  113.         .dst_rst_ni (~user_rst),
  114.         .dst        (mem));
  115.  
  116.     litedram_top
  117.       #(.ID_WIDTH (6))
  118.     ddr2 (  
  119.         .serial_tx   (litedram_tx),
  120.         .serial_rx   (i_uart_rx),
  121.         .clk100      (clk),
  122.         .rst_n       (rstn),
  123.         .pll_locked  (),
  124.         .user_clk    (user_clk),
  125.         .user_rst    (user_rst),
  126.         .ddram_a     (ddram_a),
  127.         .ddram_ba    (ddram_ba),
  128.         .ddram_ras_n (ddram_ras_n),
  129.         .ddram_cas_n (ddram_cas_n),
  130.         .ddram_we_n  (ddram_we_n),
  131.         .ddram_cs_n  (ddram_cs_n),
  132.         .ddram_dm    (ddram_dm   ),
  133.         .ddram_dq    (ddram_dq   ),
  134.         .ddram_dqs_p (ddram_dqs_p),
  135.         .ddram_dqs_n (ddram_dqs_n),
  136.         .ddram_clk_p (ddram_clk_p),
  137.         .ddram_clk_n (ddram_clk_n),
  138.         .ddram_cke   (ddram_cke  ),
  139.         .ddram_odt   (ddram_odt  ),
  140.         .init_done  (litedram_init_done),
  141.         .init_error (litedram_init_error),
  142.         .i_awid    (mem.aw_id   ),
  143.         .i_awaddr  (mem.aw_addr[26:0] ),
  144.         .i_awlen   (mem.aw_len  ),
  145.         .i_awsize  ({1'b0,mem.aw_size} ),
  146.         .i_awburst (mem.aw_burst),
  147.         .i_awvalid (mem.aw_valid),
  148.         .o_awready (mem.aw_ready),
  149.         .i_arid    (mem.ar_id   ),
  150.         .i_araddr  (mem.ar_addr[26:0] ),
  151.         .i_arlen   (mem.ar_len  ),
  152.         .i_arsize  ({1'b0,mem.ar_size} ),
  153.         .i_arburst (mem.ar_burst),
  154.         .i_arvalid (mem.ar_valid),
  155.         .o_arready (mem.ar_ready),
  156.         .i_wdata   (mem.w_data  ),
  157.         .i_wstrb   (mem.w_strb  ),
  158.         .i_wlast   (mem.w_last  ),
  159.         .i_wvalid  (mem.w_valid ),
  160.         .o_wready  (mem.w_ready ),
  161.         .o_bid     (mem.b_id    ),
  162.         .o_bresp   (mem.b_resp  ),
  163.         .o_bvalid  (mem.b_valid ),
  164.         .i_bready  (mem.b_ready ),
  165.         .o_rid     (mem.r_id    ),
  166.         .o_rdata   (mem.r_data  ),
  167.         .o_rresp   (mem.r_resp  ),
  168.         .o_rlast   (mem.r_last  ),
  169.         .o_rvalid  (mem.r_valid ),
  170.         .i_rready  (mem.r_ready ));
  171.  
  172.    wire        dmi_reg_en;
  173.    wire [6:0]  dmi_reg_addr;
  174.    wire        dmi_reg_wr_en;
  175.    wire [31:0] dmi_reg_wdata;
  176.    wire [31:0] dmi_reg_rdata;
  177.    wire        dmi_hard_reset;
  178.  
  179.    wire        flash_sclk;
  180.  
  181.    STARTUPE2 STARTUPE2
  182.      (
  183.       .CFGCLK    (),
  184.       .CFGMCLK   (),
  185.       .EOS       (),
  186.       .PREQ      (),
  187.       .CLK       (1'b0),
  188.       .GSR       (1'b0),
  189.       .GTS       (1'b0),
  190.       .KEYCLEARB (1'b1),
  191.       .PACK      (1'b0),
  192.       .USRCCLKO  (flash_sclk),
  193.       .USRCCLKTS (1'b0),
  194.       .USRDONEO  (1'b1),
  195.       .USRDONETS (1'b0));
  196.  
  197.    bscan_tap tap (
  198.         .clk            (clk_core),
  199.         .rst            (rst_core),
  200.         .jtag_id        (31'd0),
  201.         .dmi_reg_wdata  (dmi_reg_wdata),
  202.         .dmi_reg_addr   (dmi_reg_addr),
  203.         .dmi_reg_wr_en  (dmi_reg_wr_en),
  204.         .dmi_reg_en     (dmi_reg_en),
  205.         .dmi_reg_rdata  (dmi_reg_rdata),
  206.         .dmi_hard_reset (dmi_hard_reset),
  207.         .rd_status      (2'd0),
  208.         .idle           (3'd0),
  209.         .dmi_stat       (2'd0),
  210.         .version        (4'd1)
  211.     );
  212.  
  213.  
  214.  
  215.    swervolf_core
  216.      #(.bootrom_file (bootrom_file))
  217.    swervolf
  218.      (.clk  (clk_core),
  219.       .rstn (~rst_core),
  220.       .dmi_reg_rdata  (dmi_reg_rdata),
  221.       .dmi_reg_wdata  (dmi_reg_wdata),
  222.       .dmi_reg_addr   (dmi_reg_addr ),
  223.       .dmi_reg_en     (dmi_reg_en   ),
  224.       .dmi_reg_wr_en  (dmi_reg_wr_en),
  225.       .dmi_hard_reset (dmi_hard_reset),
  226.       .o_flash_sclk   (flash_sclk),
  227.       .o_flash_cs_n   (o_flash_cs_n),
  228.       .o_flash_mosi   (o_flash_mosi),
  229.       .i_flash_miso   (i_flash_miso),
  230.       .i_uart_rx      (i_uart_rx),
  231.       .o_uart_tx      (cpu_tx),
  232.       .o_ram_awid     (cpu.aw_id),
  233.       .o_ram_awaddr   (cpu.aw_addr),
  234.       .o_ram_awlen    (cpu.aw_len),
  235.       .o_ram_awsize   (cpu.aw_size),
  236.       .o_ram_awburst  (cpu.aw_burst),
  237.       .o_ram_awlock   (cpu.aw_lock),
  238.       .o_ram_awcache  (cpu.aw_cache),
  239.       .o_ram_awprot   (cpu.aw_prot),
  240.       .o_ram_awregion (cpu.aw_region),
  241.       .o_ram_awqos    (cpu.aw_qos),
  242.       .o_ram_awvalid  (cpu.aw_valid),
  243.       .i_ram_awready  (cpu.aw_ready),
  244.       .o_ram_arid     (cpu.ar_id),
  245.       .o_ram_araddr   (cpu.ar_addr),
  246.       .o_ram_arlen    (cpu.ar_len),
  247.       .o_ram_arsize   (cpu.ar_size),
  248.       .o_ram_arburst  (cpu.ar_burst),
  249.       .o_ram_arlock   (cpu.ar_lock),
  250.       .o_ram_arcache  (cpu.ar_cache),
  251.       .o_ram_arprot   (cpu.ar_prot),
  252.       .o_ram_arregion (cpu.ar_region),
  253.       .o_ram_arqos    (cpu.ar_qos),
  254.       .o_ram_arvalid  (cpu.ar_valid),
  255.       .i_ram_arready  (cpu.ar_ready),
  256.       .o_ram_wdata    (cpu.w_data),
  257.       .o_ram_wstrb    (cpu.w_strb),
  258.       .o_ram_wlast    (cpu.w_last),
  259.       .o_ram_wvalid   (cpu.w_valid),
  260.       .i_ram_wready   (cpu.w_ready),
  261.       .i_ram_bid      (cpu.b_id),
  262.       .i_ram_bresp    (cpu.b_resp),
  263.       .i_ram_bvalid   (cpu.b_valid),
  264.       .o_ram_bready   (cpu.b_ready),
  265.       .i_ram_rid      (cpu.r_id),
  266.       .i_ram_rdata    (cpu.r_data),
  267.       .i_ram_rresp    (cpu.r_resp),
  268.       .i_ram_rlast    (cpu.r_last),
  269.       .i_ram_rvalid   (cpu.r_valid),
  270.       .o_ram_rready   (cpu.r_ready),
  271.       .i_ram_init_done  (litedram_init_done),
  272.       .i_ram_init_error (litedram_init_error),
  273.       .io_data        ({i_sw[15:0],gpio_out[15:0]}),
  274.       .io_data_a      ({27'bz,i_btn_u,i_btn_d,i_btn_l,i_btn_r,i_btn_c}),
  275.       .AN (AN),
  276.       .DP (DP),
  277.       .Digits_Bits ({CA,CB,CC,CD,CE,CF,CG}),
  278.       .o_accel_sclk     (accel_sclk),
  279.       .o_accel_cs_n     (o_accel_cs_n),
  280.       .o_accel_mosi     (o_accel_mosi),
  281.       .i_accel_miso     (i_accel_miso),
  282.       .io_botinfo       (io_botinfo),
  283.       .io_botctrl       (io_botctrl),
  284.       .io_botupdt_sync  (io_botupdt_sync),
  285.       .io_int_ack       (io_int_ack)
  286.       );
  287.  
  288.     always @(posedge clk_core) begin
  289.         o_led[15:0] <= gpio_out[15:0];
  290.     end
  291.  
  292.    assign o_uart_tx = 1'b0 ? litedram_tx : cpu_tx;
  293.  
  294.  
  295.    
  296. // Implementing ROJOBOT stuff
  297.  
  298.     wire o_clk_75M;
  299.  
  300.     wire [7:0]  io_botctrl;
  301.     wire [31:0] io_botinfo;
  302.     reg         io_botupdt_sync;
  303.     wire        io_int_ack;
  304.     wire        upd_sysregs;
  305.     wire [13:0] wm_addr_a, wm_addr_b;
  306.     wire [1:0]  wm_data_a, wm_data_b;
  307.  
  308.     rojobot31_0 rojo_bot_0 (
  309.         .MotCtl_in(io_botctrl),            // input wire [7 : 0] MotCtl_in
  310.         .LocX_reg(io_botinfo[31:24]),      // output wire [7 : 0] LocX_reg
  311.         .LocY_reg(io_botinfo[23:16]),      // output wire [7 : 0] LocY_reg
  312.         .Sensors_reg(io_botinfo[15:8]),    // output wire [7 : 0] Sensors_reg
  313.         .BotInfo_reg(io_botinfo[7:0]),     // output wire [7 : 0] BotInfo_reg
  314.         .worldmap_addr(wm_addr_a),           // output wire [13 : 0] worldmap_addr
  315.         .worldmap_data(wm_data_a),           // input wire [1 : 0] worldmap_data
  316.         .clk_in(o_clk_75M),                // input wire clk_in   Will need 75MHz
  317.         .reset(rstn),                      // input wire reset
  318.         .upd_sysregs(upd_sysregs),         // output wire upd_sysregs
  319.         .Bot_Config_reg(i_sw[7:0])         // input wire [7 : 0] Bot_Config_reg
  320.     );
  321.  
  322.     world_map wm1(
  323.         .clka(o_clk_75M),
  324.         .addra(wm_addr_a),
  325.         .douta(wm_data_a),
  326.  
  327.         // Dual Ported, connect B to VGA logic.
  328.         .clkb(o_clk_75M),
  329.         .addrb(wm_addr_b),
  330.         .doutb(wm_data_b)
  331.     );
  332.  
  333.     always @(posedge clk) begin: Handshake_FF
  334.      // io_int_ack needs to be handled in an interrupt handler or software bit-banging?
  335.         if (io_int_ack == 1'b1) begin
  336.             io_botupdt_sync <= 1'b0;
  337.         end
  338.         else
  339.         if (upd_sysregs == 1'b1) begin
  340.             io_botupdt_sync <= 1'b1;
  341.         end else begin
  342.             io_botupdt_sync <= io_botupdt_sync;
  343.         end
  344.     end: Handshake_FF
  345.  
  346. endmodule
  347.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement