aboutsummaryrefslogtreecommitdiff
path: root/rtl/src/verilog/novena_baseline_top.v
blob: 890b8bc7528c7878994f9820d1b5cf4e293b0fe5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
//======================================================================
//
// novena_baseline_top.v
// ---------------------
// Top module for the Cryptech Novena FPGA framework. This design
// allow us to run the EIM interface at one clock and cores including
// core selector with the always present global clock.
//
//
// Author: Pavel Shatov
// Copyright (c) 2014, 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
// are met:
// - Redistributions of source code must retain the above copyright
//   notice, this list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright
//   notice, this list of conditions and the following disclaimer in the
//   documentation and/or other materials provided with the distribution.
//
// - Neither the name of the NORDUnet nor the names of its contributors may
//   be used to endorse or promote products derived from this software
//   without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//======================================================================

module novena_baseline_top
	(
		gclk_p_pin, gclk_n_pin,

		eim_bclk, eim_cs0_n, eim_da,
		eim_lba_n, eim_wr_n,
		eim_oe_n, eim_wait_n,

		reset_mcu_b_pin,
		apoptosis_pin,
		led_pin
	);

		//
		// Top-Levl Ports
		//
	input		wire				gclk_p_pin;			// general-purpose 50 MHz LVDS clock
	input		wire				gclk_n_pin;			//

	input		wire				eim_bclk;			// burst clock from cpu
	input		wire				eim_cs0_n;			// chip select (active low)
	inout		wire	[15: 0]	eim_da;				// bi-directional address/data bus
	input		wire				eim_lba_n;			// latch address signal (active low)
	input		wire				eim_wr_n;			// write enable signal (active low)
	input		wire				eim_oe_n;			// output enable signal (active low)
	output	wire				eim_wait_n;			// wait signal (active low)

	input		wire				reset_mcu_b_pin;	// this must be configured as input w/pullup
															// not to kill the cpu after configuration
	output	wire				apoptosis_pin;		// not used, tied to 0
	output	wire				led_pin;				// visual activity indicator


		//
		// Clock Manager
		//

		/* Clock manager is used to buffer BCLK and also generate SYS_CLK from GCLK. */

	wire	sys_clk;
	wire	sys_rst;

	wire	eim_bclk_buf;

	novena_clkmgr clkmgr
	(
		.gclk_p			(gclk_p_pin),
		.gclk_n			(gclk_n_pin),

		.reset_mcu_b	(reset_mcu_b_pin),

		.sys_clk			(sys_clk),
		.sys_rst			(sys_rst),

		.bclk_in			(eim_bclk),
		.bclk_out		(eim_bclk_buf)
	);


		//
		// EIM Arbiter
		//

		/* EIM arbiter handles EIM access and transfers it into `sys_clk' clock domain. */

	wire	[13: 0]	sys_eim_addr;
	wire				sys_eim_wr;
	wire				sys_eim_rd;
	wire	[31: 0]	sys_eim_dout;
	wire	[31: 0]	sys_eim_din;

	eim_arbiter eim
	(
		.eim_bclk		(eim_bclk_buf),
		.eim_cs0_n		(eim_cs0_n),
		.eim_da			(eim_da),
		.eim_lba_n		(eim_lba_n),
		.eim_wr_n		(eim_wr_n),
		.eim_oe_n		(eim_oe_n),
		.eim_wait_n		(eim_wait_n),

		.sys_clk			(sys_clk),

		.sys_addr		(sys_eim_addr),
		.sys_wren		(sys_eim_wr),
		.sys_data_out	(sys_eim_dout),
		.sys_rden		(sys_eim_rd),
		.sys_data_in	(sys_eim_din)
	);


		//
		// Core Selector (MUX)
		//

		/* This multiplexor is used to map demo adder registers somewhere into EIM address space. */

	core_selector mux
	(
		.sys_clk			(sys_clk),
		.sys_rst			(sys_rst),

		.sys_eim_addr	(sys_eim_addr),
		.sys_eim_wr		(sys_eim_wr),
		.sys_eim_rd		(sys_eim_rd),

		.sys_eim_dout	(sys_eim_dout),
		.sys_eim_din	(sys_eim_din)
	);


		//
		// LED Driver
		//
	eim_indicator led
	(
		.sys_clk			(sys_clk),
		.sys_rst			(sys_rst),
		.eim_active		(sys_eim_wr | sys_eim_rd),
		.led_out			(led_pin)
	);


		//
		// Unused
		//
	assign apoptosis_pin		= 1'b0;


endmodule

//======================================================================
// EOF novena_baseline_top.v
//======================================================================