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