Commit b2edc7ba authored by Tomasz Wlostowski's avatar Tomasz Wlostowski

wr_minic: added structized wrapper + updated Manifest

parent 0f14c50b
files = [ "minic_packet_buffer.vhd",
"minic_wb_slave.vhd",
"minic_wbgen2_pkg.vhd",
"wr_mini_nic.vhd" ];
"minic_wb_slave.vhd",
"minic_wbgen2_pkg.vhd",
"wr_mini_nic.vhd",
"xwr_mini_nic.vhd" ];
library ieee;
use ieee.std_logic_1164.all;
use work.wr_fabric_pkg.all;
use work.wishbone_pkg.all;
entity xwr_mini_nic is
generic (
g_interface_mode : t_wishbone_interface_mode := CLASSIC;
g_address_granularity : t_wishbone_address_granularity := WORD;
g_memsize_log2 : integer := 14;
g_buffer_little_endian : boolean := false);
port (
clk_sys_i : in std_logic;
rst_n_i : in std_logic;
-------------------------------------------------------------------------------
-- System memory i/f
-------------------------------------------------------------------------------
mem_data_o : out std_logic_vector(31 downto 0);
mem_addr_o : out std_logic_vector(g_memsize_log2-1 downto 0);
mem_data_i : in std_logic_vector(31 downto 0);
mem_wr_o : out std_logic;
-------------------------------------------------------------------------------
-- Pipelined Wishbone interface
-------------------------------------------------------------------------------
-- WBP Master (TX)
src_o: out t_wrf_source_out;
src_i: in t_wrf_source_in;
-- WBP Slave (RX)
snk_o: out t_wrf_sink_out;
snk_i: in t_wrf_sink_in;
-------------------------------------------------------------------------------
-- TXTSU i/f
-------------------------------------------------------------------------------
txtsu_port_id_i : in std_logic_vector(4 downto 0);
txtsu_frame_id_i : in std_logic_vector(16 - 1 downto 0);
txtsu_tsval_i : in std_logic_vector(28 + 4 - 1 downto 0);
txtsu_valid_i : in std_logic;
txtsu_ack_o : out std_logic;
-------------------------------------------------------------------------------
-- Wishbone slave
-------------------------------------------------------------------------------
wb_i: in t_wishbone_slave_in;
wb_o: out t_wishbone_slave_out
);
end xwr_mini_nic;
architecture wrapper of xwr_mini_nic is
component wr_mini_nic
generic (
g_interface_mode : t_wishbone_interface_mode;
g_address_granularity : t_wishbone_address_granularity;
g_memsize_log2 : integer;
g_buffer_little_endian : boolean);
port (
clk_sys_i : in std_logic;
rst_n_i : in std_logic;
mem_data_o : out std_logic_vector(31 downto 0);
mem_addr_o : out std_logic_vector(g_memsize_log2-1 downto 0);
mem_data_i : in std_logic_vector(31 downto 0);
mem_wr_o : out std_logic;
src_dat_o : out std_logic_vector(15 downto 0);
src_adr_o : out std_logic_vector(1 downto 0);
src_sel_o : out std_logic_vector(1 downto 0);
src_cyc_o : out std_logic;
src_stb_o : out std_logic;
src_we_o : out std_logic;
src_stall_i : in std_logic;
src_err_i : in std_logic;
src_ack_i : in std_logic;
snk_dat_i : in std_logic_vector(15 downto 0);
snk_adr_i : in std_logic_vector(1 downto 0);
snk_sel_i : in std_logic_vector(1 downto 0);
snk_cyc_i : in std_logic;
snk_stb_i : in std_logic;
snk_we_i : in std_logic;
snk_stall_o : out std_logic;
snk_err_o : out std_logic;
snk_ack_o : out std_logic;
txtsu_port_id_i : in std_logic_vector(4 downto 0);
txtsu_frame_id_i : in std_logic_vector(16 - 1 downto 0);
txtsu_tsval_i : in std_logic_vector(28 + 4 - 1 downto 0);
txtsu_valid_i : in std_logic;
txtsu_ack_o : out std_logic;
wb_cyc_i : in std_logic;
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
wb_adr_i : in std_logic_vector(c_wishbone_address_width-1 downto 0);
wb_dat_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_dat_o : out std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_ack_o : out std_logic;
wb_stall_o : out std_logic;
wb_irq_o : out std_logic);
end component;
begin -- wrapper
wr_mini_nic_1: wr_mini_nic
generic map (
g_interface_mode => g_interface_mode,
g_address_granularity => g_address_granularity,
g_memsize_log2 => g_memsize_log2,
g_buffer_little_endian => g_buffer_little_endian)
port map (
clk_sys_i => clk_sys_i,
rst_n_i => rst_n_i,
mem_data_o => mem_data_o,
mem_addr_o => mem_addr_o,
mem_data_i => mem_data_i,
mem_wr_o => mem_wr_o,
src_dat_o => src_o.dat,
src_adr_o => src_o.adr,
src_sel_o => src_o.sel,
src_cyc_o => src_o.cyc,
src_stb_o => src_o.stb,
src_we_o => src_o.we,
src_stall_i => src_i.stall,
src_err_i => src_i.err,
src_ack_i => src_i.ack,
snk_dat_i => snk_i.dat,
snk_adr_i => snk_i.adr,
snk_sel_i => snk_i.sel,
snk_cyc_i => snk_i.cyc,
snk_stb_i => snk_i.stb,
snk_we_i => snk_i.we,
snk_stall_o => snk_o.stall,
snk_err_o => snk_o.err,
snk_ack_o => snk_o.ack,
txtsu_port_id_i => txtsu_port_id_i,
txtsu_frame_id_i => txtsu_frame_id_i,
txtsu_tsval_i => txtsu_tsval_i,
txtsu_valid_i => txtsu_valid_i,
txtsu_ack_o => txtsu_ack_o,
wb_cyc_i => wb_i.cyc,
wb_stb_i => wb_i.stb,
wb_we_i => wb_i.we,
wb_sel_i => wb_i.sel,
wb_adr_i => wb_i.adr,
wb_dat_i => wb_i.dat,
wb_dat_o => wb_o.dat,
wb_ack_o => wb_o.ack,
wb_stall_o => wb_o.stall,
wb_irq_o => wb_o.int);
end wrapper;
files = [ "wr_core.vhd",
"wrc_dpram.vhd",
"wrcore_pkg.vhd",
"wrc_periph.vhd",
"wb_reset.vhd" ];
fetchto = "../../ip_cores"
......@@ -10,5 +10,8 @@ files = [ "wrc_lm32.vhd",
"lm32_shifter.v",
"lm32_multiplier.v",
"lm32_interrupt.v",
"lm32_dp_ram.v"
"lm32_dp_ram.v",
"lm32_debug.v",
"lm32_jtag.v",
"jtag_wb.v"
];
\ No newline at end of file
/* Added by GSI to support debug over wishbone */
`define ACK_DELAY 8 /* Give the JTAG core time to latch after a write */
module jtag_wb (
clk_i,
DAT_I,
ADR_I,
CYC_I,
SEL_I,
STB_I,
WE_I,
reg_d,
reg_addr_d,
ACK_O,
STALL_O,
DAT_O,
reg_update,
reg_q,
reg_addr_q,
jtck,
jrstn
);
input clk_i;
input [`LM32_WORD_RNG] DAT_I;
input [`LM32_WORD_RNG] ADR_I;
input CYC_I;
input [`LM32_BYTE_SELECT_RNG] SEL_I;
input STB_I;
input WE_I;
input [7:0] reg_d;
input [2:0] reg_addr_d;
output ACK_O;
output STALL_O;
output [`LM32_WORD_RNG] DAT_O;
output reg_update;
output [7:0] reg_q;
output [2:0] reg_addr_q;
output jtck;
output jrstn;
reg [7:0] reg_q;
reg [2:0] reg_addr_q;
reg [`ACK_DELAY-1:0] ack_shift;
assign reg_update = (CYC_I == `TRUE) &&
(STB_I == `TRUE) &&
(WE_I == `TRUE);
assign DAT_O[31:11] = 21'h0;
assign DAT_O[10:3] = reg_d;
assign DAT_O[2:0] = reg_addr_d;
assign jtck = clk_i;
assign jrstn = 1;
assign ACK_O = ack_shift[0];
assign STALL_O = |ack_shift[`ACK_DELAY-1:1];
always @(posedge clk_i)
begin
ack_shift <=
{CYC_I == `TRUE && STB_I == `TRUE && STALL_O == `FALSE,
ack_shift[`ACK_DELAY-1:1]};
if (reg_update == `TRUE)
begin
reg_q <= DAT_I[10:3];
reg_addr_q <= DAT_I[2:0];
end
end
endmodule
......@@ -182,7 +182,7 @@ begin
};
`LM32_CSR_IP: csr_read_data = ip;
default: csr_read_data = {`LM32_WORD_WIDTH{1'bx}};
endcase
endcase
end
end
endgenerate
......@@ -191,72 +191,91 @@ endgenerate
// Sequential Logic
/////////////////////////////////////////////////////
`define IE_DELAY 10
reg [`IE_DELAY:0] eie_delay = 0;
generate
if (interrupts > 1)
begin
// IE, IM, IP - Interrupt Enable, Interrupt Mask and Interrupt Pending CSRs
always @(posedge clk_i `CFG_RESET_SENSITIVITY)
begin
begin
if (rst_i == `TRUE)
begin
ie <= `FALSE;
eie <= `FALSE;
ie <= `FALSE;
eie <= `FALSE;
`ifdef CFG_DEBUG_ENABLED
bie <= `FALSE;
bie <= `FALSE;
`endif
im <= {interrupts{1'b0}};
ip <= {interrupts{1'b0}};
im <= {interrupts{1'b0}};
ip <= {interrupts{1'b0}};
eie_delay <= 0;
end
else
begin
// Set IP bit when interrupt line is asserted
ip <= asserted;
ip <= asserted;
`ifdef CFG_DEBUG_ENABLED
if (non_debug_exception == `TRUE)
begin
// Save and then clear interrupt enable
eie <= ie;
ie <= `FALSE;
eie <= ie;
ie <= `FALSE;
end
else if (debug_exception == `TRUE)
begin
// Save and then clear interrupt enable
bie <= ie;
ie <= `FALSE;
bie <= ie;
ie <= `FALSE;
end
`else
if (exception == `TRUE)
begin
// Save and then clear interrupt enable
eie <= ie;
ie <= `FALSE;
eie <= ie;
ie <= `FALSE;
end
`endif
else if (stall_x == `FALSE)
begin
if (eret_q_x == `TRUE)
if(eie_delay[0])
ie <= eie;
eie_delay <= {1'b0, eie_delay[`IE_DELAY:1]};
if (eret_q_x == `TRUE) begin
// Restore interrupt enable
ie <= eie;
eie_delay[`IE_DELAY] <= `TRUE;
eie_delay[`IE_DELAY-1:0] <= 0;
end
`ifdef CFG_DEBUG_ENABLED
else if (bret_q_x == `TRUE)
// Restore interrupt enable
ie <= bie;
ie <= bie;
`endif
else if (csr_write_enable == `TRUE)
begin
// Handle wcsr write
if (csr == `LM32_CSR_IE)
begin
ie <= csr_write_data[0];
ie <= csr_write_data[0];
eie <= csr_write_data[1];
`ifdef CFG_DEBUG_ENABLED
bie <= csr_write_data[2];
`endif
end
if (csr == `LM32_CSR_IM)
im <= csr_write_data[interrupts-1:0];
im <= csr_write_data[interrupts-1:0];
if (csr == `LM32_CSR_IP)
ip <= asserted & ~csr_write_data[interrupts-1:0];
ip <= asserted & ~csr_write_data[interrupts-1:0];
end
end
end
......@@ -266,64 +285,74 @@ else
begin
// IE, IM, IP - Interrupt Enable, Interrupt Mask and Interrupt Pending CSRs
always @(posedge clk_i `CFG_RESET_SENSITIVITY)
begin
begin
if (rst_i == `TRUE)
begin
ie <= `FALSE;
eie <= `FALSE;
ie <= `FALSE;
eie <= `FALSE;
`ifdef CFG_DEBUG_ENABLED
bie <= `FALSE;
bie <= `FALSE;
`endif
ip <= {interrupts{1'b0}};
ip <= {interrupts{1'b0}};
eie_delay <= 0;
end
else
begin
// Set IP bit when interrupt line is asserted
ip <= asserted;
ip <= asserted;
`ifdef CFG_DEBUG_ENABLED
if (non_debug_exception == `TRUE)
begin
// Save and then clear interrupt enable
eie <= ie;
ie <= `FALSE;
eie <= ie;
ie <= `FALSE;
end
else if (debug_exception == `TRUE)
begin
// Save and then clear interrupt enable
bie <= ie;
ie <= `FALSE;
bie <= ie;
ie <= `FALSE;
end
`else
if (exception == `TRUE)
begin
// Save and then clear interrupt enable
eie <= ie;
ie <= `FALSE;
eie <= ie;
ie <= `FALSE;
end
`endif
else if (stall_x == `FALSE)
begin
if (eret_q_x == `TRUE)
begin
if(eie_delay[0])
ie <= eie;
eie_delay <= {1'b0, eie_delay[`IE_DELAY:1]};
if (eret_q_x == `TRUE) begin
// Restore interrupt enable
ie <= eie;
eie_delay[`IE_DELAY] <= `TRUE;
eie_delay[`IE_DELAY-1:0] <= 0;
end
`ifdef CFG_DEBUG_ENABLED
else if (bret_q_x == `TRUE)
// Restore interrupt enable
ie <= bie;
ie <= bie;
`endif
else if (csr_write_enable == `TRUE)
begin
// Handle wcsr write
if (csr == `LM32_CSR_IE)
begin
ie <= csr_write_data[0];
ie <= csr_write_data[0];
eie <= csr_write_data[1];
`ifdef CFG_DEBUG_ENABLED
bie <= csr_write_data[2];
`endif
end
if (csr == `LM32_CSR_IP)
ip <= asserted & ~csr_write_data[interrupts-1:0];
ip <= asserted & ~csr_write_data[interrupts-1:0];
end
end
end
......
......@@ -51,6 +51,14 @@ module lm32_top (
I_ACK_I,
I_ERR_I,
I_RTY_I,
`endif
`ifdef CFG_JWB_ENABLED
J_DAT_I,
J_ADR_I,
J_CYC_I,
J_SEL_I,
J_STB_I,
J_WE_I,
`endif
// Data Wishbone master
D_DAT_I,
......@@ -75,6 +83,10 @@ module lm32_top (
I_CTI_O,
I_LOCK_O,
I_BTE_O,
`endif
`ifdef CFG_JWB_ENABLED
J_ACK_O,
J_DAT_O,
`endif
// Data Wishbone master
D_DAT_O,
......@@ -85,7 +97,10 @@ module lm32_top (
D_WE_O,
D_CTI_O,
D_LOCK_O,
D_BTE_O
D_BTE_O,
trace_pc_o,
trace_eret_o,
trace_pc_valid_o
);
/////////////////////////////////////////////////////
......@@ -111,6 +126,15 @@ input I_ERR_I; // Instruction Wishbone interfac
input I_RTY_I; // Instruction Wishbone interface retry
`endif
`ifdef CFG_JWB_ENABLED
input [`LM32_WORD_RNG] J_DAT_I;
input [`LM32_WORD_RNG] J_ADR_I;
input J_CYC_I;
input [`LM32_BYTE_SELECT_RNG] J_SEL_I;
input J_STB_I;
input J_WE_I;
`endif
input [`LM32_WORD_RNG] D_DAT_I; // Data Wishbone interface read data
input D_ACK_I; // Data Wishbone interface acknowledgement
input D_ERR_I; // Data Wishbone interface error
......@@ -152,6 +176,13 @@ output [`LM32_BTYPE_RNG] I_BTE_O; // Instruction Wishbone interfac
wire [`LM32_BTYPE_RNG] I_BTE_O;
`endif
`ifdef CFG_JWB_ENABLED
output J_ACK_O;
wire J_ACK_O;
output [`LM32_WORD_RNG] J_DAT_O;
wire [`LM32_WORD_RNG] J_DAT_O;
`endif
output [`LM32_WORD_RNG] D_DAT_O; // Data Wishbone interface write data
wire [`LM32_WORD_RNG] D_DAT_O;
output [`LM32_WORD_RNG] D_ADR_O; // Data Wishbone interface address
......@@ -199,6 +230,21 @@ wire trace_bret; // Indicates a bret instruction
`endif
`endif
output [31:0] trace_pc_o;
output trace_pc_valid_o;
output trace_eret_o;
`ifdef CFG_TRACE_ENABLED
assign trace_eret_o = trace_eret;
assign trace_pc_o =trace_pc;
assign trace_pc_valid_o = trace_pc_valid;
`else
assign trace_eret_o = 0;
assign trace_pc_o = 0;
assign trace_pc_valid_o = 0;
`endif
/////////////////////////////////////////////////////
// Functions
/////////////////////////////////////////////////////
......@@ -276,7 +322,7 @@ lm32_cpu cpu (
.I_CTI_O (I_CTI_O),
.I_LOCK_O (I_LOCK_O),
.I_BTE_O (I_BTE_O),
`endif
`endif
// Data Wishbone master
.D_DAT_O (D_DAT_O),
.D_ADR_O (D_ADR_O),
......@@ -290,6 +336,29 @@ lm32_cpu cpu (
);
`ifdef CFG_JTAG_ENABLED
`ifdef CFG_JWB_ENABLED
jtag_wb jtag_wb (
// ----- Inputs -----
.clk_i (clk_i),
.DAT_I (J_DAT_I),
.ADR_I (J_ADR_I),
.CYC_I (J_CYC_I),
.SEL_I (J_SEL_I),
.STB_I (J_STB_I),
.WE_I (J_WE_I),
.reg_d (jtag_reg_d),
.reg_addr_d (jtag_reg_addr_d),
// ----- Outputs -----
.ACK_O (J_ACK_O),
.STALL_O (open),
.DAT_O (J_DAT_O),
.reg_update (jtag_update),
.reg_q (jtag_reg_q),
.reg_addr_q (jtag_reg_addr_q),
.jtck (jtck),
.jrstn (jrstn)
);
`else
// JTAG cores
jtag_cores jtag_cores (
// ----- Inputs -----
......@@ -302,6 +371,7 @@ jtag_cores jtag_cores (
.jtck (jtck),
.jrstn (jrstn)
);
`endif
`endif
`endif
endmodule
......@@ -36,12 +36,15 @@
//`define CFG_DCACHE_LIMIT 32'h7fffffff
// Enable Debugging
//`define CFG_JTAG_ENABLED
//`define CFG_JTAG_UART_ENABLED
//`define CFG_DEBUG_ENABLED
//`define CFG_HW_DEBUG_ENABLED
//`define CFG_BREAKPOINTS 32'h0
//`define CFG_WATCHPOINTS 32'h0
`define CFG_TRACE_ENABLED
`define CFG_JTAG_ENABLED
`define CFG_JTAG_UART_ENABLED
`define CFG_DEBUG_ENABLED
`define CFG_HW_DEBUG_ENABLED
`define CFG_BREAKPOINTS 32'h4
`define CFG_WATCHPOINTS 32'h4
`define CFG_JWB_ENABLED
`define CFG_INTERRUPTS_ENABLED
//`define CFG_BUS_ERRORS_ENABLED
......
......@@ -18,6 +18,8 @@ entity wrc_lm32 is
iwb_dat_i : in std_logic_vector(31 downto 0);
iwb_cyc_o : out std_logic;
iwb_stb_o : out std_logic;
iwb_sel_o : out std_logic_vector(3 downto 0);
iwb_we_o : out std_logic;
iwb_ack_i : in std_logic;
dwb_adr_o : out std_logic_vector(g_addr_width-1 downto 0);
......@@ -27,7 +29,20 @@ entity wrc_lm32 is
dwb_stb_o : out std_logic;
dwb_sel_o : out std_logic_vector(3 downto 0);
dwb_we_o : out std_logic;
dwb_ack_i : in std_logic
dwb_ack_i : in std_logic;
jwb_adr_i : in std_logic_vector(g_addr_width-1 downto 0);
jwb_dat_i : in std_logic_vector(31 downto 0);
jwb_dat_o : out std_logic_vector(31 downto 0);
jwb_cyc_i : in std_logic;
jwb_stb_i : in std_logic;
jwb_sel_i : in std_logic_vector(3 downto 0);
jwb_we_i : in std_logic;
jwb_ack_o : out std_logic;
trace_pc_o: out std_logic_vector(31 downto 0);
trace_pc_valid_o: out std_logic;
trace_eret_o:out std_logic
);
end wrc_lm32;
......@@ -42,6 +57,12 @@ architecture rtl of wrc_lm32 is
I_ACK_I : in std_logic;
I_ERR_I : in std_logic;
I_RTY_I : in std_logic;
J_DAT_I : in std_logic_vector(31 downto 0);
J_ADR_I : in std_logic_vector(31 downto 0);
J_CYC_I : in std_logic;
J_SEL_I : in std_logic_vector(3 downto 0);
J_STB_I : in std_logic;
J_WE_I : in std_logic;
D_DAT_I : in std_logic_vector(31 downto 0);
D_ACK_I : in std_logic;
D_ERR_I : in std_logic;
......@@ -55,6 +76,8 @@ architecture rtl of wrc_lm32 is
I_CTI_O : out std_logic_vector(2 downto 0);
I_LOCK_O : out std_logic;
I_BTE_O : out std_logic_vector(1 downto 0);
J_ACK_O : out std_logic;
J_DAT_O : out std_logic_vector(31 downto 0);
D_DAT_O : out std_logic_vector(31 downto 0);
D_ADR_O : out std_logic_vector(31 downto 0);
D_CYC_O : out std_logic;
......@@ -63,16 +86,20 @@ architecture rtl of wrc_lm32 is
D_WE_O : out std_logic;
D_CTI_O : out std_logic_vector(2 downto 0);
D_LOCK_O : out std_logic;
D_BTE_O : out std_logic_vector(1 downto 0));
D_BTE_O : out std_logic_vector(1 downto 0);
trace_pc_o : out std_logic_vector(31 downto 0);
trace_pc_valid_o : out std_logic;
trace_eret_o: out std_logic);
end component lm32_top;
signal rst : std_logic;
signal iwb_adr_int : std_logic_vector(31 downto 0);
signal dwb_adr_int : std_logic_vector(31 downto 0);
signal jwb_adr_int : std_logic_vector(31 downto 0);
signal irqs_vec : std_logic_vector(31 downto 0);
signal dwb_data_int : std_logic_vector(31 downto 0);
begin
irqs_vec(g_num_irqs-1 downto 0) <= irq_i;
......@@ -90,6 +117,12 @@ begin
I_ACK_I => iwb_ack_i,
I_ERR_I => '0',
I_RTY_I => '0',
J_DAT_I => jwb_dat_i,
J_ADR_I => jwb_adr_int,
J_CYC_I => jwb_cyc_i,
J_SEL_I => jwb_sel_i,
J_STB_I => jwb_stb_i,
J_WE_I => jwb_we_i,
D_DAT_I => dwb_data_int,
D_ACK_I => dwb_ack_i,
D_ERR_I => '0',
......@@ -97,12 +130,14 @@ begin
I_DAT_O => iwb_dat_o,
I_ADR_O => iwb_adr_int,
I_CYC_O => iwb_cyc_o,
I_SEL_O => open,
I_SEL_O => iwb_sel_o,
I_STB_O => iwb_stb_o,
I_WE_O => open,
I_WE_O => iwb_we_o,
I_CTI_O => open,
I_LOCK_O => open,
I_BTE_O => open,
J_DAT_O => jwb_dat_o,
J_ACK_O => jwb_ack_o,
D_DAT_O => dwb_dat_o,
D_ADR_O => dwb_adr_int,
D_CYC_O => dwb_cyc_o,
......@@ -111,10 +146,17 @@ begin
D_WE_O => dwb_we_o,
D_CTI_O => open,
D_LOCK_O => open,
D_BTE_O => open);
D_BTE_O => open,
trace_pc_o => trace_pc_o,
trace_pc_valid_o => trace_pc_valid_o,
trace_eret_o => trace_eret_o);
iwb_adr_o <= iwb_adr_int(g_addr_width+1 downto 2);
dwb_adr_o <= dwb_adr_int(g_addr_width+1 downto 2);
jwb_adr_int(31 downto g_addr_width+2) <= (others => '0');
jwb_adr_int(g_addr_width+1 downto 2) <= jwb_adr_i;
jwb_adr_int(1 downto 0) <= (others => '0');
process(dwb_dat_i)
begin
......
files =["chipscope_icon.ngc", "chipscope_ila.ngc" ]
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$0af5=6:2.Yi{g|inl9$4(5=8*/=6>;;12351=7898?7=>?459345>339::<95?0327?5638=1;<5>;;13341=799;?7=<?05930563392;<<5>4:33452<9?;;=6<;;32341=599::;6=9:HLLQQ<DGG^YCA>33483:4=3<2>;<=??;7qo|437|oml::8"209;0>>789;;75>?1923456799:;<h5MSBCM[VVFZ]KE:95MUGE;?GSTW@DMC<5L7:ABTQSUM;1HI<<4CIG@OZJNKLDXIRZVPD08GL2<KEA;:6MCK0:32>EKC;=;96MCK3Z;?FJL:Q;3<85LLJ;31>EKCH;<7NBDA0F13>EKCH;O8:5LLJC2@=3<KEAI=85LLJA21>EKCM;>7NBDDWa8GIMC^VNBZDJJ5:AOOC^?3JF@JU?7029@HW?<KFGFEYZJDc9@KKRUGE:7<3m4CNLWVJJ748:5o6M@NUPLH5:697i0OB@[RNN38449k2IDBY\@L1>27;e<KFD_^BB?<06=g>EHF]XD@=2>5?a8GJHSZFF;0<81c:ALJQTHD96:;3m4CNLWVJJ74825o6M@NUPLH5:617h0OB@[RNN3848d3JEEX_AC0=03:f=DGG^YCA>320<`?FII\[EG<1<=>b9@KKRUGE:7>>0l;BMMPWIK858?2n5LOOVQKI6;:<4h7NAATSMO49416j1HCCZ]OM2?628d3JEEX_AC0=0;:f=DGG^YCA>328<a?FII\[EG<1<1c:ALJQTHD968<3m4CNLWVJJ74:;5o6M@NUPLH5:4:7i0OB@[RNN38659k2IDBY\@L1>00;c<KFD_^BB?<2794;e<KFD_^BB?<27=f>EHF]XD@=2<>c9@KKRUGE:783l4CNLWVJJ74<4i7NAATSMO4909j2IDBY\@L1>4:g=DGG^YCA>38?`8GJHSZFF;040>4:ALV@Y@MGOYMYG@N^KMBJ1<K[OJXHJ>;E68@466:2NB86J]CJa8@WELWEEHMAQFc:FQGNYKGJKGSB=4FEA7?CBDM:1MHH=4FEP7?CBUM8h0J_AB #F\GIM%(]E+.GQLLJ #PLA6j2LYC@.-J^AOO'&SG)(OSNBD"!VJC7g<N[EF,/[PCMI!$QI'*CUH@F,/14234+6789:;<=>/pR0b?CTHE)(^SNBD"!VL$'SXKEA),<;?01,3456789:;,}]7;GPLIZHDN81L?6IAD09J6>O7:2C:>6G=2:K06>O3:2C>56GAIUQWEQC43@D]m6D[AF]@LDOI12@_MJQ[ERV6?OYDDB80@D<4LN48HJGCMM<0@BMDEE58HJANKHF?7A[[159OQQ433E__895CUU44?HS_KPUG96CZXG76?HS_N?i0Ald`rWgqwliik2Gbbb|Yesqjkk4<F9=0BHZXOSI5?KIDD@Z<7CABESEF5>I03F$?<iQC1:R7?UGU\;l0\H\FOE"!NZEKC+*8<=>?.123456'xZ*CEJF/51,345678)/j7]GA_CWPMA^e3YCESO[\N@OF=>VLWAF^XCC9;QQGKKC63X;0^85]ERGW3>TRF]OXX<5\3:QFH0=T@@L_:6]@USAF2>USI]_X?6ZLK29W@L5<\ME37YK]MHLBH6=SAN20XDCJSQG@7>RJ[>1_B@QAEU;8PVYCW]ETF55[S^H\GIM>3]YTFRZ@_E;8PVYRW]ETF45[S^W\PJYR<2^R\H=k;T2,QZODGG%BSTK\_CQ@EK(RWKY$ER]9.HQZJ+OX]ZOT_BH[BRABJZCV8'_TN^;k;T2,QZODGG%BSTK\_CQ@EK(RWKY$ER[\E^QLBQDTKHDTI\>!I^WPAZ^T\V^HGRY@RJCQKPHCWL[:"XQFCNL\FVEFFVH^JJ<9;T2,QZODGG%BSTK\_CQ@EK(RWKY$eI\LK^NLGDJ5j2_;#XQFCNL,QZEJL&MTXL\HEUY24X(NWGO;"XQ[ASEFP7d<]9%^SDM@N.W\GHB(OV^J^JK[[03^*LYIM9$^SYO]GDV1f>S7'\UBOB@ U^AN@*AX\HXLIYU>2\,J[KC7&\U_M_IJT3`8Q5)RW@IDB"[PCLF,CZRFZNO_W<=R.H]MA5(RW]KYKHZ=b:W3+PYNKFD$YRMBD.E\PDT@M]Q:8P F_OG3*PYSI[MNX?l4U1-V[LEHF&_TO@J G^VBVBCSS8?V"DQJQ1,V[QGUOL^9m6[?/T]JGJH(]VIFH"IPT@PDAQ]1U'CTBH>!U^VBVBCS:h1^<"[PIBMM+PYDEM%LSYO]GDVX3X(NWGO;"XQ[ASEFP7g<]9%^SDM@N.W\GHB(OV^J^JK[[9_-MZHB8'_TXL\HEU0b?P6(]VCHCC!Z_BOG+BYSI[MNXV7R.H]MA5(RW]KYKHZ=c:W3+PYNKFD$YRMBD.W\GJKJIGNT_HB I5,EM^6Z&\UGYY<k;T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_46Z&\UGYY<k;T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_47Z&\UGYY<k;T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_44Z&\UGYY<k;T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_45Z&\UGYY<k;T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_42Z&\UGYY<k;T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_43Z&\UGYY<l;T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_4[)]VF^X?m4U1-V[LEHF&_TO@J U^ALIHGILVYN@"G;.GKX6X(RWE__>n5Z0.W\MFII'\UHAI!Z_BMNIDHCWZOG#D:!FHY0Y+SXD\^9o6[?/T]JGJH(]VIFH"[PCNONEKBX[LF$E9 IIZ6^*PYK]]8h7X> U^K@KK)RWJGO#XQLOLOBJAYTME%B8#HF[4_-QZJR\;i0Y=!Z_HALJ*SXKDN$YRM@MLCM@ZUBD&C?"KGT6\,V[ISS:j1^<"[PIBMM+PYDEM%^SNABM@LG[VCK'@>%JDU8]/W\HPR5k2_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV6R.T]OQQ4d3\:$YRGLOO-V[FKC'\UHC@CNNE]PAI)N<'LBW4S!U^NVP7e<]9%^SDM@N.W\GHB(]VID^HQFD^QFH*O3&OCP<P Z_MWW6a=R8&_TENAA/T]@IA)RWJEYIRGK_RGO+L2)N@Q:<P Z_MWW6a=R8&_TENAA/T]@IA)RWJEYIRGK_RGO+L2)N@Q:=P Z_MWW6a=R8&_TENAA/T]@IA)RWJEYIRGK_RGO+L2)N@Q:>P Z_MWW6a=R8&_TENAA/T]@IA)RWJEYIRGK_RGO+L2)N@Q:?P Z_MWW6a=R8&_TENAA/T]@IA)RWJEYIRGK_RGO+L2)N@Q:8P Z_MWW6a=R8&_TENAA/T]@IA)RWJEYIRGK_RGO+L2)N@Q:9P Z_MWW6f=R8&_TENAA/T]@IA)RWJEYIRGK_RGO+L2)N@Q:Q#[PLTV1g>S7'\UBOB@ U^AN@*SXKFXNSDJPSDN,M1(AAR8V"XQCUU0`?P6(]VCHCC!Z_BOG+PYDG[OTEIQ\EM-J0+@NS:W%YRBZT3a8Q5)RW@IDB"[PCLF,QZEHZLUBHR]JL.K7*CO\<T$^SA[[2b9V4*SXAJEE#XQLME-V[FIUMVCOS^KC/H6-BL]2U'_T@XZ=c:W3+PYNKFD$YRMBD.W\GJTBW@NT_HB I5,EM^0Z&\UGYY<l;T2,QZODGG%^SNCK/T]@KWCXAMUXIA!F4/DJ_2[)]VF^X?m4U1-V[LEHF&_TO@J U^ALV@YNLVYN@"G;.GKX<X(RWE__>n5Z0.W\MFII'\UHAI!Z_BMQAZOCWZOG#D:!FHY:Y+SXD\^:;6[?/T]JGJH(]VIFH"[PSDN\j4d<]9%^SDM@N.W\GHB(]V^J^JK[_BG22>S7'\UBOB@ U^AN@*oTMEUe=o5Z0.W\MFII'\UHAI!fT@PDAQ:687;i7X> U^K@KK)RWJGO#dZNRFGW84799h1^<"[PIBMM+PYDEM%bXL\HEU>;:4g<]9%^SDM@N.W\GHB(a]KYKHZ39?3b?P6(]VCHCC!Z_BOG+lRFZNO_SNK=c:W3+PYNKFD$YRM[RM]LQQ)AWGI[W=S!F^AN@^6Z&\UCOH<l;T2,QZODGG%^SNZ]L^MVP*@XFJZP<P I_BOG_5[)]VFHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX55[)]VBHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX55[)]VFHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX54[)]VBHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX54[)]VFHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX57[)]VBHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX57[)]VFHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX56[)]VBHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX56[)]VFHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX51[)]VBHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX51[)]VFHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX50[)]VBHI?j4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX50[)]VFHI?m4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX5X(RWAIN>n5Z0.W\MFII'\UHX_BPOTV,BZHDXR:V"KQLMEY2Y+SXDJO9o6[?/T]JGJH(]VI_^AQ@UU-E[KEWS9W%JRMBDZ0^*PYOKL8h7X> U^K@KK)RWJ^Y@RAZT.D\JFV\8T$MSNCK[3_-QZJDM;i0Y=!Z_HALJ*SXK]XGSB[[/G]MGU]7U'LTO@JT3\,V[MEB:j1^<"[PIBMM+PYD\[FTCXZ F^L@T^6Z&OUHAIU<]/W\HFC5k2_;#XQFCNL,QZESZEUDYY!I_OAS_5[)NVIFHV:R.T]KG@4d3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW9S!U^N@A7e<]9%^SDM@N.W\GQTKWF__#KQACQY3Y+@XKDNP9P Z_IAF6f=R8&_TENAA/T]@PWJXG\^$JR@LPZ2^*CYDEMQ>Q#[PLBG1g>S7'\UBOB@ U^AWVIYH]]%MSCM_[1_-BZEJLR<V"XQGCD0`?P6(]VCHCC!Z_BVQHZIR\&LTBN^T0\,E[FKCS?W%YRBLE3a8Q5)RW@IDB"[PCUPO[JSS'OUEO]U?]/D\GHB\?T$^SEMJ2b9V4*SXAJEE#XQLTSN\KPR(NVDH\V>R.G]@IA]0U'_T@NK=c:W3+PYNKFD$YRM[RM]LQQ)AWGI[W=S!F^AN@^>Z&\UCOH<l;T2,QZODGG%^SNZ]L^MVP*@XFJZP<P I_BOG_=[)]VFHI?m4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX=X(RWAIN>n5Z0.W\MFII'\UHX_BPOTV,BZHDXR:V"KQLMEY:Y+SXDJO:i6[?/T]JGJH(]VI_^AQ@UU-V[FKCO[Z;=h5Z0.W\MFII'\UHX_BPOTV,QZEJLNX[=??4U1-V[LEHF&_TOY\C_NWW+PYCI]KTZLBFD3:8Q5)RW@IDB"[PCUPO[JSS'`IDA@OAD^EQTZUBD5:5>55Z0.W\MFII'\UHX_BPOTV,mFIJEHDOSJ\__RGO848582_;#XQFCNL,QZESZEUDYY!fD@VB[SGKAM8:7X> U^K@KK)RWZ^JX"HPSUCW_5[)]VY_MY<>;T2,QZODGG%^S^ZNT.D\WQGSS8W%YR][AU02?P6(]VCHCC!Z_RVBP*@X[]K_W?S!U^QWEQ463\:$YRGLOO-V[VRF\&LT_YO[[2_-QZUSI];j7X> U^K@KK)RWZ^JX"[PCLFDVU66l2_;#XQFCNL,QZUSI]%^SIO[A^TBHLB6i2_;#XQFCNL,QZUSI]%^S^ZNTBOG5f=R8&_TENAA/T]PPDR(]VY_MYMBD^l15>S7'\UBOB@ U^QWEQ)RWZ^JXRMAT.AJ848592_;#XQFCNL,QZUSI]%^S^ZNT^AMP*EN4;49=6[?/T]JGJH(]VY_MY!Z_RVBPZEI\&IB0>0=1:W3+PYNKFD$YR][AU-V[VRF\VIEX"MF<5<15>S7'\UBOB@ U^QWEQ)RWZ^JXRMAT.AJ808582_;#XQFCNL,QZUSI]%^S^ZNT^AMP*B;878;7X> U^K@KK)RWZ^JX"[PSUCW[FHS'M6:2?>4U1-V[LEHF&_T_YO[/T]PPDRXKG^$H1<1219V4*SXAJEE#XQ\T@V,QZUSI]UHBY!K<2<14>S7'\UBOB@ U^QWEQ)RWZ^JXRMAT.F?0;473\:$YRGLOO-V[VRF\&_T_YO[_BLW+A:26;i0Y=!Z_HALJ*SX[]K_#XQ\T@V\GKR(OR:V"J`G.T]NQ]E^:>1^<"[PIBMM+PYT\H^$YR][AU]@JQ)@S9W%YRHKRD05?P6(]VCHCC!Z_RVBP*SX[]K_SN@[/FY3Y+SXD\^946[?/T]JGJH(]VY_MY!Z_RVBPZEI\&MP<P Z_YMQG\4d3\:$YRGLOO-V[VRF\&_T_YO[_BLW+B]6U'MeD#[PMTZ@]71<]9%^SDM@N.W\WQGS'\UXXLZPCOV,C^7Z&\UMH_K=6:W3+PYNKFD$YR][AU-V[VRF\VIEX"IT1\,V[ISS:11^<"[PIBMM+PYT\H^$YR][AU]@JQ)@S8W%YRV@RB[1g>S7'\UBOB@ U^QWEQ)RWZ^JXRMAT.EX6X(@fA$^S@[WCX04?P6(]VCHCC!Z_RVBP*SX[]K_SN@[/FY1Y+SXNMXN>;5Z0.W\MFII'\UXXLZ U^QWEQYDF]%LW?S!U^NVP7><]9%^SDM@N.W\WQGS'\UXXLZPCOV,C^4Z&\USC_MV2b9V4*SXAJEE#XQ\T@V,QZUSI]UHBY!H[2_-CkN)]VG^TNW=7:W3+PYNKFD$YR][AU-V[VRF\VIEX"IT3\,V[CBUM;<0Y=!Z_HALJ*SX[]K_#XQ\T@V\GKR(OR9V"XQCUU0;?P6(]VCHCC!Z_RVBP*SX[]K_SN@[/FY0Y+SXPFXHU?m4U1-V[LEHF&_T_YO[/T]PPDRXKG^$KV:R.FlK*PYJ]QIR>:5Z0.W\MFII'\UXXLZ U^QWEQYDF]%LW9S!U^DGV@413\:$YRGLOO-V[VRF\&_T_YO[_BLW+B]3U'_T@XZ=8:W3+PYNKFD$YR][AU-V[VRF\VIEX"IT4\,V[]IUKP8<7X> U^K@KK)RWZ^JX"[PSUCW[FHS'NQ>Q#[PFEPF63=R8&_TENAA/T]PPDR(]VY_MYQLNU-D_0[)]VF^X?64U1-V[LEHF&_T_YO[/T]PPDRXKG^$KV;R.T][KWE^:91^<"[PIBMM+PYT\H^$YR][AU]@JQ)T4949<6[?/T]JGJH(]VY_MY!Z_RVBPZEI\&Y7=3<?;T2,QZODGG%^S^ZNT.W\WQGSWJD_#^2=>328Q5)RW@IDB"[PSUCW+PYT\H^TOCZ S=1=65=R8&_TENAA/T]PPDR(]VY_MYQLNU-P818582_;#XQFCNL,QZUSI]%^S^ZNT^AMP*U;=7;h7X> U^K@KK)RWZ^JX"[PSUCW[MO@@8h0Y=!Z_HALJ*SX[]K_#XQ\T@V\HJQ6>2_;#XQFCNL,QZUSI]%^SYJ@1c9V4*SXAJEE#XQ\T@V,QZRCGVdnty?j;T2,QZODGG%^S^ZNT.k@IAY@ZY:T_HB>c:W3+PYNKFD$YR][AU-j@DRFW_KGEI?6;T2,QZODGG%^S^ZNT.kPPDR;87;27X> U^K@KK)RWZ^JX"g\T@V?5;7>3\:$YRGLOO-V[VRF\&cXXLZ32?3:?P6(]VCHCC!Z_RVBP*oT\H^7?3?l;T2,QZODGG%^S^ZNT.kPPDRDEMUHI<k4U1-V[LEHF&_T_YO[/hQWEQEJLVINSc?k;T2,QZODGG%^S^ZNT.kPPDRXKG^7<3?k;T2,QZODGG%^S^ZNT.kPPDRXKG^7=3?k;T2,QZODGG%^S^ZNT.kPPDRXKG^7>3?k;T2,QZODGG%^S^ZNT.kPPDRXKG^7?3?k;T2,QZODGG%^S^ZNT.kPPDRXKG^783?k;T2,QZODGG%^S^ZNT.kPPDRXKG^793?m;T2,QZODGG%^S^ZNT.kPPDRX@@MC=l5Z0.W\MFII'\UXXLZ iRVBPZJH_8k0Y=!Z_HALJ*SX[]K_#dZKO^lf|q4e3\:$YRGLOO-V[V_IK&MT_T@L_VMQ@^6Z&@UEI= Z_GFQ6g=R8&_TENAA/T]P]KE(OVYRBNQXOSFX5X(NWGO;"XQIDS0a?P6(]VCHCC!Z_R[MG*AX[PDHSZA]DZ0^*LYIM9$^SKJ]2c9V4*SXAJEE#XQ\YOA,CZU^FJU\C_JT3\,J[KC7&\UMH_<m;T2,QZODGG%^S^WAC.E\W\HDW^EYHV:R.H]MA5(RWONY>o5Z0.W\MFII'\UXUCM G^QZJFYPG[NP9P F_OG3*PYAL[8i7X> U^K@KK)RWZSEO"IPSXL@[RIULR<V"DQJQ1,V[CBU9k1^<"[PIBMM+PYTQGI$YRI@T^QZJF7c3\:$YRGLOO-V[V_IK&_TKBZPSXL@[M7c3\:$YRGLOO-V[V_IK&_TKBZPSXL@[I703\:$YRGLOO-V[V_IK&_T_T@L1d9V4*SXAJEE#XQ\YOA,QZoCI]KTO@JPn0a8Q5)RW@IDB"[PSXL@+lBF\HUHAIQa1`9V4*SXAJEE#XQ\YOA,mBISWZSEO<h4U1-V[LEHF&_T_T@L/hELPZU^FJUCEJF>e:W3+PYNKFD$YR]VNB-jCJRX[PDHSAAX1d9V4*SXAJEE#XQ\YOA,mV_IKV]D^I2?>0g8Q5)RW@IDB"[PSXL@+lU^FJU\C_J31?3f?P6(]VCHCC!Z_R[MG*oTQGIT[B\K<3<2a>S7'\UBOB@ U^QZJF)n[PDHSZA]D=1=5`=R8&_TENAA/T]P]KE(aZSEORY@RE>7:4c<]9%^SDM@N.W\W\HD'`YRBNQXOSF?1;7b3\:$YRGLOO-V[V_IK&cXUCMPWNPG8386;2_;#XQFCNL,QZRCAVxnk>>4U1-V[LEHF&_TXIAPMTZ,QZETWD_S#D:!U^OV\40(EdsSB?>129V4*SXAJEE#XQ[DN]qab723\:$YRGLOO-V[lBF\HUHAI?8;T2,QZODGG%^SdJNT@]@IAYi9;1^<"[PIBMM+PYn[LFTb<74U1-V[LEHF&cHC@CNNE]DVU:76830Y=!Z_HALJ*oDGDGJBIQHRQ>2:4?<]9%^SDM@N.k@KHKFFMUXIA2?>0c8Q5)RW@IDB"gLOLOBJAYTME6:<3?n;T2,QZODGG%bOBCBAOF\W@J;984:m6[?/T]JGJH(aJEFAL@K_RGO84499h1^<"[PIBMM+lEHEDKEHR]JL=30:4g<]9%^SDM@N.k@KHKFFMUXIA2>4?3b?P6(]VCHCC!fCNONEKBX[LF7=80>9:W3+PYNKFD$eNABM@LG[VCK484:56[?/T]JGJH(aJEFAL@K_RGO878612_;#XQFCNL,mFIJEHDOS^KC<2<2=>S7'\UBOB@ iBMNIDHCWZOG090>9:W3+PYNKFD$eNABM@LG[VCK4<4:56[?/T]JGJH(aJEFAL@K_RGO838612_;#XQFCNL,mFIJEHDOS^KC<6<2=>S7'\UBOB@ iBMNIDHCWZOG050>9:W3+PYNKFD$eNABM@LG[VCK404:96[?/T]JGJH(aJEYIRGK<1<21>S7'\UBOB@ iBMQAZOC484:96[?/T]JGJH(aJEYIRGK<3<21>S7'\UBOB@ iBMQAZOC4:4:56[?/T]JGJH(aJEYIRGK_RGO8586i2_;#XQFCNL,mFIUMVCOS^KC<07=56=R8&_TENAA/hFBPDYDEM;>7X> U^K@KK)nLH^JSNCK_od8Q5)RW@IDB"gKRBIf?P6(]VCHCC!fSDN24>S7'\UBOB@ iRGO[k`<]9%^SDM@N.kP]KEb3\:$YRGLOO-jPAOb3\:$YRGLOO-jPAI6>2_;#XQFCNL,mQBHW_OH0<;1129V4*SXAJEE#dZKO^lf|qb<]9%b_EGIT^MVP`=R8&c^\IO[E^MVP3=RXMK_In5ZSDP\RLUNJEO=7XQMUGE6?PYDDB90ZNM6;WKFSZR^XL;o7UGCIOZ.\AD'8';+_Y[M 1,2$DUDA@?0TB\LY79[WQJNJ>1S_YQHNE58\VRX^JIi7UQLOSG\MK@H>2RonRGkf:ZglZVuad\n~~g`n028\akXEh`d~[k}shmm55=_ldUFeca}Vdppmjh43Qy?o5P_^ZOJHYXW9UTSX> U^K@KK)RWJGO#XQLOLOBJAYTME%B8#HF[06^*PYK]]9h7RQPXMLN[ZY68VUTY=!Z_HALJ*SXK]XGSB[[/G]MGU]7U'LTO@JT13_-QZJDM:i0SRQWLOO\[Z76WVU^<"[PIBMM+PYD\[FTCXZ F^L@T^6Z&OUHAIU>3\,V[IEB;j1TSRVCNL]\[44XWV_;#XQFCNL,QZESZEUDYY!I_OAS_5[)NVIFHV?;]/W\HFC4k2UTSUBAM^]\56YXW\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<;R.T]OG@5e3VUTTA@B_^]20ZYX]9%^SDM@N.W\GQTKWF__#KQACQY3Y+@XKDNP=P Z_MAF7g=XWVRGB@QP_07\[ZS7'\UBOB@ U^AWVIYH]]%MSCM_[1_-BZEJLR8V"XQCCD1a?ZYXPEDFSRQ>6^]\Q5)RW@IDB"[PCUPO[JSS'OUEO]U?]/D\GHB\;T$^SAMJ3c9\[Z^KFDUTS<9P_^W3+PYNKFD$YRM[RM]LQQ)AWGI[W=S!F^AN@^2Z&\UGOH=m;^]\\IHJWVU:4RQPU1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX1X(RWEIN?o5P_^ZOJHYXW83TSR[?/T]JGJH(]VI_^AQ@UU-E[KEWS9W%JRMBDZ4^*PYKKL9i7RQPXMLN[ZY6WVU^<"[PIBMM+PYDEM%^SNABM@LG[VCK'@>%JDU>2\,V[ISS;k1TSRVCNL]\[76XWV_;#XQFCNL,QZESZEUDYY!I_OAS_5[)NVIFHV9R.T]OG@5e3VUTTA@B_^]15ZYX]9%^SDM@N.W\GQTKWF__#KQACQY3Y+@XKDNP4P Z_MAF7g=XWVRGB@QP_30\[ZS7'\UBOB@ U^AWVIYH]]%MSCM_[1_-BZEJLR3V"XQCCD0g?ZYXPEDFSRQ=3^]\Q5)RW@IDB"[PCUPO[JSS'\UHAII]P113?ZYXPEDFSRQ=4^]\Q5)RW@IDB"[PCUPO[JSS'\UOMYOPV@NJ@7g<WVUS@CCP_^06[ZYR8&_TENAA/T]P]KE(]VMDXR]VNB1a?ZYXPEDFSRQ=_^]V4*SXAJEE#XQLME-V[FIJEHDOS^KC/H6-BL]68T$^SA[[3`9\[Z^KFDUTS>QP_T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_=[)]VF^X>o4_^][HKKXWV>TSR[?/T]JGJH(]VIFH"[PCNONEKBX[LF$E9 IIZ4^*PYK]]9j7RQPXMLN[ZY2WVU^<"[PIBMM+PYDEM%^SNABM@LG[VCK'@>%JDU;]/W\HPR4i2UTSUBAM^]\2ZYX]9%^SDM@N.W\GHB(]VIDA@OAD^QFH*O3&OCP>P Z_MWW7d=XWVRGB@QP_6]\[P6(]VCHCC!Z_BVQHZIR\&LTBN^T0\,E[FKCS9W%YRBLE2`8[ZY_DGGTSR6P_^W3+PYNKFD$YRM[RM]LQQ)AWGI[W=S!F^AN@^77U'_T@NK<b:]\[]JIEVUT5RQPU1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX54[)]VFHIi5nsxl`[acdgmoy56o|yoa\ip~b3jbb|~m`pd]jgjh5n2ice}}loqg\mfii$jbb|~m`pd]jgjhX~8U;9Ro#NNLF(KIIM:>m7nffpralt`Ynkfd'oegsbmsaZodggU}=R>:_`.xgZstmVdn{R~nrrgq95*dWqidSag|t<LvigcuWJeexac_Qmqpv;63\ynSHv{_Cq`ek;aieyn7X}jr^Q`ekYD`hce1X]JR09FjddkmV@mjQMuge>pwsb3\ynSX`zsdf\Fveff4lj`~k4Urg\Wj`sjzijb0hnlrg/gZ~cmchikobim{>wugu|hd= nQlosg\p|vb58&hS`oeos]uawungg7:?!mPmhllvZpbzzcdb0?#c^`vmibXzl|bdaa=1.`[fiumVgjfb|Pvdp>5)eXkfxnS`gaos]uaw;5$jUhckPmhllvZgkxakTzh|296.`[h``W`n6=!mPurg\fp`u59&hSx}j_rkn95*dW|ynS~aitcq`ek;7$jU{mzPieal``Yumncxxh|20-a\qvcXb}klSo{ig<3/gZhreVidby|`l^rlvqu:9%iTy~kPcnlwvjj758&hSx}j_bmmpwik94:'oR{|e^aljqthd;7; nQzsd]`kkruge96<!mPurg\gjhszff?1="l_tqf[fii|{eg90>#c^wpaZehf}xd`;3?,b]vw`Ydgg~yca920-a\qvcXkfd~bb7=1.`[pubWjeexac9<2/gZstmVidby|`l02>4)eX}zoTob`{rnn2586+kVxiRm`nuplh44:8%iTy~kPcnlwvjj6;4:'oR{|e^aljqthd8>6<!mPurg\a}rXjzijb0>#c^wpaZsi}zooSo}lao?3(fYr{lUsyQ{cj]tkwmfzfeh0?#c^g{ehvkmVnndia=gcow`*dW|yn~R}lao]`ldoi58&v=o5lhhrpgjvbW`idbRZFMDQSAFYIKO997nffpralt`YnkfdTz<Q?5^c/$]okagr+OB\J Fgmawgsg{*:?#?8;bmvjqcu>2ixS`{w8:ap[hs9?k0enaa_cq`ek`<ajeeSo}lao]aqca6k2chccQmsbcm[gsaoV^BAH]_EB][WQ`<ajeeSnck_eg`kac>3`idbRm`rdf8mfiiWj~y`Raztc9jgjhX{}ky~74ibmm[vik11eknlzimf~DEv39<1KLu?md;D90?7|[<o1=l>5918277bc9;09=?78{o3:a?7<f83m6;5+18a95<0<uZ9<6<o?:829564cl881><<68:Q4b?7dl3;1=><kd009644f82Y8;7?ld;39564cl881><<n3:f2fa<7280:w^;j:0c3><6=9:8oh<<5200:3>pS1o0;6<4>:6dxW0c=9h:15=4>33fg57<59;3<7)?65;:2?S7>l38py5751:w;e?6<u-396<74b0`g>5<5<3226:htH0;2?!gb28ho7W?i:0y22?{#90h1=n?4$3195gc<,<n1=oh4+4494?">=3??7c7;:328?.32290/584:4:l:0?6<3"?86=4+94860>h><3;07&;=:18'=0<2<2d287<4;*72>5<#1<0>86`64;18?.37290/584:4:l:0?2<3">m6=4+94860>h><3?07&:k:18'=0<2<2d28784;*6`>5<#1<0>86`64;58?.2e290/584:4:l:0?><3">j6=4+94860>h><3307&:6:18'=0<2<2d287o4;*6;>5<#1<0>86`64;`8?.20290/584:4:l:0?e<3">=6=4+94860>h><3n07&:::18'=0<2<2d287k4;*67>5<#1<0>86`64;d8?.25290/584:4:l:0?7732!?=7>5$87911=i1=0:=65$4183>!?22<>0b4:51398/6`=83.297;;;o;7>45<3"9n6=4+94860>h><3;?76%<d;29 <3===1e594>5:9(7f<72-3>68:4n86953=<#:h1<7*65;77?k?328=07&=n:18'=0<2<2d287?7;:)0=?6=,0?1995a9582=>=,=j0;6)7::468j<2=9h10'8l50;&:1?333g3?6<l4;*7b>5<#1<0>86`64;3`?>-213:1(4;5559m=1<6l21 954?:%;6>02<f0>1=h54+4594?">=3??7c7;:0d8?.2b290/584:4:l:0?4632!??7>5$87911=i1=09>65$3983>!?22<>0b4:52298f4?f290:6=4?{%cf>4?33A;246F>909l=4<722wi=4750;394?6|,ho1;=5G18:8L4?63f<m6=44}cce>5<e290;w)oj:0f8L4??3A;2=6`8a;38j2d=82e2i7>5;nc1>5<<g0h1<75`a083>>i6190;66a6a;29?j?c2900el=50;9l64<722ej;7>5;n41>5<<ukh;6=4=:381M7>92.ji7?l6:k57?6=3f<?6=44b0;1>5<5290;w)oj:0g8L4??3A;2=6g81;29?j>a2900qo?l7;294?6=8rB:5<5+ad8b2>Jf>3;p(lo5929~yv042909wS8<;<3:6?163ty=87>52z\50>;61;03j6srb04b>5<5290;w)oj:6;8L4??3A;2=6g81;29?j>a2900qo?9b;296?6=8r.ji796;I3:<>N6181b;<4?::m;b?6=3th::54?:583>5}#il0=;6F>999K5<7<,>21>6g=0;29?l452900e8h50;9l==<722wi=;850;694?6|,ho1::5G18:8L4?63-=36?5f2183>>o5:3:17d;i:188k<>=831vn<86:187>5<7s-kn6;;4H0;;?M7>92.<47<4i3294?=n;?0;66g:f;29?j??2900qojl:181>5<7s-kn6:74H0;;?M7>92c<=7>5;n:e>5<<ukno6=4<:183!gb2190D<77;I3:5>"003;<7)79:0`1?l152900e:=50;9l<c<722win54?:483>5}#il0=:6F>999K5<7<,>21>6g=0;29?l452900e>850;9j1c<722e247>5;|`a=?6==3:1<v*ne;45?M7>02B:5<5+7981?l472900e?<50;9j73<722c>j7>5;n;;>5<<ukhj6=4::183!gb2?<0D<77;I3:5>"00380e?>50;9j67<722c8:7>5;h7e>5<<g021<75rbc`94?3=83:p(lk5679K5<><@83:7)97:39j65<722c9>7>5;h15>5<<a<l1<75`9983>>{ej;0;684?:1y'e`<1>2B:555G1838 2>=:2c9<7>5;h01>5<<a:<1<75f5g83>>i>03:17plm3;291?6=8r.ji789;I3:<>N6181/;54=;h03>5<<a;81<75f3783>>o2n3:17b77:188ygd3290>6=4?{%cf>30<@8337E?61:&4<?4<a;:1<75f2383>>o4>3:17d;i:188k<>=831vno;50;794?6|,ho1:;5G18:8L4?63-=36?5f2183>>o5:3:17d=9:188m0`=831d554?::af3<72<0;6=u+ad852>N6111C=4?4$6:96>o583:17d<=:188m60=831b9k4?::m:<?6=3thi;7>55;294~"fm3<=7E?68:J2=4=#?1097d<?:188m74=831b?;4?::k6b?6=3f336=44}ca1>5<2290;w)oj:968L4??3A;2=6*88;3a?!?128k:7d9=:188m25=831b;94?::k41?6=3f2m6=44}ca2>5<2290;w)oj:968L4??3A;2=6*88;3;?!?128k:7d9=:188m25=831b;94?::k41?6=3f2m6=44}ca3>5<2290;w)oj:968L4??3A;2=6*88;37?!?128kh7d9=:188m25=831b;94?::k41?6=3f2m6=44}c`e>5<2290;w)oj:968L4??3A;2=6*88;32?!?128kh7d9=:188m25=831b;94?::k41?6=3f2m6=44}c`f>5<2290;w)oj:968L4??3A;2=6*88;d8 <0=9k90e:<50;9j36<722c<87>5;h56>5<<g1l1<75rbcf94?3=83:p(lk5859K5<><@83:7)97:d9'=3<6j:1b;?4?::k47?6=3`=?6=44i6794?=h0o0;66smcc83>0<729q/mh474:J2===O90;0(:65d:&:2?7e<2c<>7>5;h50>5<<a>>1<75f7483>>i?n3:17plla;291?6=8r.ji76;;I3:<>N6181/;54m;%;5>4d33`=96=44i6194?=n?=0;66g85;29?j>a2900qom6:186>5<7s-kn65:4H0;;?M7>92.<47o4$8495g3<a>81<75f7283>>o0<3:17d9::188k=`=831vnn650;794?6|,ho1495G18:8L4?63-=3645+9782f0=n?;0;66g83;29?l132900e:;50;9l<c<722wio:4?:483>5}#il0386F>999K5<7<,>2146*66;3a2>o0:3:17d9<:188m22=831b;84?::m;b?6=3thh:7>55;294~"fm32?7E?68:J2=4=#?10<7)79:0`5?l152900e:=50;9j31<722c<97>5;n:e>5<<uki>6=4::183!gb21>0D<77;I3:5>"003<0(4851c58m24=831b;>4?::k40?6=3`=>6=44o9d94?=zjj>1<7;50;2x dc=0=1C=464H0;2?!1?2<1/5;4>b69j37<722c<?7>5;h57>5<<a>?1<75`8g83>>{ek:0;684?:1y'e`<?<2B:555G1838 2>=<2c<>7>5;h50>5<<a>>1<75f7483>>i?n3:17plmc;291?6=8r.ji76;;I3:<>N6181/;54<;h51>5<<a>91<75f7583>>o0=3:17b6i:188ygb5290>6=4?{%cf>=2<@8337E?61:&4<?7e3`=96=44i6194?=n?=0;66g85;29?j>a2900qoj>:186>5<7s-kn65:4H0;;?M7>92.<47?7;h51>5<<a>91<75f7583>>o0=3:17b6i:188ygb7290>6=4?{%cf>=2<@8337E?61:&4<?733`=96=44i6194?=n?=0;66g85;29?j>a2900qomi:186>5<7s-kn65:4H0;;?M7>92.<47?>;h51>5<<a>91<75f7583>>o0=3:17b6i:188ygeb290>6=4?{%cf>=2<@8337E?61:&4<?`<a>81<75f7283>>o0<3:17d9::188k=`=831vnnj50;794?6|,ho1495G18:8L4?63-=36h5f7383>>o0;3:17d9;:188m23=831d4k4?::a`g<72<0;6=u+ad8;0>N6111C=4?4$6:9`>o0:3:17d9<:188m22=831b;84?::m;b?6=3thom7>55;294~"fm32?7E?68:J2=4=#?10i7d9=:188m25=831b;94?::k41?6=3f2m6=44}cf:>5<2290;w)oj:968L4??3A;2=6*88;c8m24=831b;>4?::k40?6=3`=>6=44o9d94?=zjm21<7;50;2x dc=0=1C=464H0;2?!1?201b;?4?::k47?6=3`=?6=44i6794?=h0o0;66smd683>0<729q/mh474:J2===O90;0(:658:k46?6=3`=86=44i6694?=n?<0;66a7f;29?xdc>3:197>50z&ba?>33A;246F>909'3=<03`=96=44i6194?=n?=0;66g85;29?j>a2900qoj::186>5<7s-kn65:4H0;;?M7>92.<4784i6094?=n?:0;66g84;29?l122900c5h50;9~fa2=83?1<7>t$`g9<1=O9020D<7>;%5;>0=n?;0;66g83;29?l132900e:;50;9l<c<722wih>4?:483>5}#il0386F>999K5<7<,>2186g82;29?l142900e::50;9j30<722e3j7>5;|``g?6==3:1<v*ne;:7?M7>02B:5<5+7980?l152900e:=50;9j31<722c<97>5;n:e>5<<uko?6=4::183!gb21>0D<77;I3:5>"003;i7)79:0`;?l152900e:=50;9j31<722c<97>5;n:e>5<<uko>6=4::183!gb21>0D<77;I3:5>"003;i7)79:0`;?l152900e:=50;9j31<722c<97>5;n:e>5<<ukl96=4::183!gb21>0D<77;I3:5>"003;i7)79:0c5?l152900e:=50;9j31<722c<97>5;n:e>5<<ukl86=4::183!gb21>0D<77;I3:5>"003;i7)79:0c5?l152900e:=50;9j31<722c<97>5;n:e>5<<ukl?6=4::183!gb21>0D<77;I3:5>"003;i7)79:0c4?l152900e:=50;9j31<722c<97>5;n:e>5<<ukl>6=4::183!gb21>0D<77;I3:5>"003;i7)79:0c4?l152900e:=50;9j31<722c<97>5;n:e>5<<ukl=6=4::183!gb21>0D<77;I3:5>"003;i7)79:0c;?l152900e:=50;9j31<722c<97>5;n:e>5<<ukl<6=4::183!gb21>0D<77;I3:5>"003;i7)79:0c;?l152900e:=50;9j31<722c<97>5;n:e>5<<ukl36=4::183!gb21>0D<77;I3:5>"003;i7)79:0c:?l152900e:=50;9j31<722c<97>5;n:e>5<<ukl26=4::183!gb21>0D<77;I3:5>"003;i7)79:0c:?l152900e:=50;9j31<722c<97>5;n:e>5<<uklj6=4::183!gb21>0D<77;I3:5>"003;i7)79:0cb?l152900e:=50;9j31<722c<97>5;n:e>5<<ukli6=4::183!gb21>0D<77;I3:5>"003;i7)79:0cb?l152900e:=50;9j31<722c<97>5;n:e>5<<uklh6=4::183!gb21>0D<77;I3:5>"003;i7)79:0ca?l152900e:=50;9j31<722c<97>5;n:e>5<<uklo6=4::183!gb21>0D<77;I3:5>"003;i7)79:0ca?l152900e:=50;9j31<722c<97>5;n:e>5<<ukln6=4::183!gb21>0D<77;I3:5>"003;i7)79:0cg?l152900e:=50;9j31<722c<97>5;n:e>5<<uklm6=4::183!gb21>0D<77;I3:5>"003;i7)79:0cg?l152900e:=50;9j31<722c<97>5;n:e>5<<uk;;<7>55;294~"fm32?7E?68:J2=4=#?10:n6*66;3ba>o0:3:17d9<:188m22=831b;84?::m;b?6=3th:<<4?:483>5}#il0386F>999K5<7<,>21=o5+9782e`=n?;0;66g83;29?l132900e:;50;9l<c<722wi==<50;794?6|,ho1495G18:8L4?63-=36<l4$8495d`<a>81<75f7283>>o0<3:17d9::188k=`=831vn<><:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4ga3`=96=44i6194?=n?=0;66g85;29?j>a2900qok9:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4d>3`=96=44i6194?=n?=0;66g85;29?j>a2900qok8:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4d>3`=96=44i6194?=n?=0;66g85;29?j>a2900qok7:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4df3`=96=44i6194?=n?=0;66g85;29?j>a2900qok6:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4df3`=96=44i6194?=n?=0;66g85;29?j>a2900qokn:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4g53`=96=44i6194?=n?=0;66g85;29?j>a2900qokm:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4g53`=96=44i6194?=n?=0;66g85;29?j>a2900qokl:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4g43`=96=44i6194?=n?=0;66g85;29?j>a2900qokk:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4g43`=96=44i6194?=n?=0;66g85;29?j>a2900qokj:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4g33`=96=44i6194?=n?=0;66g85;29?j>a2900qoki:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4g33`=96=44i6194?=n?=0;66g85;29?j>a2900qoh?:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4g23`=96=44i6194?=n?=0;66g85;29?j>a2900qoh>:186>5<7s-kn65:4H0;;?M7>92.<47?m;%;5>4g23`=96=44i6194?=n?=0;66g85;29?j>a2900qo??5;297?6=8r.ji76<;I3:<>N6181/;54>3:&:2?7e82c<>7>5;h50>5<<g1l1<75rb027>5<4290;w)oj:918L4??3A;2=6*88;33?!?128h;7d9=:188m25=831d4k4?::a550=8391<7>t$`g9<6=O9020D<7>;%5;>4g<,0<1=o?4i6094?=n?:0;66a7f;29?xd6;m0;694?:1y'e`<?02B:555G1838m24=831b;>4?::k:g?6=3f2m6=44}c30f?6=<3:1<v*ne;:4?M7>02B:5<5f7383>>o0;3:17d7l:188k=`=831vn<=n:187>5<7s-kn6594H0;;?M7>92c<>7>5;h50>5<<a0i1<75`8g83>>{e99k1<7;50;2x dc=0=1C=464H0;2?!1?2j1b;?4?::k47?6=3`=?6=44i6794?=h0o0;66sm11`94?3=83:p(lk5859K5<><@83:7)97:728m24=831b;>4?::k40?6=3`=>6=44o9d94?=zj8:h6=4::183!gb21>0D<77;I3:5>"003;>7d9=:188m25=831b;94?::k41?6=3f2m6=44}c33`?6==3:1<v*ne;:7?M7>02B:5<5+79826>o0:3:17d9<:188m22=831b;84?::m;b?6=3th:=<4?:383>5}#il0<56F>999K5<7<a>;1<75`8g83>>{e99o1<7=50;2x dc=0:1C=464H0;2?!1?28:0e:<50;9j36<722e3j7>5;|`255<72<0;6=u+ad8;0>N6111C=4?4$6:95g=n?;0;66g83;29?l132900e:;50;9l<c<722wi==h50;194?6|,ho14>5G18:8L4?63-=36<o4$8495g7<a>81<75f7283>>i?n3:17pl>3b83>1<729q/mh497:J2===O90;0(:652:k14?6=3`896=44i4d94?=h110;66sm13294?5=83:p(lk51858L4??3A;2=6g=4;29?l1c2900c5h50;9~f47c290?6=4?{%cf>=0<@8337E?61:k10?6=3`<:6=44i8a94?=h?l0;66sm13694?5=83:p(lk51858L4??3A;2=6g=4;29?l1c2900c5h50;9~f446290?6=4?{%cf>=0<@8337E?61:k10?6=3`<:6=44i8a94?=h?l0;66sm13:94?5=83:p(lk51858L4??3A;2=6g=4;29?l1c2900c5h50;9~f442290?6=4?{%cf>=0<@8337E?61:k10?6=3`<:6=44i8a94?=h?l0;66sm13a94?5=83:p(lk51858L4??3A;2=6g=4;29?l1c2900c5h50;9~f44>290?6=4?{%cf>=0<@8337E?61:k10?6=3`<:6=44i8a94?=h?l0;66sm12294?5=83:p(lk51858L4??3A;2=6g=4;29?l1c2900c5h50;9~f44c290?6=4?{%cf>=0<@8337E?61:k10?6=3`<:6=44i8a94?=h?l0;66sm12194?5=83:p(lk51858L4??3A;2=6g=4;29?l1c2900c5h50;9~f47a29096=4?{%cf>=4<@8337E?61:&4<?743`=96=44o9d94?=zj8886=4=:183!gb2180D<77;I3:5>"003;87d9=:188k=`=831vn<<8:181>5<7s-kn65<4H0;;?M7>92.<47?<;h51>5<<g1l1<75rb00a>5<5290;w)oj:908L4??3A;2=6*88;30?l152900c5h50;9~f44a29096=4?{%cf>=4<@8337E?61:&4<?743`=96=44o9d94?=zj8996=4=:183!gb2180D<77;I3:5>"003;87d9=:188k=`=831vn<?j:186>5<7s-kn6;74H0;;?M7>92.<47<4i3294?=n:;0;66g:f;29?l?>2900c4650;9~f445290>6=4?{%cf>3?<@8337E?61:&4<?4<a;:1<75f2383>>o2n3:17d76:188k<>=831vn<<9:186>5<7s-kn6;74H0;;?M7>92.<47<4i3294?=n:;0;66g:f;29?l?>2900c4650;9~f44f290>6=4?{%cf>3?<@8337E?61:&4<?4<a;:1<75f2383>>o2n3:17d76:188k<>=831vn<<j:186>5<7s-kn6;74H0;;?M7>92.<47<4i3294?=n:;0;66g:f;29?l?>2900c4650;9~f456290>6=4?{%cf>3?<@8337E?61:&4<?4<a;:1<75f2383>>o2n3:17d76:188k<>=831vn<;7:186>5<7s-kn65:4H0;;?M7>92.<47j4i6094?=n?:0;66g84;29?l122900c5h50;9~f43129086=4?{%cf>=5<@8337E?61:&4<?7f3-3=6<l=;h51>5<<a>91<75`8g83>>{e9<k1<7<50;2x dc=?01C=464H0;2?l162900c5h50;9~f430290>6=4?{%cf>=2<@8337E?61:&4<?c<a>81<75f7283>>o0<3:17d9::188k=`=831vn<;6:186>5<7s-kn6;74H0;;?M7>92.<47<4i3294?=n:;0;66g:f;29?l?>2900c4650;9~f42a290?6=4?{%cf>3><@8337E?61:&4<?4<a;:1<75f5g83>>o>13:17b77:188yg7283:187>50z&ba?0?3A;246F>909'3=<53`8;6=44i4d94?=n100;66a68;29?xd6=80;694?:1y'e`<102B:555G1838 2>=:2c9<7>5;h7e>5<<a031<75`9983>>{e9<81<7:50;2x dc=>11C=464H0;2?!1?2;1b>=4?::k6b?6=3`326=44o8:94?=zj8?86=4;:183!gb2?20D<77;I3:5>"00380e?>50;9j1c<722c257>5;n;;>5<<uk;>87>54;294~"fm3<37E?68:J2=4=#?1097d<?:188m0`=831b544?::m:<?6=3th:984?:583>5}#il0=46F>999K5<7<,>21>6g=0;29?l3a2900e4750;9l==<722wi=;950;594?6|,ho1485G18:8L4?63-=36<m4i6094?=n?:0;66g84;29?l122900e:850;9j32<722e3j7>5;|`2g5<7290;6=u+ad8b2>Nf<2Fj:7:t$`a92f=#im0=h6*nb;4a?!g>2?k0qp}:6;296~X2>27:::486:p10<72;qU9852f18;b>{t=:0;6?uQ529>a`<?n2wx9?4?:3y]17=:mj03j6s|5083>7}Y=816il47f:p15<72;qU9=52e98;b>{t<o0;6?uQ4g9>a3<?n2wx8i4?:3y]0a=:99814k5rs5a94?4|V=i01<>?:9d8yv2e2909wS:m;<df>=`<uz>j6=4={_6b?8`d21l0q~:6:181[2>34lj65h4}r6;>5<5sW>370h7:9d8yv202909wS:8;<d5>=`<uz>=6=4={_65?8`321l0q~:::181[2234l965h4}r67>5<5sW>?70k;:9d8yv252909wS:=;<d2>=`<uz>:6=4={_62?8ca21l0q~:?:181[2734oo65h4}r1e>5<5sW9m70km:9d8yv5b2909wS=j;<g:>=`<uz9o6=4={_1g?8c021l0q~=l:181[5d34;;?76i;|q0f?6=:rT8n63>008;b>{t;h0;6?uQ3`9>bc<?n2wx?44?:3y]7<=:nm03j6s|5b83>7}Y=j16jo47f:p1g<72;qU9o52f88;b>{t=h0;6?uQ5`9>b2<?n2wx944?:3y]1<=:n<03j6s|5983>7}Y=116j>47f:p12<72;qU9:52e48;b>{t<:0;68uQ429>530=1116n:4:f:?210<2n27:9:485:p5=0=83;owS=7;<`3>32<58<=6?>4=04;>76<5k=1>=52b7814>;e=38;70l;:3289g5=:916n?4=0:?af?4734hj6?>4=c;965=:j109<63>3b814>;6;809<63>2d814>;6:h09<63>27814>;6:;09<63>1d814>;6=<09<63>55814>;6=:09<63>53814>;6=809<63>51814>;6<o09<63>58814>{t0k0;6iu218c9=4=:9?<1>?5217:967=:9:i1>?52123967=:9;o1>?5213c967=:9;<1>?52130967=:98o1>?5210f961=:9;:1>95214;91c=z{=o1<79t=0;:>3`<V=o01<<k:738944>2?;01<<::73894462?;01<?k:738yv7?n3:1>v3>68814>;fn3;2<6s|19g94?2|5mn1;>52114936=:99l1;>52ag8:a>{tj80;6?u2b1857>;fn3<97p}>8483>7}:9?319k5217c9<c=z{8236=4={<35=?5134;=n76i;|q2<<<72:q6==85739>55`=?;16=875999~w4>e2909w0?98;;;?8ga2h90q~?7c;296~;6;j02463>66843>{t9?o1<7:t=ca9<c=:m<0<?63j4;50?87683=87p}>7483>6}:k:03j63i3;50?8`52>90q~?86;297~;d<32m70h::6189c2=?:1v<98:1808e221l01k95729>b3<0;2wx=:650;1x9f0=0o16j4483:?e<?143ty:;44?:2y>g2<?n27mn79<;<db>25<uz;<m7>53z?`<?>a34lo6:=4=ga936=z{8=i6=4<{<a:>=`<5ol1;>52fd847>{t9>i1<7=t=bc9<c=:99;1;>52112936=z{8=o6=4<{<aa>=`<58:86:=4=021>25<uz;=j7>53z?a`?>a34o<6:=4=d4936=z{8=;6=4<{<`f>=`<5l31;>52e9847>{t9>;1<7=t=cd9<c=:mk0<?63ja;50?xu6?;0;6>u2c18;b>;bl3=870kl:618yv70;3:1?v3l1;:e?8ca2>901hk5729~w4132908w0m=:9d89c7=?:16j=483:p5=4=838:w0ml:9d89c7=?=16j=484:?fb?1334on6::4=df931=:mj0<863jb;57?8cf2>>01h75759>a=<0<27n;79;;<g5>22<58:86::4=021>22<58::6::4=023>22<5ol1;952fd840>;al3=?70hl:6689cd=?=16jl484:?e=?1334l36::4=g5931=:n?0<863i5;57?8`32>>01k=5759>b7<0<27n979;;<g7>22<uz;3?7>52z?g6?>a34;:<79;;|q23`<7289p1o:5999>f6<2n27ho79=;<f0>24<5m>1;?52d4846>;c>3=970j8:6089a>=?;16h4482:?ge?1534ni6:<4=bf937=:kl0<>63lf;51?8b72>801i?5739>`7<0:27:::485:p52`=83;8w0l::8:89g2==o16on483:?g7?1434n?6:=4=e7936=:l?0<?63k7;50?8b?2>901i75729>`d<0;27on79<;<ag>25<5jo1;>52cg847>;c83=870j>:6189a4=?:16=;95759~w4>7290:?v3m6;;;?8d22<l01nm5759>`6<0<27o879;;<f6>22<5m<1;952d6840>;c03=?70j6:6689ag=?=16ho484:?``?1334in6::4=bd931=:l90<863k1;57?8b52>>01<88:618yv7?93:1=>u2b68:<>;e>3?m70ml:6789a5=?<16h9485:?g1?1234n=6:;4=e5930=:l10<963k9;56?8bf2>?01il5749>ga<0=27hi79:;<ae>23<5m:1;852d0841>;c:3=>70?97;51?xu6>j0;69u2b98:<>;68=0<>63>04846>;68l0<>6s|17f94?3|5k315552b986b>;68=0<?63>04847>;68l0<?6s|19694?2|58<26464=04b>27<5mn1;?5214c934=z{82o6=4={<35<?3a34;=;76i;|q2<2<72:q6=;l5709>ec<>l27oo79>;|q2<d<72;q6=;855g9>ec<f:2wxhh4?:cy>f2<4>27i:7=9;<`6>60<5k>1?;52b2802>;e:39=70lm:2489gg=;?16n44<6:?a<?5134nh65h4}rg0>5<es4h<6?<4=c4967=:j<09>63m4;01?8d42;801o<5239>fg<5:27im7<=;<`:>74<5k21>?52de8;b>{tm80;6<<t=cc9===:j00>j63mc;51?8e42>801n:5739>g0<0:27h:79=;<a4>24<5j21;?52c8846>;di3=970mm:6089gb=?;16nh482:?ab?1534i;6:<4=b3937=:k;0<>6s|e383>44|5kh15552b`86b>;ek3=870m<:6189f2=?:16o8483:?`2?1434i<6:=4=b:936=:k00<?63la;50?8ee2>901oj5729>f`<0;27ij79<;<a3>25<5j;1;>52c3847>{tlo0;6<<t=c09===:jk0>j63mc;57?8e42>>01n:5759>g0<0<27h:79;;<a4>22<5j21;952c8840>;di3=?70mm:6689gb=?=16nh484:?ab?1334i;6::4=b3931=:k;0<86s|e183>44|5k915552b386b>;ek3=>70m<:6789f2=?<16o8485:?`2?1234i<6:;4=b:930=:k00<963la;56?8ee2>?01oj5749>f`<0=27ij79:;<a3>23<5j;1;852c3841>{t9921<7?>{<331?>a34l;6:;4=dg930=:mj0<963ja;56?8c?2>?01h85749>554=?<16==>5749>b`<0=27mo79:;<db>23<5o21;852f7841>;a<3=>70h=:6789`2=?<1v<>8:1825~;68=03j63i1;56?8ca2>?01hj5749>ag<0=27n579:;<g4>23<58:86:;4=022>23<5ol1;852fe841>;aj3=>70h6:6789c1=?<16j8485:?e7?1234o>6:;4}r33=?6=:8q6==858g9>b4<0:27m<79=;<ge>24<5lo1;?52ee846>;bk3=970km:6089`g=?;16i4482:?f<?1534o<6:<4=d4937=:9991;?52110937=:99;1;?52112937=:no0<>63ie;51?8`c2>801km5739>bg<0:27mm79=;<d:>24<5o21;?52f6846>;a>3=970h::6089c2=?;16j>482:?e6?1534o>6:<4=d6937=z{8>n6=4={<30g?3a34;8h76i;|q20a<72;q6=>l58g9>56b=?;1v<:l:181874i32m70?<d;50?xu6<90;6?u211c9<c=:9:h1;?5rs062>5<5s4;;n76i;<30f?143ty:8?4?:3y>55e=0o16=>o5739~w4242909w0??d;:e?874i3=87p}>4483>2}:98;14k521239=<=:9;o1545213c9=<=:9;<154521309=<=:98o1545rs01f>5<5s4;:<79:;<33a?>a3ty:894?:3y>546=0o16=<?5709~w45a2909w0??f;:e?87683=97p}>4c83>6}:9:n15n521239===:9:81;?5rs06b>5<3s4;8m77l;<30f??d34;9i777;<31b?153ty:844?:7y>55b=?<16==m5749>55d=?<16==o5749>57g=1116=?l5739~w42?290=w0??d;57?877k3=?70??b;57?877i3=?70?=6;;;?875?3=97p}>4683>3}:99n1;>5211a936=:99h1;>5211c936=:9;815552131937=z{8>=6=49{<33`?1534;;o79=;<33f?1534;;m79=;<32a???34;:j79=;|q252<72;q6=<k55g9>576=0o1v<?=:180875938?70?=4;07?876l3=n7p}>1983>7}:9;819k521369<c=z{8;86=4<{<311?4334;947<;;<315?1b3ty:=44?:3y>570==o16=?658g9~w4732908w0?=9;07?875k38?70?=5;5f?xu69h0;6?u213c91c=:9;i14k5rs036>5<4s4;9h7<;;<304?4334;9579j;|q25g<72;q6=?k55g9>566=0o1v<?9:181874;38?70?=d;5f?xu69j0;6?u212391c=:9:914k5rs017>5<4s4;:j76i;<32`??d34;9<79k;|q270<72:q6=?=58g9>577=1j16=?:57e9~w4512908w0?=7;:e?875=33h70?=8;5g?xu6;>0;6>u213`9<c=:9;315n5213a93a=z{8936=4<{<31b?>a34;9h77l;<304?1c3ty:?44?:3y>564=0o16=>=57e9~w43b2909w0?:6;51?872032m7p}>5b83>7}:9<31>?521449<c=z{8?i6=46{<361??>34;>8776;<367??>34;>>776;<365??>34;><776;<37b??>34;>5776;<36e?>a3ty:9k4?:3y>51`=1116=865739~w4072908w0?:0;;;?873n3?m70?:8;50?xu6>80;6>u21439===:9<:19k5214:931=z{8<96=4<{<366???34;>=7;i;<36<?123ty::>4?:2y>505=1116=8<55g9>501=?;1v<8;:180872<33370?:3;7e?872?3=87p}>5e83>7}:9<=14k52144936=z{8<>6=4<{<361???34;>87;i;<363?133twe?<950;3xL4?63td8=54?:0yK5<7<ug9:57>51zJ2=4=zf:;j6=4>{I3:5>{i;8h1<7?tH0;2?xh49j0;6<uG1838yk56l3:1=vF>909~j67b290:wE?61:m74`=83;pD<7>;|l065<728qC=4?4}o115?6=9rB:5<5rn201>5<6sA;2=6sa33194?7|@83:7p`<2583>4}O90;0qc==5;295~N6181vb><9:182M7>92we??950;3xL4?63td8>54?:0yK5<7<ug9957>51zJ2=4=zf:8j6=4>{I3:5>{i;;h1<7?tH0;2?xh4:j0;6<uG1838yk55l3:1=vF>909~j64b290:wE?61:m77`=83;pD<7>;|l075<728qC=4?4}o105?6=9rB:5<5rn211>5<6sA;2=6sa32194?7|@83:7p`<3583>4}O90;0qc=<5;295~N6181vb>=9:182M7>92we?>950;3xL4?63td8?54?:0yK5<7<ug9857>52zJ;a>N?l2B:5<5Ua9822e=utd8?l4?:0yK5<7<ug98n7>51zJ2=4=zf:9h6=4>{I:f?M>c3A;2=6Tn8;3x5<5=uS<n6<un8;~j65c290:wE6j;I:g?M7>92Pj97?t0;~j65b2909wE?61:m76`=83;pD<7>;|l005<728qC=4?4}o175?6=9rB:5<5rn261>5<6sA;2=6sa35194?7|@83:7p`<4583>4}O90;0qc=;5;295~N6181vb>:9:182M7>92we?9950;3xL4?63td8854?:0yK5<7<ug9?57>51zJ2=4=zf:>j6=4>{I3:5>{i;=h1<7?tH0;2?xh4<j0;6<uG1838yk53l3:1=vF>909~j62b290:wE?61:m71`=83;pD<7>;|l015<728qC=4?4}o165?6=9rB:5<5rn271>5<6sA;2=6sa34194?7|@83:7p`<5583>4}O90;0qc=:5;295~N6181vb>;9:182M7>92we?8950;3xL4?63td8954?:0yK5<7<ug9>57>51zJ2=4=zf:?j6=4>{I3:5>{i;<h1<7?tH0;2?xh4=j0;6<uG1838yk52l3:1=vF>909~j63b290:wE?61:m70`=83;pD<7>;|l025<728qC=4?4}o155?6=9rB:5<5rn241>5<6sA;2=6sa37194?7|@83:7p`<6583>4}O90;0qc=95;295~N6181vb>89:182M7>92we?;950;3xL4?63td8:54?:0yK5<7<ug9=57>51zJ2=4=zf:<j6=4>{I3:5>{i;?h1<7?tH0;2?xh4>j0;6<uG1838yk51l3:1=vF>909~j60b290:wE?61:m73`=83;pD<7>;|l035<728qC=4?4}o145?6=9rB:5<5rn251>5<6sA;2=6sa36194?7|@83:7p`<7583>4}O90;0qc=85;295~N6181vb>99:182M7>92we?:950;3xL4?63td8;54?:0yK5<7<ug9<57>51zJ2=4=zf:=j6=4>{I3:5>{i;>h1<7?tH0;2?xh4?j0;6<uG1838yk50l3:1=vF>909~j61b290:wE?61:m72`=83;pD<7>;|l0<5<728qC=4?4}o1;5?6=9rB:5<5rn2:1>5<6sA;2=6sa39194?7|@83:7p`<8583>4}O90;0qc=75;295~N6181vb>69:182M7>92we?5950;3xL4?63td8454?:0yK5<7<ug9357>51zJ2=4=zf:2j6=4>{I3:5>{i;1h1<7?tH0;2?xh40j0;6<uG1838yk5?l3:1=vF>909~j6>b290:wE?61:m7=`=83;pD<7>;|l0=5<728qC=4?4}o1:5?6=9rB:5<5rn2;1>5<6sA;2=6sa38194?7|@83:7p`<9583>4}O90;0qc=65;295~N6181vqpsO@By750<2k<:9<;or@A@x4xFGXrwKL
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
target = "xilinx"
action = "synthesis"
fetchto = "../../../ip_cores"
syn_device = "xc6slx45t"
syn_grade = "-3"
syn_package = "fgg484"
syn_top = "spec_top"
syn_project = "spec_top_wrc.xise"
modules = { "local" : [ "../../../top/spec_1_1/wr_core_demo", "../../../platform/xilinx/chipscope" ] }
action = "simulation"
fetchto = "../../../ip_cores"
vlog_opt = "+incdir+../../../sim"
files = [ "main.sv", "wb_gpio_port_notristates.vhd" ]
modules = { "local" : "../../.." };
`timescale 1ns/1ps
`include "if_wishbone.sv"
`include "endpoint_regs.v"
`include "endpoint_mdio.v"
`include "tbi_utils.sv"
`timescale 1ps/1ps
`define EP_QMODE_ACCESS 0
`define EP_QMODE_TRUNK 1
`define EP_QMODE_UNQ 3
// Clock periods (in picoseconds)
const int c_RBCLK_PERIOD = 8001;
const int c_REFCLK_PERIOD = 8000;
`define ADDR_RST_GEN 'h62000
module main;
wire clk_ref;
wire clk_sys;
wire rst_n;
IWishbone WB
(
.clk_i(clk_sys),
.rst_n_i(rst_n)
);
tbi_clock_rst_gen
#(
.g_rbclk_period(8002))
clkgen(
.clk_ref_o(clk_ref),
.clk_sys_o(clk_sys),
.phy_rbclk_o(phy_rbclk),
.rst_n_o(rst_n)
);
wire clk_sys_dly;
assign #10 clk_sys_dly = clk_sys;
wire [7:0]phy_tx_data ;
wire phy_tx_k ;
wire phy_tx_disparity ;
wire phy_tx_enc_err ;
wire [7:0]phy_rx_data ;
wire phy_rx_rbclk ;
wire phy_rx_k ;
wire phy_rx_enc_err ;
wire [3:0]phy_rx_bitslide ;
wire phy_rst ;
wire phy_loopen;
wr_core #(
.g_simulation (1),
.g_virtual_uart(1),
.g_ep_rxbuf_size_log2 (12),
.g_dpram_initf ("/home/slayer/wrpc-sw/hello.ram"),
.g_dpram_size (16384),
.g_num_gpio (8)
)
DUT (
.clk_sys_i (clk_sys),
.clk_dmtd_i (clk_ref),
.clk_ref_i (clk_ref),
.rst_n_i (rst_n),
.pps_p_o (),
.dac_hpll_load_p1_o (),
.dac_hpll_data_o (),
.dac_dpll_load_p1_o (),
.dac_dpll_data_o (),
.gpio_o (),
.uart_rxd_i (1'b0),
.uart_txd_o (),
.wb_addr_i (WB.adr[17:0]),
.wb_data_i (WB.dat_o),
.wb_data_o (WB.dat_i),
.wb_sel_i (4'b1111),
.wb_we_i (WB.we),
.wb_cyc_i (WB.cyc),
.wb_stb_i (WB.stb),
.wb_ack_o (WB.ack),
.phy_ref_clk_i(clk_ref),
.phy_tx_data_o(phy_tx_data),
.phy_tx_k_o(phy_tx_k),
.phy_tx_disparity_i(phy_tx_disparity),
.phy_tx_enc_err_i(phy_tx_enc_err),
.phy_rx_data_i(phy_rx_data),
.phy_rx_rbclk_i(phy_rx_rbclk),
.phy_rx_k_i(phy_rx_k),
.phy_rx_enc_err_i(phy_rx_enc_err),
.phy_rx_bitslide_i(phy_rx_bitslide),
.phy_rst_o(phy_rst),
.phy_loopen_o(phy_lo),
.genrest_n ()
);
wr_gtp_phy_spartan6
#(
.g_simulation(1),
.g_ch0_use_refclk_out (0),
.g_ch1_use_refclk_out (0)
) PHY
(
.ch0_ref_clk_i(clk_ref),
.ch0_ref_clk_o(),
.ch0_tx_data_i(8'h00),
.ch0_tx_k_i(1'b0),
.ch0_tx_disparity_o(),
.ch0_tx_enc_err_o(),
.ch0_rx_rbclk_o(),
.ch0_rx_data_o(),
.ch0_rx_k_o(),
.ch0_rx_enc_err_o(),
.ch0_rx_bitslide_o(),
.ch0_rst_i(1'b0),
.ch0_loopen_i(1'b0),
.ch1_ref_clk_i(clk_ref),
.ch1_ref_clk_o(),
.ch1_tx_data_i(phy_tx_data),
.ch1_tx_k_i(phy_tx_k),
.ch1_tx_disparity_o(phy_tx_disparity),
.ch1_tx_enc_err_o(phy_tx_enc_err),
.ch1_rx_data_o(phy_rx_data),
.ch1_rx_rbclk_o(phy_rx_rbclk),
.ch1_rx_k_o(phy_rx_k),
.ch1_rx_enc_err_o(phy_rx_enc_err),
.ch1_rx_bitslide_o(phy_rx_bitslide),
.ch1_rst_i(phy_rst),
.ch1_loopen_i(phy_lo),
.pad_txn0_o(),
.pad_txp0_o(),
.pad_rxn0_i(1'b0),
.pad_rxp0_i(1'b0),
.pad_txn1_o(sfp_txn_o),
.pad_txp1_o(sfp_txp_o),
.pad_rxn1_i(sfp_rxn_i),
.pad_rxp1_i(sfp_rxp_i));
assign sfp_rxp_i = sfp_txp_o;
assign sfp_rxn_i = sfp_txn_o;
initial begin
@(posedge rst_n);
repeat(3) @(posedge clk_sys);
WB.write32('h40000, 1);
WB.write32('h40010, 'hdead);
forever begin
reg[31:0] rval;
repeat(100) @(posedge clk_sys);
WB.read32('h40000, rval);
if(rval[3]) begin
WB.read32('h40004, rval);
$display("Got TAG: %d", rval);
end
end
end
endmodule // main
files = ["spec_top.vhd", "spec_top.ucf", "spec_serial_dac.vhd", "spec_serial_dac_arb.vhd", "wb_gpio_port_notristates.vhd"]
fetchto = "../../../ip_cores"
modules = {
"local" : ["../../../"],
"svn" : [ "http://svn.ohwr.org/gn4124-core/branches/hdlmake-compliant/rtl" ]
}
-------------------------------------------------------------------------------
-- Title : Serial DAC interface
-- Project : White Rabbit Switch
-------------------------------------------------------------------------------
-- File : serial_dac.vhd
-- Author : paas, slayer
-- Company : CERN BE-Co-HT
-- Created : 2010-02-25
-- Last update: 2011-05-10
-- Platform : fpga-generic
-- Standard : VHDL'87
-------------------------------------------------------------------------------
-- Description: The dac unit provides an interface to a 16 bit serial Digita to Analogue converter (max5441, SPI?/QSPI?/MICROWIRE? compatible)
--
-------------------------------------------------------------------------------
-- Copyright (c) 2010 CERN
-------------------------------------------------------------------------------
-- Revisions :1
-- Date Version Author Description
-- 2009-01-24 1.0 paas Created
-- 2010-02-25 1.1 slayer Modified for rev 1.1 switch
-------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity spec_serial_dac is
generic (
g_num_data_bits : integer := 16;
g_num_extra_bits : integer := 8;
g_num_cs_select : integer := 2
);
port (
-- clock & reset
clk_i : in std_logic;
rst_n_i : in std_logic;
-- channel 1 value and value load strobe
value_i : in std_logic_vector(g_num_data_bits-1 downto 0);
cs_sel_i : in std_logic_vector(g_num_cs_select-1 downto 0);
load_i : in std_logic;
-- SCLK divider: 000 = clk_i/8 ... 111 = clk_i/1024
sclk_divsel_i : in std_logic_vector(2 downto 0);
-- DAC I/F
dac_cs_n_o : out std_logic_vector(g_num_cs_select-1 downto 0);
dac_sclk_o : out std_logic;
dac_sdata_o : out std_logic;
xdone_o : out std_logic
);
end spec_serial_dac;
architecture syn of spec_serial_dac is
signal divider : unsigned(11 downto 0);
signal dataSh : std_logic_vector(g_num_data_bits + g_num_extra_bits-1 downto 0);
signal bitCounter : std_logic_vector(g_num_data_bits + g_num_extra_bits+1 downto 0);
signal endSendingData : std_logic;
signal sendingData : std_logic;
signal iDacClk : std_logic;
signal iValidValue : std_logic;
signal divider_muxed : std_logic;
signal cs_sel_reg : std_logic_vector(g_num_cs_select-1 downto 0);
begin
select_divider : process (divider, sclk_divsel_i)
begin -- process
case sclk_divsel_i is
when "000" => divider_muxed <= divider(1); -- sclk = clk_i/8
when "001" => divider_muxed <= divider(2); -- sclk = clk_i/16
when "010" => divider_muxed <= divider(3); -- sclk = clk_i/32
when "011" => divider_muxed <= divider(4); -- sclk = clk_i/64
when "100" => divider_muxed <= divider(5); -- sclk = clk_i/128
when "101" => divider_muxed <= divider(6); -- sclk = clk_i/256
when "110" => divider_muxed <= divider(7); -- sclk = clk_i/512
when "111" => divider_muxed <= divider(8); -- sclk = clk_i/1024
when others => null;
end case;
end process;
iValidValue <= load_i;
process(clk_i, rst_n_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
sendingData <= '0';
else
if iValidValue = '1' and sendingData = '0' then
sendingData <= '1';
elsif endSendingData = '1' then
sendingData <= '0';
end if;
end if;
end if;
end process;
process(clk_i)
begin
if rising_edge(clk_i) then
if iValidValue = '1' then
divider <= (others => '0');
elsif sendingData = '1' then
if(divider_muxed = '1') then
divider <= (others => '0');
else
divider <= divider + 1;
end if;
elsif endSendingData = '1' then
divider <= (others => '0');
end if;
end if;
end process;
process(clk_i, rst_n_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
iDacClk <= '1'; -- 0
else
if iValidValue = '1' then
iDacClk <= '1'; -- 0
elsif divider_muxed = '1' then
iDacClk <= not(iDacClk);
elsif endSendingData = '1' then
iDacClk <= '1'; -- 0
end if;
end if;
end if;
end process;
process(clk_i, rst_n_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
dataSh <= (others => '0');
else
if iValidValue = '1' and sendingData = '0' then
cs_sel_reg <= cs_sel_i;
dataSh(g_num_data_bits-1 downto 0) <= value_i;
dataSh(dataSh'left downto g_num_data_bits) <= (others => '0');
elsif sendingData = '1' and divider_muxed = '1' and iDacClk = '0' then
dataSh(0) <= dataSh(dataSh'left);
dataSh(dataSh'left downto 1) <= dataSh(dataSh'left - 1 downto 0);
end if;
end if;
end if;
end process;
process(clk_i)
begin
if rising_edge(clk_i) then
if iValidValue = '1' and sendingData = '0' then
bitCounter(0) <= '1';
bitCounter(bitCounter'left downto 1) <= (others => '0');
elsif sendingData = '1' and to_integer(divider) = 0 and iDacClk = '1' then
bitCounter(0) <= '0';
bitCounter(bitCounter'left downto 1) <= bitCounter(bitCounter'left - 1 downto 0);
end if;
end if;
end process;
endSendingData <= bitCounter(bitCounter'left);
xdone_o <= not SendingData;
dac_sdata_o <= dataSh(dataSh'left);
gen_cs_out : for i in 0 to g_num_cs_select-1 generate
dac_cs_n_o(i) <= not(sendingData) or (not cs_sel_reg(i));
end generate gen_cs_out;
dac_sclk_o <= iDacClk;
end syn;
library ieee;
use ieee.std_logic_1164.all;
entity spec_serial_dac_arb is
generic(
g_invert_sclk : boolean;
g_num_extra_bits : integer
);
port(
clk_i : in std_logic;
rst_n_i : in std_logic;
val1_i : in std_logic_vector(15 downto 0);
load1_i : in std_logic;
val2_i : in std_logic_vector(15 downto 0);
load2_i : in std_logic;
dac_cs_n_o : out std_logic_vector(1 downto 0);
dac_clr_n_o : out std_logic;
dac_sclk_o : out std_logic;
dac_din_o : out std_logic);
end spec_serial_dac_arb;
architecture behavioral of spec_serial_dac_arb is
component spec_serial_dac
generic (
g_num_data_bits : integer;
g_num_extra_bits : integer;
g_num_cs_select : integer);
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
value_i : in std_logic_vector(g_num_data_bits-1 downto 0);
cs_sel_i : in std_logic_vector(g_num_cs_select-1 downto 0);
load_i : in std_logic;
sclk_divsel_i : in std_logic_vector(2 downto 0);
dac_cs_n_o : out std_logic_vector(g_num_cs_select-1 downto 0);
dac_sclk_o : out std_logic;
dac_sdata_o : out std_logic;
xdone_o : out std_logic);
end component;
signal d1, d2 : std_logic_vector(15 downto 0);
signal d1_ready, d2_ready : std_logic;
signal dac_data : std_logic_vector(15 downto 0);
signal dac_load : std_logic;
signal dac_cs_sel : std_logic_vector(1 downto 0);
signal dac_done : std_logic;
signal dac_sclk_int : std_logic;
type t_state is (WAIT_DONE, LOAD_DAC, WAIT_DATA);
signal state : t_state;
signal trig0 : std_logic_vector(31 downto 0);
signal trig1 : std_logic_vector(31 downto 0);
signal trig2 : std_logic_vector(31 downto 0);
signal trig3 : std_logic_vector(31 downto 0);
signal CONTROL0 : std_logic_vector(35 downto 0);
begin -- behavioral
dac_clr_n_o <= '1';
U_DAC : spec_serial_dac
generic map (
g_num_data_bits => 16,
g_num_extra_bits => g_num_extra_bits,
g_num_cs_select => 2)
port map (
clk_i => clk_i,
rst_n_i => rst_n_i,
value_i => dac_data,
cs_sel_i => dac_cs_sel,
load_i => dac_load,
sclk_divsel_i => "001",
dac_cs_n_o => dac_cs_n_o,
dac_sclk_o => dac_sclk_int,
dac_sdata_o => dac_din_o,
xdone_o => dac_done);
p_drive_sclk: process(dac_sclk_int)
begin
if(g_invert_sclk) then
dac_sclk_o <= not dac_sclk_int;
else
dac_sclk_o <= dac_sclk_int;
end if;
end process;
process(clk_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
d1 <= (others => '0');
d1_ready <= '0';
d2 <= (others => '0');
d2_ready <= '0';
dac_load <= '0';
dac_cs_sel <= (others => '0');
state <= WAIT_DATA;
else
if(load1_i = '1' or load2_i = '1') then
if(load1_i = '1') then
d1_ready <= '1';
d1 <= val1_i;
end if;
if(load2_i = '1') then
d2_ready <= '1';
d2 <= val2_i;
end if;
else
case state is
when WAIT_DATA =>
if(d1_ready = '1') then
dac_cs_sel <= "01";
dac_data <= d1;
dac_load <= '1';
d1_ready <= '0';
state <= LOAD_DAC;
elsif(d2_ready = '1') then
dac_cs_sel <= "10";
dac_data <= d2;
dac_load <= '1';
d2_ready <= '0';
state <= LOAD_DAC;
end if;
when LOAD_DAC=>
dac_load <= '0';
state <= WAIT_DONE;
when WAIT_DONE =>
if(dac_done = '1') then
state <= WAIT_DATA;
end if;
when others => null;
end case;
end if;
end if;
end if;
end process;
end behavioral;
#bank 0
NET "CLK_20M_VCXO_I" LOC = H12;
NET "CLK_20M_VCXO_I" IOSTANDARD = "LVCMOS25";
NET "clk_125m_pllref_n_i" LOC = F10;
NET "clk_125m_pllref_n_i" IOSTANDARD = "LVDS_25";
NET "clk_125m_pllref_p_i" LOC = G9;
NET "clk_125m_pllref_p_i" IOSTANDARD = "LVDS_25";
NET "dac_cs1_n_o" LOC = A3;
NET "dac_cs1_n_o" IOSTANDARD = "LVCMOS25";
NET "dac_cs2_n_o" LOC = B3;
NET "dac_cs2_n_o" IOSTANDARD = "LVCMOS25";
#NET "dac_clr_n_o" LOC = F7;
#NET "dac_clr_n_o" IOSTANDARD = "LVCMOS25";
NET "dac_din_o" LOC = C4;
NET "dac_din_o" IOSTANDARD = "LVCMOS25";
NET "dac_sclk_o" LOC = A4;
NET "dac_sclk_o" IOSTANDARD = "LVCMOS25";
#NET "SI57X_CLK_N" LOC = F15;
#NET "SI57X_CLK_N" IOSTANDARD = "LVDS_25";
#NET "SI57X_CLK_P" LOC = F14;
#NET "SI57X_CLK_P" IOSTANDARD = "LVDS_25";
#NET "TCK_TO_FMC" LOC = G8;
#NET "TCK_TO_FMC" IOSTANDARD = "LVCMOS25";
#NET "TDI_TO_FMC" LOC = H11;
#NET "TDI_TO_FMC" IOSTANDARD = "LVCMOS25";
#NET "THERMO_ID" LOC = D4;
#NET "THERMO_ID" IOSTANDARD = "LVCMOS25";
#NET "TMS_TO_FMC" LOC = H10;
#NET "TMS_TO_FMC" IOSTANDARD = "LVCMOS25";
#NET "PRSNT_M2C_L" LOC = A2;
#NET "PRSNT_M2C_L" IOSTANDARD = "LVCMOS25";
NET "SFP_MOD_DEF1_b" LOC = F17;
NET "SFP_MOD_DEF1_b" IOSTANDARD = "LVCMOS25";
NET "SFP_MOD_DEF0_b" LOC = G15;
NET "SFP_MOD_DEF0_b" IOSTANDARD = "LVCMOS25";
NET "SFP_MOD_DEF2_b" LOC = G16;
NET "SFP_MOD_DEF2_b" IOSTANDARD = "LVCMOS25";
NET "SFP_RATE_SELECT_b" LOC = H14;
NET "SFP_RATE_SELECT_b" IOSTANDARD = "LVCMOS25";
NET "SFP_TX_FAULT_i" LOC = A17;
NET "SFP_TX_FAULT_i" IOSTANDARD = "LVCMOS25";
NET "SFP_TX_DISABLE_o" LOC = C17;
NET "SFP_TX_DISABLE_o" IOSTANDARD = "LVCMOS25";
NET "SFP_LOS_i" LOC = D18;
NET "SFP_LOS_i" IOSTANDARD = "LVCMOS25";
#NET "sfp_rxp_i" IOSTANDARD = "LVDS_12";
NET "sfp_rxp_i" LOC= D15;
#NET "sfp_rxn_i" IOSTANDARD = "LVDS_12";
NET "sfp_rxn_i" LOC= C15;
#NET "sfp_txp_o" IOSTANDARD = "LVDS_12";
NET "sfp_txp_o" LOC= B16;
#NET "sfp_txn_o" IOSTANDARD = "LVDS_12";
NET "sfp_txn_o" LOC= A16;
#NET "TRST_TO_FMC" LOC = E6;
#NET "TRST_TO_FMC" IOSTANDARD = "LVCMOS25";
#NET "CLK0_M2C_P" LOC = E16;
#NET "CLK0_M2C_P" IOSTANDARD = "LVDS_25";
NET "FPGA_SCL_B" LOC = F7;
NET "FPGA_SCL_B" IOSTANDARD = "LVCMOS25";
NET "FPGA_SDA_B" LOC = F8;
NET "FPGA_SDA_B" IOSTANDARD = "LVCMOS25";
NET "BUTTON1_I" LOC = C22;
NET "BUTTON1_I" IOSTANDARD = "LVCMOS18";
NET "BUTTON2_I" LOC = D21;
NET "BUTTON2_I" IOSTANDARD = "LVCMOS18";
#NET "TDO_FROM_FMC" LOC = F9;
#NET "TDO_FROM_FMC" IOSTANDARD = "LVCMOS25";
#NET "CLK0_M2C_N" LOC = F16;
#NET "CLK0_M2C_N" IOSTANDARD = "LVDS_25";
NET "L_RST_N" LOC = N20;
NET "L_RST_N" IOSTANDARD = "LVCMOS18";
NET "L2P_CLKN" LOC = K22;
NET "L2P_CLKN" IOSTANDARD = "DIFF_SSTL18_I";
NET "L2P_CLKP" LOC = K21;
NET "L2P_CLKP" IOSTANDARD = "DIFF_SSTL18_I";
NET "L2P_DFRAME" LOC = U22;
NET "L2P_DFRAME" IOSTANDARD = "SSTL18_I";
NET "L2P_EDB" LOC = U20;
NET "L2P_EDB" IOSTANDARD = "SSTL18_I";
NET "L2P_RDY" LOC = U19;
NET "L2P_RDY" IOSTANDARD = "SSTL18_I";
NET "L2P_VALID" LOC = T18;
NET "L2P_VALID" IOSTANDARD = "SSTL18_I";
NET "L_WR_RDY[0]" LOC = R20;
NET "L_WR_RDY[0]" IOSTANDARD = "SSTL18_I";
NET "L_WR_RDY[1]" LOC = T22;
NET "L_WR_RDY[1]" IOSTANDARD = "SSTL18_I";
NET "L_CLKN" LOC = N19;
NET "L_CLKN" IOSTANDARD = "DIFF_SSTL18_I";
NET "L_CLKP" LOC = P20;
NET "L_CLKP" IOSTANDARD = "DIFF_SSTL18_I";
NET "P2L_CLKN" LOC = M19;
NET "P2L_CLKN" IOSTANDARD = "DIFF_SSTL18_I";
NET "P2L_CLKP" LOC = M20;
NET "P2L_CLKP" IOSTANDARD = "DIFF_SSTL18_I";
NET "P2L_DFRAME" LOC = J22;
NET "P2L_DFRAME" IOSTANDARD = "SSTL18_I";
NET "P2L_RDY" LOC = J16;
NET "P2L_RDY" IOSTANDARD = "SSTL18_I";
NET "P2L_VALID" LOC = L19;
NET "P2L_VALID" IOSTANDARD = "SSTL18_I";
NET "P_RD_D_RDY[0]" LOC = N16;
NET "P_RD_D_RDY[0]" IOSTANDARD = "SSTL18_I";
NET "P_RD_D_RDY[1]" LOC = P19;
NET "P_RD_D_RDY[1]" IOSTANDARD = "SSTL18_I";
NET "P_WR_RDY[0]" LOC = L15;
NET "P_WR_RDY[0]" IOSTANDARD = "SSTL18_I";
NET "P_WR_RDY[1]" LOC = K16;
NET "P_WR_RDY[1]" IOSTANDARD = "SSTL18_I";
NET "P_WR_REQ[0]" LOC = M22;
NET "P_WR_REQ[0]" IOSTANDARD = "SSTL18_I";
NET "P_WR_REQ[1]" LOC = M21;
NET "P_WR_REQ[1]" IOSTANDARD = "SSTL18_I";
NET "RX_ERROR" LOC = J17;
NET "RX_ERROR" IOSTANDARD = "SSTL18_I";
NET "TX_ERROR" LOC = M17;
NET "TX_ERROR" IOSTANDARD = "SSTL18_I";
NET "VC_RDY[0]" LOC = B21;
NET "VC_RDY[0]" IOSTANDARD = "SSTL18_I";
NET "VC_RDY[1]" LOC = B22;
NET "VC_RDY[1]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[0]" LOC = P16;
NET "L2P_DATA[0]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[1]" LOC = P21;
NET "L2P_DATA[1]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[2]" LOC = P18;
NET "L2P_DATA[2]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[3]" LOC = T20;
NET "L2P_DATA[3]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[4]" LOC = V21;
NET "L2P_DATA[4]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[5]" LOC = V19;
NET "L2P_DATA[5]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[6]" LOC = W22;
NET "L2P_DATA[6]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[7]" LOC = Y22;
NET "L2P_DATA[7]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[8]" LOC = P22;
NET "L2P_DATA[8]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[9]" LOC = R22;
NET "L2P_DATA[9]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[10]" LOC = T21;
NET "L2P_DATA[10]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[11]" LOC = T19;
NET "L2P_DATA[11]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[12]" LOC = V22;
NET "L2P_DATA[12]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[13]" LOC = V20;
NET "L2P_DATA[13]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[14]" LOC = W20;
NET "L2P_DATA[14]" IOSTANDARD = "SSTL18_I";
NET "L2P_DATA[15]" LOC = Y21;
NET "L2P_DATA[15]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[0]" LOC = K20;
NET "P2L_DATA[0]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[1]" LOC = H22;
NET "P2L_DATA[1]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[2]" LOC = H21;
NET "P2L_DATA[2]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[3]" LOC = L17;
NET "P2L_DATA[3]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[4]" LOC = K17;
NET "P2L_DATA[4]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[5]" LOC = G22;
NET "P2L_DATA[5]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[6]" LOC = G20;
NET "P2L_DATA[6]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[7]" LOC = K18;
NET "P2L_DATA[7]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[8]" LOC = K19;
NET "P2L_DATA[8]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[9]" LOC = H20;
NET "P2L_DATA[9]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[10]" LOC = J19;
NET "P2L_DATA[10]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[11]" LOC = E22;
NET "P2L_DATA[11]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[12]" LOC = E20;
NET "P2L_DATA[12]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[13]" LOC = F22;
NET "P2L_DATA[13]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[14]" LOC = F21;
NET "P2L_DATA[14]" IOSTANDARD = "SSTL18_I";
NET "P2L_DATA[15]" LOC = H19;
NET "P2L_DATA[15]" IOSTANDARD = "SSTL18_I";
#NET "CLK1_M2C_P" LOC = L20;
#NET "CLK1_M2C_P" IOSTANDARD = "LVDS_18";
#NET "CLK1_M2C_N" LOC = L22;
#NET "CLK1_M2C_N" IOSTANDARD = "LVDS_18";
NET "GPIO[1]" LOC = U16;
NET "GPIO[1]" IOSTANDARD = "LVCMOS25";
NET "GPIO[0]" LOC = AB19;
NET "GPIO[0]" IOSTANDARD = "LVCMOS25";
#NET "LA00_N" LOC = AB11;
#NET "LA00_N" IOSTANDARD = "LVCMOS25";
#NET "LA00_P" LOC = Y11;
#NET "LA00_P" IOSTANDARD = "LVCMOS25";
#NET "LA01_N" LOC = AB12;
#NET "LA01_N" IOSTANDARD = "LVCMOS25";
#NET "LA01_P" LOC = AA12;
#NET "LA01_P" IOSTANDARD = "LVCMOS25";
#NET "sda1_b" LOC = Y6;
#NET "sda1_b" IOSTANDARD = "LVCMOS25";
#NET "scl1_b" LOC = W6;
#NET "scl1_b" IOSTANDARD = "LVCMOS25";
#NET "LA02_N" LOC = Y6;
#NET "LA02_N" IOSTANDARD = "LVCMOS25";
#NET "LA02_P" LOC = W6;
#NET "LA02_P" IOSTANDARD = "LVCMOS25";
#NET "LA03_N" LOC = W8;
#NET "LA03_N" IOSTANDARD = "LVCMOS25";
#NET "LA03_P" LOC = V7;
##NET "LA03_P" IOSTANDARD = "LVCMOS25";
#NET "LA04_N" LOC = U8;
#NET "LA04_N" IOSTANDARD = "LVCMOS25";
#NET "LA04_P" LOC = T8;
#NET "LA04_P" IOSTANDARD = "LVCMOS25";
#NET "LA05_N" LOC = AB6;
#NET "LA05_N" IOSTANDARD = "LVCMOS25";
#NET "LA05_P" LOC = AA6;
#NET "LA05_P" IOSTANDARD = "LVCMOS25";
#NET "LA06_N" LOC = AB5;
#NET "LA06_N" IOSTANDARD = "LVCMOS25";
#NET "LA06_P" LOC = Y5;
#NET "LA06_P" IOSTANDARD = "LVCMOS25";
#NET "LA07_N" LOC = V9;
#NET "LA07_N" IOSTANDARD = "LVCMOS25";
#NET "LA07_P" LOC = U9;
#NET "LA07_P" IOSTANDARD = "LVCMOS25";
#NET "LA08_N" LOC = R8;
#NET "LA08_N" IOSTANDARD = "LVCMOS25";
#NET "LA08_P" LOC = R9;
#NET "LA08_P" IOSTANDARD = "LVCMOS25";
#NET "LA09_N" LOC = AB7;
#NET "LA09_N" IOSTANDARD = "LVCMOS25";
#NET "LA09_P" LOC = Y7;
#NET "LA09_P" IOSTANDARD = "LVCMOS25";
#NET "LA10_N" LOC = AB8;
#NET "LA10_N" IOSTANDARD = "LVCMOS25";
#NET "LA10_P" LOC = AA8;
#NET "LA10_P" IOSTANDARD = "LVCMOS25";
#NET "LA11_N" LOC = Y10;
#NET "LA11_N" IOSTANDARD = "LVCMOS25";
#NET "LA11_P" LOC = W10;
#NET "LA11_P" IOSTANDARD = "LVCMOS25";
#NET "LA12_N" LOC = U10;
#NET "LA12_N" IOSTANDARD = "LVCMOS25";
#NET "LA12_P" LOC = T10;
#NET "LA12_P" IOSTANDARD = "LVCMOS25";
#NET "LA13_N" LOC = AB9;
#NET "LA13_N" IOSTANDARD = "LVCMOS25";
#NET "LA13_P" LOC = Y9;
#NET "LA13_P" IOSTANDARD = "LVCMOS25";
#NET "LA14_N" LOC = AB4;
#NET "LA14_N" IOSTANDARD = "LVCMOS25";
#NET "LA14_P" LOC = AA4;
#NET "LA14_P" IOSTANDARD = "LVCMOS25";
#NET "LA15_N" LOC = W11;
#NET "LA15_N" IOSTANDARD = "LVCMOS25";
#NET "LA15_P" LOC = V11;
#NET "LA15_P" IOSTANDARD = "LVCMOS25";
#NET "LA16_N" LOC = AB15;
#NET "LA16_N" IOSTANDARD = "LVCMOS25";
#NET "LA16_P" LOC = Y15;
#NET "LA16_P" IOSTANDARD = "LVCMOS25";
#NET "LA17_N" LOC = AB13;
#NET "LA17_N" IOSTANDARD = "LVCMOS25";
#NET "LA17_P" LOC = Y13;
#NET "LA17_P" IOSTANDARD = "LVCMOS25";
#NET "LA18_N" LOC = U12;
#NET "LA18_N" IOSTANDARD = "LVCMOS25";
#NET "LA18_P" LOC = T12;
#NET "LA18_P" IOSTANDARD = "LVCMOS25";
#NET "LA19_N" LOC = Y12;
#NET "LA19_N" IOSTANDARD = "LVCMOS25";
#NET "LA19_P" LOC = W12;
#NET "LA19_P" IOSTANDARD = "LVCMOS25";
#NET "LA20_N" LOC = T11;
#NET "LA20_N" IOSTANDARD = "LVCMOS25";
#NET "LA20_P" LOC = R11;
#NET "LA20_P" IOSTANDARD = "LVCMOS25";
#NET "LA21_N" LOC = W13;
#NET "LA21_N" IOSTANDARD = "LVCMOS25";
#NET "LA21_P" LOC = V13;
#NET "LA21_P" IOSTANDARD = "LVCMOS25";
#NET "LA22_N" LOC = T14;
#NET "LA22_N" IOSTANDARD = "LVCMOS25";
#NET "LA22_P" LOC = R13;
#NET "LA22_P" IOSTANDARD = "LVCMOS25";
#NET "LA23_N" LOC = AB16;
#NET "LA23_N" IOSTANDARD = "LVCMOS25";
#NET "LA23_P" LOC = AA16;
#NET "LA23_P" IOSTANDARD = "LVCMOS25";
#NET "LA24_N" LOC = Y14;
#NET "LA24_N" IOSTANDARD = "LVCMOS25";
#NET "LA24_P" LOC = W14;
#NET "LA24_P" IOSTANDARD = "LVCMOS25";
#NET "LA25_N" LOC = U15;
#NET "LA25_N" IOSTANDARD = "LVCMOS25";
#NET "LA25_P" LOC = T15;
#NET "LA25_P" IOSTANDARD = "LVCMOS25";
#NET "LA26_N" LOC = AB17;
#NET "LA26_N" IOSTANDARD = "LVCMOS25";
#NET "LA26_P" LOC = Y17;
#NET "LA26_P" IOSTANDARD = "LVCMOS25";
#NET "LA27_N" LOC = AB18;
#NET "LA27_N" IOSTANDARD = "LVCMOS25";
#NET "LA27_P" LOC = AA18;
#NET "LA27_P" IOSTANDARD = "LVCMOS25";
#NET "LA28_N" LOC = W15;
#NET "LA28_N" IOSTANDARD = "LVCMOS25";
#NET "LA28_P" LOC = Y16;
#NET "LA28_P" IOSTANDARD = "LVCMOS25";
#NET "LA29_N" LOC = Y18;
#NET "LA29_N" IOSTANDARD = "LVCMOS25";
#NET "LA29_P" LOC = W17;
#NET "LA29_P" IOSTANDARD = "LVCMOS25";
#NET "LA30_N" LOC = W18;
#NET "LA30_N" IOSTANDARD = "LVCMOS25";
#NET "LA30_P" LOC = V17;
#NET "LA30_P" IOSTANDARD = "LVCMOS25";
#NET "LA31_N" LOC = C18;
#NET "LA31_N" IOSTANDARD = "LVCMOS25";
#NET "LA31_P" LOC = D17;
#NET "LA31_P" IOSTANDARD = "LVCMOS25";
#NET "LA32_N" LOC = A20;
#NET "LA32_N" IOSTANDARD = "LVCMOS25";
#NET "LA32_P" LOC = B20;
#NET "LA32_P" IOSTANDARD = "LVCMOS25";
#NET "LA33_N" LOC = A19;
#NET "LA33_N" IOSTANDARD = "LVCMOS25";
#NET "LA33_P" LOC = C19;
#NET "LA33_P" IOSTANDARD = "LVCMOS25";
#NET "SI57X_SCL" LOC = AA14;
#NET "SI57X_SCL" IOSTANDARD = "LVCMOS25";
#NET "SI57X_SDA" LOC = AB14;
#NET "SI57X_SDA" IOSTANDARD = "LVCMOS25";#NET "DDR3_CAS_N" LOC = M4;
#NET "DDR3_CAS_N" IOSTANDARD = "LVCMOS15";
#NET "DDR3_CK_N" LOC = K3;
#NET "DDR3_CK_N" IOSTANDARD = "LVCMOS15";
#NET "DDR3_CK_P" LOC = K4;
#NET "DDR3_CK_P" IOSTANDARD = "LVCMOS15";
#NET "DDR3_CKE" LOC = F2;
#NET "DDR3_CKE" IOSTANDARD = "LVCMOS15";
#NET "DDR3_LDM" LOC = N4;
#NET "DDR3_LDM" IOSTANDARD = "LVCMOS15";
#NET "DDR3_LDQS_N" LOC = N1;
#NET "DDR3_LDQS_N" IOSTANDARD = "LVCMOS15";
#NET "DDR3_LDQS_P" LOC = N3;
#NET "DDR3_LDQS_P" IOSTANDARD = "LVCMOS15";
#NET "DDR3_ODT" LOC = L6;
#NET "DDR3_ODT" IOSTANDARD = "LVCMOS15";
#NET "DDR3_RAS_N" LOC = M5;
#NET "DDR3_RAS_N" IOSTANDARD = "LVCMOS15";
#NET "DDR3_RESET_N" LOC = E3;
#NET "DDR3_RESET_N" IOSTANDARD = "LVCMOS15";
#NET "DDR3_UDM" LOC = P3;
#NET "DDR3_UDM" IOSTANDARD = "LVCMOS15";
#NET "DDR3_UDQS_N" LOC = V1;
#NET "DDR3_UDQS_N" IOSTANDARD = "LVCMOS15";
#NET "DDR3_UDQS_P" LOC = V2;
#NET "DDR3_UDQS_P" IOSTANDARD = "LVCMOS15";
#NET "DDR3_WE_N" LOC = H2;
#NET "DDR3_WE_N" IOSTANDARD = "LVCMOS15";
NET "LED_RED" LOC = D5;
NET "LED_RED" IOSTANDARD = "LVCMOS25";
NET "LED_GREEN" LOC = E5;
NET "LED_GREEN" IOSTANDARD = "LVCMOS25";
#NET "PCB_VER[0]" LOC = P5;
#NET "PCB_VER[0]" IOSTANDARD = "LVCMOS15";
#NET "PCB_VER[1]" LOC = P4;
#NET "PCB_VER[1]" IOSTANDARD = "LVCMOS15";
#NET "PCB_VER[2]" LOC = AA2;
#NET "PCB_VER[2]" IOSTANDARD = "LVCMOS15";
#NET "PCB_VER[3]" LOC = AA1;
#NET "PCB_VER[3]" IOSTANDARD = "LVCMOS15";
#NET "PCB_VER[4]" LOC = N6;
#NET "PCB_VER[4]" IOSTANDARD = "LVCMOS15";
#NET "PCB_VER[5]" LOC = N7;
#NET "PCB_VER[5]" IOSTANDARD = "LVCMOS15";
#NET "PCB_VER[6]" LOC = U4;
#NET "PCB_VER[6]" IOSTANDARD = "LVCMOS15";
#NET "PCB_VER[7]" LOC = T4;
#NET "PCB_VER[7]" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A0" LOC = K2;
#NET "DDR3_A0" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A1" LOC = K1;
#NET "DDR3_A1" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A2" LOC = K5;
#NET "DDR3_A2" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A3" LOC = M6;
#NET "DDR3_A3" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A4" LOC = H3;
#NET "DDR3_A4" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A5" LOC = M3;
#NET "DDR3_A5" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A6" LOC = L4;
#NET "DDR3_A6" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A7" LOC = K6;
#NET "DDR3_A7" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A8" LOC = G3;
#NET "DDR3_A8" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A9" LOC = G1;
#NET "DDR3_A9" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A10" LOC = J4;
#NET "DDR3_A10" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A11" LOC = E1;
#NET "DDR3_A11" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A12" LOC = F1;
#NET "DDR3_A12" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A13" LOC = J6;
#NET "DDR3_A13" IOSTANDARD = "LVCMOS15";
#NET "DDR3_A14" LOC = H5;
#NET "DDR3_A14" IOSTANDARD = "LVCMOS15";
#NET "DDR3_BA0" LOC = J3;
#NET "DDR3_BA0" IOSTANDARD = "LVCMOS15";
#NET "DDR3_BA1" LOC = J1;
#NET "DDR3_BA1" IOSTANDARD = "LVCMOS15";
#NET "DDR3_BA2" LOC = H1;
#NET "DDR3_BA2" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ0" LOC = R3;
#NET "DDR3_DQ0" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ1" LOC = R1;
#NET "DDR3_DQ1" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ2" LOC = P2;
#NET "DDR3_DQ2" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ3" LOC = P1;
#NET "DDR3_DQ3" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ4" LOC = L3;
#NET "DDR3_DQ4" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ5" LOC = L1;
#NET "DDR3_DQ5" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ6" LOC = M2;
#NET "DDR3_DQ6" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ7" LOC = M1;
#NET "DDR3_DQ7" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ8" LOC = T2;
#NET "DDR3_DQ8" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ9" LOC = T1;
#NET "DDR3_DQ9" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ10" LOC = U3;
#NET "DDR3_DQ10" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ11" LOC = U1;
#NET "DDR3_DQ11" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ12" LOC = W3;
#NET "DDR3_DQ12" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ13" LOC = W1;
#NET "DDR3_DQ13" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ14" LOC = Y2;
#NET "DDR3_DQ14" IOSTANDARD = "LVCMOS15";
#NET "DDR3_DQ15" LOC = Y1;
#NET "DDR3_DQ15" IOSTANDARD = "LVCMOS15";
NET "L_CLKp" TNM_NET = "l_clkp_grp";
NET "P2L_CLKp" TNM_NET = "p2l_clkp_grp";
NET "P2L_CLKn" TNM_NET = "p2l_clkn_grp";
TIMESPEC TS_cmp_gn4124_core_cmp_clk_in_P_clk = PERIOD "cmp_gn4124_core/cmp_clk_in/P_clk" 5 ns HIGH 50%;
########################################################
## Pin definitions for FmcDio5chttl + SPEC v1.1/2.0 ##
########################################################
# DIO outputs
NET "dio_p_o[4]" LOC= T8;
NET "dio_n_o[4]" LOC= U8;
NET "dio_p_o[4]" IOSTANDARD=LVDS_25;
NET "dio_n_o[4]" IOSTANDARD=LVDS_25;
NET "dio_p_o[3]" LOC= U9;
NET "dio_n_o[3]" LOC= V9;
NET "dio_p_o[3]" IOSTANDARD=LVDS_25;
NET "dio_n_o[3]" IOSTANDARD=LVDS_25;
NET "dio_p_o[2]" LOC= R9;
NET "dio_n_o[2]" LOC= R8;
NET "dio_p_o[2]" IOSTANDARD=LVDS_25;
NET "dio_n_o[2]" IOSTANDARD=LVDS_25;
NET "dio_p_o[1]" LOC= Y16;
NET "dio_n_o[1]" LOC= W15;
NET "dio_p_o[1]" IOSTANDARD=LVDS_25;
NET "dio_n_o[1]" IOSTANDARD=LVDS_25;
NET "dio_p_o[0]" LOC= W17;
NET "dio_n_o[0]" LOC= Y18;
NET "dio_p_o[0]" IOSTANDARD=LVDS_25;
NET "dio_n_o[0]" IOSTANDARD=LVDS_25;
NET "dio_sdn_n_o" LOC= V11;
NET "dio_sdn_n_o" IOSTANDARD=LVCMOS25;
NET "dio_sdn_ck_n_o" LOC= Y5;
NET "dio_sdn_ck_n_o" IOSTANDARD=LVCMOS25;
# DIO output enable/termination enable
NET "dio_oe_n_o[4]" LOC= AA6;
NET "dio_oe_n_o[3]" LOC= W10;
NET "dio_oe_n_o[2]" LOC= W11;
NET "dio_oe_n_o[1]" LOC= Y14;
NET "dio_oe_n_o[0]" LOC= V17;
NET "dio_oe_n_o[4]" IOSTANDARD=LVCMOS25;
NET "dio_oe_n_o[3]" IOSTANDARD=LVCMOS25;
NET "dio_oe_n_o[2]" IOSTANDARD=LVCMOS25;
NET "dio_oe_n_o[1]" IOSTANDARD=LVCMOS25;
NET "dio_oe_n_o[0]" IOSTANDARD=LVCMOS25;
NET "dio_term_en_o[4]" LOC=AB7;
NET "dio_term_en_o[3]" LOC=Y7;
NET "dio_term_en_o[2]" LOC=AB6;
NET "dio_term_en_o[1]" LOC=AB5;
NET "dio_term_en_o[0]" LOC=W18;
NET "dio_term_en_o[4]" IOSTANDARD=LVCMOS25;
NET "dio_term_en_o[3]" IOSTANDARD=LVCMOS25;
NET "dio_term_en_o[2]" IOSTANDARD=LVCMOS25;
NET "dio_term_en_o[1]" IOSTANDARD=LVCMOS25;
NET "dio_term_en_o[0]" IOSTANDARD=LVCMOS25;
NET "dio_onewire_b" LOC=AB16;
NET "dio_onewire_b" IOSTANDARD=LVCMOS25;
# DIO inputs
NET "dio_clk_p_i" LOC=L20;
NET "dio_clk_p_i" IOSTANDARD=LVDS_25;
NET "dio_clk_n_i" LOC=L22;
NET "dio_clk_n_i" IOSTANDARD=LVDS_25;
NET "dio_p_i[4]" LOC =Y11;
NET "dio_p_i[4]" IOSTANDARD=LVDS_25;
NET "dio_n_i[4]" LOC =AB11;
NET "dio_n_i[4]" IOSTANDARD=LVDS_25;
NET "dio_p_i[3]" LOC =V7;
NET "dio_p_i[3]" IOSTANDARD=LVDS_25;
NET "dio_n_i[3]" LOC =W8;
NET "dio_n_i[3]" IOSTANDARD=LVDS_25;
NET "dio_p_i[2]" LOC =W12;
NET "dio_p_i[2]" IOSTANDARD=LVDS_25;
NET "dio_n_i[2]" LOC =Y12;
NET "dio_n_i[2]" IOSTANDARD=LVDS_25;
NET "dio_p_i[1]" LOC =R11;
NET "dio_p_i[1]" IOSTANDARD=LVDS_25;
NET "dio_n_i[1]" LOC =T11;
NET "dio_n_i[1]" IOSTANDARD=LVDS_25;
NET "dio_p_i[0]" LOC =C19;
NET "dio_p_i[0]" IOSTANDARD=LVDS_25;
NET "dio_n_i[0]" LOC =A19;
NET "dio_n_i[0]" IOSTANDARD=LVDS_25;
NET "dio_led_top_o" LOC= AA12;
NET "dio_led_top_o" IOSTANDARD=LVCMOS25;
NET "dio_led_bot_o" LOC= AB12;
NET "dio_led_bot_o" IOSTANDARD=LVCMOS25;
NET "uart_rxd_i" LOC= A2;
NET "uart_rxd_i" IOSTANDARD=LVCMOS25;
NET "uart_txd_o" LOC= B2;
NET "uart_txd_o" IOSTANDARD=LVCMOS25;
# System clock
# DDR3
#---------------------------------------------------------------------------------------------
# False Path
#---------------------------------------------------------------------------------------------
# GN4124
NET "l_rst_n" TIG;
NET "cmp_gn4124_core/rst_*" TIG;
#Created by Constraints Editor (xc6slx45t-fgg484-3) - 2011/01/20
NET "cmp_gn4124_core/cmp_clk_in/P_clk" TNM_NET = cmp_gn4124_core/cmp_clk_in/P_clk;
#Created by Constraints Editor (xc6slx45t-fgg484-3) - 2011/02/04
NET "clk_20m_vcxo_i" TNM_NET = clk_20m_vcxo_i;
TIMESPEC TS_clk_20m_vcxo_i = PERIOD "clk_20m_vcxo_i" 50 ns HIGH 50%;
NET "clk_125m_pllref_p_i" TNM_NET = clk_125m_pllref_p_i;
TIMESPEC TS_clk_125m_pllref_p_i = PERIOD "clk_125m_pllref_p_i" 8 ns HIGH 50%;
NET "clk_125m_pllref_n_i" TNM_NET = clk_125m_pllref_n_i;
TIMESPEC TS_clk_125m_pllref_n_i = PERIOD "clk_125m_pllref_n_i" 8 ns HIGH 50%;
PIN "clk_125m_pllref_BUFG.O" CLOCK_DEDICATED_ROUTE = FALSE;
PIN "U_GTP/U_Rbclk_bufg_ch1.O" CLOCK_DEDICATED_ROUTE = FALSE;
#Created by Constraints Editor (xc6slx45t-fgg484-3) - 2011/06/09
NET "U_GTP/ch0_gtp_clkout_int<1>" TNM_NET = U_GTP/ch0_gtp_clkout_int<1>;
TIMESPEC TS_U_GTP_ch0_gtp_clkout_int_1_ = PERIOD "U_GTP/ch0_gtp_clkout_int<1>" 8 ns HIGH 50%;
NET "U_GTP/ch1_gtp_clkout_int<1>" TNM_NET = U_GTP/ch1_gtp_clkout_int<1>;
TIMESPEC TS_U_GTP_ch1_gtp_clkout_int_1_ = PERIOD "U_GTP/ch1_gtp_clkout_int<1>" 8 ns HIGH 50%;
PIN "cmp_clk_dmtd_buf.O" CLOCK_DEDICATED_ROUTE = FALSE;
\ No newline at end of file
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use work.gn4124_core_pkg.all;
use work.gencores_pkg.all;
use work.wrcore_pkg.all;
use work.wbconmax_pkg.all;
library UNISIM;
use UNISIM.vcomponents.all;
entity spec_top is
generic
(
TAR_ADDR_WDTH : integer := 13 -- not used for this project
);
port
(
-- Global ports
clk_20m_vcxo_i : in std_logic; -- 20MHz VCXO clock
clk_125m_pllref_p_i : in std_logic; -- 125 MHz PLL reference
clk_125m_pllref_n_i : in std_logic;
-- From GN4124 Local bus
L_CLKp : in std_logic; -- Local bus clock (frequency set in GN4124 config registers)
L_CLKn : in std_logic; -- Local bus clock (frequency set in GN4124 config registers)
L_RST_N : in std_logic; -- Reset from GN4124 (RSTOUT18_N)
-- General Purpose Interface
GPIO : inout std_logic_vector(1 downto 0); -- GPIO[0] -> GN4124 GPIO8
-- GPIO[1] -> GN4124 GPIO9
-- PCIe to Local [Inbound Data] - RX
P2L_RDY : out std_logic; -- Rx Buffer Full Flag
P2L_CLKn : in std_logic; -- Receiver Source Synchronous Clock-
P2L_CLKp : in std_logic; -- Receiver Source Synchronous Clock+
P2L_DATA : in std_logic_vector(15 downto 0); -- Parallel receive data
P2L_DFRAME : in std_logic; -- Receive Frame
P2L_VALID : in std_logic; -- Receive Data Valid
-- Inbound Buffer Request/Status
P_WR_REQ : in std_logic_vector(1 downto 0); -- PCIe Write Request
P_WR_RDY : out std_logic_vector(1 downto 0); -- PCIe Write Ready
RX_ERROR : out std_logic; -- Receive Error
-- Local to Parallel [Outbound Data] - TX
L2P_DATA : out std_logic_vector(15 downto 0); -- Parallel transmit data
L2P_DFRAME : out std_logic; -- Transmit Data Frame
L2P_VALID : out std_logic; -- Transmit Data Valid
L2P_CLKn : out std_logic; -- Transmitter Source Synchronous Clock-
L2P_CLKp : out std_logic; -- Transmitter Source Synchronous Clock+
L2P_EDB : out std_logic; -- Packet termination and discard
-- Outbound Buffer Status
L2P_RDY : in std_logic; -- Tx Buffer Full Flag
L_WR_RDY : in std_logic_vector(1 downto 0); -- Local-to-PCIe Write
P_RD_D_RDY : in std_logic_vector(1 downto 0); -- PCIe-to-Local Read Response Data Ready
TX_ERROR : in std_logic; -- Transmit Error
VC_RDY : in std_logic_vector(1 downto 0); -- Channel ready
-- Font panel LEDs
LED_RED : out std_logic;
LED_GREEN : out std_logic;
dac_sclk_o : out std_logic;
dac_din_o : out std_logic;
dac_clr_n_o : out std_logic;
dac_cs1_n_o : out std_logic;
dac_cs2_n_o : out std_logic;
fpga_scl_b : inout std_logic;
fpga_sda_b : inout std_logic;
button1_i : inout std_logic;
button2_i : inout std_logic;
-------------------------------------------------------------------------
-- SFP pins
-------------------------------------------------------------------------
sfp_txp_o : out std_logic;
sfp_txn_o : out std_logic;
sfp_rxp_i : in std_logic;
sfp_rxn_i : in std_logic;
sfp_mod_def0_b : inout std_logic; -- rate_select
sfp_mod_def1_b : inout std_logic; -- scl
sfp_mod_def2_b : inout std_logic; -- sda
sfp_rate_select_b : inout std_logic;
sfp_tx_fault_i : in std_logic;
sfp_tx_disable_o : out std_logic;
sfp_los_i : in std_logic;
-------------------------------------------------------------------------
-- Digital I/O FMC Pins
-------------------------------------------------------------------------
dio_clk_p_i : in std_logic;
dio_clk_n_i : in std_logic;
dio_n_i : in std_logic_vector(4 downto 0);
dio_p_i : in std_logic_vector(4 downto 0);
dio_n_o : out std_logic_vector(4 downto 0);
dio_p_o : out std_logic_vector(4 downto 0);
dio_oe_n_o : out std_logic_vector(4 downto 0);
dio_term_en_o : out std_logic_vector(4 downto 0);
dio_onewire_b : inout std_logic;
dio_sdn_n_o : out std_logic;
dio_sdn_ck_n_o : out std_logic;
dio_led_top_o : out std_logic;
dio_led_bot_o : out std_logic;
-----------------------------------------
--UART
-----------------------------------------
uart_rxd_i : in std_logic;
uart_txd_o : out std_logic
);
end spec_top;
architecture rtl of spec_top is
------------------------------------------------------------------------------
-- Components declaration
------------------------------------------------------------------------------
component gn4124_core
generic(
-- g_IS_SPARTAN6 : boolean := false; -- This generic is used to instanciate spartan6 specific primitives
g_BAR0_APERTURE : integer := 20; -- BAR0 aperture, defined in GN4124 PCI_BAR_CONFIG register (0x80C)
-- => number of bits to address periph on the board
g_CSR_WB_SLAVES_NB : integer := 1; -- Number of CSR wishbone slaves
g_DMA_WB_SLAVES_NB : integer := 1; -- Number of DMA wishbone slaves
g_DMA_WB_ADDR_WIDTH : integer := 26; -- DMA wishbone address bus width;
g_CSR_WB_MODE : string := "classic"
);
port
(
---------------------------------------------------------
-- Control and status
--
-- Asynchronous reset from GN4124
rst_n_a_i : in std_logic;
-- P2L clock PLL locked
p2l_pll_locked : out std_logic;
-- Debug ouputs
debug_o : out std_logic_vector(7 downto 0);
---------------------------------------------------------
-- P2L Direction
--
-- Source Sync DDR related signals
p2l_clk_p_i : in std_logic; -- Receiver Source Synchronous Clock+
p2l_clk_n_i : in std_logic; -- Receiver Source Synchronous Clock-
p2l_data_i : in std_logic_vector(15 downto 0); -- Parallel receive data
p2l_dframe_i : in std_logic; -- Receive Frame
p2l_valid_i : in std_logic; -- Receive Data Valid
-- P2L Control
p2l_rdy_o : out std_logic; -- Rx Buffer Full Flag
p_wr_req_i : in std_logic_vector(1 downto 0); -- PCIe Write Request
p_wr_rdy_o : out std_logic_vector(1 downto 0); -- PCIe Write Ready
rx_error_o : out std_logic; -- Receive Error
---------------------------------------------------------
-- L2P Direction
--
-- Source Sync DDR related signals
l2p_clk_p_o : out std_logic; -- Transmitter Source Synchronous Clock+
l2p_clk_n_o : out std_logic; -- Transmitter Source Synchronous Clock-
l2p_data_o : out std_logic_vector(15 downto 0); -- Parallel transmit data
l2p_dframe_o : out std_logic; -- Transmit Data Frame
l2p_valid_o : out std_logic; -- Transmit Data Valid
l2p_edb_o : out std_logic; -- Packet termination and discard
-- L2P Control
l2p_rdy_i : in std_logic; -- Tx Buffer Full Flag
l_wr_rdy_i : in std_logic_vector(1 downto 0); -- Local-to-PCIe Write
p_rd_d_rdy_i : in std_logic_vector(1 downto 0); -- PCIe-to-Local Read Response Data Ready
tx_error_i : in std_logic; -- Transmit Error
vc_rdy_i : in std_logic_vector(1 downto 0); -- Channel ready
---------------------------------------------------------
-- Interrupt interface
dma_irq_o : out std_logic_vector(1 downto 0); -- Interrupts sources to IRQ manager
irq_p_i : in std_logic; -- Interrupt request pulse from IRQ manager
irq_p_o : out std_logic; -- Interrupt request pulse to GN4124 GPIO
---------------------------------------------------------
-- Target interface (CSR wishbone master)
wb_clk_i : in std_logic;
wb_adr_o : out std_logic_vector(g_BAR0_APERTURE-priv_log2_ceil(g_CSR_WB_SLAVES_NB+1)-1 downto 0);
wb_dat_o : out std_logic_vector(31 downto 0); -- Data out
wb_sel_o : out std_logic_vector(3 downto 0); -- Byte select
wb_stb_o : out std_logic;
wb_we_o : out std_logic;
wb_cyc_o : out std_logic_vector(g_CSR_WB_SLAVES_NB-1 downto 0);
wb_dat_i : in std_logic_vector((32*g_CSR_WB_SLAVES_NB)-1 downto 0); -- Data in
wb_ack_i : in std_logic_vector(g_CSR_WB_SLAVES_NB-1 downto 0);
---------------------------------------------------------
-- DMA interface (Pipelined wishbone master)
dma_clk_i : in std_logic;
dma_adr_o : out std_logic_vector(31 downto 0);
dma_dat_o : out std_logic_vector(31 downto 0); -- Data out
dma_sel_o : out std_logic_vector(3 downto 0); -- Byte select
dma_stb_o : out std_logic;
dma_we_o : out std_logic;
dma_cyc_o : out std_logic; --_vector(g_DMA_WB_SLAVES_NB-1 downto 0);
dma_dat_i : in std_logic_vector((32*g_DMA_WB_SLAVES_NB)-1 downto 0); -- Data in
dma_ack_i : in std_logic; --_vector(g_DMA_WB_SLAVES_NB-1 downto 0);
dma_stall_i : in std_logic--_vector(g_DMA_WB_SLAVES_NB-1 downto 0) -- for pipelined Wishbone
);
end component; -- gn4124_core
component wr_core
generic (
g_simulation : integer;
g_virtual_uart : natural;
g_ep_rxbuf_size_log2 : integer;
g_dpram_initf : string;
g_dpram_size : integer;
g_num_gpio : integer);
port (
clk_sys_i : in std_logic;
clk_dmtd_i : in std_logic;
clk_ref_i : in std_logic;
rst_n_i : in std_logic;
pps_p_o : out std_logic;
dac_hpll_load_p1_o : out std_logic;
dac_hpll_data_o : out std_logic_vector(15 downto 0);
dac_dpll_load_p1_o : out std_logic;
dac_dpll_data_o : out std_logic_vector(15 downto 0);
phy_ref_clk_i : in std_logic;
phy_tx_data_o : out std_logic_vector(7 downto 0);
phy_tx_k_o : out std_logic;
phy_tx_disparity_i : in std_logic;
phy_tx_enc_err_i : in std_logic;
phy_rx_data_i : in std_logic_vector(7 downto 0);
phy_rx_rbclk_i : in std_logic;
phy_rx_k_i : in std_logic;
phy_rx_enc_err_i : in std_logic;
phy_rx_bitslide_i : in std_logic_vector(3 downto 0);
phy_rst_o : out std_logic;
phy_loopen_o : out std_logic;
gpio_o : out std_logic_vector(g_num_gpio-1 downto 0);
gpio_i : in std_logic_vector(g_num_gpio-1 downto 0);
gpio_dir_o : out std_logic_vector(g_num_gpio-1 downto 0);
uart_rxd_i : in std_logic;
uart_txd_o : out std_logic;
wb_addr_i : in std_logic_vector(c_aw-1 downto 0);
wb_data_i : in std_logic_vector(c_dw-1 downto 0);
wb_data_o : out std_logic_vector(c_dw-1 downto 0);
wb_sel_i : in std_logic_vector(c_sw-1 downto 0);
wb_we_i : in std_logic;
wb_cyc_i : in std_logic;
wb_stb_i : in std_logic;
wb_ack_o : out std_logic;
genrest_n : out std_logic;
dio_o : out std_logic_vector(3 downto 0));
end component;
component wr_gtp_phy_spartan6
generic (
g_simulation : integer;
g_ch0_use_refclk_out : boolean := false;
g_ch1_use_refclk_out : boolean := false);
port (
ch0_ref_clk_i : in std_logic;
ch0_ref_clk_o : out std_logic;
ch0_tx_data_i : in std_logic_vector(7 downto 0);
ch0_tx_k_i : in std_logic;
ch0_tx_disparity_o : out std_logic;
ch0_tx_enc_err_o : out std_logic;
ch0_rx_rbclk_o : out std_logic;
ch0_rx_data_o : out std_logic_vector(7 downto 0);
ch0_rx_k_o : out std_logic;
ch0_rx_enc_err_o : out std_logic;
ch0_rx_bitslide_o : out std_logic_vector(3 downto 0);
ch0_rst_i : in std_logic;
ch0_loopen_i : in std_logic;
ch1_ref_clk_i : in std_logic;
ch1_ref_clk_o : out std_logic;
ch1_tx_data_i : in std_logic_vector(7 downto 0) := "00000000";
ch1_tx_k_i : in std_logic := '0';
ch1_tx_disparity_o : out std_logic;
ch1_tx_enc_err_o : out std_logic;
ch1_rx_data_o : out std_logic_vector(7 downto 0);
ch1_rx_rbclk_o : out std_logic;
ch1_rx_k_o : out std_logic;
ch1_rx_enc_err_o : out std_logic;
ch1_rx_bitslide_o : out std_logic_vector(3 downto 0);
ch1_rst_i : in std_logic := '0';
ch1_loopen_i : in std_logic := '0';
pad_txn0_o : out std_logic;
pad_txp0_o : out std_logic;
pad_rxn0_i : in std_logic := '0';
pad_rxp0_i : in std_logic := '0';
pad_txn1_o : out std_logic;
pad_txp1_o : out std_logic;
pad_rxn1_i : in std_logic := '0';
pad_rxp1_i : in std_logic := '0');
end component;
component spec_serial_dac_arb
generic(
g_invert_sclk : boolean;
g_num_extra_bits : integer);
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
val1_i : in std_logic_vector(15 downto 0);
load1_i : in std_logic;
val2_i : in std_logic_vector(15 downto 0);
load2_i : in std_logic;
dac_cs_n_o : out std_logic_vector(1 downto 0);
dac_clr_n_o : out std_logic;
dac_sclk_o : out std_logic;
dac_din_o : out std_logic);
end component;
component chipscope_ila
port (
CONTROL : inout std_logic_vector(35 downto 0);
CLK : in std_logic;
TRIG0 : in std_logic_vector(31 downto 0);
TRIG1 : in std_logic_vector(31 downto 0);
TRIG2 : in std_logic_vector(31 downto 0);
TRIG3 : in std_logic_vector(31 downto 0));
end component;
signal CONTROL : std_logic_vector(35 downto 0);
signal CLK : std_logic;
signal TRIG0 : std_logic_vector(31 downto 0);
signal TRIG1 : std_logic_vector(31 downto 0);
signal TRIG2 : std_logic_vector(31 downto 0);
signal TRIG3 : std_logic_vector(31 downto 0);
component chipscope_icon
port (
CONTROL0 : inout std_logic_vector (35 downto 0));
end component;
------------------------------------------------------------------------------
-- Constants declaration
------------------------------------------------------------------------------
constant c_BAR0_APERTURE : integer := 20;
constant c_CSR_WB_SLAVES_NB : integer := 1;
constant c_DMA_WB_SLAVES_NB : integer := 1;
constant c_DMA_WB_ADDR_WIDTH : integer := 26;
------------------------------------------------------------------------------
-- Signals declaration
------------------------------------------------------------------------------
-- LCLK from GN4124 used as system clock
signal l_clk : std_logic;
-- P2L colck PLL status
signal p2l_pll_locked : std_logic;
-- Reset
signal rst_a : std_logic;
signal rst : std_logic;
-- CSR wishbone bus
signal wb_adr : std_logic_vector(c_BAR0_APERTURE-priv_log2_ceil(c_CSR_WB_SLAVES_NB+1)-1 downto 0);
signal wb_dat_i : std_logic_vector((32*c_CSR_WB_SLAVES_NB)-1 downto 0);
signal wb_dat_o : std_logic_vector(31 downto 0);
signal wb_sel : std_logic_vector(3 downto 0);
signal wb_cyc : std_logic_vector(c_CSR_WB_SLAVES_NB-1 downto 0);
signal wb_stb : std_logic;
signal wb_we : std_logic;
signal wb_ack : std_logic_vector(c_CSR_WB_SLAVES_NB-1 downto 0);
signal spi_wb_adr : std_logic_vector(4 downto 0);
-- DMA wishbone bus
signal dma_adr : std_logic_vector(31 downto 0);
signal dma_dat_i : std_logic_vector((32*c_DMA_WB_SLAVES_NB)-1 downto 0);
signal dma_dat_o : std_logic_vector(31 downto 0);
signal dma_sel : std_logic_vector(3 downto 0);
signal dma_cyc : std_logic; --_vector(c_DMA_WB_SLAVES_NB-1 downto 0);
signal dma_stb : std_logic;
signal dma_we : std_logic;
signal dma_ack : std_logic; --_vector(c_DMA_WB_SLAVES_NB-1 downto 0);
signal dma_stall : std_logic; --_vector(c_DMA_WB_SLAVES_NB-1 downto 0);
signal ram_we : std_logic_vector(0 downto 0);
signal ddr_dma_adr : std_logic_vector(29 downto 0);
signal irq_to_gn4124 : std_logic;
-- SPI
signal spi_slave_select : std_logic_vector(7 downto 0);
signal pllout_clk_sys : std_logic;
signal pllout_clk_dmtd : std_logic;
signal pllout_clk_fb_pllref : std_logic;
signal pllout_clk_fb_dmtd : std_logic;
signal clk_20m_vcxo_buf : std_logic;
signal clk_125m_pllref : std_logic;
signal clk_sys : std_logic;
signal clk_dmtd : std_logic;
signal dac_rst_n : std_logic;
signal led_divider : unsigned(23 downto 0);
signal wrc_gpio_out : std_logic_vector(7 downto 0);
signal wrc_gpio_in : std_logic_vector(7 downto 0);
signal wrc_gpio_dir : std_logic_vector(7 downto 0);
signal wb_adr_wrc : std_logic_vector(17 downto 0);
signal dio : std_logic_vector(3 downto 0);
signal dac_hpll_load_p1 : std_logic;
signal dac_dpll_load_p1 : std_logic;
signal dac_hpll_data : std_logic_vector(15 downto 0);
signal dac_dpll_data : std_logic_vector(15 downto 0);
signal pps : std_logic;
signal phy_tx_data : std_logic_vector(7 downto 0);
signal phy_tx_k : std_logic;
signal phy_tx_disparity : std_logic;
signal phy_tx_enc_err : std_logic;
signal phy_rx_data : std_logic_vector(7 downto 0);
signal phy_rx_rbclk : std_logic;
signal phy_rx_k : std_logic;
signal phy_rx_enc_err : std_logic;
signal phy_rx_bitslide : std_logic_vector(3 downto 0);
signal phy_rst : std_logic;
signal phy_loopen : std_logic;
signal dio_in : std_logic_vector(4 downto 0);
signal dio_out : std_logic_vector(4 downto 0);
signal dio_clk : std_logic;
signal local_reset_n : std_logic;
signal button1_synced : std_logic_vector(2 downto 0);
begin
cmp_sys_clk_pll : PLL_BASE
generic map (
BANDWIDTH => "OPTIMIZED",
CLK_FEEDBACK => "CLKFBOUT",
COMPENSATION => "INTERNAL",
DIVCLK_DIVIDE => 1,
CLKFBOUT_MULT => 8,
CLKFBOUT_PHASE => 0.000,
CLKOUT0_DIVIDE => 16, -- 62.5 MHz
CLKOUT0_PHASE => 0.000,
CLKOUT0_DUTY_CYCLE => 0.500,
CLKOUT1_DIVIDE => 16, -- 125 MHz
CLKOUT1_PHASE => 0.000,
CLKOUT1_DUTY_CYCLE => 0.500,
CLKOUT2_DIVIDE => 16,
CLKOUT2_PHASE => 0.000,
CLKOUT2_DUTY_CYCLE => 0.500,
CLKIN_PERIOD => 8.0,
REF_JITTER => 0.016)
port map (
CLKFBOUT => pllout_clk_fb_pllref,
CLKOUT0 => pllout_clk_sys,
CLKOUT1 => open,
CLKOUT2 => open,
CLKOUT3 => open,
CLKOUT4 => open,
CLKOUT5 => open,
LOCKED => open,
RST => '0',
CLKFBIN => pllout_clk_fb_pllref,
CLKIN => clk_125m_pllref);
cmp_dmtd_clk_pll : PLL_BASE
generic map (
BANDWIDTH => "OPTIMIZED",
CLK_FEEDBACK => "CLKFBOUT",
COMPENSATION => "INTERNAL",
DIVCLK_DIVIDE => 1,
CLKFBOUT_MULT => 50,
CLKFBOUT_PHASE => 0.000,
CLKOUT0_DIVIDE => 8, -- 62.5 MHz
CLKOUT0_PHASE => 0.000,
CLKOUT0_DUTY_CYCLE => 0.500,
CLKOUT1_DIVIDE => 8, -- 125 MHz
CLKOUT1_PHASE => 0.000,
CLKOUT1_DUTY_CYCLE => 0.500,
CLKOUT2_DIVIDE => 8,
CLKOUT2_PHASE => 0.000,
CLKOUT2_DUTY_CYCLE => 0.500,
CLKIN_PERIOD => 50.0,
REF_JITTER => 0.016)
port map (
CLKFBOUT => pllout_clk_fb_dmtd,
CLKOUT0 => pllout_clk_dmtd,
CLKOUT1 => open,
CLKOUT2 => open,
CLKOUT3 => open,
CLKOUT4 => open,
CLKOUT5 => open,
LOCKED => open,
RST => '0',
CLKFBIN => pllout_clk_fb_dmtd,
CLKIN => clk_20m_vcxo_buf);
--p_gen_reset : process(clk_sys)
--begin
-- if rising_edge(clk_sys) then
-- button1_synced(0) <= button1_i;
-- button1_synced(1) <= button1_synced(0);
-- button1_synced(2) <= button1_synced(1);
-- if(L_RST_N = '0') then
-- local_reset_n <= '0';
-- elsif (button1_synced(2) = '0') then
-- local_reset_n <= '0';
-- else
-- local_reset_n <= '1';
-- end if;
-- end if;
--end process;
local_reset_n <= L_RST_N;
cmp_clk_sys_buf : BUFG
port map (
O => clk_sys,
I => pllout_clk_sys);
cmp_clk_dmtd_buf : BUFG
port map (
O => clk_dmtd,
I => pllout_clk_dmtd);
cmp_clk_vcxo : BUFG
port map (
O => clk_20m_vcxo_buf,
I => clk_20m_vcxo_i);
------------------------------------------------------------------------------
-- Local clock from gennum LCLK
------------------------------------------------------------------------------
cmp_l_clk_buf : IBUFDS
generic map (
DIFF_TERM => false, -- Differential Termination
IBUF_LOW_PWR => true, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
IOSTANDARD => "DEFAULT")
port map (
O => l_clk, -- Buffer output
I => L_CLKp, -- Diff_p buffer input (connect directly to top-level port)
IB => L_CLKn -- Diff_n buffer input (connect directly to top-level port)
);
cmp_pllrefclk_buf : IBUFGDS
generic map (
DIFF_TERM => true, -- Differential Termination
IBUF_LOW_PWR => true, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
IOSTANDARD => "DEFAULT")
port map (
O => clk_125m_pllref, -- Buffer output
I => clk_125m_pllref_p_i, -- Diff_p buffer input (connect directly to top-level port)
IB => clk_125m_pllref_n_i -- Diff_n buffer input (connect directly to top-level port)
);
------------------------------------------------------------------------------
-- Active high reset
------------------------------------------------------------------------------
rst <= not(L_RST_N);
------------------------------------------------------------------------------
-- GN4124 interface
------------------------------------------------------------------------------
cmp_gn4124_core : gn4124_core
generic map (
-- g_IS_SPARTAN6 => true,
g_BAR0_APERTURE => c_BAR0_APERTURE,
g_CSR_WB_SLAVES_NB => c_CSR_WB_SLAVES_NB,
g_DMA_WB_SLAVES_NB => c_DMA_WB_SLAVES_NB,
g_DMA_WB_ADDR_WIDTH => c_DMA_WB_ADDR_WIDTH,
g_CSR_WB_MODE => "classic"
)
port map
(
---------------------------------------------------------
-- Control and status
--
-- Asynchronous reset from GN4124
rst_n_a_i => L_RST_N,
-- P2L clock PLL locked
p2l_pll_locked => p2l_pll_locked,
-- Debug outputs
debug_o => open,
---------------------------------------------------------
-- P2L Direction
--
-- Source Sync DDR related signals
p2l_clk_p_i => P2L_CLKp,
p2l_clk_n_i => P2L_CLKn,
p2l_data_i => P2L_DATA,
p2l_dframe_i => P2L_DFRAME,
p2l_valid_i => P2L_VALID,
-- P2L Control
p2l_rdy_o => P2L_RDY,
p_wr_req_i => P_WR_REQ,
p_wr_rdy_o => P_WR_RDY,
rx_error_o => RX_ERROR,
---------------------------------------------------------
-- L2P Direction
--
-- Source Sync DDR related signals
l2p_clk_p_o => L2P_CLKp,
l2p_clk_n_o => L2P_CLKn,
l2p_data_o => L2P_DATA,
l2p_dframe_o => L2P_DFRAME,
l2p_valid_o => L2P_VALID,
l2p_edb_o => L2P_EDB,
-- L2P Control
l2p_rdy_i => L2P_RDY,
l_wr_rdy_i => L_WR_RDY,
p_rd_d_rdy_i => P_RD_D_RDY,
tx_error_i => TX_ERROR,
vc_rdy_i => VC_RDY,
---------------------------------------------------------
-- Interrupt interface
dma_irq_o => open,
irq_p_i => '0',
irq_p_o => GPIO(0),
---------------------------------------------------------
-- Target Interface (Wishbone master)
wb_clk_i => clk_sys,
wb_adr_o => wb_adr,
wb_dat_o => wb_dat_o,
wb_sel_o => wb_sel,
wb_stb_o => wb_stb,
wb_we_o => wb_we,
wb_cyc_o => wb_cyc,
wb_dat_i => wb_dat_i,
wb_ack_i => wb_ack,
---------------------------------------------------------
-- L2P DMA Interface (Pipelined Wishbone master)
dma_clk_i => clk_sys,
dma_adr_o => dma_adr,
dma_dat_o => dma_dat_o,
dma_sel_o => dma_sel,
dma_stb_o => dma_stb,
dma_we_o => dma_we,
dma_cyc_o => dma_cyc,
dma_dat_i => dma_dat_i,
dma_ack_i => dma_ack,
dma_stall_i => dma_stall
);
process(clk_sys, rst)
begin
if rising_edge(clk_sys) then
led_divider <= led_divider + 1;
end if;
end process;
-- LED_RED <= std_logic(led_divider(led_divider'high));
wb_adr_wrc <= '0' & wb_adr (16 downto 0);
U_WR_CORE : wr_core
generic map (
g_simulation => 0,
g_virtual_uart => 0,
g_ep_rxbuf_size_log2 => 12,
g_dpram_initf => "",
g_dpram_size => 16384,
g_num_gpio => 8)
port map (
clk_sys_i => clk_sys,
clk_dmtd_i => clk_dmtd,
clk_ref_i => clk_125m_pllref,
rst_n_i => local_reset_n,
pps_p_o => pps,
dac_hpll_load_p1_o => dac_hpll_load_p1,
dac_hpll_data_o => dac_hpll_data,
dac_dpll_load_p1_o => dac_dpll_load_p1,
dac_dpll_data_o => dac_dpll_data,
gpio_o => wrc_gpio_out,
gpio_i => wrc_gpio_in,
gpio_dir_o => wrc_gpio_dir,
uart_rxd_i => uart_rxd_i,
uart_txd_o => uart_txd_o,
wb_addr_i => wb_adr_wrc,
wb_data_i => wb_dat_o,
wb_data_o => wb_dat_i(31 downto 0),
wb_sel_i => wb_sel,
wb_we_i => wb_we,
wb_cyc_i => wb_cyc(0),
wb_stb_i => wb_stb,
wb_ack_o => wb_ack(0),
genrest_n => open,
dio_o => dio_out(4 downto 1),
phy_ref_clk_i => clk_125m_pllref,
phy_tx_data_o => phy_tx_data,
phy_tx_k_o => phy_tx_k,
phy_tx_disparity_i => phy_tx_disparity,
phy_tx_enc_err_i => phy_tx_enc_err,
phy_rx_data_i => phy_rx_data,
phy_rx_rbclk_i => phy_rx_rbclk,
phy_rx_k_i => phy_rx_k,
phy_rx_enc_err_i => phy_rx_enc_err,
phy_rx_bitslide_i => phy_rx_bitslide,
phy_rst_o => phy_rst,
phy_loopen_o => phy_loopen
);
U_GTP : wr_gtp_phy_spartan6
generic map (
g_simulation => 0)
port map (
ch0_ref_clk_i => clk_125m_pllref,
ch0_ref_clk_o => open,
ch0_tx_data_i => x"00",
ch0_tx_k_i => '0',
ch0_tx_disparity_o => open,
ch0_tx_enc_err_o => open,
ch0_rx_rbclk_o => open,
ch0_rx_data_o => open,
ch0_rx_k_o => open,
ch0_rx_enc_err_o => open,
ch0_rx_bitslide_o => open,
ch0_rst_i => '1',
ch0_loopen_i => '0',
ch1_ref_clk_i => clk_125m_pllref,
ch1_ref_clk_o => open,
ch1_tx_data_i => phy_tx_data,
ch1_tx_k_i => phy_tx_k,
ch1_tx_disparity_o => phy_tx_disparity,
ch1_tx_enc_err_o => phy_tx_enc_err,
ch1_rx_data_o => phy_rx_data,
ch1_rx_rbclk_o => phy_rx_rbclk,
ch1_rx_k_o => phy_rx_k,
ch1_rx_enc_err_o => phy_rx_enc_err,
ch1_rx_bitslide_o => phy_rx_bitslide,
ch1_rst_i => phy_rst,
ch1_loopen_i => phy_loopen,
pad_txn0_o => open,
pad_txp0_o => open,
pad_rxn0_i => '0',
pad_rxp0_i => '0',
pad_txn1_o => sfp_txn_o,
pad_txp1_o => sfp_txp_o,
pad_rxn1_i => sfp_rxn_i,
pad_rxp1_i => sfp_rxp_i);
U_DAC_ARB : spec_serial_dac_arb
generic map (
g_invert_sclk => false,
g_num_extra_bits => 8)
port map (
clk_i => clk_sys,
rst_n_i => local_reset_n,
val1_i => dac_dpll_data,
load1_i => dac_dpll_load_p1,
val2_i => dac_hpll_data,
load2_i => dac_hpll_load_p1,
dac_cs_n_o(0) => dac_cs1_n_o,
dac_cs_n_o(1) => dac_cs2_n_o,
dac_clr_n_o => dac_clr_n_o,
dac_sclk_o => dac_sclk_o,
dac_din_o => dac_din_o);
U_Extend_PPS : gc_extend_pulse
generic map (
g_width => 10000000)
port map (
clk_i => clk_125m_pllref,
rst_n_i => local_reset_n,
pulse_i => pps,
extended_o => dio_led_top_o);
gen_dio_iobufs : for i in 0 to 4 generate
U_ibuf : IBUFDS
generic map (
DIFF_TERM => true)
port map (
O => dio_in(i),
I => dio_p_i(i),
IB => dio_n_i(i)
);
U_obuf : OBUFDS
port map (
I => dio_out(i),
O => dio_p_o(i),
OB => dio_n_o(i)
);
end generate gen_dio_iobufs;
U_input_buffer : IBUFDS
generic map (
DIFF_TERM => true)
port map (
O => dio_clk,
I => dio_clk_p_i,
IB => dio_clk_n_i
);
dio_led_bot_o <= '0';
dio_out(0) <= pps;
-- dio_out(4 downto 1) <= (others => '0');
dio_oe_n_o(0) <= '0';
dio_oe_n_o(4 downto 1) <= (others => '0');
dio_term_en_o <= (others => '0');
dio_sdn_ck_n_o <= '0';
dio_sdn_n_o <= '0';
LED_GREEN <= wrc_gpio_out(0);
LED_RED <= wrc_gpio_out(1);
fpga_scl_b <= '0' when wrc_gpio_out(2) = '0' else 'Z';
fpga_sda_b <= '0' when wrc_gpio_out(3) = '0' else 'Z';
wrc_gpio_in(4) <= fpga_sda_b;
wrc_gpio_in(5) <= '0';
wrc_gpio_in(6) <= button2_i;
sfp_mod_def0_b <= '0';
sfp_mod_def1_b <= '0';
sfp_mod_def2_b <= '0';
sfp_tx_disable_o <= '0';
--chipscope_ila_1 : chipscope_ila
-- port map (
-- CONTROL => CONTROL,
-- CLK => clk_125m_pllref,
-- TRIG0 => TRIG0,
-- TRIG1 => TRIG1,
-- TRIG2 => TRIG2,
-- TRIG3 => TRIG3);
--chipscope_icon_1 : chipscope_icon
-- port map (
-- CONTROL0 => CONTROL
-- );
--TRIG0(7 downto 0)<=phy_tx_data;
--TRIG0(8) <= phy_tx_k;
--TRIG0(9) <= phy_tx_disparity;
--TRIG0(10) <= phy_tx_enc_err;
end rtl;
------------------------------------------------------------------------------
-- Title : Wishbone GPIO port
-- Project : White Rabbit Switch
------------------------------------------------------------------------------
-- Author : Tomasz Wlostowski
-- Company : CERN BE-Co-HT
-- Created : 2010-05-18
-- Last update: 2011-04-06
-- Platform : FPGA-generic
-- Standard : VHDL'87
-------------------------------------------------------------------------------
-- Description: Bidirectional GPIO port of configurable width (1 to 32 bits).
-------------------------------------------------------------------------------
-- Copyright (c) 2010 Tomasz Wlostowski
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2010-05-18 1.0 twlostow Created
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
library work;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
entity wb_gpio_port_notristates is
generic(g_num_pins : natural := 8 -- number of GPIO pins
);
port(
-- System reset, active low
sys_rst_n_i : in std_logic;
-------------------------------------------------------------------------------
-- Wishbone bus
-------------------------------------------------------------------------------
wb_clk_i : in std_logic;
wb_sel_i : in std_logic;
wb_cyc_i : in std_logic;
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_addr_i : in std_logic_vector(2 downto 0);
wb_data_i : in std_logic_vector(31 downto 0);
wb_data_o : out std_logic_vector(31 downto 0);
wb_ack_o : out std_logic;
-- GPIO pin vector
gpio_o : out std_logic_vector(g_num_pins-1 downto 0);
gpio_i : in std_logic_vector(g_num_pins-1 downto 0);
gpio_dir_o : out std_logic_vector(g_num_pins-1 downto 0)
);
end wb_gpio_port_notristates;
architecture behavioral of wb_gpio_port_notristates is
constant c_GPIO_REG_CODR : std_logic_vector(2 downto 0) := "000"; -- *reg* clear output register
constant c_GPIO_REG_SODR : std_logic_vector(2 downto 0) := "001"; -- *reg* set output register
constant c_GPIO_REG_DDR : std_logic_vector(2 downto 0) := "010"; -- *reg* data direction register
constant c_GPIO_REG_PSR : std_logic_vector(2 downto 0) := "011"; -- *reg* pin state register
signal out_reg, in_reg, dir_reg : std_logic_vector(g_num_pins-1 downto 0);
signal gpio_in_synced : std_logic_vector(g_num_pins-1 downto 0);
signal ack_int : std_logic;
begin
GEN_SYNC_FFS : for i in 0 to g_num_pins-1 generate
INPUT_SYNC : gc_sync_ffs
generic map (
g_sync_edge => "positive")
port map (
rst_n_i => sys_rst_n_i,
clk_i => wb_clk_i,
data_i => gpio_i(i),
synced_o => gpio_in_synced(i),
npulse_o => open
);
end generate GEN_SYNC_FFS;
process (wb_clk_i, sys_rst_n_i)
begin
if sys_rst_n_i = '0' then
dir_reg <= (others => '0');
out_reg <= (others => '0');
ack_int <= '0';
wb_data_o(g_num_pins-1 downto 0) <= (others => '0');
elsif rising_edge(wb_clk_i) then
if(ack_int = '1') then
ack_int <= '0';
elsif(wb_cyc_i = '1') and (wb_sel_i = '1') and (wb_stb_i = '1') then
if(wb_we_i = '1') then
case wb_addr_i(2 downto 0) is
when c_GPIO_REG_SODR =>
out_reg <= out_reg or wb_data_i(g_num_pins-1 downto 0);
ack_int <= '1';
when c_GPIO_REG_CODR =>
out_reg <= out_reg and (not wb_data_i(g_num_pins-1 downto 0));
ack_int <= '1';
when c_GPIO_REG_DDR =>
dir_reg <= wb_data_i(g_num_pins-1 downto 0);
ack_int <= '1';
when others =>
ack_int <= '1';
end case;
else
case wb_addr_i(2 downto 0) is
when c_GPIO_REG_DDR =>
wb_data_o(g_num_pins-1 downto 0) <= dir_reg;
ack_int <= '1';
when c_GPIO_REG_PSR =>
wb_data_o(g_num_pins-1 downto 0) <= gpio_in_synced;
ack_int <= '1';
when others =>
ack_int <= '1';
end case;
end if;
else
ack_int <= '0';
end if;
end if;
end process;
gpio_dir_o <= dir_reg;
gpio_o <= out_reg;
wb_ack_o <= ack_int;
end behavioral;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment