Revision b115e4d7

b/.gitignore
1
*~
b/usrp2/gpmc/gpmc.v
1
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3

  
4
module gpmc
5
  (input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A, input [1:0] EM_NBE,
6
   input EM_WAIT0, input EM_NCS4, input EM_NCS6, input EM_NWE, input EM_NOE,
7

  
8
   input wb_clk, input wb_rst,
9
   output reg [10:0] wb_adr_o, output reg [15:0] wb_dat_mosi, input [15:0] wb_dat_miso,
10
   output reg [1:0] wb_sel_o, output wb_cyc_o, output reg wb_stb_o, output reg wb_we_o, input wb_ack_i
11
   );
12

  
13
   wire 	EM_output_enable = (~EM_NOE & (~EM_NCS4 | ~EM_NCS6));
14
   wire [15:0] 	EM_D_ram;
15
   reg [15:0] 	EM_D_wb;
16

  
17
   assign EM_D = ~EM_output_enable ? 16'bz : ~EM_NCS4 ? EM_D_ram : EM_D_wb;
18

  
19
   // CS4 is RAM_2PORT for high-speed data
20
   ram_2port #(.DWIDTH(16), .AWIDTH(10)) ram_2port
21
     (.clka(clk_fpga), .ena(~EM_NCS4), .wea(~EM_NWE), .addra(EM_A), .dia(EM_D), .doa(EM_D_ram),
22
      .clkb(clk_fpga), .enb(0), .web(0), .addrb(0), .dib(0), .dob());
23

  
24
   // CS6 is Control, Wishbone bus bridge (wb master)
25
   // Sync version
26
   reg [1:0] 	cs_del, we_del, oe_del;
27

  
28
   // Synchronize the async control signals
29
   always @(posedge wb_clk)
30
     begin
31
	cs_del <= { cs_del[0], EM_NCS6 };
32
	we_del <= { we_del[0], EM_NWE };
33
	oe_del <= { oe_del[0], EM_NOE };
34
     end
35

  
36
   always @(posedge wb_clk)
