aboutsummaryrefslogtreecommitdiff
path: root/rtl/alpha_fmc_top.v
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/alpha_fmc_top.v')
-rw-r--r--rtl/alpha_fmc_top.v272
1 files changed, 132 insertions, 140 deletions
diff --git a/rtl/alpha_fmc_top.v b/rtl/alpha_fmc_top.v
index a07beee..09229b5 100644
--- a/rtl/alpha_fmc_top.v
+++ b/rtl/alpha_fmc_top.v
@@ -8,7 +8,7 @@
//
//
// Author: Pavel Shatov
-// Copyright (c) 2016, 2018 NORDUnet A/S All rights reserved.
+// Copyright (c) 2016, 2018-2019 NORDUnet A/S All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
@@ -38,147 +38,139 @@
//
//======================================================================
-`timescale 1ns / 1ps
-
module alpha_fmc_top
- (
- input wire gclk_pin, // 50 MHz
-
- input wire ct_noise, // cryptech avalanche noise circuit
-
- input wire fmc_clk, // clock
- input wire [23: 0] fmc_a, // address
- inout wire [31: 0] fmc_d, // data
- input wire fmc_ne1, // chip select
- input wire fmc_noe, // output enable
- input wire fmc_nwe, // write enable
- input wire fmc_nl, // latch enable
- output wire fmc_nwait,// wait
-
- output wire mkm_sclk,
- output wire mkm_cs_n,
- input wire mkm_do,
- output wire mkm_di,
-
- output wire [3: 0] led_pins // {red, yellow, green, blue}
- );
-
-
- //----------------------------------------------------------------
- // Clock Manager
- //
- // Clock manager is used to buffer FMC_CLK and implement reset logic.
- // ----------------------------------------------------------------
- wire sys_clk; // system clock (90 MHz)
- wire sys_rst_n; // active-low reset
-
- alpha_clkmgr clkmgr
- (
- .fmc_clk (fmc_clk),
-
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n)
- );
-
-
-
- //----------------------------------------------------------------
- // FMC Arbiter
- //
- // FMC arbiter handles FMC accesses.
- //----------------------------------------------------------------
-
- wire [23: 0] sys_fmc_addr; // address
- wire sys_fmc_wren; // write enable
- wire sys_fmc_rden; // read enable
- wire [31: 0] sys_fmc_dout; // data output (from STM32 to FPGA)
- wire [31: 0] sys_fmc_din; // data input (from FPGA to STM32)
-
- fmc_arbiter #
- (
- .NUM_ADDR_BITS(24) // change to 26 when Alpha is alive!
- )
- fmc
- (
- .fmc_a(fmc_a),
- .fmc_d(fmc_d),
- .fmc_ne1(fmc_ne1),
- .fmc_nl(fmc_nl),
- .fmc_nwe(fmc_nwe),
- .fmc_noe(fmc_noe),
- .fmc_nwait(fmc_nwait),
-
- .sys_clk(sys_clk),
-
- .sys_addr(sys_fmc_addr),
- .sys_wr_en(sys_fmc_wren),
- .sys_rd_en(sys_fmc_rden),
- .sys_data_out(sys_fmc_dout),
- .sys_data_in(sys_fmc_din)
- );
-
-
- //----------------------------------------------------------------
- // LED Driver
- //
- // A simple utility LED driver that turns on the Alpha
- // board LED when the FMC interface is active.
- //----------------------------------------------------------------
- fmc_indicator led
- (
- .sys_clk(sys_clk),
- .sys_rst_n(sys_rst_n),
- .fmc_active(sys_fmc_wren | sys_fmc_rden),
- .led_out(led_pins[0])
- );
-
-
- //----------------------------------------------------------------
- // Core Selector
- //
- // This multiplexer is used to map different types of cores, such as
- // hashes, RNGs and ciphers to different regions (segments) of memory.
- //----------------------------------------------------------------
-
- // A note on byte-swapping:
- // STM32 is little-endian, while the register interface here is
- // big-endian. The software reads and writes 32-bit integer values,
- // which means transmitting the least significant byte first. Up to
- // now, we've been doing byte-swapping in software, which is
- // inefficient, especially for bulk data transfer. So now we're doing
- // the byte-swapping in hardware.
-
- wire [31:0] write_data;
- assign write_data = {sys_fmc_dout[7:0], sys_fmc_dout[15:8], sys_fmc_dout[23:16], sys_fmc_dout[31:24]};
-
- wire [31 : 0] read_data;
- assign sys_fmc_din = {read_data[7:0], read_data[15:8], read_data[23:16], read_data[31:24]};
-
- core_selector cores
- (
- .sys_clk(sys_clk),
- .sys_rst_n(sys_rst_n),
-
- .sys_fmc_addr(sys_fmc_addr),
- .sys_fmc_wr(sys_fmc_wren),
- .sys_fmc_rd(sys_fmc_rden),
- .sys_write_data(write_data),
- .sys_read_data(read_data),
-
- .noise(ct_noise),
-
- .mkm_sclk(mkm_sclk),
- .mkm_cs_n(mkm_cs_n),
- .mkm_do(mkm_do),
- .mkm_di(mkm_di)
- );
-
-
- //
- // Dummy assignment to bypass unconnected outpins pins check in BitGen
- //
+(
+// input wire gclk_pin, // 50 MHz
+
+ input wire ct_noise, // cryptech avalanche noise circuit
+
+ input wire fmc_clk, // clock
+ input wire [23: 0] fmc_a, // address
+ inout wire [31: 0] fmc_d, // data
+ input wire fmc_ne1, // chip select
+ input wire fmc_noe, // output enable
+ input wire fmc_nwe, // write enable
+ input wire fmc_nl, // latch enable
+ output wire fmc_nwait,// wait
+
+ output wire mkm_sclk,
+ output wire mkm_cs_n,
+ input wire mkm_do,
+ output wire mkm_di,
+
+ output wire [3: 0] led_pins // {red, yellow, green, blue}
+);
+
+
+ //----------------------------------------------------------------
+ // Clock Manager
+ //
+ // Clock manager is used to buffer FMC_CLK and implement reset logic.
+ // ----------------------------------------------------------------
+ wire io_clk; // FMC I/O clock (45 MHz)
+ wire sys_clk; // system clock (90 MHz)
+ wire sys_rst_n; // active-low system reset
+ wire core_clk; // high-speed core clock (45*N MHz)
+
+ alpha_clkmgr #(.CLK_CORE_MULT(4)) clkmgr
+ (
+ .fmc_clk (fmc_clk),
+
+ .io_clk (io_clk),
+ .sys_clk (sys_clk),
+ .sys_rst_n (sys_rst_n),
+ .core_clk (core_clk)
+ );
+
+
+
+ //----------------------------------------------------------------
+ // FMC Arbiter
+ //
+ // FMC arbiter handles FMC accesses.
+ //----------------------------------------------------------------
+
+ wire [23: 0] sys_fmc_addr; // address
+ wire sys_fmc_wren; // write enable
+ wire sys_fmc_rden; // read enable
+ wire [31: 0] sys_fmc_dout; // data output (from STM32 to FPGA)
+ wire [31: 0] sys_fmc_din; // data input (from FPGA to STM32)
+
+ fmc_arbiter #
+ (
+ .NUM_ADDR_BITS(24) // change to 26 when Alpha is alive!
+ )
+ fmc
+ (
+ .fmc_a(fmc_a),
+ .fmc_d(fmc_d),
+ .fmc_ne1(fmc_ne1),
+ .fmc_nl(fmc_nl),
+ .fmc_nwe(fmc_nwe),
+ .fmc_noe(fmc_noe),
+ .fmc_nwait(fmc_nwait),
+
+ .sys_clk(sys_clk),
+ .io_clk(io_clk),
+
+ .sys_addr(sys_fmc_addr),
+ .sys_wr_en(sys_fmc_wren),
+ .sys_rd_en(sys_fmc_rden),
+ .sys_data_out(sys_fmc_dout),
+ .sys_data_in(sys_fmc_din)
+ );
+
+
+ //----------------------------------------------------------------
+ // LED Driver
+ //
+ // A simple utility LED driver that turns on the Alpha
+ // board LED when the FMC interface is active.
+ //----------------------------------------------------------------
+ fmc_indicator led
+ (
+ .sys_clk(sys_clk),
+ .sys_rst_n(sys_rst_n),
+ .fmc_active(sys_fmc_wren | sys_fmc_rden),
+ .led_out(led_pins[0])
+ );
+
+
+ //----------------------------------------------------------------
+ // Core Selector
+ //
+ // This multiplexer is used to map different types of cores, such as
+ // hashes, RNGs and ciphers to different regions (segments) of memory.
+ //----------------------------------------------------------------
+
+ core_selector cores
+ (
+ .sys_clk(sys_clk),
+ .sys_rst_n(sys_rst_n),
+ .core_clk(core_clk),
+
+ .sys_fmc_addr(sys_fmc_addr),
+ .sys_fmc_wr(sys_fmc_wren),
+ .sys_fmc_rd(sys_fmc_rden),
+ .sys_write_data(sys_fmc_dout),
+ .sys_read_data(sys_fmc_din),
+ .sys_error(),
+
+ .noise(ct_noise),
+
+ .mkm_sclk(mkm_sclk),
+ .mkm_cs_n(mkm_cs_n),
+ .mkm_do(mkm_do),
+ .mkm_di(mkm_di),
+
+ .debug()
+ );
+
- assign led_pins[3:1] = 3'b000;
+ //
+ // Dummy assignment to get past the unconnected outpins pins check in BitGen
+ //
+ assign led_pins[3:1] = 3'b000;
endmodule