peregrin5

rvfpga.sv

Feb 7th, 2021
501
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.  
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×