37
     if(cs_del == 2'b10)  // Falling Edge
38
       wb_adr_o <= { EM_A, 1'b0 };
39

  
40
   always @(posedge wb_clk)
41
     if(we_del == 2'b10)  // Falling Edge
42
       begin
43
	  wb_dat_mosi <= EM_D;
44
	  wb_sel_o <= ~EM_NBE;
45
       end
46

  
47
   always @(posedge wb_clk)
48
     if(wb_ack_i)
49
       EM_D_wb <= wb_dat_miso;
50

  
51
   // stb, oe_del, we_del
52
   assign wb_cyc_o = wb_stb_o;
53

  
54
   always @(posedge wb_clk)
55
     if( ~cs_del[0] & (we_del == 2'b10) )
56
       wb_we_o <= 1;
57
     else if(wb_ack_i)  // Turn off we when done.  Could also use we_del[0], others...
58
       wb_we_o <= 0;
59

  
60
   always @(posedge wb_clk)
61
     if( ~cs_del[0] & ((we_del == 2'b10) | (oe_del == 2'b10)))
62
       wb_stb_o <= 1;
63
     else if(wb_ack_i)
64
       wb_stb_o <= 0;
65
   
66
endmodule // gpmc
b/usrp2/top/u1e/Makefile
174 174
timing/time_sender.v \
175 175
timing/time_sync.v \
176 176
timing/timer.v \
177
top/u2_core/u2_core.v \
177
gpmc/gpmc.v \
178
top/u1e/u1e_core.v \
178 179
top/u1e/u1e.ucf \
179 180
top/u1e/u1e.v 
180 181

  
b/usrp2/top/u1e/tb_u1e.v
1
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3

  
4
module tb_u1e();
5
   
6
   wire [2:0] debug_led;
7
   wire [31:0] debug;
8
   wire [1:0] debug_clk;
9
   
10
   
11
   // GPMC
12
   wire       EM_CLK, EM_WAIT0, EM_NCS4, EM_NCS6, EM_NWE, EM_NOE;
13
   wire [15:0] EM_D;
14
   wire [10:1] EM_A;
15
   wire [1:0]  EM_NBE;
16
   
17
   reg  clk_fpga = 0;
18
   always #100 clk_fpga = ~clk_fpga;
19
   
20
   u1e_core u1e_core(.clk_fpga(clk_fpga), .debug_led(debug_led), .debug(debug), .debug_clk(debug_clk),
21
		     .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
22
		     .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS6(EM_NCS6), 
23
		     .EM_NWE(EM_NWE), .EM_NOE(EM_NOE) );
24
   
25
endmodule // u1e
b/usrp2/top/u1e/u1e.ucf
3 3
NET "CLK_FPGA_N"  LOC = "Y10"  ;
4 4

  
5 5
## GPMC
6
NET "EM_CLK"  LOC = "F11"  ;
7

  
8 6
NET "EM_D<15>"  LOC = "D13"  ;
9 7
NET "EM_D<14>"  LOC = "D15"  ;
10 8
NET "EM_D<13>"  LOC = "C16"  ;
......
33 31
NET "EM_A<2>"  LOC = "A7"  ;
34 32
NET "EM_A<1>"  LOC = "C15"  ;
35 33

  
36
#NET "EM_NCS6"  LOC = "E17"  ;
34
NET "EM_NCS6"  LOC = "E17"  ;
37 35
#NET "EM_NCS5"  LOC = "E10"  ;
38 36
NET "EM_NCS4"  LOC = "E6"  ;
39 37
#NET "EM_NCS1"  LOC = "D18"  ;
40 38
#NET "EM_NCS0"  LOC = "D17"  ;
41 39

  
40
NET "EM_CLK"  LOC = "F11"  ;
42 41
NET "EM_WAIT0"  LOC = "F14"  ;
43
#NET "EM_NBE1"  LOC = "D14"  ;
44
#NET "EM_NBE0"  LOC = "A13"  ;
45
NET "EM_NWP"  LOC = "F13"  ;
42
NET "EM_NBE<1>"  LOC = "D14"  ;
43
NET "EM_NBE<0>"  LOC = "A13"  ;
46 44
NET "EM_NWE"  LOC = "B13"  ;
47 45
NET "EM_NOE"  LOC = "A14"  ;
48
NET "EM_NADV_ALE"  LOC = "B15"  ;
49

  
46
#NET "EM_NADV_ALE"  LOC = "B15"  ;
47
#NET "EM_NWP"  LOC = "F13"  ;
50 48

  
51 49
## Overo GPIO
52 50
#NET "overo_gpio0"  LOC = "F9"  ;
b/usrp2/top/u1e/u1e.v
2 2
//////////////////////////////////////////////////////////////////////////////////
3 3

  
4 4
module u1e
5
  (
6
   input CLK_FPGA_P, input CLK_FPGA_N,  // Diff
5
  (input CLK_FPGA_P, input CLK_FPGA_N,  // Diff
7 6
   output [2:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
8 7

  
9 8
   // GPMC
10
   input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A,
11
   input EM_WAIT0, input EM_NCS4, input EM_NWP, input EM_NWE, input EM_NOE, input EM_NADV_ALE
9
   input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A, input [1:0] EM_NBE,
10
   input EM_WAIT0, input EM_NCS4, input EM_NCS6, input EM_NWE, input EM_NOE
12 11
   );
13 12

  
14 13
   // FPGA-specific pins connections
......
17 16
   IBUFGDS #(.IOSTANDARD("LVDS_33"), .DIFF_TERM("TRUE")) 
18 17
   clk_fpga_pin (.O(clk_fpga),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
19 18

  
20
   // Debug circuitry
21
   reg [31:0] 	ctr;
22
   always @(posedge clk_fpga)
23
     ctr <= ctr + 1;
24

  
25
   
26
   assign debug_led = ctr[27:25];
27
   assign debug_clk = { EM_CLK, clk_fpga };
28
   assign debug = { { EM_WAIT0, EM_NADV_ALE, EM_NWP, EM_NCS4, EM_NWE, EM_NOE, EM_A[10:1] },
29
		    { EM_D } };
30

  
31
   wire 	EM_output_enable = (~EM_NOE & ~EM_NCS4);
32
   wire [15:0] 	EM_D_out;
33

  
34
   assign EM_D = EM_output_enable ? EM_D_out : 16'bz;
35

  
36
   ram_2port #(.DWIDTH(16), .AWIDTH(10)) ram_2port
37
     (.clka(clk_fpga), .ena(~EM_NCS4), .wea(~EM_NWE), .addra(EM_A), .dia(EM_D), .doa(EM_D_out),
38
      .clkb(clk_fpga), .enb(0), .web(0), .addrb(0), .dib(0), .dob());
19
   u1e_core u1e_core(.clk_fpga(clk_fpga), .debug_led(debug_led), .debug(debug), .debug_clk(debug_clk),
20
		     .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
21
		     .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS6(EM_NCS6), 
22
		     .EM_NWE(EM_NWE), .EM_NOE(EM_NOE) );
39 23
   
40
      
41
endmodule // u2plus
24
endmodule // u1e
b/usrp2/top/u1e/u1e_core.v
1
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3

  
4
module u1e_core
5
  (input clk_fpga, output [2:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
6

  
7
   // GPMC
8
   input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A, input [1:0] EM_NBE,
9
   input EM_WAIT0, input EM_NCS4, input EM_NCS6, input EM_NWE, input EM_NOE
10
   );
11

  
12
   // Debug circuitry
13
   reg [31:0] 	ctr;
14
   always @(posedge clk_fpga)
15
     ctr <= ctr + 1;
16
   
17
   assign debug_led = ctr[27:25];
18
   assign debug_clk = { EM_CLK, clk_fpga };
19
   assign debug = { { 1'b0, EM_WAIT0, EM_NCS6, EM_NCS4, EM_NWE, EM_NOE, EM_A[10:1] },
20
		    { EM_D } };
21

  
22
   wire 	wb_clk, wb_rst;
23
   wire 	wb_cyc, wb_stb, wb_we, wb_ack;
24
   wire [1:0] 	wb_sel;
25
   wire [10:0] 	wb_adr;
26
   wire [15:0] 	wb_dat_mosi, wb_dat_miso;
27
   
28
   gpmc gpmc (.EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
29
	      .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS6(EM_NCS6), .EM_NWE(EM_NWE), 
30
	      .EM_NOE(EM_NOE),
31

  
32
	      .wb_clk(wb_clk), .wb_rst(wb_rst),
33
	      .wb_adr_o(wb_adr), .wb_dat_mosi(wb_dat_mosi), .wb_dat_miso(wb_dat_miso),
34
	      .wb_sel_o(wb_sel), .wb_cyc_o(wb_cyc), .wb_stb_o(wb_stb), .wb_we_o(wb_we),
35
	      .wb_ack_i(wb_ack));
36

  
37
   assign wb_clk = clk_fpga;
38
   reg [15:0] 	reg_fast, reg_slow;
39

  
40
   localparam [10:0] WB_ADR_REG_FAST = 36;
41
   localparam [10:0] WB_ADR_REG_SLOW = 38;
42
   
43
   always @(posedge wb_clk)
44
     if(wb_cyc & wb_stb & wb_we & (wb_adr == WB_ADR_REG_FAST))
45
       reg_fast <= wb_dat_mosi;
46

  
47
   assign wb_dat_miso = (wb_adr == WB_ADR_REG_FAST) ? reg_fast : 16'bx;
48

  
49
   assign wb_ack = wb_stb & wb_cyc;
50
   
51
   
52
endmodule // u2plus

Also available in: Unified diff