Commit c9217ac1 authored by Lucas Russo's avatar Lucas Russo

First commit

parents
*~
*.swp
*.orig
[submodule "hdl/ip_cores/general-cores"]
path = hdl/ip_cores/general-cores
url = git://ohwr.org/hdl-core-lib/general-cores.git
Repository containing the Beam Position Monitor FPGA firmware and
software.
==========================================================
modules = { "local": [
"modules/custom_wishbone",
"modules/custom_common",
"ip_cores/general-cores",
"platform/virtex6/chipscope"] };
Folder containing all the BPM FPGA firmware and related tests
==========================================================
general-cores @ 065d6958
Subproject commit 065d69583659890a1180a024e937bc66f7340d72
modules = { "local" : ["reset_synch"] };
files = [ "custom_common_pkg.vhd" ];
library ieee;
use ieee.std_logic_1164.all;
package custom_common_pkg is
--------------------------------------------------------------------
-- Components
--------------------------------------------------------------------
component reset_synch
port
(
clk_i : in std_logic;
arst_n_i : in std_logic;
rst_n_o : out std_logic
);
end component;
end custom_common_pkg;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity reset_synch is
port
(
clk_i : in std_logic;
arst_n_i : in std_logic;
rst_n_o : out std_logic
);
end reset_synch;
architecture rtl of reset_synch is
signal s_ff : std_logic;
begin
process(clk_i, arst_n_i)
begin
if arst_n_i = '0' then
s_ff <= '0';
rst_n_o <= '0';
elsif rising_edge(clk_i) then
s_ff <= '1';
rst_n_o <= s_ff;
end if;
end process;
end rtl;
modules = { "local" : [
# "wb_irq_mngr",
# "wb_dma_interface" ,
"wb_stream",
"wb_fmc150"
] };
files = [ "custom_wishbone_pkg.vhd" ];
library ieee;
use ieee.std_logic_1164.all;
library work;
use work.wishbone_pkg.all;
package custom_wishbone_pkg is
--------------------------------------------------------------------
-- Records
--------------------------------------------------------------------
type t_wishbone_dflow_master_out is record
cyc : std_logic;
stb : std_logic;
adr : t_wishbone_address;
sel : t_wishbone_byte_select;
cti : t_wishbone_cycle_type;
bte : t_wishbone_burst_type;
we : std_logic;
dat : t_wishbone_data;
end record t_wishbone_dflow_master_out;
subtype t_wishbone_dflow_slave_in is t_wishbone_dflow_master_out;
type t_wishbone_dflow_slave_out is record
ack : std_logic;
err : std_logic;
rty : std_logic;
stall : std_logic;
int : std_logic;
dat : t_wishbone_data;
end record t_wishbone_dflow_slave_out;
subtype t_wishbone_dflow_master_in is t_wishbone_dflow_slave_out;
--------------------------------------------------------------------
-- Components
--------------------------------------------------------------------
component wb_dma_interface
generic(
g_ovf_counter_width : natural := 10
);
port(
-- Asynchronous Reset signal
arst_n_i : in std_logic;
-- Write Domain Clock
dma_clk_i : in std_logic;
--dma_valid_o : out std_logic;
--dma_data_o : out std_logic_vector(C_NBITS_DATA_INPUT-1 downto 0);
--dma_be_o : out std_logic_vector(C_NBITS_DATA_INPUT/8 - 1 downto 0);
--dma_last_o : out std_logic;
--dma_ready_i : in std_logic;
-- Slave Data Flow port
--dma_dflow_slave_i : in t_wishbone_dflow_slave_in;
--dma_dflow_slave_o : out t_wishbone_dflow_slave_out;
wb_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
wb_cyc_i : in std_logic;
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_adr_i : in std_logic_vector(c_wishbone_data_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;
-- Slave Data Input Port
--data_slave_i : in t_wishbone_slave_in;
--data_slave_o : out t_wishbone_slave_out;
data_clk_i : in std_logic;
data_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
data_valid_i : in std_logic;
data_ready_o : out std_logic;
-- Slave control port. use wbgen2 tool or not if it is simple.
--control_slave_i : in t_wishbone_slave_in;
--control_slave_o : out t_wishbone_slave_out;
capture_ctl_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
dma_complete_o : out std_logic;
dma_ovf_o : out std_logic
-- Debug Signals
--dma_debug_clk_o : out std_logic;
--dma_debug_data_o : out std_logic_vector(255 downto 0);
--dma_debug_trigger_o : out std_logic_vector(15 downto 0)
);
end component;
component xwb_dma_interface
generic(
-- Three 32-bit data input. LSB bits are valid.
--C_NBITS_VALID_INPUT : natural := 128;
--C_NBITS_DATA_INPUT : natural := 128;
--C_OVF_COUNTER_SIZE : natural := 10
g_ovf_counter_width : natural := 10
);
port(
-- Asynchronous Reset signal
arst_n_i : in std_logic;
-- Write Domain Clock
dma_clk_i : in std_logic;
--dma_valid_o : out std_logic;
--dma_data_o : out std_logic_vector(C_NBITS_DATA_INPUT-1 downto 0);
--dma_be_o : out std_logic_vector(C_NBITS_DATA_INPUT/8 - 1 downto 0);
--dma_last_o : out std_logic;
--dma_ready_i : in std_logic;
-- Slave Data Flow port
dma_slave_i : in t_wishbone_slave_in;
dma_slave_o : out t_wishbone_slave_out;
-- Slave Data Input Port
--data_slave_i : in t_wishbone_slave_in;
--data_slave_o : out t_wishbone_slave_out;
data_clk_i : in std_logic;
data_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
data_valid_i : in std_logic;
data_ready_o : out std_logic;
-- Slave control port. use wbgen2 tool or not if it is simple.
--control_slave_i : in t_wishbone_slave_in;
--control_slave_o : out t_wishbone_slave_out;
capture_ctl_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
dma_complete_o : out std_logic;
dma_ovf_o : out std_logic
-- Debug Signals
--dma_debug_clk_o : out std_logic;
--dma_debug_data_o : out std_logic_vector(255 downto 0);
--dma_debug_trigger_o : out std_logic_vector(15 downto 0)
);
end component;
component dma_status_reg_synch
generic
(
C_NUM_REG : integer := 10;
C_SLV_DWIDTH : integer := 32;
C_STATUS_REG_IDX : natural := 1
);
port
(
bus_clk_i : in std_logic;
bus_rst_n_i : in std_logic;
bus_reg_read_sel_i : in std_logic_vector(C_NUM_REG-1 downto 0);
bus_reg_write_sel_i : in std_logic_vector(C_NUM_REG-1 downto 0);
bus_2_ip_data_i : in std_logic_vector(C_SLV_DWIDTH-1 downto 0);
dma_complete_i : in std_logic;
dma_ovf_i : in std_logic;
dma_complete_synch_o : out std_logic;
dma_ovf_synch_o : out std_logic
);
end component;
end custom_wishbone_pkg;
files = [ "wb_dma_interface.vhd",
"xwb_dma_interface.vhd",
# "wb_dma_iface_ctl/xdma_ctl_regs_pkg.vhd",
# "wb_dma_iface_ctl/xdma_ctl_iface.vhd"
];
------------------------------------------------------------------------------
-- dma_status_reg_synch.vhd - entity/architecture pair
------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.dma_pkg.all;
------------------------------------------------------------------------------
-- Entity section
------------------------------------------------------------------------------
entity dma_status_reg_synch is
generic
(
C_NUM_REG : integer := 10;
C_SLV_DWIDTH : integer := 32;
C_STATUS_REG_IDX : natural := 1
);
port
(
bus_clk_i : in std_logic;
bus_rst_n_i : in std_logic;
bus_reg_read_sel_i : in std_logic_vector(C_NUM_REG-1 downto 0);
bus_reg_write_sel_i : in std_logic_vector(C_NUM_REG-1 downto 0);
bus_2_ip_data_i : in std_logic_vector(C_SLV_DWIDTH-1 downto 0);
dma_complete_i : in std_logic;
dma_ovf_i : in std_logic;
dma_complete_synch_o : out std_logic;
dma_ovf_synch_o : out std_logic
);
end entity dma_status_reg_synch;
architecture IMP of dma_status_reg_synch is
-- DMA status synch regs
signal s_dma_complete_d1 : std_logic;
signal s_dma_complete_d2 : std_logic;
signal s_dma_complete_d3 : std_logic;
signal s_dma_complete_status : std_logic;
signal s_dma_ovf_d1 : std_logic;
signal s_dma_ovf_d2 : std_logic;
signal s_dma_ovf_status : std_logic;
-- Glue logic
signal dma_complete_synch_glue : std_logic;
signal dma_ovf_synch_glue : std_logic;
begin
-- Glue logic
dma_complete_synch_o <= dma_complete_synch_glue;
dma_ovf_synch_o <= dma_ovf_synch_glue;
p_dma_status_synch : process(bus_clk_i) is
begin
if rising_edge(bus_clk_i) then
if bus_rst_n_i = '0' then
s_dma_complete_d1 <= '0';
s_dma_complete_d2 <= '0';
s_dma_complete_d3 <= '0';
s_dma_complete_status <= '0';
s_dma_ovf_d1 <= '0';
s_dma_ovf_d2 <= '0';
s_dma_ovf_status <= '0';
else
s_dma_complete_d1 <= dma_complete_i;
s_dma_complete_d2 <= s_dma_complete_d1;
s_dma_complete_d3 <= s_dma_complete_d2;
-- Every dma_complete toggle is recognized as a dma_complete
s_dma_complete_status <= s_dma_complete_d3 xor s_dma_complete_d2;
s_dma_ovf_d1 <= dma_ovf_i;
s_dma_ovf_d2 <= s_dma_ovf_d1;
s_dma_ovf_status <= s_dma_ovf_d2;
end if;
end if;
end process p_dma_status_synch;
-- DMA Status set and clear software accessible regs
-- If a condition is detected, set the bit accordingly.
-- Otherwise, wait for "user" to clear the bit.
-- This is done in order to ensure that the user can detected
-- the condition.
p_dma_status_reg : process(bus_clk_i) is
begin
if rising_edge(bus_clk_i) then
if bus_rst_n_i = '0' then
dma_complete_synch_glue <= '0';
dma_ovf_synch_glue <= '0';
else
if s_dma_complete_status = '1' then
dma_complete_synch_glue <= '1';
elsif bus_reg_write_sel_i = std_logic_vector(to_unsigned(2**(C_NUM_REG-1-C_STATUS_REG_IDX), C_NUM_REG)) and dma_complete_synch_glue = '1' then
dma_complete_synch_glue <= bus_2_ip_data_i(0);
end if;
if s_dma_ovf_status = '1' then
dma_ovf_synch_glue <= '1';
elsif bus_reg_write_sel_i = std_logic_vector(to_unsigned(2**(C_NUM_REG-1-C_STATUS_REG_IDX), C_NUM_REG)) and dma_ovf_synch_glue = '1' then
dma_ovf_synch_glue <= bus_2_ip_data_i(1);
end if;
end if;
end if;
end process p_dma_status_reg;
end IMP;
\ No newline at end of file
<HTML>
<HEAD>
<TITLE>wb_dma_ctl_iface</TITLE>
<STYLE TYPE="text/css" MEDIA="all">
<!--
BODY { background: white; color: black;
font-family: Arial,Helvetica; font-size:12; }
h1 { font-family: Trebuchet MS,Arial,Helvetica; font-size:30; color:#404040; }
h2 { font-family: Trebuchet MS,Arial,Helvetica; font-size:22; color:#404040; }
h3 { font-family: Trebuchet MS,Arial,Helvetica; font-size:16; color:#404040; }
.td_arrow_left { padding:0px; background: #ffffff; text-align: right; font-size:12;}
.td_arrow_right { padding:0px; background: #ffffff; text-align: left; font-size:12;}
.td_code { font-family:Courier New,Courier; padding: 3px; }
.td_desc { padding: 3px; }
.td_sym_center { background: #e0e0f0; padding: 3px; }
.td_port_name { font-family:Courier New,Courier; background: #e0e0f0; text-align: right; font-weight:bold;padding: 3px; width:200px; }
.td_pblock_left { font-family:Courier New,Courier; background: #e0e0f0; padding: 0px; text-align: left; }
.td_pblock_right { font-family:Courier New,Courier; background: #e0e0f0; padding: 0px; text-align: right; }
.td_bit { background: #ffffff; color:#404040; font-size:10; width: 70px; font-family:Courier New,Courier; padding: 3px; text-align:center; }
.td_field { background: #e0e0f0; padding: 3px; text-align:center; }
.td_unused { background: #a0a0a0; padding: 3px; text-align:center; }
th { font-weight:bold; color:#ffffff; background: #202080; padding:3px; }
.tr_even { background: #f0eff0; }
.tr_odd { background: #e0e0f0; }
-->
</STYLE>
</HEAD>
<BODY>
<h1 class="heading">wb_dma_ctl_iface</h1>
<h3>Wishbone DMA Streaming Control Interface</h3>
<p>Simple Wishbone DMA interface for controlling the DMA Streaming peripheral</p>
<h3>Contents:</h3>
<span style="margin-left: 0px; ">1. <A href="#sect_1_0">Memory map summary</a></span><br/>
<span style="margin-left: 0px; ">2. <A href="#sect_2_0">HDL symbol</a></span><br/>
<span style="margin-left: 0px; ">3. <A href="#sect_3_0">Register description</a></span><br/>
<span style="margin-left: 20px; ">3.1. <A href="#sect_3_1">Control/Status register</a></span><br/>
<span style="margin-left: 20px; ">3.2. <A href="#sect_3_2">Transaction Counter</a></span><br/>
<h3><a name="sect_1_0">1. Memory map summary</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<th >
H/W Address
</th>
<th >
Type
</th>
<th >
Name
</th>
<th >
VHDL/Verilog prefix
</th>
<th >
C prefix
</th>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x0
</td>
<td >
REG
</td>
<td >
<A href="#CTL">Control/Status register</a>
</td>
<td class="td_code">
dma_ctl_iface_ctl
</td>
<td class="td_code">
CTL
</td>
</tr>
<tr class="tr_even">
<td class="td_code">
0x1
</td>
<td >
REG
</td>
<td >
<A href="#TR_CNTR">Transaction Counter</a>
</td>
<td class="td_code">
dma_ctl_iface_tr_cntr
</td>
<td class="td_code">
TR_CNTR
</td>
</tr>
</table>
<h3><a name="sect_2_0">2. HDL symbol</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
rst_n_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Control/Status register:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
clk_sys_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_ctl_iface_ctl_start_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_adr_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_ctl_iface_ctl_done_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rArr;
</td>
<td class="td_pblock_left">
wb_dat_i[31:0]
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_ctl_iface_ctl_ovf_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&lArr;
</td>
<td class="td_pblock_left">
wb_dat_o[31:0]
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_cyc_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Transaction Counter:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rArr;
</td>
<td class="td_pblock_left">
wb_sel_i[3:0]
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_ctl_iface_tr_cntr_o[31:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_stb_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_we_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&larr;
</td>
<td class="td_pblock_left">
wb_ack_o
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&larr;
</td>
<td class="td_pblock_left">
wb_stall_o
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
</table>
<h3><a name="sect_3_0">3. Register description</a></h3>
<a name="CTL"></a>
<h3><a name="sect_3_1">3.1. Control/Status register</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_ctl_iface_ctl
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x0
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
CTL
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x0
</td>
</tr>
</table>
<p>
A register defining the Control and Status of the core.
</p>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
OVF
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
DONE
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
START
</td>
</tr>
</table>
<ul>
<li><b>
START
</b>[<i>read/write</i>]: Start Transaction
<br>write 1: starts the DMA transaction.<br> write 0: no effect
<li><b>
DONE
</b>[<i>read-only</i>]: DMA complete
<br>read 1: the DMA has completed the transaction<br> read 0: DMA transaction still in progress
<li><b>
OVF
</b>[<i>read-only</i>]: DMA overflow
<br>read 1: the DMA overflow detected<br> read 0: No overflow detected
</ul>
<a name="TR_CNTR"></a>
<h3><a name="sect_3_2">3.2. Transaction Counter</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_ctl_iface_tr_cntr
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x1
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
TR_CNTR
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x4
</td>
</tr>
</table>
<p>
Register holding the word count to be transfered to DMA
</p>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
TR_CNTR[31:24]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
TR_CNTR[23:16]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
TR_CNTR[15:8]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
TR_CNTR[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
TR_CNTR
</b>[<i>read/write</i>]: Transactions Counter
<br>Stores the words to be transfered to DMA
</ul>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE>wb_dma_interface_port</TITLE>
<STYLE TYPE="text/css" MEDIA="all">
<!--
BODY { background: white; color: black;
font-family: Arial,Helvetica; font-size:12; }
h1 { font-family: Trebuchet MS,Arial,Helvetica; font-size:30; color:#404040; }
h2 { font-family: Trebuchet MS,Arial,Helvetica; font-size:22; color:#404040; }
h3 { font-family: Trebuchet MS,Arial,Helvetica; font-size:16; color:#404040; }
.td_arrow_left { padding:0px; background: #ffffff; text-align: right; font-size:12;}
.td_arrow_right { padding:0px; background: #ffffff; text-align: left; font-size:12;}
.td_code { font-family:Courier New,Courier; padding: 3px; }
.td_desc { padding: 3px; }
.td_sym_center { background: #e0e0f0; padding: 3px; }
.td_port_name { font-family:Courier New,Courier; background: #e0e0f0; text-align: right; font-weight:bold;padding: 3px; width:200px; }
.td_pblock_left { font-family:Courier New,Courier; background: #e0e0f0; padding: 0px; text-align: left; }
.td_pblock_right { font-family:Courier New,Courier; background: #e0e0f0; padding: 0px; text-align: right; }
.td_bit { background: #ffffff; color:#404040; font-size:10; width: 70px; font-family:Courier New,Courier; padding: 3px; text-align:center; }
.td_field { background: #e0e0f0; padding: 3px; text-align:center; }
.td_unused { background: #a0a0a0; padding: 3px; text-align:center; }
th { font-weight:bold; color:#ffffff; background: #202080; padding:3px; }
.tr_even { background: #f0eff0; }
.tr_odd { background: #e0e0f0; }
-->
</STYLE>
</HEAD>
<BODY>
<h1 class="heading">wb_dma_interface_port</h1>
<h3>Wishbone DMA Streaming Interface</h3>
<p>Simple Wishbone DMA interface for peripherals which want to stream data to a DMA</p>
<h3>Contents:</h3>
<span style="margin-left: 0px; ">1. <A href="#sect_1_0">Memory map summary</a></span><br/>
<span style="margin-left: 0px; ">2. <A href="#sect_2_0">HDL symbol</a></span><br/>
<span style="margin-left: 0px; ">3. <A href="#sect_3_0">Register description</a></span><br/>
<span style="margin-left: 20px; ">3.1. <A href="#sect_3_1">Control/Status register</a></span><br/>
<span style="margin-left: 20px; ">3.2. <A href="#sect_3_2">Transaction Counter</a></span><br/>
<span style="margin-left: 20px; ">3.3. <A href="#sect_3_3">FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 0</a></span><br/>
<span style="margin-left: 20px; ">3.4. <A href="#sect_3_4">FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 1</a></span><br/>
<span style="margin-left: 20px; ">3.5. <A href="#sect_3_5">FIFO 'FIFO C2B (Core -> DMA) synchronization' control/status register</a></span><br/>
<span style="margin-left: 20px; ">3.6. <A href="#sect_3_6">FIFO 'FIFO B2C (Bus -> Core) synchronization' data input register 0</a></span><br/>
<span style="margin-left: 20px; ">3.7. <A href="#sect_3_7">FIFO 'FIFO B2C (Bus -> Core) synchronization' control/status register</a></span><br/>
<h3><a name="sect_1_0">1. Memory map summary</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<th >
H/W Address
</th>
<th >
Type
</th>
<th >
Name
</th>
<th >
VHDL/Verilog prefix
</th>
<th >
C prefix
</th>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x0
</td>
<td >
REG
</td>
<td >
<A href="#CTL">Control/Status register</a>
</td>
<td class="td_code">
dma_iface_ctl
</td>
<td class="td_code">
CTL
</td>
</tr>
<tr class="tr_even">
<td class="td_code">
0x1
</td>
<td >
REG
</td>
<td >
<A href="#TR_CNTR">Transaction Counter</a>
</td>
<td class="td_code">
dma_iface_tr_cntr
</td>
<td class="td_code">
TR_CNTR
</td>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x2
</td>
<td >
FIFOREG
</td>
<td >
<A href="#FIFO_C2B_R0">FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 0</a>
</td>
<td class="td_code">
dma_iface_fifo_c2b_r0
</td>
<td class="td_code">
FIFO_C2B_R0
</td>
</tr>
<tr class="tr_even">
<td class="td_code">
0x3
</td>
<td >
FIFOREG
</td>
<td >
<A href="#FIFO_C2B_R1">FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 1</a>
</td>
<td class="td_code">
dma_iface_fifo_c2b_r1
</td>
<td class="td_code">
FIFO_C2B_R1
</td>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x4
</td>
<td >
REG
</td>
<td >
<A href="#FIFO_C2B_CSR">FIFO 'FIFO C2B (Core -> DMA) synchronization' control/status register</a>
</td>
<td class="td_code">
dma_iface_fifo_c2b_csr
</td>
<td class="td_code">
FIFO_C2B_CSR
</td>
</tr>
<tr class="tr_even">
<td class="td_code">
0x5
</td>
<td >
FIFOREG
</td>
<td >
<A href="#FIFO_B2C_R0">FIFO 'FIFO B2C (Bus -> Core) synchronization' data input register 0</a>
</td>
<td class="td_code">
dma_iface_fifo_b2c_r0
</td>
<td class="td_code">
FIFO_B2C_R0
</td>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x6
</td>
<td >
REG
</td>
<td >
<A href="#FIFO_B2C_CSR">FIFO 'FIFO B2C (Bus -> Core) synchronization' control/status register</a>
</td>
<td class="td_code">
dma_iface_fifo_b2c_csr
</td>
<td class="td_code">
FIFO_B2C_CSR
</td>
</tr>
</table>
<h3><a name="sect_2_0">2. HDL symbol</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
rst_n_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Control/Status register:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
clk_sys_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_ctl_start_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rArr;
</td>
<td class="td_pblock_left">
wb_adr_i[2:0]
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_ctl_done_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rArr;
</td>
<td class="td_pblock_left">
wb_dat_i[31:0]
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_ctl_ovf_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&lArr;
</td>
<td class="td_pblock_left">
wb_dat_o[31:0]
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_cyc_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Transaction Counter:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rArr;
</td>
<td class="td_pblock_left">
wb_sel_i[3:0]
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_tr_cntr_o[31:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_stb_i
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_we_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>FIFO C2B (Core -> DMA) synchronization:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&larr;
</td>
<td class="td_pblock_left">
wb_ack_o
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_c2b_wr_req_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&larr;
</td>
<td class="td_pblock_left">
wb_stall_o
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_c2b_wr_full_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_c2b_wr_empty_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_c2b_wr_usedw_o[7:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_c2b_data_i[31:0]
</td>
<td class="td_arrow_right">
&lArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_c2b_last_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>FIFO B2C (Bus -> Core) synchronization:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_b2c_rd_req_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_b2c_rd_full_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_b2c_rd_empty_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_b2c_rd_usedw_o[7:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
dma_iface_fifo_b2c_data_o[31:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 0:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 1:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>FIFO 'FIFO B2C (Bus -> Core) synchronization' data input register 0:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
</table>
<h3><a name="sect_3_0">3. Register description</a></h3>
<a name="CTL"></a>
<h3><a name="sect_3_1">3.1. Control/Status register</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_iface_ctl
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x0
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
CTL
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x0
</td>
</tr>
</table>
<p>
A register defining the Control and Status of the core.
</p>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
OVF
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
DONE
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
START
</td>
</tr>
</table>
<ul>
<li><b>
START
</b>[<i>read/write</i>]: Start Transaction
<br>write 1: starts the DMA transaction.<br> write 0: no effect
<li><b>
DONE
</b>[<i>read-only</i>]: DMA complete
<br>read 1: the DMA has completed the transaction<br> read 0: DMA transaction still in progress
<li><b>
OVF
</b>[<i>read-only</i>]: DMA overflow
<br>read 1: the DMA overflow detected<br> read 0: No overflow detected
</ul>
<a name="TR_CNTR"></a>
<h3><a name="sect_3_2">3.2. Transaction Counter</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_iface_tr_cntr
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x1
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
TR_CNTR
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x4
</td>
</tr>
</table>
<p>
Register holding the word count to be transfered to DMA
</p>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
TR_CNTR[31:24]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
TR_CNTR[23:16]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
TR_CNTR[15:8]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
TR_CNTR[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
TR_CNTR
</b>[<i>read/write</i>]: Transactions Counter
<br>Stores the words to be transfered to DMA
</ul>
<a name="FIFO_C2B_R0"></a>
<h3><a name="sect_3_3">3.3. FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 0</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_iface_fifo_c2b_r0
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x2
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
FIFO_C2B_R0
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x8
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA[31:24]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA[23:16]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA[15:8]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
DATA
</b>[<i>read-only</i>]: Output FIFO data value
<br>Value of data word synchronized to the core clock
</ul>
<a name="FIFO_C2B_R1"></a>
<h3><a name="sect_3_4">3.4. FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 1</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_iface_fifo_c2b_r1
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x3
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
FIFO_C2B_R1
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0xc
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
LAST
</td>
</tr>
</table>
<ul>
<li><b>
LAST
</b>[<i>read-only</i>]: Transaction Last Data
<br>0: Current entry is not the last transaction data<br> 1: Current entry is the last transaction data
</ul>
<a name="FIFO_C2B_CSR"></a>
<h3><a name="sect_3_5">3.5. FIFO 'FIFO C2B (Core -> DMA) synchronization' control/status register</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_iface_fifo_c2b_csr
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x4
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
FIFO_C2B_CSR
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x10
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
EMPTY
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
FULL
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
USEDW[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
FULL
</b>[<i>read-only</i>]: FIFO full flag
<br>1: FIFO 'FIFO C2B (Core -> DMA) synchronization' is full<br>0: FIFO is not full
<li><b>
EMPTY
</b>[<i>read-only</i>]: FIFO empty flag
<br>1: FIFO 'FIFO C2B (Core -> DMA) synchronization' is empty<br>0: FIFO is not empty
<li><b>
USEDW
</b>[<i>read-only</i>]: FIFO counter
<br>Number of data records currently being stored in FIFO 'FIFO C2B (Core -> DMA) synchronization'
</ul>
<a name="FIFO_B2C_R0"></a>
<h3><a name="sect_3_6">3.6. FIFO 'FIFO B2C (Bus -> Core) synchronization' data input register 0</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_iface_fifo_b2c_r0
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x5
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
FIFO_B2C_R0
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x14
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA[31:24]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA[23:16]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA[15:8]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
DATA
</b>[<i>write-only</i>]: Input FIFO data value
<br>Value of data word synchronized to the core clock
</ul>
<a name="FIFO_B2C_CSR"></a>
<h3><a name="sect_3_7">3.7. FIFO 'FIFO B2C (Bus -> Core) synchronization' control/status register</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
dma_iface_fifo_b2c_csr
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x6
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
FIFO_B2C_CSR
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x18
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
EMPTY
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
FULL
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
USEDW[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
FULL
</b>[<i>read-only</i>]: FIFO full flag
<br>1: FIFO 'FIFO B2C (Bus -> Core) synchronization' is full<br>0: FIFO is not full
<li><b>
EMPTY
</b>[<i>read-only</i>]: FIFO empty flag
<br>1: FIFO 'FIFO B2C (Bus -> Core) synchronization' is empty<br>0: FIFO is not empty
<li><b>
USEDW
</b>[<i>read-only</i>]: FIFO counter
<br>Number of data records currently being stored in FIFO 'FIFO B2C (Bus -> Core) synchronization'
</ul>
</BODY>
</HTML>
---------------------------------------------------------------------------------------
-- Title : Wishbone slave core for Wishbone DMA Streaming Interface
---------------------------------------------------------------------------------------
-- File : xdma_interface_registers_pkg.vhd
-- Author : auto-generated by wbgen2 from xdma_interface_wb.wb
-- Created : Thu Sep 27 15:39:56 2012
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE xdma_interface_wb.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.wbgen2_pkg.all;
package dma_iface_wbgen2_pkg is
-- Input registers (user design -> WB slave)
type t_dma_iface_in_registers is record
ctl_done_i : std_logic;
ctl_ovf_i : std_logic;
fifo_c2b_wr_req_i : std_logic;
fifo_c2b_data_i : std_logic_vector(31 downto 0);
fifo_c2b_last_i : std_logic;
fifo_b2c_rd_req_i : std_logic;
end record;
constant c_dma_iface_in_registers_init_value: t_dma_iface_in_registers := (
ctl_done_i => '0',
ctl_ovf_i => '0',
fifo_c2b_wr_req_i => '0',
fifo_c2b_data_i => (others => '0'),
fifo_c2b_last_i => '0',
fifo_b2c_rd_req_i => '0'
);
-- Output registers (WB slave -> user design)
type t_dma_iface_out_registers is record
ctl_start_o : std_logic;
tr_cntr_o : std_logic_vector(31 downto 0);
fifo_c2b_wr_full_o : std_logic;
fifo_c2b_wr_empty_o : std_logic;
fifo_c2b_wr_usedw_o : std_logic_vector(7 downto 0);
fifo_b2c_rd_full_o : std_logic;
fifo_b2c_rd_empty_o : std_logic;
fifo_b2c_rd_usedw_o : std_logic_vector(7 downto 0);
fifo_b2c_data_o : std_logic_vector(31 downto 0);
end record;
constant c_dma_iface_out_registers_init_value: t_dma_iface_out_registers := (
ctl_start_o => '0',
tr_cntr_o => (others => '0'),
fifo_c2b_wr_full_o => '0',
fifo_c2b_wr_empty_o => '0',
fifo_c2b_wr_usedw_o => (others => '0'),
fifo_b2c_rd_full_o => '0',
fifo_b2c_rd_empty_o => '0',
fifo_b2c_rd_usedw_o => (others => '0'),
fifo_b2c_data_o => (others => '0')
);
function "or" (left, right: t_dma_iface_in_registers) return t_dma_iface_in_registers;
function f_x_to_zero (x:std_logic) return std_logic;
function f_x_to_zero (x:std_logic_vector) return std_logic_vector;
end package;
package body dma_iface_wbgen2_pkg is
function f_x_to_zero (x:std_logic) return std_logic is
begin
if(x = 'X' or x = 'U') then
return '0';
else
return x;
end if;
end function;
function f_x_to_zero (x:std_logic_vector) return std_logic_vector is
variable tmp: std_logic_vector(x'length-1 downto 0);
begin
for i in 0 to x'length-1 loop
if(x(i) = 'X' or x(i) = 'U') then
tmp(i):= '0';
else
tmp(i):=x(i);
end if;
end loop;
return tmp;
end function;
function "or" (left, right: t_dma_iface_in_registers) return t_dma_iface_in_registers is
variable tmp: t_dma_iface_in_registers;
begin
tmp.ctl_done_i := f_x_to_zero(left.ctl_done_i) or f_x_to_zero(right.ctl_done_i);
tmp.ctl_ovf_i := f_x_to_zero(left.ctl_ovf_i) or f_x_to_zero(right.ctl_ovf_i);
tmp.fifo_c2b_wr_req_i := f_x_to_zero(left.fifo_c2b_wr_req_i) or f_x_to_zero(right.fifo_c2b_wr_req_i);
tmp.fifo_c2b_data_i := f_x_to_zero(left.fifo_c2b_data_i) or f_x_to_zero(right.fifo_c2b_data_i);
tmp.fifo_c2b_last_i := f_x_to_zero(left.fifo_c2b_last_i) or f_x_to_zero(right.fifo_c2b_last_i);
tmp.fifo_b2c_rd_req_i := f_x_to_zero(left.fifo_b2c_rd_req_i) or f_x_to_zero(right.fifo_b2c_rd_req_i);
return tmp;
end function;
end package body;
/*
Register definitions for slave core: Wishbone DMA Streaming Interface
* File : xdma_interface_regs.h
* Author : auto-generated by wbgen2 from xdma_interface_wb.wb
* Created : Thu Sep 27 15:39:56 2012
* Standard : ANSI C
THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE xdma_interface_wb.wb
DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
*/
#ifndef __WBGEN2_REGDEFS_XDMA_INTERFACE_WB_WB
#define __WBGEN2_REGDEFS_XDMA_INTERFACE_WB_WB
#include <inttypes.h>
#if defined( __GNUC__)
#define PACKED __attribute__ ((packed))
#else
#error "Unsupported compiler?"
#endif
#ifndef __WBGEN2_MACROS_DEFINED__
#define __WBGEN2_MACROS_DEFINED__
#define WBGEN2_GEN_MASK(offset, size) (((1<<(size))-1) << (offset))
#define WBGEN2_GEN_WRITE(value, offset, size) (((value) & ((1<<(size))-1)) << (offset))
#define WBGEN2_GEN_READ(reg, offset, size) (((reg) >> (offset)) & ((1<<(size))-1))
#define WBGEN2_SIGN_EXTEND(value, bits) (((value) & (1<<bits) ? ~((1<<(bits))-1): 0 ) | (value))
#endif
/* definitions for register: Control/Status register */
/* definitions for field: Start Transaction in reg: Control/Status register */
#define DMA_IFACE_CTL_START WBGEN2_GEN_MASK(0, 1)
/* definitions for field: DMA complete in reg: Control/Status register */
#define DMA_IFACE_CTL_DONE WBGEN2_GEN_MASK(1, 1)
/* definitions for field: DMA overflow in reg: Control/Status register */
#define DMA_IFACE_CTL_OVF WBGEN2_GEN_MASK(2, 1)
/* definitions for register: Transaction Counter */
/* definitions for register: FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 0 */
/* definitions for field: Output FIFO data value in reg: FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 0 */
#define DMA_IFACE_FIFO_C2B_R0_DATA_MASK WBGEN2_GEN_MASK(0, 32)
#define DMA_IFACE_FIFO_C2B_R0_DATA_SHIFT 0
#define DMA_IFACE_FIFO_C2B_R0_DATA_W(value) WBGEN2_GEN_WRITE(value, 0, 32)
#define DMA_IFACE_FIFO_C2B_R0_DATA_R(reg) WBGEN2_GEN_READ(reg, 0, 32)
/* definitions for register: FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 1 */
/* definitions for field: Transaction Last Data in reg: FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 1 */
#define DMA_IFACE_FIFO_C2B_R1_LAST WBGEN2_GEN_MASK(0, 1)
/* definitions for register: FIFO 'FIFO C2B (Core -> DMA) synchronization' control/status register */
/* definitions for field: FIFO full flag in reg: FIFO 'FIFO C2B (Core -> DMA) synchronization' control/status register */
#define DMA_IFACE_FIFO_C2B_CSR_FULL WBGEN2_GEN_MASK(16, 1)
/* definitions for field: FIFO empty flag in reg: FIFO 'FIFO C2B (Core -> DMA) synchronization' control/status register */
#define DMA_IFACE_FIFO_C2B_CSR_EMPTY WBGEN2_GEN_MASK(17, 1)
/* definitions for field: FIFO counter in reg: FIFO 'FIFO C2B (Core -> DMA) synchronization' control/status register */
#define DMA_IFACE_FIFO_C2B_CSR_USEDW_MASK WBGEN2_GEN_MASK(0, 8)
#define DMA_IFACE_FIFO_C2B_CSR_USEDW_SHIFT 0
#define DMA_IFACE_FIFO_C2B_CSR_USEDW_W(value) WBGEN2_GEN_WRITE(value, 0, 8)
#define DMA_IFACE_FIFO_C2B_CSR_USEDW_R(reg) WBGEN2_GEN_READ(reg, 0, 8)
/* definitions for register: FIFO 'FIFO B2C (Bus -> Core) synchronization' data input register 0 */
/* definitions for field: Input FIFO data value in reg: FIFO 'FIFO B2C (Bus -> Core) synchronization' data input register 0 */
#define DMA_IFACE_FIFO_B2C_R0_DATA_MASK WBGEN2_GEN_MASK(0, 32)
#define DMA_IFACE_FIFO_B2C_R0_DATA_SHIFT 0
#define DMA_IFACE_FIFO_B2C_R0_DATA_W(value) WBGEN2_GEN_WRITE(value, 0, 32)
#define DMA_IFACE_FIFO_B2C_R0_DATA_R(reg) WBGEN2_GEN_READ(reg, 0, 32)
/* definitions for register: FIFO 'FIFO B2C (Bus -> Core) synchronization' control/status register */
/* definitions for field: FIFO full flag in reg: FIFO 'FIFO B2C (Bus -> Core) synchronization' control/status register */
#define DMA_IFACE_FIFO_B2C_CSR_FULL WBGEN2_GEN_MASK(16, 1)
/* definitions for field: FIFO empty flag in reg: FIFO 'FIFO B2C (Bus -> Core) synchronization' control/status register */
#define DMA_IFACE_FIFO_B2C_CSR_EMPTY WBGEN2_GEN_MASK(17, 1)
/* definitions for field: FIFO counter in reg: FIFO 'FIFO B2C (Bus -> Core) synchronization' control/status register */
#define DMA_IFACE_FIFO_B2C_CSR_USEDW_MASK WBGEN2_GEN_MASK(0, 8)
#define DMA_IFACE_FIFO_B2C_CSR_USEDW_SHIFT 0
#define DMA_IFACE_FIFO_B2C_CSR_USEDW_W(value) WBGEN2_GEN_WRITE(value, 0, 8)
#define DMA_IFACE_FIFO_B2C_CSR_USEDW_R(reg) WBGEN2_GEN_READ(reg, 0, 8)
PACKED struct DMA_IFACE_WB {
/* [0x0]: REG Control/Status register */
uint32_t CTL;
/* [0x4]: REG Transaction Counter */
uint32_t TR_CNTR;
/* [0x8]: REG FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 0 */
uint32_t FIFO_C2B_R0;
/* [0xc]: REG FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 1 */
uint32_t FIFO_C2B_R1;
/* [0x10]: REG FIFO 'FIFO C2B (Core -> DMA) synchronization' control/status register */
uint32_t FIFO_C2B_CSR;
/* [0x14]: REG FIFO 'FIFO B2C (Bus -> Core) synchronization' data input register 0 */
uint32_t FIFO_B2C_R0;
/* [0x18]: REG FIFO 'FIFO B2C (Bus -> Core) synchronization' control/status register */
uint32_t FIFO_B2C_CSR;
};
#endif
---------------------------------------------------------------------------------------
-- Title : Wishbone slave core for Wishbone DMA Streaming Interface
---------------------------------------------------------------------------------------
-- File : xdma_interface_wb.vhd
-- Author : auto-generated by wbgen2 from xdma_interface_wb.wb
-- Created : Thu Sep 27 15:39:56 2012
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE xdma_interface_wb.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.wbgen2_pkg.all;
use work.dma_iface_wbgen2_pkg.all;
entity wb_dma_interface_port is
port (
rst_n_i : in std_logic;
clk_sys_i : in std_logic;
wb_adr_i : in std_logic_vector(2 downto 0);
wb_dat_i : in std_logic_vector(31 downto 0);
wb_dat_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
wb_stall_o : out std_logic;
data_clk_i : in std_logic;
dma_clk_i : in std_logic;
regs_i : in t_dma_iface_in_registers;
regs_o : out t_dma_iface_out_registers
);
end wb_dma_interface_port;
architecture syn of wb_dma_interface_port is
signal dma_iface_ctl_start_int : std_logic ;
signal dma_iface_ctl_start_int_delay : std_logic ;
signal dma_iface_ctl_start_sync0 : std_logic ;
signal dma_iface_ctl_start_sync1 : std_logic ;
signal dma_iface_ctl_start_sync2 : std_logic ;
signal dma_iface_ctl_done_sync0 : std_logic ;
signal dma_iface_ctl_done_sync1 : std_logic ;
signal dma_iface_ctl_ovf_sync0 : std_logic ;
signal dma_iface_ctl_ovf_sync1 : std_logic ;
signal dma_iface_tr_cntr_int : std_logic_vector(31 downto 0);
signal dma_iface_tr_cntr_swb : std_logic ;
signal dma_iface_tr_cntr_swb_delay : std_logic ;
signal dma_iface_tr_cntr_swb_s0 : std_logic ;
signal dma_iface_tr_cntr_swb_s1 : std_logic ;
signal dma_iface_tr_cntr_swb_s2 : std_logic ;
signal dma_iface_fifo_c2b_rst_n : std_logic ;
signal dma_iface_fifo_c2b_in_int : std_logic_vector(32 downto 0);
signal dma_iface_fifo_c2b_out_int : std_logic_vector(32 downto 0);
signal dma_iface_fifo_c2b_rdreq_int : std_logic ;
signal dma_iface_fifo_c2b_rdreq_int_d0 : std_logic ;
signal dma_iface_fifo_b2c_rst_n : std_logic ;
signal dma_iface_fifo_b2c_in_int : std_logic_vector(31 downto 0);
signal dma_iface_fifo_b2c_out_int : std_logic_vector(31 downto 0);
signal dma_iface_fifo_b2c_wrreq_int : std_logic ;
signal dma_iface_fifo_c2b_full_int : std_logic ;
signal dma_iface_fifo_c2b_empty_int : std_logic ;
signal dma_iface_fifo_c2b_usedw_int : std_logic_vector(7 downto 0);
signal dma_iface_fifo_b2c_full_int : std_logic ;
signal dma_iface_fifo_b2c_empty_int : std_logic ;
signal dma_iface_fifo_b2c_usedw_int : std_logic_vector(7 downto 0);
signal ack_sreg : std_logic_vector(9 downto 0);
signal rddata_reg : std_logic_vector(31 downto 0);
signal wrdata_reg : std_logic_vector(31 downto 0);
signal bwsel_reg : std_logic_vector(3 downto 0);
signal rwaddr_reg : std_logic_vector(2 downto 0);
signal ack_in_progress : std_logic ;
signal wr_int : std_logic ;
signal rd_int : std_logic ;
signal allones : std_logic_vector(31 downto 0);
signal allzeros : std_logic_vector(31 downto 0);
begin
-- Some internal signals assignments. For (foreseen) compatibility with other bus standards.
wrdata_reg <= wb_dat_i;
bwsel_reg <= wb_sel_i;
rd_int <= wb_cyc_i and (wb_stb_i and (not wb_we_i));
wr_int <= wb_cyc_i and (wb_stb_i and wb_we_i);
allones <= (others => '1');
allzeros <= (others => '0');
--
-- Main register bank access process.
process (clk_sys_i, rst_n_i)
begin
if (rst_n_i = '0') then
ack_sreg <= "0000000000";
ack_in_progress <= '0';
rddata_reg <= "00000000000000000000000000000000";
dma_iface_ctl_start_int <= '0';
dma_iface_ctl_start_int_delay <= '0';
dma_iface_tr_cntr_int <= "00000000000000000000000000000000";
dma_iface_tr_cntr_swb <= '0';
dma_iface_tr_cntr_swb_delay <= '0';
dma_iface_fifo_c2b_rdreq_int <= '0';
dma_iface_fifo_b2c_wrreq_int <= '0';
elsif rising_edge(clk_sys_i) then
-- advance the ACK generator shift register
ack_sreg(8 downto 0) <= ack_sreg(9 downto 1);
ack_sreg(9) <= '0';
if (ack_in_progress = '1') then
if (ack_sreg(0) = '1') then
dma_iface_fifo_b2c_wrreq_int <= '0';
ack_in_progress <= '0';
else
dma_iface_ctl_start_int <= dma_iface_ctl_start_int_delay;
dma_iface_ctl_start_int_delay <= '0';
dma_iface_tr_cntr_swb <= dma_iface_tr_cntr_swb_delay;
dma_iface_tr_cntr_swb_delay <= '0';
end if;
else
if ((wb_cyc_i = '1') and (wb_stb_i = '1')) then
case rwaddr_reg(2 downto 0) is
when "000" =>
if (wb_we_i = '1') then
dma_iface_ctl_start_int <= wrdata_reg(0);
dma_iface_ctl_start_int_delay <= wrdata_reg(0);
end if;
rddata_reg(0) <= 'X';
rddata_reg(1) <= dma_iface_ctl_done_sync1;
rddata_reg(2) <= dma_iface_ctl_ovf_sync1;
rddata_reg(3) <= 'X';
rddata_reg(4) <= 'X';
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(4) <= '1';
ack_in_progress <= '1';
when "001" =>
if (wb_we_i = '1') then
dma_iface_tr_cntr_int <= wrdata_reg(31 downto 0);
dma_iface_tr_cntr_swb <= '1';
dma_iface_tr_cntr_swb_delay <= '1';
end if;
rddata_reg(31 downto 0) <= dma_iface_tr_cntr_int;
ack_sreg(3) <= '1';
ack_in_progress <= '1';
when "010" =>
if (wb_we_i = '1') then
end if;
if (dma_iface_fifo_c2b_rdreq_int_d0 = '0') then
dma_iface_fifo_c2b_rdreq_int <= not dma_iface_fifo_c2b_rdreq_int;
else
rddata_reg(31 downto 0) <= dma_iface_fifo_c2b_out_int(31 downto 0);
ack_in_progress <= '1';
ack_sreg(0) <= '1';
end if;
when "011" =>
if (wb_we_i = '1') then
end if;
rddata_reg(0) <= dma_iface_fifo_c2b_out_int(32);
rddata_reg(1) <= 'X';
rddata_reg(2) <= 'X';
rddata_reg(3) <= 'X';
rddata_reg(4) <= 'X';
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "100" =>
if (wb_we_i = '1') then
end if;
rddata_reg(16) <= dma_iface_fifo_c2b_full_int;
rddata_reg(17) <= dma_iface_fifo_c2b_empty_int;
rddata_reg(7 downto 0) <= dma_iface_fifo_c2b_usedw_int;
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "101" =>
if (wb_we_i = '1') then
dma_iface_fifo_b2c_in_int(31 downto 0) <= wrdata_reg(31 downto 0);
dma_iface_fifo_b2c_wrreq_int <= '1';
end if;
rddata_reg(0) <= 'X';
rddata_reg(1) <= 'X';
rddata_reg(2) <= 'X';
rddata_reg(3) <= 'X';
rddata_reg(4) <= 'X';
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "110" =>
if (wb_we_i = '1') then
end if;
rddata_reg(16) <= dma_iface_fifo_b2c_full_int;
rddata_reg(17) <= dma_iface_fifo_b2c_empty_int;
rddata_reg(7 downto 0) <= dma_iface_fifo_b2c_usedw_int;
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when others =>
-- prevent the slave from hanging the bus on invalid address
ack_in_progress <= '1';
ack_sreg(0) <= '1';
end case;
end if;
end if;
end if;
end process;
-- Drive the data output bus
wb_dat_o <= rddata_reg;
-- Start Transaction
process (data_clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
regs_o.ctl_start_o <= '0';
dma_iface_ctl_start_sync0 <= '0';
dma_iface_ctl_start_sync1 <= '0';
dma_iface_ctl_start_sync2 <= '0';
elsif rising_edge(data_clk_i) then
dma_iface_ctl_start_sync0 <= dma_iface_ctl_start_int;
dma_iface_ctl_start_sync1 <= dma_iface_ctl_start_sync0;
dma_iface_ctl_start_sync2 <= dma_iface_ctl_start_sync1;
regs_o.ctl_start_o <= dma_iface_ctl_start_sync2 and (not dma_iface_ctl_start_sync1);
end if;
end process;
-- DMA complete
-- synchronizer chain for field : DMA complete (type RO/WO, dma_clk_i -> clk_sys_i)
process (dma_clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_iface_ctl_done_sync0 <= '0';
dma_iface_ctl_done_sync1 <= '0';
elsif rising_edge(dma_clk_i) then
dma_iface_ctl_done_sync0 <= regs_i.ctl_done_i;
dma_iface_ctl_done_sync1 <= dma_iface_ctl_done_sync0;
end if;
end process;
-- DMA overflow
-- synchronizer chain for field : DMA overflow (type RO/WO, dma_clk_i -> clk_sys_i)
process (dma_clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_iface_ctl_ovf_sync0 <= '0';
dma_iface_ctl_ovf_sync1 <= '0';
elsif rising_edge(dma_clk_i) then
dma_iface_ctl_ovf_sync0 <= regs_i.ctl_ovf_i;
dma_iface_ctl_ovf_sync1 <= dma_iface_ctl_ovf_sync0;
end if;
end process;
-- Transactions Counter
-- asynchronous std_logic_vector register : Transactions Counter (type RW/RO, data_clk_i <-> clk_sys_i)
process (data_clk_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_iface_tr_cntr_swb_s0 <= '0';
dma_iface_tr_cntr_swb_s1 <= '0';
dma_iface_tr_cntr_swb_s2 <= '0';
regs_o.tr_cntr_o <= "00000000000000000000000000000000";
elsif rising_edge(data_clk_i) then
dma_iface_tr_cntr_swb_s0 <= dma_iface_tr_cntr_swb;
dma_iface_tr_cntr_swb_s1 <= dma_iface_tr_cntr_swb_s0;
dma_iface_tr_cntr_swb_s2 <= dma_iface_tr_cntr_swb_s1;
if ((dma_iface_tr_cntr_swb_s2 = '0') and (dma_iface_tr_cntr_swb_s1 = '1')) then
regs_o.tr_cntr_o <= dma_iface_tr_cntr_int;
end if;
end if;
end process;
-- extra code for reg/fifo/mem: FIFO C2B (Core -> DMA) synchronization
dma_iface_fifo_c2b_in_int(31 downto 0) <= regs_i.fifo_c2b_data_i;
dma_iface_fifo_c2b_in_int(32) <= regs_i.fifo_c2b_last_i;
dma_iface_fifo_c2b_rst_n <= rst_n_i;
dma_iface_fifo_c2b_INST : wbgen2_fifo_async
generic map (
g_size => 256,
g_width => 33,
g_usedw_size => 8
)
port map (
wr_req_i => regs_i.fifo_c2b_wr_req_i,
wr_full_o => regs_o.fifo_c2b_wr_full_o,
wr_empty_o => regs_o.fifo_c2b_wr_empty_o,
wr_usedw_o => regs_o.fifo_c2b_wr_usedw_o,
rd_full_o => dma_iface_fifo_c2b_full_int,
rd_empty_o => dma_iface_fifo_c2b_empty_int,
rd_usedw_o => dma_iface_fifo_c2b_usedw_int,
rd_req_i => dma_iface_fifo_c2b_rdreq_int,
rst_n_i => dma_iface_fifo_c2b_rst_n,
wr_clk_i => dma_clk_i,
rd_clk_i => clk_sys_i,
wr_data_i => dma_iface_fifo_c2b_in_int,
rd_data_o => dma_iface_fifo_c2b_out_int
);
-- extra code for reg/fifo/mem: FIFO B2C (Bus -> Core) synchronization
regs_o.fifo_b2c_data_o <= dma_iface_fifo_b2c_out_int(31 downto 0);
dma_iface_fifo_b2c_rst_n <= rst_n_i;
dma_iface_fifo_b2c_INST : wbgen2_fifo_async
generic map (
g_size => 256,
g_width => 32,
g_usedw_size => 8
)
port map (
rd_req_i => regs_i.fifo_b2c_rd_req_i,
rd_full_o => regs_o.fifo_b2c_rd_full_o,
rd_empty_o => regs_o.fifo_b2c_rd_empty_o,
rd_usedw_o => regs_o.fifo_b2c_rd_usedw_o,
wr_full_o => dma_iface_fifo_b2c_full_int,
wr_empty_o => dma_iface_fifo_b2c_empty_int,
wr_usedw_o => dma_iface_fifo_b2c_usedw_int,
wr_req_i => dma_iface_fifo_b2c_wrreq_int,
rst_n_i => dma_iface_fifo_b2c_rst_n,
rd_clk_i => data_clk_i,
wr_clk_i => clk_sys_i,
wr_data_i => dma_iface_fifo_b2c_in_int,
rd_data_o => dma_iface_fifo_b2c_out_int
);
-- extra code for reg/fifo/mem: FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 0
process (clk_sys_i, rst_n_i)
begin
if (rst_n_i = '0') then
dma_iface_fifo_c2b_rdreq_int_d0 <= '0';
elsif rising_edge(clk_sys_i) then
dma_iface_fifo_c2b_rdreq_int_d0 <= dma_iface_fifo_c2b_rdreq_int;
end if;
end process;
-- extra code for reg/fifo/mem: FIFO 'FIFO C2B (Core -> DMA) synchronization' data output register 1
-- extra code for reg/fifo/mem: FIFO 'FIFO B2C (Bus -> Core) synchronization' data input register 0
rwaddr_reg <= wb_adr_i;
wb_stall_o <= (not ack_sreg(0)) and (wb_stb_i and wb_cyc_i);
-- ACK signal generation. Just pass the LSB of ACK counter.
wb_ack_o <= ack_sreg(0);
end syn;
-- Description of the wishbone interface for the wb_dma_interface core
peripheral {
name = "Wishbone DMA Streaming Interface";
description = "Simple Wishbone DMA interface for peripherals which want to stream data to a DMA";
-- Prefix for all generated ports
prefix = "dma_iface";
-- Name of the vhdl entity to be generated
hdl_entity = "wb_dma_interface_port";
mode = PIPELINED;
-- Control Register
reg {
name = "Control/Status register";
description = "A register defining the Control and Status of the core.";
prefix = "ctl";
field {
name = "Start Transaction";
description = "write 1: starts the DMA transaction.\
write 0: no effect";
prefix = "start";
-- Pulse to start
type = MONOSTABLE;
clock = "data_clk_i";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
field {
name = "DMA complete";
description = "read 1: the DMA has completed the transaction\
read 0: DMA transaction still in progress";
prefix = "done";
type = BIT;
clock = "dma_clk_i";
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
field {
name = "DMA overflow";
description = "read 1: the DMA overflow detected\
read 0: No overflow detected";
prefix = "ovf";
type = BIT;
clock = "dma_clk_i";
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
};
-- Transaction Counter Register
reg {
name = "Transaction Counter";
description = "Register holding the word count to be transfered to DMA";
prefix = "tr_cntr";
field {
name = "Transactions Counter";
description = "Stores the words to be transfered to DMA";
--prefix = "";
type = SLV;
size = 32;
clock = "data_clk_i";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
-- Bus = Read, Core = Write (Core -> Bus)
fifo_reg {
size = 256;
direction = CORE_TO_BUS;
prefix = "fifo_c2b";
name = "FIFO C2B (Core -> DMA) synchronization";
description = "Data to to be written to DMA";
flags_bus = {FIFO_FULL, FIFO_EMPTY, FIFO_COUNT};
flags_dev = {FIFO_FULL, FIFO_EMPTY, FIFO_COUNT};
clock = "dma_clk_i";
--mode = PIPELINED;
field {
name = "Output FIFO data value";
description = "Value of data word synchronized to the core clock";
prefix = "data";
type = SLV;
size = 32;
};
field {
name = "Transaction Last Data";
description = "0: Current entry is not the last transaction data\
1: Current entry is the last transaction data";
prefix = "last";
type = BIT;
};
};
-- Bus = Write, Core = Read (Bus -> Core)
fifo_reg {
size = 256;
direction = BUS_TO_CORE;
prefix = "fifo_b2c";
name = "FIFO B2C (Bus -> Core) synchronization";
flags_bus = {FIFO_FULL, FIFO_EMPTY, FIFO_COUNT};
flags_dev = {FIFO_FULL, FIFO_EMPTY, FIFO_COUNT};
clock = "data_clk_i";
--mode = PIPELINED;
field {
name = "Input FIFO data value";
description = "Value of data word synchronized to the core clock";
prefix = "data";
type = SLV;
size = 32;
};
};
};
------------------------------------------------------------------------------
-- dma_if.vhd - entity/architecture pair
------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.genram_pkg.all;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
use work.custom_wishbone_pkg.all;
use work.custom_common_pkg.all;
------------------------------------------------------------------------------
-- Entity section
------------------------------------------------------------------------------
entity wb_dma_interface is
generic(
g_ovf_counter_width : natural := 10
);
port(
-- Asynchronous Reset signal
arst_n_i : in std_logic;
-- Write Domain Clock
--dma_valid_o : out std_logic;
--dma_data_o : out std_logic_vector(C_NBITS_DATA_INPUT-1 downto 0);
--dma_be_o : out std_logic_vector(C_NBITS_DATA_INPUT/8 - 1 downto 0);
--dma_last_o : out std_logic;
--dma_ready_i : in std_logic;
-- Clock Data Sink Input.
dma_clk_i : in std_logic;
-- Slave Data Sink port. To/From Data Sink Core
wb_sink_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
wb_sink_cyc_i : in std_logic;
wb_sink_stb_i : in std_logic;
wb_sink_we_i : in std_logic;
wb_sink_adr_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_sink_dat_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_sink_dat_o : out std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_sink_ack_o : out std_logic;
wb_sink_stall_o : out std_logic;
-- Clock Data Source Input.
data_clk_i : in std_logic;
-- Slave Data Source port. To/From Data Source Core
wb_src_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
wb_src_cyc_i : in std_logic;
wb_src_stb_i : in std_logic;
wb_src_we_i : in std_logic;
wb_src_adr_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_src_dat_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_src_dat_o : out std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_src_ack_o : out std_logic;
wb_src_stall_o : out std_logic;
-- Slave Data Source port. To/From Data Source Core
wb_ctl_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
wb_ctl_cyc_i : in std_logic;
wb_ctl_stb_i : in std_logic;
wb_ctl_we_i : in std_logic;
wb_ctl_adr_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_ctl_dat_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_ctl_dat_o : out std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_ctl_ack_o : out std_logic;
wb_ctl_stall_o : out std_logic;
-- Slave Data Input Port
--data_slave_i : in t_wishbone_slave_in;
--data_slave_o : out t_wishbone_slave_out;
--data_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
--data_valid_i : in std_logic;
--data_ready_o : out std_logic;
-- Slave control port. use wbgen2 tool or not if it is simple.
--control_slave_i : in t_wishbone_slave_in;
--control_slave_o : out t_wishbone_slave_out;
--capture_ctl_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
--dma_complete_o : out std_logic;
--dma_ovf_o : out std_logic
-- Debug Signals
--dma_debug_clk_o : out std_logic;
--dma_debug_data_o : out std_logic_vector(255 downto 0);
--dma_debug_trigger_o : out std_logic_vector(15 downto 0)
);
end wb_dma_interface;
architecture rtl of wb_dma_interface is
--constant C_DATA_SIZE : natural := 32;
--constant C_OVF_COUNTER_SIZE : natural := 10;
-- FIFO signals index
--constant c_X_DATA : natural := 3;
--constant c_Y_DATA : natural := 2;
--constant c_Z_DATA : natural := 1;
--constant c_W_DATA : natural := 0;
-- Fifo Depth = 8K words * 32 bits/word
constant c_fifo_size : natural := 1024;
-- Register definition
constant c_FIFO_REG : std_logic_vector(2 downto 0) := "000";
------------------------------------------
-- Wishbone and Finite State Machine Signals
------------------------------------------
--type t_wishbone_state is (IDLE, CLASSIC, CABURST, EOBURST);
--signal wb_state : t_wishbone_state := IDLE;
signal cycle_progress : std_logic;
signal read_cycle_progress : std_logic;
signal write_cycle_progress : std_logic;
signal ack_int : std_logic;
signal stall_int : std_logic;
------------------------------------------
-- FIFO Signals
------------------------------------------
subtype fifo_data is std_logic_vector(c_wishbone_data_width downto 0);
--subtype fifo_count is std_logic_vector(12 downto 0);
subtype fifo_ctrl is std_logic;
--signal fifo_do_concat : std_logic_vector(C_NBITS_VALID_INPUT-1 downto 0);
signal data_i_d1 : std_logic_vector(c_wishbone_data_width-1 downto 0);
-- read data_i: 32-bit (each) output: read output data_i
signal fifo_do : fifo_data;
-- status: 1-bit (each) output: flags and other fifo status outputs
signal fifo_empty : fifo_ctrl;
signal fifo_full : fifo_ctrl;
-- read control signals: 1-bit (each) input: read clock, enable and reset input signals
signal fifo_rdclk : fifo_ctrl;
signal fifo_rden : fifo_ctrl;
signal fifo_rst_n : fifo_ctrl;
-- counter fifo signals
--signal fifo_rd_data_count : fifo_count;
--signal fifo_wr_data_count : fifo_count;
-- write control signals: 1-bit (each) input: write clock and enable input signals
signal fifo_wrclk : fifo_ctrl;
signal fifo_wren : fifo_ctrl;
-- write data_i: 32-bit (each) input: write input data_i
signal fifo_di : fifo_data;
signal last_data_reg : std_logic;
-- Overflow counter. One extra bit for easy overflow detection
signal s_fifo_ovf_c : std_logic_vector(g_ovf_counter_width downto 0);
signal s_fifo_ovf : std_logic;
------------------------------------------
-- Internal Control
------------------------------------------
signal capture_ctl_reg : std_logic_vector(c_wishbone_data_width-1 downto 0);
signal start_acq : std_logic;
signal start_acq_trig : std_logic;
------------------------------------------
-- Reset Synch
------------------------------------------
signal data_clk_rst_n : std_logic;
signal dma_clk_rst_n : std_logic;
------------------------------------------
-- DMA output signals
------------------------------------------
-- C_NBITS_DATA_INPUT+1 bits. C_NBITS_DATA_INPUT bits (LSBs) for data_i and 1 bit (MSB) for last data_i bit
signal dma_data_out0 : std_logic_vector(c_wishbone_data_width downto 0);
signal dma_valid_out0 : std_logic;
signal dma_data_out1 : std_logic_vector(c_wishbone_data_width downto 0);
signal dma_valid_out1 : std_logic;
signal dma_data_out2 : std_logic_vector(c_wishbone_data_width downto 0);
signal dma_valid_out2 : std_logic;
signal dma_data_out3 : std_logic_vector(c_wishbone_data_width downto 0);
signal dma_valid_out3 : std_logic;
signal dma_valid_s : std_logic;
signal dma_ready_s : std_logic;
signal dma_last_s : std_logic;
signal s_last_data : std_logic;
signal dma_valid_reg0 : std_logic;
-- Counter to coordinate the FIFO output - DMA input
signal output_counter_rd : std_logic_vector(1 downto 0);
signal pre_output_counter_wr : std_logic_vector(1 downto 0);
-- Internal signals
signal dma_complete_int : std_logic;
signal dma_last_int : std_logic;
signal dma_valid_int : std_logic;
signal dma_data_int : std_logic_vector(c_wishbone_data_width-1 downto 0);
-- Functions. Improve this function. Not generic.
function f_end_counter(counter : std_logic_vector(c_wishbone_data_width-1 downto 0))
return boolean is
begin
if counter(c_wishbone_data_width-1) = '1' and
unsigned(counter(c_wishbone_data_width-2 downto 0)) = 0 then
return true;
else
return false;
end if;
end f_end_counter;
begin
-- DMA signals glue
--dma_last_o <= s_dma_last_glue;
--dma_valid_o <= s_dma_valid_glue;
--dma_data_o <= s_dma_data_glue;
-- Debug data_i
--dma_debug_clk_o <= dma_clk_i;
--
--dma_debug_trigger_o(15 downto 6) <= (others => '0');
--dma_debug_trigger_o(5) <= fifo_full(C_W_DATA);
--dma_debug_trigger_o(4) <= start_acq_trig;
--dma_debug_trigger_o(3) <= capture_ctl_reg(21);
--dma_debug_trigger_o(2) <= dma_ready_i;
--dma_debug_trigger_o(1) <= s_dma_last_glue;
--dma_debug_trigger_o(0) <= s_dma_valid_glue;
--
--dma_debug_data_o(255 downto 120) <= (others => '0');
--dma_debug_data_o(119 downto 109) <= s_fifo_ovf_c(10 downto 0);
--dma_debug_data_o(108) <= s_dma_complete;
--dma_debug_data_o(107) <= start_acq_trig;
--dma_debug_data_o(106) <= fifo_full(C_W_DATA);
--dma_debug_data_o(105 downto 84) <= capture_ctl_reg;
--dma_debug_data_o(83 downto 52) <= s_dma_data_glue(31 downto 0);
--dma_debug_data_o(51 downto 36) <= fifo_do(C_W_DATA)(15 downto 0);-- FIXXXX
--dma_debug_data_o(35 downto 34) <= output_counter_rd;
--dma_debug_data_o(33 downto 32) <= pre_output_counter_wr;
--dma_debug_data_o(31 downto 19) <= fifo_wr_data_count(C_W_DATA);--(5 downto 0);
--dma_debug_data_o(18 downto 6) <= fifo_rd_data_count(C_W_DATA);--(5 downto 0);
--dma_debug_data_o(5) <= dma_ready_s;
--dma_debug_data_o(4) <= dma_valid_reg0;
--dma_debug_data_o(3) <= dma_valid_s;
--dma_debug_data_o(2) <= dma_ready_i;
--dma_debug_data_o(1) <= s_dma_last_glue;
--dma_debug_data_o(0) <= s_dma_valid_glue;
--------------------------------
-- Wishbone interface instantiation
--------------------------------
--wb_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
--wb_cyc_i : in std_logic;
--wb_stb_i : in std_logic;
--wb_we_i : in std_logic;
--wb_adr_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
--wb_dat_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
--wb_cti_i : in std_logic_vector(2 downto 0);
--wb_bte_i : in std_logic_vector(1 downto 0);
wb_dat_o <= dma_data_int;
wb_ack_o <= ack_int;
wb_stall_o <= stall_int;
--FIXXX
-- Hard-wired slave pins
--slave_o.ACK <= slave_o_ACK;
--slave_o.ERR <= '0';
--slave_o.RTY <= '0';
--slave_o.STALL <= '0';
--slave_o.DAT <= slave_o_DAT;
-- Hard-wired master pins
--r_master_o.CYC <= r_master_o_CYC;
--w_master_o.CYC <= w_master_o_CYC;
--r_master_o.STB <= r_master_o_STB;
--w_master_o.STB <= w_master_o_STB;
--r_master_o.ADR <= read_issue_address;
--w_master_o.ADR <= write_issue_address;
--r_master_o.SEL <= (others => '1');
--w_master_o.SEL <= (others => '1');
--r_master_o.WE <= '0';
--w_master_o.WE <= '1';
--r_master_o.DAT <= (others => '0');
--w_master_o.DAT <= ring(index(write_issue_offset));
--------------------------------
-- Reset Logic
--------------------------------
-- FIFO reset cycle: RST must be held high for at least three RDCLK clock cycles,
-- and RDEN must be low for four clock cycles before RST becomes active high, and RDEN
-- remains low during this reset cycle.
-- Guarantees the synchronicity with the input clock on reset deassertion
cmp_reset_synch_dma : reset_synch
port map(
clk_i => dma_clk_i,
arst_n_i => arst_n_i,
rst_n_o => dma_clk_rst_n
);
cmp_reset_synch_data : reset_synch
port map(
clk_i => data_clk_i,
arst_n_i => arst_n_i,
rst_n_o => data_clk_rst_n
);
--------------------------------
-- Start Acquisition logic
--------------------------------
-- Simple trigger detector 0 -> 1 for start_acq.
-- Synchronize with bus clock data_clk_i might not be the same
p_start_acq_trig : gc_sync_ffs
generic map (
g_sync_edge => "positive")
port map (
rst_n_i => data_clk_rst_n,
clk_i => data_clk_i,
data_i => start_acq,
synced_o => start_acq_trig,
npulse_o => open
);
-- MSB bit representing the start acquisition signal
start_acq <= capture_ctl_i(c_wishbone_data_width-1);
--------------------------------
-- Samples Counter Logic
--------------------------------
-- Hold counter for "capture_count" clock cycles
p_samples_counter : process (data_clk_i, data_clk_rst_n)
begin
if data_clk_rst_n = '0' then
capture_ctl_reg <= (others => '0');
elsif rising_edge(data_clk_i) then
-- start counting and stop only when we have input all data to fifos
if capture_ctl_reg(c_wishbone_data_width-1) = '1' and
data_valid_i = '1' and fifo_full = '0' then
capture_ctl_reg <= std_logic_vector(unsigned(capture_ctl_reg) - 1);
-- assign only when 0 -> 1 transition of MSB of start_acq. MSB of capture_ctl_reg
elsif start_acq_trig = '1' then
if data_valid_i = '1' then
-- MSB of capture_ctl_i might not be 1 by this time. Force to 1 then...
capture_ctl_reg <= '1' & std_logic_vector(unsigned(capture_ctl_i(c_wishbone_data_width-2 downto 0)) - 1);
else
-- Do not decrement now. wait until data_valid is set
capture_ctl_reg <= '1' & std_logic_vector(unsigned(capture_ctl_i(c_wishbone_data_width-2 downto 0)));
end if;
end if;
end if;
end process p_samples_counter;
--------------------------------
-- DMA Last Data Logic
--------------------------------
p_last_data_proc : process(data_clk_i, data_clk_rst_n)
begin
if data_clk_rst_n = '0' then
last_data_reg <= '0';
elsif rising_edge(data_clk_i) then
last_data_reg <= s_last_data;
end if;
end process p_last_data_proc;
-- bit c_wishbone_data_width-1 = 1 and bits c_wishbone_data_width-2 downto 0 = 0
s_last_data <= '1' when
f_end_counter(capture_ctl_reg(c_wishbone_data_width-1 downto 0)) and data_valid_i = '1' else '0';
--------------------------------
-- FIFO Write Enable Logic
--------------------------------
p_fifo_wr_en : process(data_clk_i, data_clk_rst_n)
begin
if data_clk_rst_n = '0' then
fifo_wren <= '0';
data_i_d1 <= (others => '0');
elsif rising_edge(data_clk_i) then
-- We only need to consider one as all FIFOs are synchronized with each other
if fifo_full = '0' then
-- input data to fifo only when data is valid
fifo_wren <= capture_ctl_reg(c_wishbone_data_width-1) and data_valid_i;
end if;
--Necessary in order to input data to FIFO correctly as fifo_wren is registered
data_i_d1 <= data_i;
end if;
end process p_fifo_wr_en;
p_gen_ack : process (dma_clk_i, dma_clk_rst_n)
begin
if dma_clk_rst_n = '0' then
ack_int <= '0';
elsif rising_edge(dma_clk_i) then
if cycle_progress = '1' and wb_we_i = '0' and dma_valid_int = '1' then
ack_int <= '1';
else
ack_int <= '0';
end if;
end if;
end process;
p_gen_stall : process (dma_valid_s)
begin
stall_int <= dma_valid_s;
end process;
--------------------------------
-- DMA Output Logic
--------------------------------
cycle_progress <= wb_cyc_i and wb_stb_i; --and wb_we_i = '0';
read_cycle_progress <= cycle_progress and not wb_we_i;
write_cycle_progress <= cycle_progress and wb_we_i;
--dma_ready_s <= dma_ready_i or not s_dma_valid_glue;
dma_ready_s <= read_cycle_progress or not dma_valid_int;
-- fifo is not empty and dma is ready
--dma_valid_s <= '0' when fifo_empty = '1' else read_cycle_progress;
dma_valid_s <= not fifo_empty or read_cycle_progress;
-- We have a 2 output delay for FIFO. That being said, if we have a dma_ready_i signal it will take 2 dma clock cycles
-- in order to read the data_i from FIFO.
-- By this time, dma_ready_i might not be set and we have to wait for it. To solve this 2 delay read cycle
-- it is employed a small 4 position "buffer" to hold the values read from fifo but not yet passed to the DMA.
-- Note that dma_valid_reg0 is 1 clock cycle delayed in relation to dma_valid_s. That should give time to
-- FIFO output the data_i requested. Also not that that difference between pre_output_counter_wr and output_counter_rd
-- is at most (at any given point in time) not greater than 2. Thus, with a 2 bit counter, we will not have overflow
p_dma_pre_output : process(dma_clk_i, dma_clk_rst_n)
begin
if dma_clk_rst_n = '0' then
dma_data_out0 <= (others => '0');
dma_valid_out0 <= '0';
dma_data_out1 <= (others => '0');
dma_valid_out1 <= '0';
dma_data_out2 <= (others => '0');
dma_valid_out2 <= '0';
dma_data_out3 <= (others => '0');
dma_valid_out3 <= '0';
dma_valid_reg0 <= '0';
pre_output_counter_wr <= (others => '0');
-- fifo is not empty and dma is ready
elsif rising_edge(dma_clk_i) then
--if dma_valid_reg1 = '1' then -- fifo output should be valid by now as fifo_rden was enabled and it id not empty!
-- Store output from FIFO in the correct dma_data_outX if dma_valid_reg1 is valid.
-- On the next dma_valid_reg1 operation (next clock cycle if dma_valid_reg1 remains 1),
-- clear the past dma_data_outX if dma has read from it (read pointer is in the past write position).
if pre_output_counter_wr = "00" and dma_valid_reg0 = '1' then
-- Output only the last_data bit of fifo_do
dma_data_out0(c_wishbone_data_width) <= fifo_do(c_wishbone_data_width);
-- Output the data from fifo itself
dma_data_out0(c_wishbone_data_width-1 downto 0) <= fifo_do(c_wishbone_data_width-1 downto 0);
dma_valid_out0 <= '1';
elsif output_counter_rd = "00" and dma_ready_s = '1' then
dma_data_out0 <= (others => '0');
dma_valid_out0 <= '0';
end if;
if pre_output_counter_wr = "01" and dma_valid_reg0 = '1' then
dma_data_out1(c_wishbone_data_width) <= fifo_do(c_wishbone_data_width);
dma_data_out1(c_wishbone_data_width-1 downto 0) <= fifo_do(c_wishbone_data_width-1 downto 0);
dma_valid_out1 <= '1';
elsif output_counter_rd = "01" and dma_ready_s = '1' then
dma_data_out1 <= (others => '0');
dma_valid_out1 <= '0';
end if;
if pre_output_counter_wr = "10" and dma_valid_reg0 = '1' then
dma_data_out2(c_wishbone_data_width) <= fifo_do(c_wishbone_data_width);
dma_data_out2(c_wishbone_data_width-1 downto 0) <= fifo_do(c_wishbone_data_width-1 downto 0);
dma_valid_out2 <= '1';
elsif output_counter_rd = "10" and dma_ready_s = '1' then
dma_data_out2 <= (others => '0');
dma_valid_out2 <= '0';
end if;
if pre_output_counter_wr = "11" and dma_valid_reg0 = '1' then
dma_data_out3(c_wishbone_data_width) <= fifo_do(c_wishbone_data_width);
dma_data_out3(c_wishbone_data_width-1 downto 0) <= fifo_do(c_wishbone_data_width-1 downto 0);
dma_valid_out3 <= '1';
elsif output_counter_rd = "11" and dma_ready_s = '1' then
dma_data_out3 <= (others => '0');
dma_valid_out3 <= '0';
end if;
if dma_valid_reg0 = '1' then --dma_valid_reg0 = '1' then
pre_output_counter_wr <= std_logic_vector(unsigned(pre_output_counter_wr) + 1);
end if;
-- 2 clock cycle delay for read from fifo.
-- Nedded to break logic into one more FF as timing constraint wasn't met,
-- due to the use of dma_valid_s directly into fifo_rden.
-- This is not a problem since there is a 4 position "buffer" after this
-- to absorb dma_ready_i deassertion
dma_valid_reg0 <= dma_valid_s;
end if;
end process p_dma_pre_output;
-- Send to DMA the correct data_i from dma_data_out, based on the currently read pointer position
p_dma_output_proc : process(dma_clk_i, dma_clk_rst_n)
begin
if dma_clk_rst_n = '0' then
dma_data_int <= (others => '0');
dma_valid_int <= '0';
--dma_be_o <= (others => '0');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= '0';
output_counter_rd <= (others => '0');
elsif rising_edge(dma_clk_i) then
if dma_ready_s = '1' then
-- verify wr counter and output corresponding output
case output_counter_rd is
when "11" =>
dma_data_int <= dma_data_out3(c_wishbone_data_width-1 downto 0);
dma_valid_int <= dma_valid_out3;
--dma_be_o <= (others => '1');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= dma_data_out3(c_wishbone_data_width) and dma_valid_out3;
when "10" =>
dma_data_int <= dma_data_out2(c_wishbone_data_width-1 downto 0);
dma_valid_int <= dma_valid_out2;
--dma_be_o <= (others => '1');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= dma_data_out2(c_wishbone_data_width) and dma_valid_out2;
when "01" =>
dma_data_int <= dma_data_out1(c_wishbone_data_width-1 downto 0);
dma_valid_int <= dma_valid_out1;
--dma_be_o <= (others => '1');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= dma_data_out1(c_wishbone_data_width) and dma_valid_out1;
--when "01" =>
when others =>
dma_data_int <= dma_data_out0(c_wishbone_data_width-1 downto 0);
dma_valid_int <= dma_valid_out0;
--dma_be_o <= (others => '1');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= dma_data_out0(c_wishbone_data_width) and dma_valid_out0;
end case;
-- Only increment output_counter_rd if it is different from pre_output_counter_wr
-- to prevent overflow!
if output_counter_rd /= pre_output_counter_wr then
output_counter_rd <= std_logic_vector(unsigned(output_counter_rd) + 1);
end if;
end if;
end if;
end process p_dma_output_proc;
-- Simple backpressure scheme. Should be almost full for correct behavior.
-- fifo_full is already synchronized with fifo write_clock
data_ready_o <= not fifo_full;
--------------------------------
-- DMA complete status
--------------------------------
dma_last_s <= dma_valid_int and read_cycle_progress and dma_last_int;
p_dma_complete : process (dma_clk_i, dma_clk_rst_n)
begin
if dma_clk_rst_n = '0' then
dma_complete_int <= '0';
elsif rising_edge(dma_clk_i) then
if dma_last_s = '1' then
-- DMA could be held to 1 when completed, but it would be more difficult
-- to bring it back to 0, since the dma transfer is initiated in the data_clk_i domain
dma_complete_int <= not dma_complete_int;
end if;
end if;
end process p_dma_complete;
dma_complete_o <= dma_complete_int;
--------------------------------
-- DMA overflow (fifo full) status and counter
--------------------------------
-- Data is lost when this is asserted.
-- FIFO is full, there is data valid on input and we are in the middle of a dma transfer
s_fifo_ovf <= fifo_full and data_valid_i and
capture_ctl_reg(c_wishbone_data_width-1);
p_dma_overflow : process (data_clk_i, data_clk_rst_n)
begin
if data_clk_rst_n = '0' then
s_fifo_ovf_c <= (others => '0');
elsif rising_edge(data_clk_i) then
if start_acq_trig = '1' then
s_fifo_ovf_c <= (others => '0');
elsif s_fifo_ovf = '1' then
-- Even if the counter wrapps around, an overflow will still be detected!
s_fifo_ovf_c <= '1' & std_logic_vector(unsigned(s_fifo_ovf_c(g_ovf_counter_width-1 downto 0)) + 1);
end if;
end if;
end process p_dma_overflow;
dma_ovf_o <= s_fifo_ovf_c(g_ovf_counter_width);
--------------------------------
-- FIFO instantiation
--------------------------------
cmp_fifo : generic_async_fifo
generic map(
g_data_width => c_wishbone_data_width+1,
g_size => c_fifo_size,
-- Read-side flag selection
g_with_rd_empty => true, -- with empty flag
--g_with_rd_count => false, -- with words counter
--g_with_wr_empty => false,
g_with_wr_full => true
--g_with_wr_count => false,
--g_almost_empty_threshold => ?, -- threshold for almost empty flag
--g_almost_full_threshold => ? -- threshold for almost full flag
)
port map(
rst_n_i => fifo_rst_n,
-- write port
clk_wr_i => fifo_wrclk,
d_i => fifo_di,
we_i => fifo_wren,
wr_empty_o => open,
wr_full_o => fifo_full,
wr_almost_empty_o => open,
wr_almost_full_o => open,
wr_count_o => open,
-- read port
clk_rd_i => fifo_rdclk,
q_o => fifo_do,
rd_i => fifo_rden,
rd_empty_o => fifo_empty,
rd_full_o => open,
rd_almost_empty_o => open,
rd_almost_full_o => open,
rd_count_o => open
);
fifo_rst_n <= arst_n_i;
fifo_rden <= dma_valid_s;
fifo_rdclk <= dma_clk_i;
-- Observe the FIFO reset cycle! dma_clk_buf is the clock for fifo_rd_en
fifo_wrclk <= data_clk_i;
-- -- c_wishbone_data_width + 1 bits.
-- -- It doesn't matter if the data_i is signed or unsigned since we do not care what the input data is.
-- -- The user has to treat this and extend the sign if necessary.
fifo_di <= last_data_reg & data_i_d1;
end rtl;
------------------------------------------------------------------------------
-- dma_if.vhd - entity/architecture pair
------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.genram_pkg.all;
use work.gencores_pkg.all;
use work.wishbone_pkg.all;
use work.custom_wishbone_pkg.all;
use work.custom_common_pkg.all;
------------------------------------------------------------------------------
-- Entity section
------------------------------------------------------------------------------
entity wb_dma_interface is
port(
---------------------
-- Source Interface
---------------------
clk_i : in std_logic;
rst_n_i : in std_logic;
-- Wishbone Fabric Interface I/O
src_i : in t_wbs_source_in;
src_o : out t_wbs_source_out;
-- Decoded & buffered logic
addr_i : in std_logic_vector(c_wbs_address_width-1 downto 0);
data_i : in std_logic_vector(c_wbs_data_width-1 downto 0);
dvalid_i : in std_logic;
sof_i : in std_logic;
eof_i : in std_logic;
error_i : in std_logic;
bytesel_i : in std_logic;
dreq_o : out std_logic
---------------------
-- Sink Interface
---------------------
clk_i : in std_logic;
rst_n_i : in std_logic;
-- Wishbone Fabric Interface I/O
snk_i : in t_wbs_sink_in;
snk_o : out t_wbs_sink_out;
-- Decoded & buffered fabric
addr_o : out std_logic_vector(c_wbs_address_width-1 downto 0);
data_o : out std_logic_vector(c_wbs_data_width-1 downto 0);
dvalid_o : out std_logic;
sof_o : out std_logic;
eof_o : out std_logic;
error_o : out std_logic;
bytesel_o : out std_logic;
dreq_i : in std_logic
);
end wb_dma_interface;
architecture rtl of wb_dma_interface is
--constant C_DATA_SIZE : natural := 32;
--constant C_OVF_COUNTER_SIZE : natural := 10;
-- FIFO signals index
--constant c_X_DATA : natural := 3;
--constant c_Y_DATA : natural := 2;
--constant c_Z_DATA : natural := 1;
--constant c_W_DATA : natural := 0;
-- Fifo Depth = 8K words * 32 bits/word
constant c_fifo_size : natural := 1024;
-- Register definition
constant c_FIFO_REG : std_logic_vector(2 downto 0) := "000";
------------------------------------------
-- Wishbone and Finite State Machine Signals
------------------------------------------
--type t_wishbone_state is (IDLE, CLASSIC, CABURST, EOBURST);
--signal wb_state : t_wishbone_state := IDLE;
signal cycle_progress : std_logic;
signal read_cycle_progress : std_logic;
signal write_cycle_progress : std_logic;
signal ack_int : std_logic;
signal stall_int : std_logic;
------------------------------------------
-- FIFO Signals
------------------------------------------
subtype fifo_data is std_logic_vector(c_wishbone_data_width downto 0);
--subtype fifo_count is std_logic_vector(12 downto 0);
subtype fifo_ctrl is std_logic;
--signal fifo_do_concat : std_logic_vector(C_NBITS_VALID_INPUT-1 downto 0);
signal data_i_d1 : std_logic_vector(c_wishbone_data_width-1 downto 0);
-- read data_i: 32-bit (each) output: read output data_i
signal fifo_do : fifo_data;
-- status: 1-bit (each) output: flags and other fifo status outputs
signal fifo_empty : fifo_ctrl;
signal fifo_full : fifo_ctrl;
-- read control signals: 1-bit (each) input: read clock, enable and reset input signals
signal fifo_rdclk : fifo_ctrl;
signal fifo_rden : fifo_ctrl;
signal fifo_rst_n : fifo_ctrl;
-- counter fifo signals
--signal fifo_rd_data_count : fifo_count;
--signal fifo_wr_data_count : fifo_count;
-- write control signals: 1-bit (each) input: write clock and enable input signals
signal fifo_wrclk : fifo_ctrl;
signal fifo_wren : fifo_ctrl;
-- write data_i: 32-bit (each) input: write input data_i
signal fifo_di : fifo_data;
signal last_data_reg : std_logic;
-- Overflow counter. One extra bit for easy overflow detection
signal s_fifo_ovf_c : std_logic_vector(g_ovf_counter_width downto 0);
signal s_fifo_ovf : std_logic;
------------------------------------------
-- Internal Control
------------------------------------------
signal capture_ctl_reg : std_logic_vector(c_wishbone_data_width-1 downto 0);
signal start_acq : std_logic;
signal start_acq_trig : std_logic;
------------------------------------------
-- Reset Synch
------------------------------------------
signal data_clk_rst_n : std_logic;
signal dma_clk_rst_n : std_logic;
------------------------------------------
-- DMA output signals
------------------------------------------
-- C_NBITS_DATA_INPUT+1 bits. C_NBITS_DATA_INPUT bits (LSBs) for data_i and 1 bit (MSB) for last data_i bit
signal dma_data_out0 : std_logic_vector(c_wishbone_data_width downto 0);
signal dma_valid_out0 : std_logic;
signal dma_data_out1 : std_logic_vector(c_wishbone_data_width downto 0);
signal dma_valid_out1 : std_logic;
signal dma_data_out2 : std_logic_vector(c_wishbone_data_width downto 0);
signal dma_valid_out2 : std_logic;
signal dma_data_out3 : std_logic_vector(c_wishbone_data_width downto 0);
signal dma_valid_out3 : std_logic;
signal dma_valid_s : std_logic;
signal dma_ready_s : std_logic;
signal dma_last_s : std_logic;
signal s_last_data : std_logic;
signal dma_valid_reg0 : std_logic;
-- Counter to coordinate the FIFO output - DMA input
signal output_counter_rd : std_logic_vector(1 downto 0);
signal pre_output_counter_wr : std_logic_vector(1 downto 0);
-- Internal signals
signal dma_complete_int : std_logic;
signal dma_last_int : std_logic;
signal dma_valid_int : std_logic;
signal dma_data_int : std_logic_vector(c_wishbone_data_width-1 downto 0);
-- Functions. Improve this function. Not generic.
function f_end_counter(counter : std_logic_vector(c_wishbone_data_width-1 downto 0))
return boolean is
begin
if counter(c_wishbone_data_width-1) = '1' and
unsigned(counter(c_wishbone_data_width-2 downto 0)) = 0 then
return true;
else
return false;
end if;
end f_end_counter;
begin
-- DMA signals glue
--dma_last_o <= s_dma_last_glue;
--dma_valid_o <= s_dma_valid_glue;
--dma_data_o <= s_dma_data_glue;
-- Debug data_i
--dma_debug_clk_o <= dma_clk_i;
--
--dma_debug_trigger_o(15 downto 6) <= (others => '0');
--dma_debug_trigger_o(5) <= fifo_full(C_W_DATA);
--dma_debug_trigger_o(4) <= start_acq_trig;
--dma_debug_trigger_o(3) <= capture_ctl_reg(21);
--dma_debug_trigger_o(2) <= dma_ready_i;
--dma_debug_trigger_o(1) <= s_dma_last_glue;
--dma_debug_trigger_o(0) <= s_dma_valid_glue;
--
--dma_debug_data_o(255 downto 120) <= (others => '0');
--dma_debug_data_o(119 downto 109) <= s_fifo_ovf_c(10 downto 0);
--dma_debug_data_o(108) <= s_dma_complete;
--dma_debug_data_o(107) <= start_acq_trig;
--dma_debug_data_o(106) <= fifo_full(C_W_DATA);
--dma_debug_data_o(105 downto 84) <= capture_ctl_reg;
--dma_debug_data_o(83 downto 52) <= s_dma_data_glue(31 downto 0);
--dma_debug_data_o(51 downto 36) <= fifo_do(C_W_DATA)(15 downto 0);-- FIXXXX
--dma_debug_data_o(35 downto 34) <= output_counter_rd;
--dma_debug_data_o(33 downto 32) <= pre_output_counter_wr;
--dma_debug_data_o(31 downto 19) <= fifo_wr_data_count(C_W_DATA);--(5 downto 0);
--dma_debug_data_o(18 downto 6) <= fifo_rd_data_count(C_W_DATA);--(5 downto 0);
--dma_debug_data_o(5) <= dma_ready_s;
--dma_debug_data_o(4) <= dma_valid_reg0;
--dma_debug_data_o(3) <= dma_valid_s;
--dma_debug_data_o(2) <= dma_ready_i;
--dma_debug_data_o(1) <= s_dma_last_glue;
--dma_debug_data_o(0) <= s_dma_valid_glue;
--------------------------------
-- Wishbone interface instantiation
--------------------------------
--wb_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
--wb_cyc_i : in std_logic;
--wb_stb_i : in std_logic;
--wb_we_i : in std_logic;
--wb_adr_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
--wb_dat_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
--wb_cti_i : in std_logic_vector(2 downto 0);
--wb_bte_i : in std_logic_vector(1 downto 0);
wb_dat_o <= dma_data_int;
wb_ack_o <= ack_int;
wb_stall_o <= stall_int;
--FIXXX
-- Hard-wired slave pins
--slave_o.ACK <= slave_o_ACK;
--slave_o.ERR <= '0';
--slave_o.RTY <= '0';
--slave_o.STALL <= '0';
--slave_o.DAT <= slave_o_DAT;
-- Hard-wired master pins
--r_master_o.CYC <= r_master_o_CYC;
--w_master_o.CYC <= w_master_o_CYC;
--r_master_o.STB <= r_master_o_STB;
--w_master_o.STB <= w_master_o_STB;
--r_master_o.ADR <= read_issue_address;
--w_master_o.ADR <= write_issue_address;
--r_master_o.SEL <= (others => '1');
--w_master_o.SEL <= (others => '1');
--r_master_o.WE <= '0';
--w_master_o.WE <= '1';
--r_master_o.DAT <= (others => '0');
--w_master_o.DAT <= ring(index(write_issue_offset));
--------------------------------
-- Reset Logic
--------------------------------
-- FIFO reset cycle: RST must be held high for at least three RDCLK clock cycles,
-- and RDEN must be low for four clock cycles before RST becomes active high, and RDEN
-- remains low during this reset cycle.
-- Guarantees the synchronicity with the input clock on reset deassertion
cmp_reset_synch_dma : reset_synch
port map(
clk_i => dma_clk_i,
arst_n_i => arst_n_i,
rst_n_o => dma_clk_rst_n
);
cmp_reset_synch_data : reset_synch
port map(
clk_i => data_clk_i,
arst_n_i => arst_n_i,
rst_n_o => data_clk_rst_n
);
--------------------------------
-- Start Acquisition logic
--------------------------------
-- Simple trigger detector 0 -> 1 for start_acq.
-- Synchronize with bus clock data_clk_i might not be the same
p_start_acq_trig : gc_sync_ffs
generic map (
g_sync_edge => "positive")
port map (
rst_n_i => data_clk_rst_n,
clk_i => data_clk_i,
data_i => start_acq,
synced_o => start_acq_trig,
npulse_o => open
);
-- MSB bit representing the start acquisition signal
start_acq <= capture_ctl_i(c_wishbone_data_width-1);
--------------------------------
-- Samples Counter Logic
--------------------------------
-- Hold counter for "capture_count" clock cycles
p_samples_counter : process (data_clk_i, data_clk_rst_n)
begin
if data_clk_rst_n = '0' then
capture_ctl_reg <= (others => '0');
elsif rising_edge(data_clk_i) then
-- start counting and stop only when we have input all data to fifos
if capture_ctl_reg(c_wishbone_data_width-1) = '1' and
data_valid_i = '1' and fifo_full = '0' then
capture_ctl_reg <= std_logic_vector(unsigned(capture_ctl_reg) - 1);
-- assign only when 0 -> 1 transition of MSB of start_acq. MSB of capture_ctl_reg
elsif start_acq_trig = '1' then
if data_valid_i = '1' then
-- MSB of capture_ctl_i might not be 1 by this time. Force to 1 then...
capture_ctl_reg <= '1' & std_logic_vector(unsigned(capture_ctl_i(c_wishbone_data_width-2 downto 0)) - 1);
else
-- Do not decrement now. wait until data_valid is set
capture_ctl_reg <= '1' & std_logic_vector(unsigned(capture_ctl_i(c_wishbone_data_width-2 downto 0)));
end if;
end if;
end if;
end process p_samples_counter;
--------------------------------
-- DMA Last Data Logic
--------------------------------
p_last_data_proc : process(data_clk_i, data_clk_rst_n)
begin
if data_clk_rst_n = '0' then
last_data_reg <= '0';
elsif rising_edge(data_clk_i) then
last_data_reg <= s_last_data;
end if;
end process p_last_data_proc;
-- bit c_wishbone_data_width-1 = 1 and bits c_wishbone_data_width-2 downto 0 = 0
s_last_data <= '1' when
f_end_counter(capture_ctl_reg(c_wishbone_data_width-1 downto 0)) and data_valid_i = '1' else '0';
--------------------------------
-- FIFO Write Enable Logic
--------------------------------
p_fifo_wr_en : process(data_clk_i, data_clk_rst_n)
begin
if data_clk_rst_n = '0' then
fifo_wren <= '0';
data_i_d1 <= (others => '0');
elsif rising_edge(data_clk_i) then
-- We only need to consider one as all FIFOs are synchronized with each other
if fifo_full = '0' then
-- input data to fifo only when data is valid
fifo_wren <= capture_ctl_reg(c_wishbone_data_width-1) and data_valid_i;
end if;
--Necessary in order to input data to FIFO correctly as fifo_wren is registered
data_i_d1 <= data_i;
end if;
end process p_fifo_wr_en;
p_gen_ack : process (dma_clk_i, dma_clk_rst_n)
begin
if dma_clk_rst_n = '0' then
ack_int <= '0';
elsif rising_edge(dma_clk_i) then
if cycle_progress = '1' and wb_we_i = '0' and dma_valid_int = '1' then
ack_int <= '1';
else
ack_int <= '0';
end if;
end if;
end process;
p_gen_stall : process (dma_valid_s)
begin
stall_int <= dma_valid_s;
end process;
--------------------------------
-- DMA Output Logic
--------------------------------
cycle_progress <= wb_cyc_i and wb_stb_i; --and wb_we_i = '0';
read_cycle_progress <= cycle_progress and not wb_we_i;
write_cycle_progress <= cycle_progress and wb_we_i;
--dma_ready_s <= dma_ready_i or not s_dma_valid_glue;
dma_ready_s <= read_cycle_progress or not dma_valid_int;
-- fifo is not empty and dma is ready
--dma_valid_s <= '0' when fifo_empty = '1' else read_cycle_progress;
dma_valid_s <= not fifo_empty or read_cycle_progress;
-- We have a 2 output delay for FIFO. That being said, if we have a dma_ready_i signal it will take 2 dma clock cycles
-- in order to read the data_i from FIFO.
-- By this time, dma_ready_i might not be set and we have to wait for it. To solve this 2 delay read cycle
-- it is employed a small 4 position "buffer" to hold the values read from fifo but not yet passed to the DMA.
-- Note that dma_valid_reg0 is 1 clock cycle delayed in relation to dma_valid_s. That should give time to
-- FIFO output the data_i requested. Also not that that difference between pre_output_counter_wr and output_counter_rd
-- is at most (at any given point in time) not greater than 2. Thus, with a 2 bit counter, we will not have overflow
p_dma_pre_output : process(dma_clk_i, dma_clk_rst_n)
begin
if dma_clk_rst_n = '0' then
dma_data_out0 <= (others => '0');
dma_valid_out0 <= '0';
dma_data_out1 <= (others => '0');
dma_valid_out1 <= '0';
dma_data_out2 <= (others => '0');
dma_valid_out2 <= '0';
dma_data_out3 <= (others => '0');
dma_valid_out3 <= '0';
dma_valid_reg0 <= '0';
pre_output_counter_wr <= (others => '0');
-- fifo is not empty and dma is ready
elsif rising_edge(dma_clk_i) then
--if dma_valid_reg1 = '1' then -- fifo output should be valid by now as fifo_rden was enabled and it id not empty!
-- Store output from FIFO in the correct dma_data_outX if dma_valid_reg1 is valid.
-- On the next dma_valid_reg1 operation (next clock cycle if dma_valid_reg1 remains 1),
-- clear the past dma_data_outX if dma has read from it (read pointer is in the past write position).
if pre_output_counter_wr = "00" and dma_valid_reg0 = '1' then
-- Output only the last_data bit of fifo_do
dma_data_out0(c_wishbone_data_width) <= fifo_do(c_wishbone_data_width);
-- Output the data from fifo itself
dma_data_out0(c_wishbone_data_width-1 downto 0) <= fifo_do(c_wishbone_data_width-1 downto 0);
dma_valid_out0 <= '1';
elsif output_counter_rd = "00" and dma_ready_s = '1' then
dma_data_out0 <= (others => '0');
dma_valid_out0 <= '0';
end if;
if pre_output_counter_wr = "01" and dma_valid_reg0 = '1' then
dma_data_out1(c_wishbone_data_width) <= fifo_do(c_wishbone_data_width);
dma_data_out1(c_wishbone_data_width-1 downto 0) <= fifo_do(c_wishbone_data_width-1 downto 0);
dma_valid_out1 <= '1';
elsif output_counter_rd = "01" and dma_ready_s = '1' then
dma_data_out1 <= (others => '0');
dma_valid_out1 <= '0';
end if;
if pre_output_counter_wr = "10" and dma_valid_reg0 = '1' then
dma_data_out2(c_wishbone_data_width) <= fifo_do(c_wishbone_data_width);
dma_data_out2(c_wishbone_data_width-1 downto 0) <= fifo_do(c_wishbone_data_width-1 downto 0);
dma_valid_out2 <= '1';
elsif output_counter_rd = "10" and dma_ready_s = '1' then
dma_data_out2 <= (others => '0');
dma_valid_out2 <= '0';
end if;
if pre_output_counter_wr = "11" and dma_valid_reg0 = '1' then
dma_data_out3(c_wishbone_data_width) <= fifo_do(c_wishbone_data_width);
dma_data_out3(c_wishbone_data_width-1 downto 0) <= fifo_do(c_wishbone_data_width-1 downto 0);
dma_valid_out3 <= '1';
elsif output_counter_rd = "11" and dma_ready_s = '1' then
dma_data_out3 <= (others => '0');
dma_valid_out3 <= '0';
end if;
if dma_valid_reg0 = '1' then --dma_valid_reg0 = '1' then
pre_output_counter_wr <= std_logic_vector(unsigned(pre_output_counter_wr) + 1);
end if;
-- 2 clock cycle delay for read from fifo.
-- Nedded to break logic into one more FF as timing constraint wasn't met,
-- due to the use of dma_valid_s directly into fifo_rden.
-- This is not a problem since there is a 4 position "buffer" after this
-- to absorb dma_ready_i deassertion
dma_valid_reg0 <= dma_valid_s;
end if;
end process p_dma_pre_output;
-- Send to DMA the correct data_i from dma_data_out, based on the currently read pointer position
p_dma_output_proc : process(dma_clk_i, dma_clk_rst_n)
begin
if dma_clk_rst_n = '0' then
dma_data_int <= (others => '0');
dma_valid_int <= '0';
--dma_be_o <= (others => '0');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= '0';
output_counter_rd <= (others => '0');
elsif rising_edge(dma_clk_i) then
if dma_ready_s = '1' then
-- verify wr counter and output corresponding output
case output_counter_rd is
when "11" =>
dma_data_int <= dma_data_out3(c_wishbone_data_width-1 downto 0);
dma_valid_int <= dma_valid_out3;
--dma_be_o <= (others => '1');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= dma_data_out3(c_wishbone_data_width) and dma_valid_out3;
when "10" =>
dma_data_int <= dma_data_out2(c_wishbone_data_width-1 downto 0);
dma_valid_int <= dma_valid_out2;
--dma_be_o <= (others => '1');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= dma_data_out2(c_wishbone_data_width) and dma_valid_out2;
when "01" =>
dma_data_int <= dma_data_out1(c_wishbone_data_width-1 downto 0);
dma_valid_int <= dma_valid_out1;
--dma_be_o <= (others => '1');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= dma_data_out1(c_wishbone_data_width) and dma_valid_out1;
--when "01" =>
when others =>
dma_data_int <= dma_data_out0(c_wishbone_data_width-1 downto 0);
dma_valid_int <= dma_valid_out0;
--dma_be_o <= (others => '1');
-- The MSB is an indicator of the last data_i requested!
dma_last_int <= dma_data_out0(c_wishbone_data_width) and dma_valid_out0;
end case;
-- Only increment output_counter_rd if it is different from pre_output_counter_wr
-- to prevent overflow!
if output_counter_rd /= pre_output_counter_wr then
output_counter_rd <= std_logic_vector(unsigned(output_counter_rd) + 1);
end if;
end if;
end if;
end process p_dma_output_proc;
-- Simple backpressure scheme. Should be almost full for correct behavior.
-- fifo_full is already synchronized with fifo write_clock
data_ready_o <= not fifo_full;
--------------------------------
-- DMA complete status
--------------------------------
dma_last_s <= dma_valid_int and read_cycle_progress and dma_last_int;
p_dma_complete : process (dma_clk_i, dma_clk_rst_n)
begin
if dma_clk_rst_n = '0' then
dma_complete_int <= '0';
elsif rising_edge(dma_clk_i) then
if dma_last_s = '1' then
-- DMA could be held to 1 when completed, but it would be more difficult
-- to bring it back to 0, since the dma transfer is initiated in the data_clk_i domain
dma_complete_int <= not dma_complete_int;
end if;
end if;
end process p_dma_complete;
dma_complete_o <= dma_complete_int;
--------------------------------
-- DMA overflow (fifo full) status and counter
--------------------------------
-- Data is lost when this is asserted.
-- FIFO is full, there is data valid on input and we are in the middle of a dma transfer
s_fifo_ovf <= fifo_full and data_valid_i and
capture_ctl_reg(c_wishbone_data_width-1);
p_dma_overflow : process (data_clk_i, data_clk_rst_n)
begin
if data_clk_rst_n = '0' then
s_fifo_ovf_c <= (others => '0');
elsif rising_edge(data_clk_i) then
if start_acq_trig = '1' then
s_fifo_ovf_c <= (others => '0');
elsif s_fifo_ovf = '1' then
-- Even if the counter wrapps around, an overflow will still be detected!
s_fifo_ovf_c <= '1' & std_logic_vector(unsigned(s_fifo_ovf_c(g_ovf_counter_width-1 downto 0)) + 1);
end if;
end if;
end process p_dma_overflow;
dma_ovf_o <= s_fifo_ovf_c(g_ovf_counter_width);
--------------------------------
-- FIFO instantiation
--------------------------------
cmp_fifo : generic_async_fifo
generic map(
g_data_width => c_wishbone_data_width+1,
g_size => c_fifo_size,
-- Read-side flag selection
g_with_rd_empty => true, -- with empty flag
--g_with_rd_count => false, -- with words counter
--g_with_wr_empty => false,
g_with_wr_full => true
--g_with_wr_count => false,
--g_almost_empty_threshold => ?, -- threshold for almost empty flag
--g_almost_full_threshold => ? -- threshold for almost full flag
)
port map(
rst_n_i => fifo_rst_n,
-- write port
clk_wr_i => fifo_wrclk,
d_i => fifo_di,
we_i => fifo_wren,
wr_empty_o => open,
wr_full_o => fifo_full,
wr_almost_empty_o => open,
wr_almost_full_o => open,
wr_count_o => open,
-- read port
clk_rd_i => fifo_rdclk,
q_o => fifo_do,
rd_i => fifo_rden,
rd_empty_o => fifo_empty,
rd_full_o => open,
rd_almost_empty_o => open,
rd_almost_full_o => open,
rd_count_o => open
);
fifo_rst_n <= arst_n_i;
fifo_rden <= dma_valid_s;
fifo_rdclk <= dma_clk_i;
-- Observe the FIFO reset cycle! dma_clk_buf is the clock for fifo_rd_en
fifo_wrclk <= data_clk_i;
-- c_wishbone_data_width + 1 bits.
-- It doesn't matter if the data_i is signed or unsigned since we do not care what the input data is.
-- The user has to treat this and extend the sign if necessary.
fifo_di <= last_data_reg & data_i_d1;
end rtl;
-- Description of the wishbone interface for the wb_dma_interface core
peripheral {
name = "Wishbone DMA Streaming Interface";
description = "Simple Wishbone DMA interface for peripherals which want to stream data to a DMA";
-- Prefix for all generated ports
prefix = "dma_iface";
-- Name of the vhdl entity to be generated
hdl_entity = "wb_dma_interface_port";
-- Control Register
reg {
name = "Control/Status register";
prefix = "ctl";
field {
name = "Start Transaction";
description = "write 1: starts the DMA transaction.\
write 0: no effect";
prefix = "start";
-- Pulse to start
type = MONOSTABLE;
clock = "data_clk_i";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
field {
name = "DMA complete";
description = "read 1: the DMA has completed the transaction\
read 0: DMA transaction still in progress";
prefix = "done";
type = BIT;
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
field {
name = "DMA overflow";
description = "read 1: the DMA overflow detected\
read 0: No overflow detected";
prefix = "done";
type = BIT;
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
};
-- Data Count Register
reg {
name = "Transaction Counter";
prefix = "tr_cntr";
field {
--name = "";
description = "Stores the the words to be transfered to DMA";
--prefix = "";
type = SLV;
size = 32;
clock = "data_clk_i";
access_bus = WRITE_ONLY;
access_dev = READ_ONLY;
};
};
-- Bus = Read, Core = Write (Core -> Bus)
fifo_reg {
size = 256;
direction = CORE_TO_BUS;
prefix = "fifo_out";
name = "FIFO DMA synchronization";
description = "Data to to be written to DMA";
flags_bus = {FIFO_FULL, FIFO_EMPTY, FIFO_COUNT};
flags_dev = {FIFO_FULL, FIFO_EMPTY, FIFO_COUNT};
mode = PIPELINE;
field {
name = "Output FIFO data value";
description = "Value of data word synchronized to the core clock";
--prefix = "";
type = SLV;
size = 32;
clock = "dma_clk_i";
};
field {
name = "Transaction Last Data";
description = "0: Current entry is not the last transaction data\
1: Current entry is the last transaction data";
prefix = "last";
type = BIT;
clock = "dma_clk_i";
};
};
-- Bus = Write, Core = Read (Bus -> Core)
fifo_reg {
size = 256;
direction = BUS_TO_CORE;
prefix = "fifo_in";
name = "FIFO input synchronization";
flags_bus = {FIFO_FULL, FIFO_EMPTY, FIFO_COUNT};
flags_dev = {FIFO_FULL, FIFO_EMPTY, FIFO_COUNT};
mode = PIPELINE;
field {
name = "Input FIFO data value";
description = "Value of data word synchronized to the core clock";
--prefix = "";
type = SLV;
size = 32;
clock = "data_clk_i";
};
};
};
------------------------------------------------------------------------------
-- dma_if.vhd - entity/architecture pair
------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.wishbone_pkg.all;
use work.custom_wishbone_pkg.all;
------------------------------------------------------------------------------
-- Entity section
------------------------------------------------------------------------------
entity xwb_dma_interface is
generic(
-- Three 32-bit data input. LSB bits are valid.
--C_NBITS_VALID_INPUT : natural := 128;
--C_NBITS_DATA_INPUT : natural := 128;
--C_OVF_COUNTER_SIZE : natural := 10
g_ovf_counter_width : natural := 10
);
port(
-- Asynchronous Reset signal
arst_n_i : in std_logic;
-- Write Domain Clock
dma_clk_i : in std_logic;
--dma_valid_o : out std_logic;
--dma_data_o : out std_logic_vector(C_NBITS_DATA_INPUT-1 downto 0);
--dma_be_o : out std_logic_vector(C_NBITS_DATA_INPUT/8 - 1 downto 0);
--dma_last_o : out std_logic;
--dma_ready_i : in std_logic;
-- Slave Data Flow port
--dma_dflow_slave_i : in t_wishbone_dflow_slave_in;
--dma_dflow_slave_o : out t_wishbone_dflow_slave_out;
dma_slave_i : in t_wishbone_slave_in;
dma_slave_o : out t_wishbone_slave_out;
-- Slave Data Input Port
--data_slave_i : in t_wishbone_slave_in;
--data_slave_o : out t_wishbone_slave_out;
data_clk_i : in std_logic;
data_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
data_valid_i : in std_logic;
data_ready_o : out std_logic;
-- Slave control port. use wbgen2 tool or not if it is simple.
--control_slave_i : in t_wishbone_slave_in;
--control_slave_o : out t_wishbone_slave_out;
capture_ctl_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
dma_complete_o : out std_logic;
dma_ovf_o : out std_logic
-- Debug Signals
--dma_debug_clk_o : out std_logic;
--dma_debug_data_o : out std_logic_vector(255 downto 0);
--dma_debug_trigger_o : out std_logic_vector(15 downto 0)
);
end xwb_dma_interface;
architecture rtl of xwb_dma_interface is
begin
cmp_wb_dma_interface : wb_dma_interface
port map(
-- Asynchronous Reset signal
arst_n_i => arst_n_i,
-- Write Domain Clock
dma_clk_i => dma_clk_i,
--dma_valid_o : out std_logic;
--dma_data_o : out std_logic_vector(C_NBITS_DATA_INPUT-1 downto 0);
--dma_be_o : out std_logic_vector(C_NBITS_DATA_INPUT/8 - 1 downto 0);
--dma_last_o : out std_logic;
--dma_ready_i : in std_logic;
-- Slave Data Flow port
--dma_dflow_slave_i : in t_wishbone_dflow_slave_in;
--dma_dflow_slave_o : out t_wishbone_dflow_slave_out;
wb_sel_i => dma_slave_i.sel,
wb_cyc_i => dma_slave_i.cyc,
wb_stb_i => dma_slave_i.stb,
wb_we_i => dma_slave_i.we,
wb_adr_i => dma_slave_i.adr,
wb_dat_i => dma_slave_i.dat,
--wb_cti_i => dma_dflow_slave_i.cti,
--wb_bte_i => dma_dflow_slave_i.bte,
wb_dat_o => dma_slave_o.dat,
wb_ack_o => dma_slave_o.ack,
wb_stall_o => dma_slave_o.stall,
-- Slave Data Input Port
--data_slave_i : in t_wishbone_slave_in;
--data_slave_o : out t_wishbone_slave_out;
data_clk_i => data_clk_i,
data_i => data_i,
data_valid_i => data_valid_i,
data_ready_o => data_ready_o,
-- Slave control port. use wbgen2 tool or not if it is simple.
--control_slave_i : in t_wishbone_slave_in;
--control_slave_o : out t_wishbone_slave_out;
capture_ctl_i => capture_ctl_i,
dma_complete_o => dma_complete_o,
dma_ovf_o => dma_ovf_o
-- Debug Signals
--dma_debug_clk_o : out std_logic;
--dma_debug_data_o : out std_logic_vector(255 downto 0);
--dma_debug_trigger_o : out std_logic_vector(15 downto 0)
);
dma_slave_o.rty <= '0';
dma_slave_o.err <= '0';
dma_slave_o.int <= '0';
end rtl;
------------------------------------------------------------------------------
-- dma_if.vhd - entity/architecture pair
------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.wishbone_pkg.all;
use work.custom_wishbone_pkg.all;
------------------------------------------------------------------------------
-- Entity section
------------------------------------------------------------------------------
entity xwb_dma_interface is
port(
-- Asynchronous Reset signal
arst_n_i : in std_logic;
-- Write Domain Clock
dma_clk_i : in std_logic;
--dma_valid_o : out std_logic;
--dma_data_o : out std_logic_vector(C_NBITS_DATA_INPUT-1 downto 0);
--dma_be_o : out std_logic_vector(C_NBITS_DATA_INPUT/8 - 1 downto 0);
--dma_last_o : out std_logic;
--dma_ready_i : in std_logic;
-- Slave Data Flow port
--dma_dflow_slave_i : in t_wishbone_dflow_slave_in;
--dma_dflow_slave_o : out t_wishbone_dflow_slave_out;
dma_slave_i : in t_wishbone_slave_in;
dma_slave_o : out t_wishbone_slave_out;
-- Slave Data Input Port
--data_slave_i : in t_wishbone_slave_in;
--data_slave_o : out t_wishbone_slave_out;
data_clk_i : in std_logic;
data_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
data_valid_i : in std_logic;
data_ready_o : out std_logic;
-- Slave control port. use wbgen2 tool or not if it is simple.
--control_slave_i : in t_wishbone_slave_in;
--control_slave_o : out t_wishbone_slave_out;
capture_ctl_i : in std_logic_vector(c_wishbone_data_width-1 downto 0);
dma_complete_o : out std_logic;
dma_ovf_o : out std_logic
-- Debug Signals
--dma_debug_clk_o : out std_logic;
--dma_debug_data_o : out std_logic_vector(255 downto 0);
--dma_debug_trigger_o : out std_logic_vector(15 downto 0)
);
end xwb_dma_interface;
architecture rtl of xwb_dma_interface is
begin
cmp_wb_dma_interface : wb_dma_interface
port map(
-- Asynchronous Reset signal
arst_n_i => arst_n_i,
-- Write Domain Clock
dma_clk_i => dma_clk_i,
--dma_valid_o : out std_logic;
--dma_data_o : out std_logic_vector(C_NBITS_DATA_INPUT-1 downto 0);
--dma_be_o : out std_logic_vector(C_NBITS_DATA_INPUT/8 - 1 downto 0);
--dma_last_o : out std_logic;
--dma_ready_i : in std_logic;
-- Slave Data Flow port
--dma_dflow_slave_i : in t_wishbone_dflow_slave_in;
--dma_dflow_slave_o : out t_wishbone_dflow_slave_out;
wb_sel_i => dma_slave_i.sel,
wb_cyc_i => dma_slave_i.cyc,
wb_stb_i => dma_slave_i.stb,
wb_we_i => dma_slave_i.we,
wb_adr_i => dma_slave_i.adr,
wb_dat_i => dma_slave_i.dat,
--wb_cti_i => dma_dflow_slave_i.cti,
--wb_bte_i => dma_dflow_slave_i.bte,
wb_dat_o => dma_slave_o.dat,
wb_ack_o => dma_slave_o.ack,
wb_stall_o => dma_slave_o.stall,
-- Slave Data Input Port
--data_slave_i : in t_wishbone_slave_in;
--data_slave_o : out t_wishbone_slave_out;
data_clk_i => data_clk_i,
data_i => data_i,
data_valid_i => data_valid_i,
data_ready_o => data_ready_o,
-- Slave control port. use wbgen2 tool or not if it is simple.
--control_slave_i : in t_wishbone_slave_in;
--control_slave_o : out t_wishbone_slave_out;
capture_ctl_i => capture_ctl_i,
dma_complete_o => dma_complete_o,
dma_ovf_o => dma_ovf_o
-- Debug Signals
--dma_debug_clk_o : out std_logic;
--dma_debug_data_o : out std_logic_vector(255 downto 0);
--dma_debug_trigger_o : out std_logic_vector(15 downto 0)
);
dma_slave_o.rty <= '0';
dma_slave_o.err <= '0';
dma_slave_o.int <= '0';
end rtl;
modules = { "local" : [
"adc",
"fmc150",
"netlist" ] };
files = ["wb_fmc150.vhd", "xwb_fmc150.vhd", "xfmc150_regs_pkg.vhd", "wb_fmc150_port.vhd",
"xwb_fmc150.vhd" ];
files = ["adc_channel_lvds_ddr.vhd", "adc_pkg.vhd", "strobe_lvds.vhd" ];
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library unisim;
use unisim.vcomponents.all;
entity adc_channel_lvds_ddr is
generic
(
C_NBITS : natural := 16;
C_DEFAULT_DELAY : natural := 0
);
port
(
clk_adc_i : in std_logic;
clk_ctrl_i : in std_logic;
adc_p_i : in std_logic_vector(C_NBITS/2 - 1 downto 0);
adc_n_i : in std_logic_vector(C_NBITS/2 - 1 downto 0);
adc_data_o : out std_logic_vector(C_NBITS - 1 downto 0);
ctrl_delay_update_i : in std_logic;
ctrl_delay_value_i : in std_logic_vector(4 downto 0)
);
end adc_channel_lvds_ddr;
architecture rtl of adc_channel_lvds_ddr is
signal s_adc_raw : std_logic_vector(C_NBITS/2 - 1 downto 0);
signal s_adc_ddr : std_logic_vector(C_NBITS/2 - 1 downto 0);
signal s_adc_ddr_dly : std_logic_vector(C_NBITS/2 - 1 downto 0);
begin
gen_adc_lvds_ddr : for i in 0 to (C_NBITS/2)-1 generate
-- Differential input buffer with termination (LVDS)
cmp_ibufds : ibufds
generic map
(
IOSTANDARD => "LVDS_25",
DIFF_TERM => TRUE
)
port map
(
i => adc_p_i(i),
ib => adc_n_i(i),
o => s_adc_ddr(i)
);
-- Input delay
cmp_iodelay : iodelaye1
generic map
(
IDELAY_TYPE => "VAR_LOADABLE",
IDELAY_VALUE => C_DEFAULT_DELAY,
SIGNAL_PATTERN => "DATA",
DELAY_SRC => "I"
)
port map
(
idatain => s_adc_ddr(i),
dataout => s_adc_ddr_dly(i),
c => clk_ctrl_i,
ce => '0',
inc => '0',
datain => '0',
odatain => '0',
clkin => '0',
rst => ctrl_delay_update_i,
cntvaluein => ctrl_delay_value_i,
cntvalueout => open,
cinvctrl => '0',
t => '1'
);
-- DDR to SDR
cmp_iddr : iddr
generic map
(
DDR_CLK_EDGE => "SAME_EDGE_PIPELINED"
)
port map
(
q1 => adc_data_o(2*i),
q2 => adc_data_o(2*i+1),
c => clk_adc_i,
ce => '1',
d => s_adc_ddr_dly(i),
r => '0',
s => '0'
);
end generate;
end rtl;
\ No newline at end of file
library ieee;
use ieee.std_logic_1164.all;
package adc_pkg is
--------------------------------------------------------------------
-- Components
--------------------------------------------------------------------
component strobe_lvds is
generic
(
C_DEFAULT_DELAY : natural := 0
);
port
(
clk_ctrl_i : in std_logic;
strobe_p_i : in std_logic;
strobe_n_i : in std_logic;
strobe_o : out std_logic;
ctrl_delay_update_i : in std_logic;
ctrl_delay_value_i : in std_logic_vector(4 downto 0);
ctrl_delay_value_o : out std_logic_vector(4 downto 0)
);
end component;
component adc_channel_lvds_ddr is
generic
(
C_NBITS : natural := 16;
C_DEFAULT_DELAY : natural := 0
);
port
(
clk_adc_i : in std_logic;
clk_ctrl_i : in std_logic;
adc_p_i : in std_logic_vector(C_NBITS/2 - 1 downto 0);
adc_n_i : in std_logic_vector(C_NBITS/2 - 1 downto 0);
adc_data_o : out std_logic_vector(C_NBITS - 1 downto 0);
ctrl_delay_update_i : in std_logic;
ctrl_delay_value_i : in std_logic_vector(4 downto 0)
);
end component;
end adc_pkg;
\ No newline at end of file
-----------------------------------------------------------------------------------
-- <description>
--
-- Author: Daniel Tavares (daniel.tavares@lnls.br)
-- Company: Brazilian Synchrotron Light Laboratory, Campinas, Brazil
-----------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library unisim;
use unisim.vcomponents.all;
entity strobe_lvds is
generic
(
C_DEFAULT_DELAY : natural := 0
);
port
(
clk_ctrl_i : in std_logic;
strobe_p_i : in std_logic;
strobe_n_i : in std_logic;
strobe_o : out std_logic;
ctrl_delay_update_i : in std_logic;
ctrl_delay_value_i : in std_logic_vector(4 downto 0);
ctrl_delay_value_o : out std_logic_vector(4 downto 0)
);
end strobe_lvds;
architecture rtl of strobe_lvds is
signal s_strobe_l : std_logic;
signal s_strobe_dly : std_logic;
begin
cmp_ibufgds : ibufds
generic map
(
IOSTANDARD => "LVDS_25",
DIFF_TERM => TRUE
)
port map
(
i => strobe_p_i,
ib => strobe_n_i,
o => s_strobe_l
);
cmp_iodelay : iodelaye1
generic map
(
IDELAY_TYPE => "VAR_LOADABLE",
IDELAY_VALUE => C_DEFAULT_DELAY,
SIGNAL_PATTERN => "CLOCK",
DELAY_SRC => "I"
)
port map
(
idatain => s_strobe_l,
dataout => s_strobe_dly,
c => clk_ctrl_i,
ce => '0',
inc => '0',
datain => '0',
odatain => '0',
clkin => '0',
rst => ctrl_delay_update_i,
cntvaluein => ctrl_delay_value_i,
cntvalueout => ctrl_delay_value_o,
cinvctrl => '0',
t => '1'
);
cmp_bufr : bufr
generic map
(
SIM_DEVICE => "VIRTEX6",
BUFR_DIVIDE => "BYPASS"
)
port map
(
clr => '1',
ce => '1',
i => s_strobe_dly,
o => strobe_o
);
end rtl;
\ No newline at end of file
#!/bin/bash
wbgen2 -V wb_fmc150_port.vhd -H record -p xfmc150_regs_pkg.vhd -K ../../../sim/regs/xfmc150_regs_regs.vh -s struct -C xfmc150_regs_regs.h -D doc/xfmc150_regs_wb.html xfmc150.wb
<HTML>
<HEAD>
<TITLE>wb_fmc150_port</TITLE>
<STYLE TYPE="text/css" MEDIA="all">
<!--
BODY { background: white; color: black;
font-family: Arial,Helvetica; font-size:12; }
h1 { font-family: Trebuchet MS,Arial,Helvetica; font-size:30; color:#404040; }
h2 { font-family: Trebuchet MS,Arial,Helvetica; font-size:22; color:#404040; }
h3 { font-family: Trebuchet MS,Arial,Helvetica; font-size:16; color:#404040; }
.td_arrow_left { padding:0px; background: #ffffff; text-align: right; font-size:12;}
.td_arrow_right { padding:0px; background: #ffffff; text-align: left; font-size:12;}
.td_code { font-family:Courier New,Courier; padding: 3px; }
.td_desc { padding: 3px; }
.td_sym_center { background: #e0e0f0; padding: 3px; }
.td_port_name { font-family:Courier New,Courier; background: #e0e0f0; text-align: right; font-weight:bold;padding: 3px; width:200px; }
.td_pblock_left { font-family:Courier New,Courier; background: #e0e0f0; padding: 0px; text-align: left; }
.td_pblock_right { font-family:Courier New,Courier; background: #e0e0f0; padding: 0px; text-align: right; }
.td_bit { background: #ffffff; color:#404040; font-size:10; width: 70px; font-family:Courier New,Courier; padding: 3px; text-align:center; }
.td_field { background: #e0e0f0; padding: 3px; text-align:center; }
.td_unused { background: #a0a0a0; padding: 3px; text-align:center; }
th { font-weight:bold; color:#ffffff; background: #202080; padding:3px; }
.tr_even { background: #f0eff0; }
.tr_odd { background: #e0e0f0; }
-->
</STYLE>
</HEAD>
<BODY>
<h1 class="heading">wb_fmc150_port</h1>
<h3>FMC ADC/DAC interface registers</h3>
<p>FMC ADC/DAC interface</p>
<h3>Contents:</h3>
<span style="margin-left: 0px; ">1. <A href="#sect_1_0">Memory map summary</a></span><br/>
<span style="margin-left: 0px; ">2. <A href="#sect_2_0">HDL symbol</a></span><br/>
<span style="margin-left: 0px; ">3. <A href="#sect_3_0">Register description</a></span><br/>
<span style="margin-left: 20px; ">3.1. <A href="#sect_3_1">Input Flags for Pulsing Registers</a></span><br/>
<span style="margin-left: 20px; ">3.2. <A href="#sect_3_2">Input Flags for FMC150</a></span><br/>
<span style="margin-left: 20px; ">3.3. <A href="#sect_3_3">Address for Chips on FMC150</a></span><br/>
<span style="margin-left: 20px; ">3.4. <A href="#sect_3_4">Data In for Chips on FMC150</a></span><br/>
<span style="margin-left: 20px; ">3.5. <A href="#sect_3_5">Chipselect for Chips on FMC150</a></span><br/>
<span style="margin-left: 20px; ">3.6. <A href="#sect_3_6">ADC Delay</a></span><br/>
<span style="margin-left: 20px; ">3.7. <A href="#sect_3_7">Data Out From Chips on FMC150</a></span><br/>
<span style="margin-left: 20px; ">3.8. <A href="#sect_3_8">Flags out from Chips on FMC150</a></span><br/>
<h3><a name="sect_1_0">1. Memory map summary</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<th >
H/W Address
</th>
<th >
Type
</th>
<th >
Name
</th>
<th >
VHDL/Verilog prefix
</th>
<th >
C prefix
</th>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x0
</td>
<td >
REG
</td>
<td >
<A href="#FLGS_PULSE">Input Flags for Pulsing Registers</a>
</td>
<td class="td_code">
fmc150_flgs_pulse
</td>
<td class="td_code">
FLGS_PULSE
</td>
</tr>
<tr class="tr_even">
<td class="td_code">
0x1
</td>
<td >
REG
</td>
<td >
<A href="#FLGS_IN">Input Flags for FMC150</a>
</td>
<td class="td_code">
fmc150_flgs_in
</td>
<td class="td_code">
FLGS_IN
</td>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x2
</td>
<td >
REG
</td>
<td >
<A href="#ADDR">Address for Chips on FMC150</a>
</td>
<td class="td_code">
fmc150_addr
</td>
<td class="td_code">
ADDR
</td>
</tr>
<tr class="tr_even">
<td class="td_code">
0x3
</td>
<td >
REG
</td>
<td >
<A href="#DATA_IN">Data In for Chips on FMC150</a>
</td>
<td class="td_code">
fmc150_data_in
</td>
<td class="td_code">
DATA_IN
</td>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x4
</td>
<td >
REG
</td>
<td >
<A href="#CS">Chipselect for Chips on FMC150</a>
</td>
<td class="td_code">
fmc150_cs
</td>
<td class="td_code">
CS
</td>
</tr>
<tr class="tr_even">
<td class="td_code">
0x5
</td>
<td >
REG
</td>
<td >
<A href="#ADC_DLY">ADC Delay</a>
</td>
<td class="td_code">
fmc150_adc_dly
</td>
<td class="td_code">
ADC_DLY
</td>
</tr>
<tr class="tr_odd">
<td class="td_code">
0x6
</td>
<td >
REG
</td>
<td >
<A href="#DATA_OUT">Data Out From Chips on FMC150</a>
</td>
<td class="td_code">
fmc150_data_out
</td>
<td class="td_code">
DATA_OUT
</td>
</tr>
<tr class="tr_even">
<td class="td_code">
0x7
</td>
<td >
REG
</td>
<td >
<A href="#FLGS_OUT">Flags out from Chips on FMC150</a>
</td>
<td class="td_code">
fmc150_flgs_out
</td>
<td class="td_code">
FLGS_OUT
</td>
</tr>
</table>
<h3><a name="sect_2_0">2. HDL symbol</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
rst_n_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Input Flags for Pulsing Registers:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
clk_sys_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_flgs_pulse_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rArr;
</td>
<td class="td_pblock_left">
wb_adr_i[2:0]
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rArr;
</td>
<td class="td_pblock_left">
wb_dat_i[31:0]
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Input Flags for FMC150:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&lArr;
</td>
<td class="td_pblock_left">
wb_dat_o[31:0]
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_flgs_in_spi_rw_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_cyc_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_flgs_in_ext_clk_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rArr;
</td>
<td class="td_pblock_left">
wb_sel_i[3:0]
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_stb_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Address for Chips on FMC150:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&rarr;
</td>
<td class="td_pblock_left">
wb_we_i
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_addr_o[15:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
&larr;
</td>
<td class="td_pblock_left">
wb_ack_o
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
&larr;
</td>
<td class="td_pblock_left">
wb_stall_o
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Data In for Chips on FMC150:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_data_in_o[31:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Chipselect for Chips on FMC150:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_cs_cdce72010_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_cs_ads62p49_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_cs_dac3283_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_cs_amc7823_o
</td>
<td class="td_arrow_right">
&rarr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>ADC Delay:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_adc_dly_str_o[4:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_adc_dly_cha_o[4:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_adc_dly_chb_o[4:0]
</td>
<td class="td_arrow_right">
&rArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Data Out From Chips on FMC150:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_data_out_i[31:0]
</td>
<td class="td_arrow_right">
&lArr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
&nbsp;
</td>
<td class="td_pblock_right">
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
<b>Flags out from Chips on FMC150:</b>
</td>
<td class="td_arrow_right">
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_flgs_out_spi_busy_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_flgs_out_pll_status_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_flgs_out_adc_clk_locked_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
<tr>
<td class="td_arrow_left">
</td>
<td class="td_pblock_left">
</td>
<td class="td_sym_center">
</td>
<td class="td_pblock_right">
fmc150_flgs_out_fmc_prst_i
</td>
<td class="td_arrow_right">
&larr;
</td>
</tr>
</table>
<h3><a name="sect_3_0">3. Register description</a></h3>
<a name="FLGS_PULSE"></a>
<h3><a name="sect_3_1">3.1. Input Flags for Pulsing Registers</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
fmc150_flgs_pulse
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x0
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
FLGS_PULSE
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x0
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
FLGS_PULSE
</td>
</tr>
</table>
<ul>
<li><b>
FLGS_PULSE
</b>[<i>read/write</i>]: Update ADC delay
<br>write 1: pulse ADC delay register.<br> write 0: no effect
</ul>
<a name="FLGS_IN"></a>
<h3><a name="sect_3_2">3.2. Input Flags for FMC150</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
fmc150_flgs_in
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x1
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
FLGS_IN
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x4
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
EXT_CLK
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
SPI_RW
</td>
</tr>
</table>
<ul>
<li><b>
SPI_RW
</b>[<i>read/write</i>]: SPI Read/Write flag
<br>write 1: write to SPI. <br> write 0: read from SPI
<li><b>
EXT_CLK
</b>[<i>read/write</i>]: External Clock for ADC
<br>write 1: external clock for ADC. <br> write 0: internal clock for ADC
</ul>
<a name="ADDR"></a>
<h3><a name="sect_3_3">3.3. Address for Chips on FMC150</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
fmc150_addr
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x2
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
ADDR
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x8
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
ADDR[15:8]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
ADDR[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
ADDR
</b>[<i>read/write</i>]: SPI address
<br>Address of internal register
</ul>
<a name="DATA_IN"></a>
<h3><a name="sect_3_4">3.4. Data In for Chips on FMC150</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
fmc150_data_in
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x3
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
DATA_IN
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0xc
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA_IN[31:24]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA_IN[23:16]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA_IN[15:8]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA_IN[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
DATA_IN
</b>[<i>read/write</i>]: Data In for FMC150
<br>Data to internal chip register
</ul>
<a name="CS"></a>
<h3><a name="sect_3_5">3.5. Chipselect for Chips on FMC150</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
fmc150_cs
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x4
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
CS
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x10
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
AMC7823
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
DAC3283
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
ADS62P49
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
CDCE72010
</td>
</tr>
</table>
<ul>
<li><b>
CDCE72010
</b>[<i>read/write</i>]: Chipselect for cdce72010
<br>write 1: select chip cdce72010 for operation.<br> write 0: no effect
<li><b>
ADS62P49
</b>[<i>read/write</i>]: Chipselect for ads62p49
<br>write 1: select chip ads62p49 for operation.<br> write 0: no effect
<li><b>
DAC3283
</b>[<i>read/write</i>]: Chipselect for dac3283
<br>write 1: select chip dac3283 for operation.<br> write 0: no effect
<li><b>
AMC7823
</b>[<i>read/write</i>]: Chipselect for amc7823
<br>write 1: select chip amc7823 for operation.<br> write 0: no effect
</ul>
<a name="ADC_DLY"></a>
<h3><a name="sect_3_6">3.6. ADC Delay</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
fmc150_adc_dly
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x5
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
ADC_DLY
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x14
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=5 class="td_field">
CHB[4:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=5 class="td_field">
CHA[4:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=5 class="td_field">
STR[4:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
STR
</b>[<i>read/write</i>]: ADC Strobe delay
<br>write the strobe delay
<li><b>
CHA
</b>[<i>read/write</i>]: ADC Channel A delay
<br>write the channel A delay
<li><b>
CHB
</b>[<i>read/write</i>]: ADC Strobe delay
<br>write the channel B delay
</ul>
<a name="DATA_OUT"></a>
<h3><a name="sect_3_7">3.7. Data Out From Chips on FMC150</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
fmc150_data_out
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x6
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
DATA_OUT
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x18
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA_OUT[31:24]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA_OUT[23:16]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA_OUT[15:8]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td style="border: solid 1px black;" colspan=8 class="td_field">
DATA_OUT[7:0]
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
<td >
</td>
</tr>
</table>
<ul>
<li><b>
DATA_OUT
</b>[<i>read-only</i>]: Data out from FMC150
<br>Data from internal chip register
</ul>
<a name="FLGS_OUT"></a>
<h3><a name="sect_3_8">3.8. Flags out from Chips on FMC150</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
fmc150_flgs_out
</td>
</tr>
<tr>
<td >
<b>HW address: </b>
</td>
<td class="td_code">
0x7
</td>
</tr>
<tr>
<td >
<b>C prefix: </b>
</td>
<td class="td_code">
FLGS_OUT
</td>
</tr>
<tr>
<td >
<b>C offset: </b>
</td>
<td class="td_code">
0x1c
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
31
</td>
<td class="td_bit">
30
</td>
<td class="td_bit">
29
</td>
<td class="td_bit">
28
</td>
<td class="td_bit">
27
</td>
<td class="td_bit">
26
</td>
<td class="td_bit">
25
</td>
<td class="td_bit">
24
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
23
</td>
<td class="td_bit">
22
</td>
<td class="td_bit">
21
</td>
<td class="td_bit">
20
</td>
<td class="td_bit">
19
</td>
<td class="td_bit">
18
</td>
<td class="td_bit">
17
</td>
<td class="td_bit">
16
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
15
</td>
<td class="td_bit">
14
</td>
<td class="td_bit">
13
</td>
<td class="td_bit">
12
</td>
<td class="td_bit">
11
</td>
<td class="td_bit">
10
</td>
<td class="td_bit">
9
</td>
<td class="td_bit">
8
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
</tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td class="td_bit">
7
</td>
<td class="td_bit">
6
</td>
<td class="td_bit">
5
</td>
<td class="td_bit">
4
</td>
<td class="td_bit">
3
</td>
<td class="td_bit">
2
</td>
<td class="td_bit">
1
</td>
<td class="td_bit">
0
</td>
</tr>
<tr>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td class="td_unused">
-
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
FMC_PRST
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
ADC_CLK_LOCKED
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
PLL_STATUS
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
SPI_BUSY
</td>
</tr>
</table>
<ul>
<li><b>
SPI_BUSY
</b>[<i>read-only</i>]: SPI Busy
<br>read 1: spi busy.<br> read 0: spi idle
<li><b>
PLL_STATUS
</b>[<i>read-only</i>]: CDCE72010 PLL Status
<br>read 1: PLL locked.<br> read 0: PLL not locked
<li><b>
ADC_CLK_LOCKED
</b>[<i>read-only</i>]: FPGA ADC clock locked
<br>read 1: FPGA ADC PLL locked.<br> read 0: FPGA ADC PLL not locked
<li><b>
FMC_PRST
</b>[<i>read-only</i>]: FMC present
<br>read 1: FMC present.<br> read 0: FMC not present
</ul>
</BODY>
</HTML>
files = ["ads62p49_ctrl.vhd", "amc7823_ctrl.vhd", "cdce72010_ctrl.vhd", "dac3283_ctrl.vhd",
"fmc150_adc_if.vhd", "fmc150_dac_if.vhd", "fmc150_pkg.vhd", "fmc150_spi_ctrl.vhd",
"fmc150_stellar_cmd.vhd", "fmc150_testbench.vhd", "pulse2pulse.vhd"];
-------------------------------------------------------------------------------------
-- FILE NAME : ads62p49_ctrl.vhd
--
-- AUTHOR : Peter Kortekaas
--
-- COMPANY : 4DSP
--
-- ITEM : 1
--
-- UNITS : Entity - ads62p49_ctrl
-- architecture - ads62p49_ctrl_syn
--
-- LANGUAGE : VHDL
--
-------------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------------
-- DESCRIPTION
-- ===========
--
-- This file initialises the internal registers in the ADS62P49 from FPGA ROM
-- through SPI communication bus.
--
-------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
use ieee.std_logic_unsigned.all;
entity ads62p49_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
adc_reset : out std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end ads62p49_ctrl;
architecture ads62p49_ctrl_syn of ads62p49_ctrl is
component fmc150_stellar_cmd is
generic
(
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port
(
reset : in std_logic;
-- Command Interface
clk_cmd : in std_logic; --cmd_in and cmd_out are synchronous to this clock;
out_cmd : out std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
in_cmd : in std_logic_vector(63 downto 0);
in_cmd_val : in std_logic;
-- Register interface
clk_reg : in std_logic; --register interface is synchronous to this clock
out_reg : out std_logic_vector(31 downto 0); --caries the out register data
out_reg_val : out std_logic; --the out_reg has valid data (pulse)
out_reg_addr : out std_logic_vector(27 downto 0); --out register address
in_reg : in std_logic_vector(31 downto 0); --requested register data is placed on this bus
in_reg_val : in std_logic; --pulse to indicate requested register is valid
in_reg_req : out std_logic; --pulse to request data
in_reg_addr : out std_logic_vector(27 downto 0); --requested address
--mailbox interface
mbx_in_reg : in std_logic_vector(31 downto 0); --value of the mailbox to send
mbx_in_val : in std_logic --pulse to indicate mailbox is valid
);
end component fmc150_stellar_cmd;
component pulse2pulse
port (
rst : in std_logic;
in_clk : in std_logic;
out_clk : in std_logic;
pulsein : in std_logic;
pulseout : out std_logic;
inbusy : out std_logic
);
end component;
component ads62p49_init_mem is
port (
clka : in std_logic;
addra : in std_logic_vector(4 downto 0);
douta : out std_logic_vector(15 downto 0)
);
end component;
constant ADDR_GLOBAL : std_logic_vector(27 downto 0) := x"0000077";
constant ADDR_MAX_WR : std_logic_vector(27 downto 0) := x"0000076";
constant ADDR_MAX_RD : std_logic_vector(27 downto 0) := x"0000076";
type sh_states is (idle, instruct, data_io, data_valid);
signal sh_state : sh_states;
signal serial_clk : std_logic;
signal sclk_ext : std_logic;
signal out_reg_val : std_logic;
signal out_reg_addr : std_logic_vector(27 downto 0);
signal out_reg : std_logic_vector(31 downto 0);
signal in_reg_req : std_logic;
signal in_reg_addr : std_logic_vector(27 downto 0);
signal in_reg_val : std_logic;
signal in_reg : std_logic_vector(31 downto 0);
signal done_sclk : std_logic;
signal init_done_sclk : std_logic;
signal init_done_tmp : std_logic;
signal init_done_prev : std_logic;
signal init : std_logic;
signal init_tmp : std_logic;
signal init_reg : std_logic;
signal reset : std_logic;
signal inst_val : std_logic;
signal inst_reg_val : std_logic;
signal inst_rw : std_logic;
signal inst_reg : std_logic_vector(7 downto 0);
signal data_reg : std_logic_vector(7 downto 0);
signal sh_counter : integer;
signal shifting : std_logic;
signal read_n_write : std_logic;
signal ncs_int : std_logic;
signal busy : std_logic;
signal sdi : std_logic;
signal shift_reg : std_logic_vector(15 downto 0);
signal init_address : std_logic_vector(4 downto 0);
signal init_data : std_logic_vector(15 downto 0);
signal read_byte_val : std_logic;
signal data_read_val : std_logic;
signal data_read : std_logic_vector(7 downto 0);
begin
----------------------------------------------------------------------------------------------------
-- Generate serial clock (max 20MHz)
----------------------------------------------------------------------------------------------------
process (clk)
-- Divide by 2^4 = 16, CLKmax = 16 x 20MHz = 320MHz
variable clk_div : std_logic_vector(3 downto 0) := (others => '0');
begin
if (rising_edge(clk)) then
clk_div := clk_div + '1';
-- The slave samples the data on the rising edge of SCLK.
-- therefore we make sure the external clock is slightly
-- after the internal clock.
serial_clk <= clk_div(clk_div'length-1);
sclk_ext <= serial_clk;
end if;
end process;
----------------------------------------------------------------------------------------------------
-- Stellar Command Interface
----------------------------------------------------------------------------------------------------
fmc150_stellar_cmd_inst : fmc150_stellar_cmd
generic map
(
START_ADDR => START_ADDR,
STOP_ADDR => STOP_ADDR
)
port map
(
reset => rst,
clk_cmd => clk_cmd,
in_cmd_val => in_cmd_val,
in_cmd => in_cmd,
out_cmd_val => out_cmd_val,
out_cmd => out_cmd,
clk_reg => clk,
out_reg_val => out_reg_val,
out_reg_addr => out_reg_addr,
out_reg => out_reg,
in_reg_req => in_reg_req,
in_reg_addr => in_reg_addr,
in_reg_val => in_reg_val,
in_reg => in_reg,
mbx_in_val => '0',
mbx_in_reg => (others => '0')
);
----------------------------------------------------------------------------------------------------
-- Shoot commands to the state machine
----------------------------------------------------------------------------------------------------
process (rst, clk)
begin
if (rst = '1') then
init_done <= '0';
init_done_tmp <= '0';
init_done_prev <= '0';
init <= '0';
reset <= '1';
in_reg_val <= '0';
in_reg <= (others => '0');
inst_val <= '0';
inst_rw <= '0';
inst_reg <= (others=> '0');
data_reg <= (others=> '0');
elsif (rising_edge(clk)) then
init_done <= init_done_sclk;
init_done_tmp <= done_sclk;
init_done_prev <= init_done_tmp;
-- Release the init flag on rising edge init done
if (init_done_tmp = '1' and init_done_prev = '0') then
init <= '0';
-- Enable the init flag when enable flag is high, but done flag is low
elsif (init_ena = '1' and init_done_tmp = '0') then
init <= '1';
-- There is one additional status and control register available
elsif (out_reg_val = '1' and out_reg_addr = ADDR_GLOBAL) then
init <= out_reg(0);
end if;
--Write
if (out_reg_val = '1' and out_reg_addr = ADDR_GLOBAL) then
reset <= out_reg(1);
else
reset <= '0';
end if;
-- There is one additional status and control register available
if (in_reg_req = '1' and in_reg_addr = ADDR_GLOBAL) then
in_reg_val <= '1';
in_reg <= conv_std_logic_vector(0, 27) & '0' & busy & '0' & reset & init_done_prev;
-- read from serial if when address is within device range
elsif (in_reg_addr <= ADDR_MAX_RD) then
in_reg_val <= data_read_val;
in_reg <= conv_std_logic_vector(0, 24) & data_read;
else
in_reg_val <= '0';
in_reg <= in_reg;
end if;
-- Write instruction, only when address is within device range
if (out_reg_val = '1' and out_reg_addr <= ADDR_MAX_WR) then
inst_val <= '1';
inst_rw <= '0'; -- write
inst_reg <= out_reg_addr(7 downto 0);
data_reg <= out_reg(7 downto 0);
-- Read instruction, only when address is within device range
elsif (in_reg_req = '1' and in_reg_addr <= ADDR_MAX_RD) then
inst_val <= '1';
inst_rw <= '1'; -- read
inst_reg <= in_reg_addr(7 downto 0);
data_reg <= data_reg;
-- No instruction
else
inst_val <= '0';
inst_rw <= inst_rw;
inst_reg <= inst_reg;
data_reg <= data_reg;
end if;
end if;
end process;
-- Intruction pulse
pulse2pulse_inst0 : pulse2pulse
port map
(
rst => rst,
in_clk => clk,
out_clk => serial_clk,
pulsein => inst_val,
pulseout => inst_reg_val,
inbusy => open
);
----------------------------------------------------------------------------------------------------
-- Serial interface state-machine
----------------------------------------------------------------------------------------------------
process (rst, serial_clk)
begin
if (rst = '1') then
init_tmp <= '0';
init_reg <= '0';
sh_state <= idle;
sh_counter <= 0;
shifting <= '0';
read_n_write <= '0';
ncs_int <= '1';
elsif (rising_edge(serial_clk)) then
-- Double synchonise flag from other clock domain
init_tmp <= init;
init_reg <= init_tmp;
-- Main state machine
case sh_state is
when idle =>
sh_counter <= shift_reg'length-data_reg'length-1; --total length minus data bytes;
-- Accept every instruction
if (inst_reg_val = '1' or init_reg = '1') then
shifting <= '1';
read_n_write <= inst_rw and not init_reg; -- force write during init
ncs_int <= '0';
sh_state <= instruct;
else
shifting <= '0';
ncs_int <= '1';
end if;
when instruct =>
if (sh_counter = 0) then
sh_counter <= data_reg'length-1;
sh_state <= data_io;
else
sh_counter <= sh_counter - 1;
end if;
when data_io =>
if (sh_counter = 0) then
sh_counter <= shift_reg'length-data_reg'length-1; --total length minus data bytes;
shifting <= '0';
ncs_int <= '1';
if (read_n_write = '1') then
sh_state <= data_valid;
else
sh_state <= idle;
end if;
else
sh_counter <= sh_counter - 1;
end if;
when data_valid =>
sh_state <= idle;
when others =>
sh_state <= idle;
end case;
end if;
end process;
busy <= '0' when (sh_state = idle and init_reg = '0') else '1';
----------------------------------------------------------------------------------------------------
-- Instruction & data shift register
----------------------------------------------------------------------------------------------------
process (rst, serial_clk)
begin
if (rst = '1') then
shift_reg <= (others => '0');
init_address <= (others => '0');
done_sclk <= '0';
init_done_sclk <= '0';
read_byte_val <= '0';
data_read <= (others => '0');
elsif (rising_edge(serial_clk)) then
if (init_reg = '1' and shifting = '0') then
shift_reg <= init_data;
-- Stop when update instruction is reveived (= last instruction)
if (init_data(15 downto 8) = ADDR_MAX_WR) then
init_address <= (others => '0');
done_sclk <= '1';
else
init_address <= init_address + 1;
done_sclk <= '0';
end if;
elsif (inst_reg_val = '1' and init_reg = '0') then
shift_reg <= inst_reg & data_reg;
elsif (shifting = '1') then
shift_reg <= shift_reg(shift_reg'length - 2 downto 0) & sdi;
end if;
if (done_sclk = '0') then
init_done_sclk <= '0';
elsif (sh_state = idle) then
init_done_sclk <= '1';
end if;
-- Data read from device
if (sh_state = data_valid) then
read_byte_val <= '1';
data_read <= shift_reg(7 downto 0);
else
read_byte_val <= '0';
data_read <= data_read;
end if;
end if;
end process;
-- Transfer data valid pulse to other clock domain
pulse2pulse_inst1 : pulse2pulse
port map
(
rst => rst,
in_clk => serial_clk,
out_clk => clk,
pulsein => read_byte_val,
pulseout => data_read_val,
inbusy => open
);
----------------------------------------------------------------------------------------------------
-- Initialization memory
----------------------------------------------------------------------------------------------------
ads62p49_init_mem_inst : ads62p49_init_mem
port map (
clka => serial_clk,
addra => init_address,
douta => init_data
);
----------------------------------------------------------------------------------------------------
-- Capture data in on rising edge SCLK
-- therefore freeze the signal on the falling edge of serial clock.
----------------------------------------------------------------------------------------------------
process (serial_clk)
begin
if (falling_edge(serial_clk)) then
sdi <= spi_sdi;
end if;
end process;
----------------------------------------------------------------------------------------------------
-- Connect entity
----------------------------------------------------------------------------------------------------
in_cmd_busy <= busy; -- serial interface busy
spi_n_oe <= '1' when (sh_state = data_io and read_n_write = '1') else ncs_int;
spi_n_cs <= ncs_int;
spi_sclk <= sclk_ext when ncs_int = '0' else '0';
spi_sdo <= 'Z' when (sh_state = data_io and read_n_write = '1') else shift_reg(shift_reg'length - 1);
adc_reset <= reset;
----------------------------------------------------------------------------------------------------
-- End
----------------------------------------------------------------------------------------------------
end ads62p49_ctrl_syn;
\ No newline at end of file
-------------------------------------------------------------------------------------
-- FILE NAME : amc7823_ctrl.vhd
--
-- AUTHOR : Peter Kortekaas
--
-- COMPANY : 4DSP
--
-- ITEM : 1
--
-- UNITS : Entity - amc7823_ctrl
-- architecture - amc7823_ctrl_syn
--
-- LANGUAGE : VHDL
--
-------------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------------
-- DESCRIPTION
-- ===========
--
-- This file initialises the internal registers in the AMC7823 from FPGA ROM
-- through SPI communication bus.
--
-------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
use ieee.std_logic_unsigned.all;
entity amc7823_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
mon_n_reset : out std_logic;
mon_n_int : in std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end amc7823_ctrl;
architecture amc7823_ctrl_syn of amc7823_ctrl is
component fmc150_stellar_cmd is
generic
(
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port
(
reset : in std_logic;
-- Command Interface
clk_cmd : in std_logic; --cmd_in and cmd_out are synchronous to this clock;
out_cmd : out std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
in_cmd : in std_logic_vector(63 downto 0);
in_cmd_val : in std_logic;
-- Register interface
clk_reg : in std_logic; --register interface is synchronous to this clock
out_reg : out std_logic_vector(31 downto 0); --caries the out register data
out_reg_val : out std_logic; --the out_reg has valid data (pulse)
out_reg_addr : out std_logic_vector(27 downto 0); --out register address
in_reg : in std_logic_vector(31 downto 0); --requested register data is placed on this bus
in_reg_val : in std_logic; --pulse to indicate requested register is valid
in_reg_req : out std_logic; --pulse to request data
in_reg_addr : out std_logic_vector(27 downto 0); --requested address
--mailbox interface
mbx_in_reg : in std_logic_vector(31 downto 0); --value of the mailbox to send
mbx_in_val : in std_logic --pulse to indicate mailbox is valid
);
end component fmc150_stellar_cmd;
component pulse2pulse
port (
rst : in std_logic;
in_clk : in std_logic;
out_clk : in std_logic;
pulsein : in std_logic;
pulseout : out std_logic;
inbusy : out std_logic
);
end component;
component amc7823_init_mem is
port (
clka : in std_logic;
addra : in std_logic_vector(4 downto 0);
douta : out std_logic_vector(31 downto 0)
);
end component;
constant ADDR_GLOBAL : std_logic_vector(27 downto 0) := x"0000320";
constant ADDR_MAX_WR : std_logic_vector(27 downto 0) := x"0000115"; --page 1 (0x40), reg 0x15
constant ADDR_MAX_RD : std_logic_vector(27 downto 0) := x"000011E"; --page 1 (0x40), reg 0x1E
type sh_states is (idle, instruct, data_io, data_valid);
signal sh_state : sh_states;
signal serial_clk : std_logic;
signal sclk_ext : std_logic;
signal out_reg_val : std_logic;
signal out_reg_addr : std_logic_vector(27 downto 0);
signal out_reg : std_logic_vector(31 downto 0);
signal in_reg_req : std_logic;
signal in_reg_addr : std_logic_vector(27 downto 0);
signal in_reg_val : std_logic;
signal in_reg : std_logic_vector(31 downto 0);
signal done_sclk : std_logic;
signal init_done_sclk : std_logic;
signal init_done_tmp : std_logic;
signal init_done_prev : std_logic;
signal init : std_logic;
signal init_tmp : std_logic;
signal init_reg : std_logic;
signal mon_reset : std_logic;
signal inst_val : std_logic;
signal inst_reg_val : std_logic;
signal inst_rw : std_logic;
signal page_reg : std_logic_vector(1 downto 0);
signal inst_reg : std_logic_vector(4 downto 0);
signal data_reg : std_logic_vector(15 downto 0);
signal sh_counter : integer;
signal shifting : std_logic;
signal read_n_write : std_logic;
signal ncs_int : std_logic;
signal busy : std_logic;
signal sdi : std_logic;
signal shift_reg : std_logic_vector(31 downto 0);
signal init_address : std_logic_vector(4 downto 0);
signal init_data : std_logic_vector(31 downto 0);
signal read_byte_val : std_logic;
signal data_read_val : std_logic;
signal data_read : std_logic_vector(15 downto 0);
begin
----------------------------------------------------------------------------------------------------
-- Generate serial clock (max 20MHz)
----------------------------------------------------------------------------------------------------
process (clk)
-- Divide by 2^4 = 16, CLKmax = 16 x 20MHz = 320MHz
variable clk_div : std_logic_vector(3 downto 0) := (others => '0');
begin
if (rising_edge(clk)) then
clk_div := clk_div + '1';
-- The slave samples the data on the falling edge of SCLK.
-- therefore we make sure the external clock is slightly
-- before the internal clock.
sclk_ext <= clk_div(clk_div'length-1);
serial_clk <= sclk_ext;
end if;
end process;
----------------------------------------------------------------------------------------------------
-- Stellar Command Interface
----------------------------------------------------------------------------------------------------
fmc150_stellar_cmd_inst : fmc150_stellar_cmd
generic map
(
START_ADDR => START_ADDR,
STOP_ADDR => STOP_ADDR
)
port map
(
reset => rst,
clk_cmd => clk_cmd,
in_cmd_val => in_cmd_val,
in_cmd => in_cmd,
out_cmd_val => out_cmd_val,
out_cmd => out_cmd,
clk_reg => clk,
out_reg_val => out_reg_val,
out_reg_addr => out_reg_addr,
out_reg => out_reg,
in_reg_req => in_reg_req,
in_reg_addr => in_reg_addr,
in_reg_val => in_reg_val,
in_reg => in_reg,
mbx_in_val => '0',
mbx_in_reg => (others => '0')
);
----------------------------------------------------------------------------------------------------
-- Shoot commands to the DAC state machine
----------------------------------------------------------------------------------------------------
process (rst, clk)
begin
if (rst = '1') then
init_done <= '0';
init_done_tmp <= '0';
init_done_prev <= '0';
init <= '0';
mon_reset <= '1';
in_reg_val <= '0';
in_reg <= (others => '0');
inst_val <= '0';
inst_rw <= '0';
page_reg <= (others=> '0');
inst_reg <= (others=> '0');
data_reg <= (others=> '0');
elsif (rising_edge(clk)) then
init_done <= init_done_sclk;
init_done_tmp <= done_sclk;
init_done_prev <= init_done_tmp;
-- Release the init flag on rising edge init done
if (init_done_tmp = '1' and init_done_prev = '0') then
init <= '0';
-- Enable the init flag when enable flag is high, but done flag is low
elsif (init_ena = '1' and init_done_tmp = '0') then
init <= '1';
-- There is one additional status and control register available
elsif (out_reg_val = '1' and out_reg_addr = ADDR_GLOBAL) then
init <= out_reg(0);
end if;
--Write
if (out_reg_val = '1' and out_reg_addr = ADDR_GLOBAL) then
mon_reset <= out_reg(1);
else
mon_reset <= '0';
end if;
-- There is one additional status and control register available
if (in_reg_req = '1' and in_reg_addr = ADDR_GLOBAL) then
in_reg_val <= '1';
in_reg <= conv_std_logic_vector(0, 28) & busy & not mon_n_int & mon_reset & init_done_prev;
-- read from serial if when address is within DAC range
elsif (in_reg_addr <= ADDR_MAX_RD) then
in_reg_val <= data_read_val;
in_reg <= conv_std_logic_vector(0, 16) & data_read;
else
in_reg_val <= '0';
in_reg <= in_reg;
end if;
-- Write instruction, only when address is within DAC range
if (out_reg_val = '1' and out_reg_addr <= ADDR_MAX_WR) then
inst_val <= '1';
inst_rw <= '0'; -- write
page_reg <= out_reg_addr(9 downto 8);
inst_reg <= out_reg_addr(4 downto 0);
data_reg <= out_reg(15 downto 0);
-- Read instruction, only when address is within DAC range
elsif (in_reg_req = '1' and in_reg_addr <= ADDR_MAX_RD) then
inst_val <= '1';
inst_rw <= '1'; -- read
page_reg <= in_reg_addr(9 downto 8);
inst_reg <= in_reg_addr(4 downto 0);
data_reg <= data_reg;
-- No instruction
else
inst_val <= '0';
inst_rw <= inst_rw;
inst_reg <= inst_reg;
data_reg <= data_reg;
end if;
end if;
end process;
-- Intruction pulse
pulse2pulse_inst0 : pulse2pulse
port map
(
rst => rst,
in_clk => clk,
out_clk => serial_clk,
pulsein => inst_val,
pulseout => inst_reg_val,
inbusy => open
);
----------------------------------------------------------------------------------------------------
-- DAC serial interface state-machine
----------------------------------------------------------------------------------------------------
process (rst, serial_clk)
begin
if (rst = '1') then
init_tmp <= '0';
init_reg <= '0';
sh_state <= idle;
sh_counter <= 0;
shifting <= '0';
read_n_write <= '0';
ncs_int <= '1';
elsif (rising_edge(serial_clk)) then
-- Double synchonise flag from other clock domain
init_tmp <= init;
init_reg <= init_tmp;
-- Main state machine
case sh_state is
when idle =>
sh_counter <= shift_reg'length-data_reg'length-1; --total length minus one data byte;
-- Accept every instruction
if (inst_reg_val = '1' or init_reg = '1') then
shifting <= '1';
read_n_write <= inst_rw and not init_reg; -- force write during init
ncs_int <= '0';
sh_state <= instruct;
else
shifting <= '0';
ncs_int <= '1';
end if;
when instruct =>
if (sh_counter = 0) then
sh_counter <= data_reg'length-1;
sh_state <= data_io;
else
sh_counter <= sh_counter - 1;
end if;
when data_io =>
if (sh_counter = 0) then
sh_counter <= shift_reg'length-data_reg'length-1; --total length minus one data byte;
shifting <= '0';
ncs_int <= '1';
if (read_n_write = '1') then
sh_state <= data_valid;
else
sh_state <= idle;
end if;
else
sh_counter <= sh_counter - 1;
end if;
when data_valid =>
sh_state <= idle;
when others =>
sh_state <= idle;
end case;
end if;
end process;
busy <= '0' when (sh_state = idle and init_reg = '0') else '1';
----------------------------------------------------------------------------------------------------
-- DAC instruction & data shift register
----------------------------------------------------------------------------------------------------
process (rst, serial_clk)
begin
if (rst = '1') then
shift_reg <= (others => '0');
init_address <= (others => '0');
done_sclk <= '0';
init_done_sclk <= '0';
read_byte_val <= '0';
data_read <= (others => '0');
elsif (rising_edge(serial_clk)) then
if (init_reg = '1' and shifting = '0') then
--rw + X,PG + X,StartADR + X,EndADR+ data
shift_reg <= '0' & init_data(26 downto 24) & init_data(21 downto 16) & init_data(21 downto 16) & init_data(15 downto 0);
-- Stop when update instruction is reveived (= last instruction)
if (init_data(31 downto 16) = ADDR_MAX_WR) then
init_address <= (others => '0');
done_sclk <= '1';
else
init_address <= init_address + 1;
done_sclk <= '0';
end if;
elsif (inst_reg_val = '1' and init_reg = '0') then
-- Always access one register per cycle
shift_reg <= inst_rw & '0' & page_reg & '0' & inst_reg & '0' & inst_reg & data_reg;
elsif (shifting = '1') then
shift_reg <= shift_reg(shift_reg'length - 2 downto 0) & sdi;
end if;
if (done_sclk = '0') then
init_done_sclk <= '0';
elsif (sh_state = idle) then
init_done_sclk <= '1';
end if;
-- Data read from DAC
if (sh_state = data_valid) then
read_byte_val <= '1';
data_read <= shift_reg(15 downto 0);
else
read_byte_val <= '0';
data_read <= data_read;
end if;
end if;
end process;
-- Transfer data valid pulse to other clock domain
pulse2pulse_inst1 : pulse2pulse
port map
(
rst => rst,
in_clk => serial_clk,
out_clk => clk,
pulsein => read_byte_val,
pulseout => data_read_val,
inbusy => open
);
----------------------------------------------------------------------------------------------------
-- Initialization memory
----------------------------------------------------------------------------------------------------
amc7823_init_mem_inst : amc7823_init_mem
port map (
clka => serial_clk,
addra => init_address,
douta => init_data
);
----------------------------------------------------------------------------------------------------
-- Capture data in on falling edge SCLK
-- therefore pass the signal to the process that captures on the rising edge of serial clock.
----------------------------------------------------------------------------------------------------
--process (serial_clk)
--begin
-- if (falling_edge(serial_clk)) then
sdi <= spi_sdi;
-- end if;
--end process;
----------------------------------------------------------------------------------------------------
-- Connect entity
----------------------------------------------------------------------------------------------------
in_cmd_busy <= busy; -- serial interface busy
spi_n_oe <= '1' when (sh_state = data_io and read_n_write = '1') else ncs_int;
spi_n_cs <= ncs_int;
spi_sclk <= not sclk_ext when ncs_int = '0' else '0';
spi_sdo <= 'Z' when (sh_state = data_io and read_n_write = '1') else shift_reg(shift_reg'length - 1);
mon_n_reset <= not mon_reset;
----------------------------------------------------------------------------------------------------
-- End
----------------------------------------------------------------------------------------------------
end amc7823_ctrl_syn;
\ No newline at end of file
-------------------------------------------------------------------------------------
-- FILE NAME : cdce72010_ctrl.vhd
--
-- AUTHOR : Peter Kortekaas
--
-- COMPANY : 4DSP
--
-- ITEM : 1
--
-- UNITS : Entity - cdce72010_ctrl
-- architecture - cdce72010_ctrl_syn
--
-- LANGUAGE : VHDL
--
-------------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------------
-- DESCRIPTION
-- ===========
--
-- This file initialises the internal registers in the CDCE72010 from FPGA ROM
-- through SPI communication bus.
--
-------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
use ieee.std_logic_unsigned.all;
entity cdce72010_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
external_clock : in std_logic;
cdce_n_reset : out std_logic;
cdce_n_pd : out std_logic;
ref_en : out std_logic;
pll_status : in std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end cdce72010_ctrl;
architecture cdce72010_ctrl_syn of cdce72010_ctrl is
component fmc150_stellar_cmd is
generic
(
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port
(
reset : in std_logic;
-- Command Interface
clk_cmd : in std_logic; --cmd_in and cmd_out are synchronous to this clock;
out_cmd : out std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
in_cmd : in std_logic_vector(63 downto 0);
in_cmd_val : in std_logic;
-- Register interface
clk_reg : in std_logic; --register interface is synchronous to this clock
out_reg : out std_logic_vector(31 downto 0); --caries the out register data
out_reg_val : out std_logic; --the out_reg has valid data (pulse)
out_reg_addr : out std_logic_vector(27 downto 0); --out register address
in_reg : in std_logic_vector(31 downto 0); --requested register data is placed on this bus
in_reg_val : in std_logic; --pulse to indicate requested register is valid
in_reg_req : out std_logic; --pulse to request data
in_reg_addr : out std_logic_vector(27 downto 0); --requested address
--mailbox interface
mbx_in_reg : in std_logic_vector(31 downto 0); --value of the mailbox to send
mbx_in_val : in std_logic --pulse to indicate mailbox is valid
);
end component fmc150_stellar_cmd;
component pulse2pulse
port (
rst : in std_logic;
in_clk : in std_logic;
out_clk : in std_logic;
pulsein : in std_logic;
pulseout : out std_logic;
inbusy : out std_logic
);
end component;
component cdce72010_init_mem_int is
port (
clka : in std_logic;
addra : in std_logic_vector(3 downto 0);
douta : out std_logic_vector(31 downto 0)
);
end component;
component cdce72010_init_mem_ext is
port (
clka : in std_logic;
addra : in std_logic_vector(3 downto 0);
douta : out std_logic_vector(31 downto 0)
);
end component;
constant ADDR_GLOBAL : std_logic_vector := x"0000010";
constant ADDR_MAX_WR : std_logic_vector := x"000000C";
constant ADDR_MAX_RD : std_logic_vector := x"000000C";
type sh_states is (idle, reg_write, start_reg_read, reg_read, data_valid);
signal sh_state : sh_states;
signal serial_clk : std_logic;
signal sclk_ext : std_logic;
signal out_reg_val : std_logic;
signal out_reg_addr : std_logic_vector(27 downto 0);
signal out_reg : std_logic_vector(31 downto 0);
signal in_reg_req : std_logic;
signal in_reg_addr : std_logic_vector(27 downto 0);
signal in_reg_val : std_logic;
signal in_reg : std_logic_vector(31 downto 0);
signal done_sclk : std_logic;
signal init_done_sclk : std_logic;
signal init_done_tmp : std_logic;
signal init_done_prev : std_logic;
signal init : std_logic;
signal init_tmp : std_logic;
signal init_reg : std_logic;
signal cdce_reset : std_logic;
signal cdce_pd : std_logic;
signal ref_dis : std_logic;
signal inst_val : std_logic;
signal inst_reg_val : std_logic;
signal inst_rw : std_logic;
signal inst_reg : std_logic_vector(3 downto 0);
signal data_reg : std_logic_vector(27 downto 0);
signal sh_counter : integer;
signal shifting : std_logic;
signal read_n_write : std_logic;
signal ncs_int : std_logic;
signal busy : std_logic;
signal sdi : std_logic;
signal shift_reg : std_logic_vector(31 downto 0);
signal init_address : std_logic_vector(3 downto 0);
signal init_data_int : std_logic_vector(31 downto 0);
signal init_data_ext : std_logic_vector(31 downto 0);
signal init_data : std_logic_vector(31 downto 0);
signal read_byte_val : std_logic;
signal data_read_val : std_logic;
signal data_read : std_logic_vector(27 downto 0);
begin
----------------------------------------------------------------------------------------------------
-- Generate serial clock (max 20MHz)
----------------------------------------------------------------------------------------------------
process (clk)
-- Divide by 2^4 = 16, CLKmax = 16 x 20MHz = 320MHz
variable clk_div : std_logic_vector(3 downto 0) := (others => '0');
begin
if (rising_edge(clk)) then
clk_div := clk_div + '1';
-- The slave samples the data on the rising edge of SCLK.
-- therefore we make sure the external clock is slightly
-- after the internal clock.
sclk_ext <= clk_div(clk_div'length-1);
serial_clk <= sclk_ext;
end if;
end process;
----------------------------------------------------------------------------------------------------
-- Stellar Command Interface
----------------------------------------------------------------------------------------------------
fmc150_stellar_cmd_inst : fmc150_stellar_cmd
generic map
(
START_ADDR => START_ADDR,
STOP_ADDR => STOP_ADDR
)
port map
(
reset => rst,
clk_cmd => clk_cmd,
in_cmd_val => in_cmd_val,
in_cmd => in_cmd,
out_cmd_val => out_cmd_val,
out_cmd => out_cmd,
clk_reg => clk,
out_reg_val => out_reg_val,
out_reg_addr => out_reg_addr,
out_reg => out_reg,
in_reg_req => in_reg_req,
in_reg_addr => in_reg_addr,
in_reg_val => in_reg_val,
in_reg => in_reg,
mbx_in_val => '0',
mbx_in_reg => (others => '0')
);
----------------------------------------------------------------------------------------------------
-- Shoot commands to the DAC state machine
----------------------------------------------------------------------------------------------------
process (rst, clk)
begin
if (rst = '1') then
init_done <= '0';
init_done_tmp <= '0';
init_done_prev <= '0';
init <= '0';
cdce_reset <= '0';
cdce_pd <= '0';
ref_dis <= '0';
in_reg_val <= '0';
in_reg <= (others => '0');
inst_val <= '0';
inst_rw <= '0';
inst_reg <= (others=> '0');
data_reg <= (others=> '0');
elsif (rising_edge(clk)) then
init_done <= init_done_sclk;
init_done_tmp <= done_sclk;
init_done_prev <= init_done_tmp;
-- Release the init flag on rising edge init done
if (init_done_tmp = '1' and init_done_prev = '0') then
init <= '0';
-- Enable the init flag when enable flag is high, but done flag is low
elsif (init_ena = '1' and init_done_tmp = '0') then
init <= '1';
-- There is one additional status and control register available
elsif (out_reg_val = '1' and out_reg_addr = ADDR_GLOBAL) then
init <= out_reg(0);
end if;
--Write
if (out_reg_val = '1' and out_reg_addr = ADDR_GLOBAL) then
cdce_reset <= out_reg(1);
cdce_pd <= out_reg(2);
ref_dis <= out_reg(3);
else
cdce_reset <= '0';
cdce_pd <= cdce_pd;
ref_dis <= ref_dis;
end if;
-- There is one additional status and control register available
if (in_reg_req = '1' and in_reg_addr = ADDR_GLOBAL) then
in_reg_val <= '1';
in_reg <= conv_std_logic_vector(0, 26) & busy & pll_status & ref_dis & cdce_pd & cdce_reset & init_done_prev;
-- Read from serial if when address is within chip range
elsif (in_reg_addr <= ADDR_MAX_RD) then
in_reg_val <= data_read_val;
in_reg <= data_read & in_reg_addr(3 downto 0);
else
in_reg_val <= '0';
in_reg <= in_reg;
end if;
-- Write instruction, only when address is within chip range
if (out_reg_val = '1' and out_reg_addr <= ADDR_MAX_WR) then
inst_val <= '1';
inst_rw <= '0'; -- write
inst_reg <= out_reg_addr(3 downto 0);
data_reg <= out_reg(31 downto 4);
-- Read instruction, only when address is within chip range
elsif (in_reg_req = '1' and in_reg_addr <= ADDR_MAX_RD) then
inst_val <= '1';
inst_rw <= '1'; -- read
inst_reg <= "1110";
data_reg <= conv_std_logic_vector(0, 24) & in_reg_addr(3 downto 0);
-- No instruction
else
inst_val <= '0';
inst_rw <= inst_rw;
inst_reg <= inst_reg;
data_reg <= data_reg;
end if;
end if;
end process;
-- Intruction pulse
pulse2pulse_inst0 : pulse2pulse
port map
(
rst => rst,
in_clk => clk,
out_clk => serial_clk,
pulsein => inst_val,
pulseout => inst_reg_val,
inbusy => open
);
----------------------------------------------------------------------------------------------------
-- DAC serial interface state-machine
----------------------------------------------------------------------------------------------------
process (rst, serial_clk)
begin
if (rst = '1') then
init_tmp <= '0';
init_reg <= '0';
sh_state <= idle;
sh_counter <= 0;
shifting <= '0';
read_n_write <= '0';
ncs_int <= '1';
elsif (rising_edge(serial_clk)) then
-- Double synchonise flag from other clock domain
init_tmp <= init;
init_reg <= init_tmp;
-- Main state machine
case sh_state is
when idle =>
sh_counter <= shift_reg'length - 1;
-- Accept every instruction
if (inst_reg_val = '1' or init_reg = '1') then
shifting <= '1';
read_n_write <= inst_rw and not init_reg; -- force write during init
ncs_int <= '0';
sh_state <= reg_write;
else
shifting <= '0';
ncs_int <= '1';
end if;
when reg_write =>
if (sh_counter = 0) then
sh_counter <= shift_reg'length - 1;
shifting <= '0';
ncs_int <= '1';
if (read_n_write = '1') then
sh_state <= start_reg_read;
else
sh_state <= idle;
end if;
else
sh_counter <= sh_counter - 1;
end if;
when start_reg_read =>
sh_counter <= shift_reg'length - 1;
shifting <= '1';
ncs_int <= '0';
sh_state <= reg_read;
when reg_read =>
if (sh_counter = 0) then
sh_counter <= shift_reg'length - 1;
shifting <= '0';
ncs_int <= '1';
sh_state <= data_valid;
else
sh_counter <= sh_counter - 1;
end if;
when data_valid =>
sh_state <= idle;
when others =>
sh_state <= idle;
end case;
end if;
end process;
busy <= '0' when (sh_state = idle and init_reg = '0') else '1';
----------------------------------------------------------------------------------------------------
-- DAC instruction & data shift register
----------------------------------------------------------------------------------------------------
process (rst, serial_clk)
begin
if (rst = '1') then
shift_reg <= (others => '0');
init_address <= (others => '0');
done_sclk <= '0';
init_done_sclk <= '0';
read_byte_val <= '0';
data_read <= (others => '0');
elsif (rising_edge(serial_clk)) then
if (init_reg = '1' and shifting = '0') then
shift_reg <= init_data;
-- Stop when update instruction is reveived (= last instruction)
if (init_data(3 downto 0) = ADDR_MAX_WR) then
init_address <= (others => '0');
done_sclk <= '1';
else
init_address <= init_address + 1;
done_sclk <= '0';
end if;
elsif (inst_reg_val = '1' and init_reg = '0') then
shift_reg <= data_reg & inst_reg;
elsif (shifting = '1') then
shift_reg <= sdi & shift_reg(shift_reg'length - 1 downto 1);
end if;
if (done_sclk = '0') then
init_done_sclk <= '0';
elsif (sh_state = idle) then
init_done_sclk <= '1';
end if;
-- Data read from DAC
if (sh_state = data_valid) then
read_byte_val <= '1';
data_read <= shift_reg(31 downto 4);
else
read_byte_val <= '0';
data_read <= data_read;
end if;
end if;
end process;
-- Transfer data valid pulse to other clock domain
pulse2pulse_inst1 : pulse2pulse
port map
(
rst => rst,
in_clk => serial_clk,
out_clk => clk,
pulsein => read_byte_val,
pulseout => data_read_val,
inbusy => open
);
----------------------------------------------------------------------------------------------------
-- Initialization memory for internal clock source
----------------------------------------------------------------------------------------------------
cdce72010_init_mem_int_inst : cdce72010_init_mem_int
port map (
clka => serial_clk,
addra => init_address,
douta => init_data_int
);
----------------------------------------------------------------------------------------------------
-- Initialization memory for external clock source
----------------------------------------------------------------------------------------------------
cdce72010_init_mem_ext_inst : cdce72010_init_mem_ext
port map (
clka => serial_clk,
addra => init_address,
douta => init_data_ext
);
----------------------------------------------------------------------------------------------------
-- Select between internal clock or external clock initialisation
----------------------------------------------------------------------------------------------------
init_data <= init_data_ext when external_clock = '1' else init_data_int;
----------------------------------------------------------------------------------------------------
-- Capture data in on rising edge SCLK
-- therefore freeze the signal on the falling edge of serial clock.
----------------------------------------------------------------------------------------------------
process (serial_clk)
begin
if (falling_edge(serial_clk)) then
sdi <= spi_sdi;
end if;
end process;
----------------------------------------------------------------------------------------------------
-- Connect entity
----------------------------------------------------------------------------------------------------
in_cmd_busy <= busy; -- serial interface busy
spi_n_oe <= '1' when (sh_state = reg_read) else ncs_int;
spi_n_cs <= ncs_int;
spi_sclk <= not sclk_ext when ncs_int = '0' else '0';
spi_sdo <= 'Z' when (sh_state = reg_read) else shift_reg(0);
cdce_n_reset <= not cdce_reset;
cdce_n_pd <= not cdce_pd;
ref_en <= not ref_dis;
----------------------------------------------------------------------------------------------------
-- End
----------------------------------------------------------------------------------------------------
end cdce72010_ctrl_syn;
\ No newline at end of file
-------------------------------------------------------------------------------------
-- FILE NAME : dac3283_ctrl.vhd
--
-- AUTHOR : Peter Kortekaas
--
-- COMPANY : 4DSP
--
-- ITEM : 1
--
-- UNITS : Entity - dac3283_ctrl
-- architecture - dac3283_ctrl_syn
--
-- LANGUAGE : VHDL
--
-------------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------------
-- DESCRIPTION
-- ===========
--
-- This file initialises the internal registers in the DAC3283 from FPGA ROM
-- through SPI communication bus.
--
-------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
use ieee.std_logic_unsigned.all;
entity dac3283_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end dac3283_ctrl;
architecture dac3283_ctrl_syn of dac3283_ctrl is
component fmc150_stellar_cmd is
generic
(
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port
(
reset : in std_logic;
-- Command Interface
clk_cmd : in std_logic; --cmd_in and cmd_out are synchronous to this clock;
out_cmd : out std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
in_cmd : in std_logic_vector(63 downto 0);
in_cmd_val : in std_logic;
-- Register interface
clk_reg : in std_logic; --register interface is synchronous to this clock
out_reg : out std_logic_vector(31 downto 0); --caries the out register data
out_reg_val : out std_logic; --the out_reg has valid data (pulse)
out_reg_addr : out std_logic_vector(27 downto 0); --out register address
in_reg : in std_logic_vector(31 downto 0); --requested register data is placed on this bus
in_reg_val : in std_logic; --pulse to indicate requested register is valid
in_reg_req : out std_logic; --pulse to request data
in_reg_addr : out std_logic_vector(27 downto 0); --requested address
--mailbox interface
mbx_in_reg : in std_logic_vector(31 downto 0); --value of the mailbox to send
mbx_in_val : in std_logic --pulse to indicate mailbox is valid
);
end component fmc150_stellar_cmd;
component pulse2pulse
port (
rst : in std_logic;
in_clk : in std_logic;
out_clk : in std_logic;
pulsein : in std_logic;
pulseout : out std_logic;
inbusy : out std_logic
);
end component;
component dac3283_init_mem is
port (
clka : in std_logic;
addra : in std_logic_vector(4 downto 0);
douta : out std_logic_vector(15 downto 0)
);
end component;
constant ADDR_GLOBAL : std_logic_vector := x"0000020";
constant ADDR_MAX_WR : std_logic_vector := x"000001F";
constant ADDR_MAX_RD : std_logic_vector := x"000001F";
type sh_states is (idle, instruct, data_io, data_valid);
signal sh_state : sh_states;
signal serial_clk : std_logic;
signal sclk_ext : std_logic;
signal out_reg_val : std_logic;
signal out_reg_addr : std_logic_vector(27 downto 0);
signal out_reg : std_logic_vector(31 downto 0);
signal in_reg_req : std_logic;
signal in_reg_addr : std_logic_vector(27 downto 0);
signal in_reg_val : std_logic;
signal in_reg : std_logic_vector(31 downto 0);
signal done_sclk : std_logic;
signal init_done_sclk : std_logic;
signal init_done_tmp : std_logic;
signal init_done_prev : std_logic;
signal init : std_logic;
signal init_tmp : std_logic;
signal init_reg : std_logic;
signal inst_val : std_logic;
signal inst_reg_val : std_logic;
signal inst_rw : std_logic;
signal inst_reg : std_logic_vector(4 downto 0);
signal data_reg : std_logic_vector(7 downto 0);
signal sh_counter : integer;
signal shifting : std_logic;
signal read_n_write : std_logic;
signal ncs_int : std_logic;
signal busy : std_logic;
signal sdi : std_logic;
signal shift_reg : std_logic_vector(15 downto 0);
signal init_address : std_logic_vector(4 downto 0);
signal init_data : std_logic_vector(15 downto 0);
signal read_byte_val : std_logic;
signal data_read_val : std_logic;
signal data_read : std_logic_vector(7 downto 0);
begin
----------------------------------------------------------------------------------------------------
-- Generate serial clock (max 20MHz)
----------------------------------------------------------------------------------------------------
process (clk)
-- Divide by 2^4 = 16, CLKmax = 16 x 20MHz = 320MHz
variable clk_div : std_logic_vector(3 downto 0) := (others => '0');
begin
if (rising_edge(clk)) then
clk_div := clk_div + '1';
-- The slave samples the data on the rising edge of SCLK.
-- therefore we make sure the external clock is slightly
-- after the internal clock.
sclk_ext <= clk_div(clk_div'length-1);
serial_clk <= sclk_ext;
end if;
end process;
----------------------------------------------------------------------------------------------------
-- Stellar Command Interface
----------------------------------------------------------------------------------------------------
fmc150_stellar_cmd_inst : fmc150_stellar_cmd
generic map
(
START_ADDR => START_ADDR,
STOP_ADDR => STOP_ADDR
)
port map
(
reset => rst,
clk_cmd => clk_cmd,
in_cmd_val => in_cmd_val,
in_cmd => in_cmd,
out_cmd_val => out_cmd_val,
out_cmd => out_cmd,
clk_reg => clk,
out_reg_val => out_reg_val,
out_reg_addr => out_reg_addr,
out_reg => out_reg,
in_reg_req => in_reg_req,
in_reg_addr => in_reg_addr,
in_reg_val => in_reg_val,
in_reg => in_reg,
mbx_in_val => '0',
mbx_in_reg => (others => '0')
);
----------------------------------------------------------------------------------------------------
-- Shoot commands to the state machine
----------------------------------------------------------------------------------------------------
process (rst, clk)
begin
if (rst = '1') then
init_done <= '0';
init_done_tmp <= '0';
init_done_prev <= '0';
init <= '0';
in_reg_val <= '0';
in_reg <= (others => '0');
inst_val <= '0';
inst_rw <= '0';
inst_reg <= (others=> '0');
data_reg <= (others=> '0');
elsif (rising_edge(clk)) then
init_done <= init_done_sclk;
init_done_tmp <= done_sclk;
init_done_prev <= init_done_tmp;
-- Release the init flag on rising edge init done
if (init_done_tmp = '1' and init_done_prev = '0') then
init <= '0';
-- Enable the init flag when enable flag is high, but done flag is low
elsif (init_ena = '1' and init_done_tmp = '0') then
init <= '1';
-- There is one additional status and control register available
elsif (out_reg_val = '1' and out_reg_addr = ADDR_GLOBAL) then
init <= out_reg(0);
end if;
-- There is one additional status and control register available
if (in_reg_req = '1' and in_reg_addr = ADDR_GLOBAL) then
in_reg_val <= '1';
in_reg <= conv_std_logic_vector(0, 27) & '0' & busy & '0' & '0' & init_done_prev;
-- read from serial if when address is within device range
elsif (in_reg_addr <= ADDR_MAX_RD) then
in_reg_val <= data_read_val;
in_reg <= conv_std_logic_vector(0, 24) & data_read;
else
in_reg_val <= '0';
in_reg <= in_reg;
end if;
-- Write instruction, only when address is within device range
if (out_reg_val = '1' and out_reg_addr <= ADDR_MAX_WR) then
inst_val <= '1';
inst_rw <= '0'; -- write
inst_reg <= out_reg_addr(4 downto 0);
data_reg <= out_reg(7 downto 0);
-- Read instruction, only when address is within device range
elsif (in_reg_req = '1' and in_reg_addr <= ADDR_MAX_RD) then
inst_val <= '1';
inst_rw <= '1'; -- read
inst_reg <= in_reg_addr(4 downto 0);
data_reg <= data_reg;
-- No instruction
else
inst_val <= '0';
inst_rw <= inst_rw;
inst_reg <= inst_reg;
data_reg <= data_reg;
end if;
end if;
end process;
-- Intruction pulse
pulse2pulse_inst0 : pulse2pulse
port map
(
rst => rst,
in_clk => clk,
out_clk => serial_clk,
pulsein => inst_val,
pulseout => inst_reg_val,
inbusy => open
);
----------------------------------------------------------------------------------------------------
-- Serial interface state-machine
----------------------------------------------------------------------------------------------------
process (rst, serial_clk)
begin
if (rst = '1') then
init_tmp <= '0';
init_reg <= '0';
sh_state <= idle;
sh_counter <= 0;
shifting <= '0';
read_n_write <= '0';
ncs_int <= '1';
elsif (rising_edge(serial_clk)) then
-- Double synchonise flag from other clock domain
init_tmp <= init;
init_reg <= init_tmp;
-- Main state machine
case sh_state is
when idle =>
sh_counter <= shift_reg'length-data_reg'length-1; --total length minus data bytes;
-- Accept every instruction
if (inst_reg_val = '1' or init_reg = '1') then
shifting <= '1';
read_n_write <= inst_rw and not init_reg; -- force write during init
ncs_int <= '0';
sh_state <= instruct;
else
shifting <= '0';
ncs_int <= '1';
end if;
when instruct =>
if (sh_counter = 0) then
sh_counter <= data_reg'length-1;
sh_state <= data_io;
else
sh_counter <= sh_counter - 1;
end if;
when data_io =>
if (sh_counter = 0) then
sh_counter <= shift_reg'length-data_reg'length-1; --total length minus one data byte;
shifting <= '0';
ncs_int <= '1';
if (read_n_write = '1') then
sh_state <= data_valid;
else
sh_state <= idle;
end if;
else
sh_counter <= sh_counter - 1;
end if;
when data_valid =>
sh_state <= idle;
when others =>
sh_state <= idle;
end case;
end if;
end process;
busy <= '0' when (sh_state = idle and init_reg = '0') else '1';
----------------------------------------------------------------------------------------------------
-- Instruction & data shift register
----------------------------------------------------------------------------------------------------
process (rst, serial_clk)
begin
if (rst = '1') then
shift_reg <= (others => '0');
init_address <= (others => '0');
done_sclk <= '0';
init_done_sclk <= '0';
read_byte_val <= '0';
data_read <= (others => '0');
elsif (rising_edge(serial_clk)) then
if (init_reg = '1' and shifting = '0') then
shift_reg <= '0' & "00" & init_data(12 downto 0);
-- Stop when update instruction is reveived (= last instruction)
if (init_data(12 downto 8) = ADDR_MAX_WR) then
init_address <= (others => '0');
done_sclk <= '1';
else
init_address <= init_address + 1;
done_sclk <= '0';
end if;
elsif (inst_reg_val = '1' and init_reg = '0') then
shift_reg <= inst_rw & "00" & inst_reg & data_reg;
elsif (shifting = '1') then
shift_reg <= shift_reg(shift_reg'length - 2 downto 0) & sdi;
end if;
if (done_sclk = '0') then
init_done_sclk <= '0';
elsif (sh_state = idle) then
init_done_sclk <= '1';
end if;
-- Data read from device
if (sh_state = data_valid) then
read_byte_val <= '1';
--data_read <= shift_reg(8 downto 1); -- at this stage already one bit has shifted in too much
data_read <= shift_reg(7 downto 0);
else
read_byte_val <= '0';
data_read <= data_read;
end if;
end if;
end process;
-- Transfer data valid pulse to other clock domain
pulse2pulse_inst1 : pulse2pulse
port map
(
rst => rst,
in_clk => serial_clk,
out_clk => clk,
pulsein => read_byte_val,
pulseout => data_read_val,
inbusy => open
);
----------------------------------------------------------------------------------------------------
-- Initialization memory
----------------------------------------------------------------------------------------------------
dac3283_init_mem_inst : dac3283_init_mem
port map (
clka => serial_clk,
addra => init_address,
douta => init_data
);
----------------------------------------------------------------------------------------------------
-- Capture data in on rising edge SCLK
-- therefore freeze the signal on the falling edge of serial clock.
----------------------------------------------------------------------------------------------------
process (serial_clk)
begin
if (falling_edge(serial_clk)) then
sdi <= spi_sdi;
end if;
end process;
----------------------------------------------------------------------------------------------------
-- Connect entity
----------------------------------------------------------------------------------------------------
in_cmd_busy <= busy; -- serial interface busy
spi_n_oe <= '1' when (sh_state = data_io and read_n_write = '1') else ncs_int;
spi_n_cs <= ncs_int;
spi_sclk <= not sclk_ext when ncs_int = '0' else '0';
spi_sdo <= 'Z' when (sh_state = data_io and read_n_write = '1') else shift_reg(shift_reg'length - 1);
----------------------------------------------------------------------------------------------------
-- End
----------------------------------------------------------------------------------------------------
end dac3283_ctrl_syn;
\ No newline at end of file
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library unisim;
use unisim.vcomponents.all;
library work;
use work.adc_pkg.all;
entity fmc150_adc_if is
port
(
clk_200MHz_i : in std_logic;
clk_100MHz_i : in std_logic;
rst_i : in std_logic;
cha_p_i : in std_logic_vector(6 downto 0);
cha_n_i : in std_logic_vector(6 downto 0);
chb_p_i : in std_logic_vector(6 downto 0);
chb_n_i : in std_logic_vector(6 downto 0);
str_p_i : in std_logic;
str_n_i : in std_logic;
cha_data_o : out std_logic_vector(13 downto 0);
chb_data_o : out std_logic_vector(13 downto 0);
clk_adc_i : in std_logic;
str_o : out std_logic;
delay_update_i : in std_logic;
str_cntvalue_i : in std_logic_vector(4 downto 0);
cha_cntvalue_i : in std_logic_vector(4 downto 0);
chb_cntvalue_i : in std_logic_vector(4 downto 0);
str_cntvalue_o : out std_logic_vector(4 downto 0)
);
end fmc150_adc_if;
architecture rtl of fmc150_adc_if is
--------------------------------------------------------------------
-- Signal declaration
--------------------------------------------------------------------
-- ADC data strobe
signal s_adc_str_dly : std_logic;
signal s_adc_str : std_logic;
-- ADC data streams on Single Data Rate (SDR)
signal s_adc_cha_sdr : std_logic_vector(13 downto 0);
signal s_adc_chb_sdr : std_logic_vector(13 downto 0);
begin
-- ADC data strobe (channel A and B) with adjustable delay
cmp_adc_str: strobe_lvds
port map
(
clk_ctrl_i => clk_100MHz_i,
strobe_p_i => str_p_i,
strobe_n_i => str_n_i,
strobe_o => s_adc_str_dly,
ctrl_delay_update_i => delay_update_i,
ctrl_delay_value_i => str_cntvalue_i,
ctrl_delay_value_o => str_cntvalue_o
);
-- s_adc_str_dly is a regional clock driven by BUFR.
-- Must go through a BUFG before other components (BPM DDC)
-- ADC strobe must be routed on a global net
--cmp_adc_str_bufg: bufg
--port map
--(
-- i => s_adc_str_dly,
-- o => s_adc_str
--);
--str_o <= s_adc_str;
str_o <= s_adc_str_dly;
-- ADC channel A with adjustable delay
cmp_adc_cha: adc_channel_lvds_ddr
generic map
(
C_NBITS => 14,
C_DEFAULT_DELAY => 15
)
port map
(
clk_adc_i => s_adc_str_dly,--clk_adc_i,
clk_ctrl_i => clk_100MHz_i,
adc_p_i => cha_p_i,
adc_n_i => cha_n_i,
adc_data_o => cha_data_o,
ctrl_delay_update_i => delay_update_i,
ctrl_delay_value_i => cha_cntvalue_i
);
-- ADC channel B with adjustable delay
cmp_adc_chb: adc_channel_lvds_ddr
generic map
(
C_NBITS => 14,
C_DEFAULT_DELAY => 15
)
port map
(
clk_adc_i => s_adc_str_dly,--clk_adc_i,
clk_ctrl_i => clk_100MHz_i,
adc_p_i => chb_p_i,
adc_n_i => chb_n_i,
adc_data_o => chb_data_o,
ctrl_delay_update_i => delay_update_i,
ctrl_delay_value_i => chb_cntvalue_i
);
end rtl;
\ No newline at end of file
library ieee;
use ieee.std_logic_1164.all;
library unisim;
use unisim.vcomponents.all;
entity fmc150_dac_if is
port
(
rst_i : in std_logic;
clk_dac_i : in std_logic;
clk_dac_2x_i : in std_logic;
dac_din_c_i : in std_logic_vector(15 downto 0);
dac_din_d_i : in std_logic_vector(15 downto 0);
dac_data_p_o : out std_logic_vector(7 downto 0);
dac_data_n_o : out std_logic_vector(7 downto 0);
dac_dclk_p_o : out std_logic;
dac_dclk_n_o : out std_logic;
dac_frame_p_o : out std_logic;
dac_frame_n_o : out std_logic;
txenable_o : out std_logic
);
end fmc150_dac_if;
architecture rtl of fmc150_dac_if is
signal frame : std_logic;
signal io_rst : std_logic;
signal dac_dclk_prebuf : std_logic;
signal dac_data_prebuf : std_logic_vector(7 downto 0);
signal dac_frame_prebuf : std_logic;
begin
---------------------------------------------------------------------------------------------------
-- Reset sequence
----------------------------------------------------------------------------------------------------
process (rst_i, clk_dac_i)
variable cnt : integer range 0 to 1023 := 0;
begin
if (rst_i = '0') then
cnt := 0;
io_rst <= '0';
frame <= '0';
txenable_o <= '0';
elsif (rising_edge(clk_dac_i)) then
if (cnt < 1023) then
cnt := cnt + 1;
else
cnt := cnt;
end if;
-- The OSERDES blocks are synchronously reset for one clock cycle...
if (cnt = 255) then
io_rst <= '1';
else
io_rst <= '0';
end if;
-- Then a frame pulse is transmitted to the DAC...
if (cnt = 511) then
frame <= '1';
else
frame <= '0';
end if;
-- Finally the TX enable for the DAC can be pulled high.
if (cnt = 1023) then
txenable_o <= '1';
end if;
end if;
end process;
-- Output SERDES and LVDS buffer for DAC clock
oserdes_clock : oserdes
generic map (
DATA_RATE_OQ => "DDR",
DATA_RATE_TQ => "DDR",
DATA_WIDTH => 4,
INIT_OQ => '0',
INIT_TQ => '0',
SERDES_MODE => "MASTER",
SRVAL_OQ => '0',
SRVAL_TQ => '0',
TRISTATE_WIDTH => 1
)
port map (
oq => dac_dclk_prebuf,
shiftout1 => open,
shiftout2 => open,
tq => open,
clk => clk_dac_2x_i,
clkdiv => clk_dac_i,
d1 => '1',
d2 => '0',
d3 => '1',
d4 => '0',
d5 => '0',
d6 => '0',
oce => '1',
rev => '0',
shiftin1 => '0',
shiftin2 => '0',
sr => io_rst,
t1 => '0',
t2 => '0',
t3 => '0',
t4 => '0',
tce => '0'
);
-- Output buffer
obufds_clock : obufds_lvdsext_25
port map (
i => dac_dclk_prebuf,
o => dac_dclk_p_o,
ob => dac_dclk_n_o
);
-- Output serdes and LVDS buffers for DAC data
dac_data: for i in 0 to 7 generate
oserdes_data : oserdes
generic map (
DATA_RATE_OQ => "DDR",
DATA_RATE_TQ => "DDR",
DATA_WIDTH => 4,
INIT_OQ => '0',
INIT_TQ => '0',
SERDES_MODE => "MASTER",
SRVAL_OQ => '0',
SRVAL_TQ => '0',
TRISTATE_WIDTH => 1
)
port map (
oq => dac_data_prebuf(i),
shiftout1 => open,
shiftout2 => open,
tq => open,
clk => clk_dac_2x_i,
clkdiv => clk_dac_i,
d1 => dac_din_c_i(i + 8),
d2 => dac_din_c_i(i),
d3 => dac_din_d_i(i + 8),
d4 => dac_din_d_i(i),
d5 => '0',
d6 => '0',
oce => '1',
rev => '0',
shiftin1 => '0',
shiftin2 => '0',
sr => io_rst,
t1 => '0',
t2 => '0',
t3 => '0',
t4 => '0',
tce => '0'
);
--output buffers
obufds_data : obufds_lvdsext_25
port map (
i => dac_data_prebuf(i),
o => dac_data_p_o(i),
ob => dac_data_n_o(i)
);
end generate;
-- Output serdes and LVDS buffer for DAC frame
oserdes_frame : oserdes
generic map (
DATA_RATE_OQ => "DDR",
DATA_RATE_TQ => "DDR",
DATA_WIDTH => 4,
INIT_OQ => '0',
INIT_TQ => '0',
SERDES_MODE => "MASTER",
SRVAL_OQ => '0',
SRVAL_TQ => '0',
TRISTATE_WIDTH => 1
)
port map (
oq => dac_frame_prebuf,
shiftout1 => open,
shiftout2 => open,
tq => open,
clk => clk_dac_2x_i,
clkdiv => clk_dac_i,
d1 => frame,
d2 => frame,
d3 => frame,
d4 => frame,
d5 => '0',
d6 => '0',
oce => '1',
rev => '0',
shiftin1 => '0',
shiftin2 => '0',
sr => io_rst,
t1 => '0',
t2 => '0',
t3 => '0',
t4 => '0',
tce => '0'
);
--output buffer
obufds_frame : obufds_lvdsext_25
port map (
i => dac_frame_prebuf,
o => dac_frame_p_o,
ob => dac_frame_n_o
);
end rtl;
\ No newline at end of file
library ieee;
use ieee.std_logic_1164.all;
package fmc150_pkg is
--------------------------------------------------------------------
-- Type definition
--------------------------------------------------------------------
type cntvalueout_array is array(13 downto 0) of std_logic_vector(4 downto 0);
type t_fmc150_ctrl_in is record
-- Common for ADS62P49, CDCE72010, AMC7823
rdwr : std_logic;
addr : std_logic_vector(15 downto 0);
data : std_logic_vector(31 downto 0);
-- ADS62P49
adc_sdo : std_logic;
ads62p49_valid : std_logic;
-- CDCE72010
cdce_sdo : std_logic;
cdce_pll_status : std_logic;
cdce_external_clock : std_logic;
cdce72010_valid : std_logic;
-- DAC3283
dac_sdo : std_logic;
dac3283_valid : std_logic;
-- AMC7823
mon_sdo : std_logic;
mon_n_int : std_logic;
amc7823_valid : std_logic;
end record t_fmc150_ctrl_in;
type t_fmc150_ctrl_out is record
-- Common for ADS62P49, CDCE72010, AMC7823
data : std_logic_vector(31 downto 0);
busy : std_logic;
-- ADS62P49
adc_en_n : std_logic;
rst_adc : std_logic;
-- CDCE72010
cdce_en_n : std_logic;
rst_cdce_n : std_logic;
cdce_n_pd : std_logic;
cdce_ref_en : std_logic;
-- DAC3283
dac_en_n : std_logic;
-- AMC7823
mon_en_n : std_logic;
rst_mon_n : std_logic;
end record t_fmc150_ctrl_out;
--------------------------------------------------------------------
-- Components
--------------------------------------------------------------------
component sin_cos
port
(
clk: in std_logic;
cosine: out std_logic_vector(15 downto 0);
sine: out std_logic_vector(15 downto 0);
phase_out: out std_logic_vector(15 downto 0)
);
end component;
component fmc150_adc_if is
port
(
clk_200MHz_i : in std_logic;
clk_100MHz_i : in std_logic;
rst_i : in std_logic;
cha_p_i : in std_logic_vector(6 downto 0);
cha_n_i : in std_logic_vector(6 downto 0);
chb_p_i : in std_logic_vector(6 downto 0);
chb_n_i : in std_logic_vector(6 downto 0);
clk_adc_i : in std_logic;
str_p_i : in std_logic;
str_n_i : in std_logic;
str_o : out std_logic;
cha_data_o : out std_logic_vector(13 downto 0);
chb_data_o : out std_logic_vector(13 downto 0);
delay_update_i : in std_logic;
str_cntvalue_i : in std_logic_vector(4 downto 0);
cha_cntvalue_i : in std_logic_vector(4 downto 0);
chb_cntvalue_i : in std_logic_vector(4 downto 0);
str_cntvalue_o : out std_logic_vector(4 downto 0)
);
end component fmc150_adc_if;
component fmc150_dac_if is
port
(
clk_dac_i : in std_logic;
clk_dac_2x_i : in std_logic;
rst_i : in std_logic;
dac_din_c_i : in std_logic_vector(15 downto 0);
dac_din_d_i : in std_logic_vector(15 downto 0);
dac_data_p_o : out std_logic_vector(7 downto 0);
dac_data_n_o : out std_logic_vector(7 downto 0);
dac_dclk_p_o : out std_logic;
dac_dclk_n_o : out std_logic;
dac_frame_p_o : out std_logic;
dac_frame_n_o : out std_logic;
txenable_o : out std_logic
);
end component fmc150_dac_if;
component fmc150_testbench is
port (
rst : in std_logic;
clk_100Mhz : in std_logic;
clk_200Mhz : in std_logic;
--Clock/Data connection to ADC on FMC150 (ADS62P49)
adc_clk_ab_p : in std_logic;
adc_clk_ab_n : in std_logic;
adc_cha_p : in std_logic_vector(6 downto 0);
adc_cha_n : in std_logic_vector(6 downto 0);
adc_chb_p : in std_logic_vector(6 downto 0);
adc_chb_n : in std_logic_vector(6 downto 0);
--Clock/Data connection to DAC on FMC150 (DAC3283)
dac_dclk_p : out std_logic;
dac_dclk_n : out std_logic;
dac_data_p : out std_logic_vector(7 downto 0);
dac_data_n : out std_logic_vector(7 downto 0);
dac_frame_p : out std_logic;
dac_frame_n : out std_logic;
txenable : out std_logic;
--Serial Peripheral Interface (SPI)
spi_sclk : out std_logic; -- Shared SPI clock line
spi_sdata : out std_logic; -- Shared SPI data line
--Clock/Trigger connection to FMC150
clk_to_fpga_p : in std_logic;
clk_to_fpga_n : in std_logic;
ext_trigger_p : in std_logic;
ext_trigger_n : in std_logic;
-- Control signals from/to FMC150
rd_n_wr : in std_logic;
addr : in std_logic_vector(15 downto 0);
idata : in std_logic_vector(31 downto 0);
odata : out std_logic_vector(31 downto 0);
busy : out std_logic;
cdce72010_valid : in std_logic;
ads62p49_valid : in std_logic;
dac3283_valid : in std_logic;
amc7823_valid : in std_logic;
external_clock : in std_logic;
adc_n_en : out std_logic;
adc_sdo : in std_logic;
adc_reset : out std_logic;
cdce_n_en : out std_logic;
cdce_sdo : in std_logic;
cdce_n_reset : out std_logic;
cdce_n_pd : out std_logic;
ref_en : out std_logic;
pll_status : in std_logic;
dac_n_en : out std_logic;
dac_sdo : in std_logic;
mon_n_en : out std_logic;
mon_sdo : in std_logic;
mon_n_reset : out std_logic;
mon_n_int : in std_logic;
--FMC Present status
prsnt_m2c_l : in std_logic;
adc_delay_update_i : in std_logic;
adc_str_cntvaluein_i : in std_logic_vector(4 downto 0);
adc_cha_cntvaluein_i : in std_logic_vector(4 downto 0);
adc_chb_cntvaluein_i : in std_logic_vector(4 downto 0);
adc_str_cntvalueout_o : out std_logic_vector(4 downto 0);
adc_dout_o : out std_logic_vector(31 downto 0);
clk_adc_o : out std_logic;
mmcm_adc_locked_o : out std_logic
);
end component;
--------------------
-- THIRD-PARTY CODE
--------------------
component fmc150_spi_ctrl is
port
(
rd_n_wr : in std_logic;
addr : in std_logic_vector(15 downto 0);
idata : in std_logic_vector(31 downto 0);
odata : out std_logic_vector(31 downto 0);
busy : out std_logic;
cdce72010_valid : in std_logic;
ads62p49_valid : in std_logic;
dac3283_valid : in std_logic;
amc7823_valid : in std_logic;
external_clock : in std_logic;
rst : in std_logic;
clk : in std_logic;
spi_sclk : out std_logic;
spi_sdata : out std_logic;
adc_n_en : out std_logic;
adc_sdo : in std_logic;
adc_reset : out std_logic;
cdce_n_en : out std_logic;
cdce_sdo : in std_logic;
cdce_n_reset : out std_logic;
cdce_n_pd : out std_logic;
ref_en : out std_logic;
pll_status : in std_logic;
dac_n_en : out std_logic;
dac_sdo : in std_logic;
mon_n_en : out std_logic;
mon_sdo : in std_logic;
mon_n_reset : out std_logic;
mon_n_int : in std_logic;
prsnt_m2c_l : in std_logic
);
end component fmc150_spi_ctrl;
component cdce72010_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
external_clock : in std_logic;
cdce_n_reset : out std_logic;
cdce_n_pd : out std_logic;
ref_en : out std_logic;
pll_status : in std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end component;
component ads62p49_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
adc_reset : out std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end component;
component dac3283_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end component;
component amc7823_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
mon_n_reset : out std_logic;
mon_n_int : in std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end component;
component fmc150_stellar_cmd is
generic
(
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port
(
reset : in std_logic;
-- Command Interface
clk_cmd : in std_logic; --cmd_in and cmd_out are synchronous to this clock;
out_cmd : out std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
in_cmd : in std_logic_vector(63 downto 0);
in_cmd_val : in std_logic;
-- Register interface
clk_reg : in std_logic; --register interface is synchronous to this clock
out_reg : out std_logic_vector(31 downto 0); --caries the out register data
out_reg_val : out std_logic; --the out_reg has valid data (pulse)
out_reg_addr : out std_logic_vector(27 downto 0); --out register address
in_reg : in std_logic_vector(31 downto 0); --requested register data is placed on this bus
in_reg_val : in std_logic; --pulse to indicate requested register is valid
in_reg_req : out std_logic; --pulse to request data
in_reg_addr : out std_logic_vector(27 downto 0); --requested address
--mailbox interface
mbx_in_reg : in std_logic_vector(31 downto 0); --value of the mailbox to send
mbx_in_val : in std_logic --pulse to indicate mailbox is valid
);
end component fmc150_stellar_cmd;
component pulse2pulse
port (
rst : in std_logic;
in_clk : in std_logic;
out_clk : in std_logic;
pulsein : in std_logic;
pulseout : out std_logic;
inbusy : out std_logic
);
end component;
end fmc150_pkg;
\ No newline at end of file
-------------------------------------------------------------------------------------
-- FILE NAME : fmc150_spi_ctrl.vhd
--
-- AUTHOR : Peter Kortekaas
--
-- COMPANY : 4DSP
--
-- ITEM : 1
--
-- UNITS : Entity - fmc150_spi_ctrl
-- architecture - fmc150_spi_ctrl_syn
--
-- LANGUAGE : VHDL
--
-------------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------------
-- DESCRIPTION
-- ===========
--
-- This file initialises the internal registers of devices on the FMC150 from
-- FPGA ROM through SPI communication busses.
--
-------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_misc.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
library unisim;
use unisim.vcomponents.all;
library work;
entity fmc150_spi_ctrl is
port (
-- VIO command interface
rd_n_wr : in std_logic;
addr : in std_logic_vector(15 downto 0);
idata : in std_logic_vector(31 downto 0);
odata : out std_logic_vector(31 downto 0);
busy : out std_logic;
cdce72010_valid : in std_logic;
ads62p49_valid : in std_logic;
dac3283_valid : in std_logic;
amc7823_valid : in std_logic;
rst : in std_logic;
clk : in std_logic;
external_clock : in std_logic;
spi_sclk : out std_logic;
spi_sdata : out std_logic;
adc_n_en : out std_logic;
adc_sdo : in std_logic;
adc_reset : out std_logic;
cdce_n_en : out std_logic;
cdce_sdo : in std_logic;
cdce_n_reset : out std_logic;
cdce_n_pd : out std_logic;
ref_en : out std_logic;
pll_status : in std_logic;
dac_n_en : out std_logic;
dac_sdo : in std_logic;
mon_n_en : out std_logic;
mon_sdo : in std_logic;
mon_n_reset : out std_logic;
mon_n_int : in std_logic;
prsnt_m2c_l : in std_logic
);
end fmc150_spi_ctrl;
architecture fmc150_spi_ctrl_syn of fmc150_spi_ctrl is
----------------------------------------------------------------------------------------------------
-- Constant declaration
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
--Component declaration
----------------------------------------------------------------------------------------------------
component cdce72010_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
external_clock : in std_logic;
cdce_n_reset : out std_logic;
cdce_n_pd : out std_logic;
ref_en : out std_logic;
pll_status : in std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end component;
component ads62p49_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
adc_reset : out std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end component;
component dac3283_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end component;
component amc7823_ctrl is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"00000FF"
);
port (
rst : in std_logic;
clk : in std_logic;
-- Sequence interface
init_ena : in std_logic;
init_done : out std_logic;
-- Command Interface
clk_cmd : in std_logic;
in_cmd_val : in std_logic;
in_cmd : in std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
out_cmd : out std_logic_vector(63 downto 0);
in_cmd_busy : out std_logic;
-- Direct control
mon_n_reset : out std_logic;
mon_n_int : in std_logic;
-- SPI control
spi_n_oe : out std_logic;
spi_n_cs : out std_logic;
spi_sclk : out std_logic;
spi_sdo : out std_logic;
spi_sdi : in std_logic
);
end component;
----------------------------------------------------------------------------------------------------
--Signal declaration
----------------------------------------------------------------------------------------------------
signal in_cmd : std_logic_vector(63 downto 0);
signal cdce72010_valid_prev : std_logic;
signal cdce72010_in_cmd_val : std_logic;
signal cdce72010_out_cmd_val : std_logic;
signal cdce72010_out_cmd : std_logic_vector(63 downto 0);
signal cdce72010_in_cmd_busy : std_logic;
signal ads62p49_valid_prev : std_logic;
signal ads62p49_in_cmd_val : std_logic;
signal ads62p49_out_cmd_val : std_logic;
signal ads62p49_out_cmd : std_logic_vector(63 downto 0);
signal ads62p49_in_cmd_busy : std_logic;
signal dac3283_valid_prev : std_logic;
signal dac3283_in_cmd_val : std_logic;
signal dac3283_out_cmd_val : std_logic;
signal dac3283_out_cmd : std_logic_vector(63 downto 0);
signal dac3283_in_cmd_busy : std_logic;
signal amc7823_valid_prev : std_logic;
signal amc7823_in_cmd_val : std_logic;
signal amc7823_out_cmd_val : std_logic;
signal amc7823_out_cmd : std_logic_vector(63 downto 0);
signal amc7823_in_cmd_busy : std_logic;
signal init_ena_cdce72010 : std_logic;
signal init_done_cdce72010 : std_logic;
signal init_ena_ads62p49 : std_logic;
signal init_done_ads62p49 : std_logic;
signal init_ena_dac3283 : std_logic;
signal init_done_dac3283 : std_logic;
signal init_ena_amc7823 : std_logic;
signal init_done_amc7823 : std_logic;
signal spi_n_oe0 : std_logic_vector(3 downto 0);
signal spi_n_cs0 : std_logic_vector(3 downto 0);
signal spi_sclk0 : std_logic_vector(3 downto 0);
signal spi_sdo0 : std_logic_vector(3 downto 0);
signal spi_sdi0 : std_logic_vector(3 downto 0);
begin
----------------------------------------------------------------------------------------------------
-- Input control
----------------------------------------------------------------------------------------------------
process(clk)
begin
if (rising_edge(clk)) then
cdce72010_valid_prev <= cdce72010_valid;
ads62p49_valid_prev <= ads62p49_valid;
dac3283_valid_prev <= dac3283_valid;
amc7823_valid_prev <= amc7823_valid;
cdce72010_in_cmd_val <= cdce72010_valid xor cdce72010_valid_prev;
ads62p49_in_cmd_val <= ads62p49_valid xor ads62p49_valid_prev;
dac3283_in_cmd_val <= dac3283_valid xor dac3283_valid_prev;
amc7823_in_cmd_val <= amc7823_valid xor amc7823_valid_prev;
if (rd_n_wr = '0') then
in_cmd(63 downto 60) <= x"1"; -- write command
else
in_cmd(63 downto 60) <= x"2"; -- read command
end if;
in_cmd(59 downto 32) <= x"000" & addr; -- address
in_cmd(31 downto 00) <= idata; -- data
end if;
end process;
----------------------------------------------------------------------------------------------------
-- Output control
----------------------------------------------------------------------------------------------------
process(clk)
begin
if (rising_edge(clk)) then
busy <= cdce72010_in_cmd_busy or
ads62p49_in_cmd_busy or
dac3283_in_cmd_busy or
amc7823_in_cmd_busy;
if (cdce72010_out_cmd_val = '1') then
odata <= cdce72010_out_cmd(31 downto 0);
elsif (ads62p49_out_cmd_val = '1') then
odata <= ads62p49_out_cmd(31 downto 0);
elsif (dac3283_out_cmd_val = '1') then
odata <= dac3283_out_cmd(31 downto 0);
elsif (amc7823_out_cmd_val = '1') then
odata <= amc7823_out_cmd(31 downto 0);
end if;
end if;
end process;
----------------------------------------------------------------------------------------------------
-- SPI Interface controlling the clock IC
----------------------------------------------------------------------------------------------------
cdce72010_ctrl_inst : cdce72010_ctrl
generic map (
START_ADDR => x"0000000",
STOP_ADDR => x"FFFFFFF"
)
port map (
rst => rst,
clk => clk,
init_ena => init_ena_cdce72010,
init_done => init_done_cdce72010,
clk_cmd => clk,
in_cmd_val => cdce72010_in_cmd_val,
in_cmd => in_cmd,
out_cmd_val => cdce72010_out_cmd_val,
out_cmd => cdce72010_out_cmd,
in_cmd_busy => cdce72010_in_cmd_busy,
external_clock => external_clock,
cdce_n_reset => cdce_n_reset,
cdce_n_pd => cdce_n_pd,
ref_en => ref_en,
pll_status => pll_status,
spi_n_oe => spi_n_oe0(0),
spi_n_cs => spi_n_cs0(0),
spi_sclk => spi_sclk0(0),
spi_sdo => spi_sdo0(0),
spi_sdi => spi_sdi0(0)
);
----------------------------------------------------------------------------------------------------
-- SPI interface controlling ADC chip
----------------------------------------------------------------------------------------------------
ads62p49_ctrl_inst : ads62p49_ctrl
generic map (
START_ADDR => x"0000000",
STOP_ADDR => x"FFFFFFF"
)
port map (
rst => rst,
clk => clk,
init_ena => init_ena_ads62p49,
init_done => init_done_ads62p49,
clk_cmd => clk,
in_cmd_val => ads62p49_in_cmd_val,
in_cmd => in_cmd,
out_cmd_val => ads62p49_out_cmd_val,
out_cmd => ads62p49_out_cmd,
in_cmd_busy => ads62p49_in_cmd_busy,
adc_reset => adc_reset,
spi_n_oe => spi_n_oe0(1),
spi_n_cs => spi_n_cs0(1),
spi_sclk => spi_sclk0(1),
spi_sdo => spi_sdo0(1),
spi_sdi => spi_sdi0(1)
);
----------------------------------------------------------------------------------------------------
-- SPI interface controlling DAC chip
----------------------------------------------------------------------------------------------------
dac3283_ctrl_inst : dac3283_ctrl
generic map (
START_ADDR => x"0000000",
STOP_ADDR => x"FFFFFFF"
)
port map (
rst => rst,
clk => clk,
init_ena => init_ena_dac3283,
init_done => init_done_dac3283,
clk_cmd => clk,
in_cmd_val => dac3283_in_cmd_val,
in_cmd => in_cmd,
out_cmd_val => dac3283_out_cmd_val,
out_cmd => dac3283_out_cmd,
in_cmd_busy => dac3283_in_cmd_busy,
spi_n_oe => spi_n_oe0(2),
spi_n_cs => spi_n_cs0(2),
spi_sclk => spi_sclk0(2),
spi_sdo => spi_sdo0(2),
spi_sdi => spi_sdi0(2)
);
----------------------------------------------------------------------------------------------------
-- SPI interface controlling Monitoring chip
----------------------------------------------------------------------------------------------------
amc7823_ctrl_inst : amc7823_ctrl
generic map (
START_ADDR => x"0000000",
STOP_ADDR => x"FFFFFFF"
)
port map (
rst => rst,
clk => clk,
init_ena => init_ena_amc7823,
init_done => init_done_amc7823,
clk_cmd => clk,
in_cmd_val => amc7823_in_cmd_val,
in_cmd => in_cmd,
out_cmd_val => amc7823_out_cmd_val,
out_cmd => amc7823_out_cmd,
in_cmd_busy => amc7823_in_cmd_busy,
mon_n_reset => mon_n_reset,
mon_n_int => mon_n_int,
spi_n_oe => spi_n_oe0(3),
spi_n_cs => spi_n_cs0(3),
spi_sclk => spi_sclk0(3),
spi_sdo => spi_sdo0(3),
spi_sdi => spi_sdi0(3)
);
----------------------------------------------------------------------------------------------------
-- SPI PHY, shared SPI bus
----------------------------------------------------------------------------------------------------
spi_sclk <= spi_sclk0(0) when spi_n_cs0(0) = '0' else
spi_sclk0(1) when spi_n_cs0(1) = '0' else
spi_sclk0(2) when spi_n_cs0(2) = '0' else
spi_sclk0(3) when spi_n_cs0(3) = '0' else '0';
spi_sdata <= spi_sdo0(0) when spi_n_oe0(0) = '0' else
spi_sdo0(1) when spi_n_oe0(1) = '0' else
spi_sdo0(2) when spi_n_oe0(2) = '0' else
spi_sdo0(3) when spi_n_oe0(3) = '0' else '0';
cdce_n_en <= spi_n_cs0(0);
adc_n_en <= spi_n_cs0(1);
dac_n_en <= spi_n_cs0(2);
mon_n_en <= spi_n_cs0(3);
spi_sdi0(0) <= cdce_sdo;
spi_sdi0(1) <= adc_sdo;
spi_sdi0(2) <= dac_sdo;
spi_sdi0(3) <= mon_sdo;
----------------------------------------------------------------------------------------------------
-- Sequence SPI initialization
----------------------------------------------------------------------------------------------------
init_ena_cdce72010 <= '1';
init_ena_ads62p49 <= init_done_cdce72010;
init_ena_dac3283 <= init_done_ads62p49;
init_ena_amc7823 <= init_done_dac3283;
----------------------------------------------------------------------------------------------------
-- End
----------------------------------------------------------------------------------------------------
end fmc150_spi_ctrl_syn;
\ No newline at end of file
-------------------------------------------------------------------------------------
-- FILE NAME : fmc150_stellar_cmd.vhd
--
-- AUTHOR : Peter Kortekaas
--
-- COMPANY : 4DSP
--
-- ITEM : 1
--
-- UNITS : Entity - fmc150_stellar_cmd
-- architecture - fmc150_stellar_cmd_syn
--
-- LANGUAGE : VHDL
--
-------------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------------
-- DESCRIPTION
-- ===========
--
--
--
--
-------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_misc.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
--------------------------------------------------------------------------------
-- Entity declaration
--------------------------------------------------------------------------------
entity fmc150_stellar_cmd is
generic (
START_ADDR : std_logic_vector(27 downto 0) := x"0000000";
STOP_ADDR : std_logic_vector(27 downto 0) := x"0000010"
);
port (
reset : in std_logic;
-- Command interface
clk_cmd : in std_logic; --cmd_in and cmd_out are synchronous to this clock;
out_cmd : out std_logic_vector(63 downto 0);
out_cmd_val : out std_logic;
in_cmd : in std_logic_vector(63 downto 0);
in_cmd_val : in std_logic;
-- Register interface
clk_reg : in std_logic; --register interface is synchronous to this clock
out_reg : out std_logic_vector(31 downto 0);--caries the out register data
out_reg_val : out std_logic; --the out_reg has valid data (pulse)
out_reg_addr : out std_logic_vector(27 downto 0);--out register address
in_reg : in std_logic_vector(31 downto 0);--requested register data is placed on this bus
in_reg_val : in std_logic; --pulse to indicate requested register is valid
in_reg_req : out std_logic; --pulse to request data
in_reg_addr : out std_logic_vector(27 downto 0);--requested address
-- Mailbox interface
mbx_in_reg : in std_logic_vector(31 downto 0);--value of the mailbox to send
mbx_in_val : in std_logic --pulse to indicate mailbox is valid
);
end entity fmc150_stellar_cmd;
--------------------------------------------------------------------------------
-- Architecture declaration
--------------------------------------------------------------------------------
architecture arch_fmc150_stellar_cmd of fmc150_stellar_cmd is
-----------------------------------------------------------------------------------
-- Constant declarations
-----------------------------------------------------------------------------------
constant CMD_WR : std_logic_vector(3 downto 0) := x"1";
constant CMD_RD : std_logic_vector(3 downto 0) := x"2";
constant CMD_RD_ACK : std_logic_vector(3 downto 0) := x"4";
-----------------------------------------------------------------------------------
-- Dignal declarations
-----------------------------------------------------------------------------------
signal register_wr : std_logic;
signal register_rd : std_logic;
signal out_cmd_val_sig : std_logic;
signal in_reg_addr_sig : std_logic_vector(27 downto 0);
signal mbx_in_val_sig : std_logic;
signal mbx_received : std_logic;
-----------------------------------------------------------------------------------
-- Component declarations
-----------------------------------------------------------------------------------
component pulse2pulse
port (
in_clk : in std_logic;
out_clk : in std_logic;
rst : in std_logic;
pulsein : in std_logic;
inbusy : out std_logic;
pulseout : out std_logic
);
end component;
-----------------------------------------------------------------------------------
-- Begin
-----------------------------------------------------------------------------------
begin
-----------------------------------------------------------------------------------
-- Component instantiations
-----------------------------------------------------------------------------------
p2p0: pulse2pulse
port map (
in_clk => clk_cmd,
out_clk => clk_reg,
rst => reset,
pulsein => register_wr,
inbusy => open,
pulseout => out_reg_val
);
p2p1: pulse2pulse
port map (
in_clk => clk_cmd,
out_clk => clk_reg,
rst => reset,
pulsein => register_rd,
inbusy => open,
pulseout => in_reg_req
);
p2p2: pulse2pulse
port map (
in_clk => clk_reg,
out_clk => clk_cmd,
rst => reset,
pulsein => in_reg_val,
inbusy => open,
pulseout => out_cmd_val_sig
);
p2p3: pulse2pulse
port map (
in_clk => clk_reg,
out_clk => clk_cmd ,
rst => reset,
pulsein => mbx_in_val,
inbusy => open,
pulseout => mbx_in_val_sig
);
-----------------------------------------------------------------------------------
-- Synchronous processes
-----------------------------------------------------------------------------------
in_reg_proc: process (reset, clk_cmd)
begin
if (reset = '1') then
in_reg_addr_sig <= (others => '0');
register_rd <= '0';
mbx_received <= '0';
out_cmd <= (others => '0');
out_cmd_val <= '0';
elsif (clk_cmd'event and clk_cmd = '1') then
--register the requested address when the address is in the modules range
if (in_cmd_val = '1' and in_cmd(63 downto 60) = CMD_RD and in_cmd(59 downto 32) >= start_addr and in_cmd(59 downto 32) <= stop_addr) then
in_reg_addr_sig <= in_cmd(59 downto 32)-start_addr;
end if;
--generate the read req pulse when the address is in the modules range
if (in_cmd_val = '1' and in_cmd(63 downto 60) = CMD_RD and in_cmd(59 downto 32) >= start_addr and in_cmd(59 downto 32) <= stop_addr) then
register_rd <= '1';
else
register_rd <= '0';
end if;
--mailbox has less priority then command acknowledge
--create the output packet
if (out_cmd_val_sig = '1' and mbx_in_val_sig = '1') then
mbx_received <= '1';
elsif( mbx_received = '1' and out_cmd_val_sig = '0') then
mbx_received <= '0';
end if;
if (out_cmd_val_sig = '1') then
out_cmd(31 downto 0) <= in_reg;
out_cmd(59 downto 32) <= in_reg_addr_sig+start_addr;
out_cmd(63 downto 60) <= CMD_RD_ACK;
elsif (mbx_in_val_sig = '1' or mbx_received = '1') then
out_cmd(31 downto 0) <= mbx_in_reg;
out_cmd(59 downto 32) <= start_addr;
out_cmd(63 downto 60) <= (others=>'0');
else
out_cmd(63 downto 0) <= (others=>'0');
end if;
if (out_cmd_val_sig = '1') then
out_cmd_val <= '1';
elsif (mbx_in_val_sig = '1' or mbx_received = '1') then
out_cmd_val <= '1';
else
out_cmd_val <= '0';
end if;
end if;
end process;
out_reg_proc: process(reset, clk_cmd)
begin
if (reset = '1') then
out_reg_addr <= (others => '0');
out_reg <= (others => '0');
register_wr <= '0';
elsif(clk_cmd'event and clk_cmd = '1') then
--register the requested address when the address is in the modules range
if (in_cmd_val = '1' and in_cmd(63 downto 60) = CMD_WR and in_cmd(59 downto 32) >= start_addr and in_cmd(59 downto 32) <= stop_addr) then
out_reg_addr <= in_cmd(59 downto 32) - start_addr;
out_reg <= in_cmd(31 downto 0);
end if;
--generate the write req pulse when the address is in the modules range
if (in_cmd_val = '1' and in_cmd(63 downto 60) = CMD_WR and in_cmd(59 downto 32) >= start_addr and in_cmd(59 downto 32) <= stop_addr) then
register_wr <= '1';
else
register_wr <= '0';
end if;
end if;
end process;
-----------------------------------------------------------------------------------
-- Asynchronous mapping
-----------------------------------------------------------------------------------
in_reg_addr <= in_reg_addr_sig;
-----------------------------------------------------------------------------------
-- End
-----------------------------------------------------------------------------------
end architecture arch_fmc150_stellar_cmd;
\ No newline at end of file
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library unisim;
use unisim.vcomponents.all;
library work;
use work.fmc150_pkg.all;
entity fmc150_testbench is
port
(
rst : in std_logic;
clk_100Mhz : in std_logic;
clk_200Mhz : in std_logic;
adc_clk_ab_p : in std_logic;
adc_clk_ab_n : in std_logic;
adc_cha_p : in std_logic_vector(6 downto 0);
adc_cha_n : in std_logic_vector(6 downto 0);
adc_chb_p : in std_logic_vector(6 downto 0);
adc_chb_n : in std_logic_vector(6 downto 0);
dac_dclk_p : out std_logic;
dac_dclk_n : out std_logic;
dac_data_p : out std_logic_vector(7 downto 0);
dac_data_n : out std_logic_vector(7 downto 0);
dac_frame_p : out std_logic;
dac_frame_n : out std_logic;
txenable : out std_logic;
clk_to_fpga_p : in std_logic;
clk_to_fpga_n : in std_logic;
ext_trigger_p : in std_logic;
ext_trigger_n : in std_logic;
spi_sclk : out std_logic;
spi_sdata : out std_logic;
rd_n_wr : in std_logic;
addr : in std_logic_vector(15 downto 0);
idata : in std_logic_vector(31 downto 0);
odata : out std_logic_vector(31 downto 0);
busy : out std_logic;
cdce72010_valid : in std_logic;
ads62p49_valid : in std_logic;
dac3283_valid : in std_logic;
amc7823_valid : in std_logic;
external_clock : in std_logic;
adc_n_en : out std_logic;
adc_sdo : in std_logic;
adc_reset : out std_logic;
cdce_n_en : out std_logic;
cdce_sdo : in std_logic;
cdce_n_reset : out std_logic;
cdce_n_pd : out std_logic;
ref_en : out std_logic;
pll_status : in std_logic;
dac_n_en : out std_logic;
dac_sdo : in std_logic;
mon_n_en : out std_logic;
mon_sdo : in std_logic;
mon_n_reset : out std_logic;
mon_n_int : in std_logic;
prsnt_m2c_l : in std_logic;
adc_delay_update_i : in std_logic;
adc_str_cntvaluein_i : in std_logic_vector(4 downto 0);
adc_cha_cntvaluein_i : in std_logic_vector(4 downto 0);
adc_chb_cntvaluein_i : in std_logic_vector(4 downto 0);
adc_str_cntvalueout_o : out std_logic_vector(4 downto 0);
adc_dout_o : out std_logic_vector(31 downto 0);
clk_adc_o : out std_logic;
mmcm_adc_locked_o : out std_logic
);
end fmc150_testbench;
architecture rtl of fmc150_testbench is
----------------------------------------------------------------------------------------------------
-- Constant declaration
----------------------------------------------------------------------------------------------------
constant ADC_STR_IDELAY : integer := 0; -- Initial number of delay taps on ADC clock input
constant ADC_CHA_IDELAY : integer := 0; -- Initial number of delay taps on ADC data port A
constant ADC_CHB_IDELAY : integer := 0; -- Initial number of delay taps on ADC data port B
----------------------------------------------------------------------------------------------------
-- Signal declaration
----------------------------------------------------------------------------------------------------
signal clk_ab_l : std_logic;
signal clk_ab_dly : std_logic;
signal adc_cha_ddr : std_logic_vector(6 downto 0); -- Double Data Rate
signal adc_cha_ddr_dly : std_logic_vector(6 downto 0); -- Double Data Rate, Delayed
signal adc_cha_sdr : std_logic_vector(13 downto 0); -- Single Data Rate
signal adc_chb_ddr : std_logic_vector(6 downto 0); -- Double Data Rate
signal adc_chb_ddr_dly : std_logic_vector(6 downto 0); -- Double Data Rate, Delayed
signal adc_chb_sdr : std_logic_vector(13 downto 0); -- Single Data Rate
signal adc_dout_a : std_logic_vector(15 downto 0); -- Single Data Rate, Extended to 16-bit
signal adc_dout_b : std_logic_vector(15 downto 0); -- Single Data Rate, Extended to 16-bit
signal adc_str : std_logic;
signal clk_adc : std_logic;
signal mmcm_adc_locked : std_logic;
signal fmc150_ctrl_in : t_fmc150_ctrl_in;
signal fmc150_ctrl_out : t_fmc150_ctrl_out;
signal clk_to_fpga : std_logic;
signal clk_adc_2x : std_logic;
signal dac_din_c : std_logic_vector(15 downto 0);
signal dac_din_d : std_logic_vector(15 downto 0);
signal adc_str_fbin, adc_str_out, adc_str_2x_out, adc_str_fbout : std_logic;
begin
-- I/O delay control
cmp_idelayctrl : idelayctrl
port map
(
rst => rst,
refclk => clk_200MHz,
rdy => open
);
-- ADC Clock PLL
cmp_mmcm_adc : MMCM_ADV
generic map
(
BANDWIDTH => "OPTIMIZED",
CLKOUT4_CASCADE => FALSE,
CLOCK_HOLD => FALSE,
COMPENSATION => "ZHOLD",
STARTUP_WAIT => FALSE,
DIVCLK_DIVIDE => 1,
--CLKFBOUT_MULT_F => 16.000,
CLKFBOUT_MULT_F => 8.000,
CLKFBOUT_PHASE => 0.000,
CLKFBOUT_USE_FINE_PS => FALSE,
--CLKOUT0_DIVIDE_F => 16.000,
CLKOUT0_DIVIDE_F => 8.000,
CLKOUT0_PHASE => 0.000,
CLKOUT0_DUTY_CYCLE => 0.500,
CLKOUT0_USE_FINE_PS => FALSE,
--CLKOUT1_DIVIDE => 8,
CLKOUT1_DIVIDE => 4,
CLKOUT1_PHASE => 0.000,
CLKOUT1_DUTY_CYCLE => 0.500,
CLKOUT1_USE_FINE_PS => FALSE,
-- 61.44 MHZ input clock
--CLKIN1_PERIOD => 16.276,
-- 122.88 MHZ input clock
CLKIN1_PERIOD => 8.138,
REF_JITTER1 => 0.010
)
port map
(
-- Output clocks
CLKFBOUT => adc_str_fbout,
CLKFBOUTB => open,
CLKOUT0 => adc_str_out,
CLKOUT0B => open,
CLKOUT1 => adc_str_2x_out,
CLKOUT1B => open,
CLKOUT2 => open,
CLKOUT2B => open,
CLKOUT3 => open,
CLKOUT3B => open,
CLKOUT4 => open,
CLKOUT5 => open,
CLKOUT6 => open,
-- Input clock control
CLKFBIN => adc_str_fbin,
CLKIN1 => adc_str,
CLKIN2 => '0',
-- Tied to always select the primary input clock
CLKINSEL => '1',
-- Ports for dynamic reconfiguration
DADDR => (others => '0'),
DCLK => '0',
DEN => '0',
DI => (others => '0'),
DO => open,
DRDY => open,
DWE => '0',
-- Ports for dynamic phase shift
PSCLK => '0',
PSEN => '0',
PSINCDEC => '0',
PSDONE => open,
-- Other control and status signals
LOCKED => mmcm_adc_locked,
CLKINSTOPPED => open,
CLKFBSTOPPED => open,
PWRDWN => '0',
RST => rst
);
-- Global clock buffers for "cmp_mmcm_adc" instance
cmp_clkf_bufg : BUFG
port map
(
O => adc_str_fbin,
I => adc_str_fbout
);
cmp_adc_str_out_bufg : BUFG
port map
(
O => clk_adc,
I => adc_str_out
);
cmp_adc_str_2x_out_bufg : BUFG
port map
(
O => clk_adc_2x,
I => adc_str_2x_out
);
clk_adc_o <= clk_adc;--adc_str;
-- ADC Interface
cmp_adc_if : fmc150_adc_if
port map
(
clk_200MHz_i => clk_200MHz,
clk_100MHz_i => clk_100MHz,
rst_i => mmcm_adc_locked,
str_p_i => adc_clk_ab_p,
str_n_i => adc_clk_ab_n,
cha_p_i => adc_cha_p,
cha_n_i => adc_cha_n,
chb_p_i => adc_chb_p,
chb_n_i => adc_chb_n,
cha_data_o => adc_cha_sdr,
chb_data_o => adc_chb_sdr,
str_o => adc_str,
-- Not used for now. Should it be removed?
clk_adc_i => adc_str,--clk_adc,
delay_update_i => adc_delay_update_i,
str_cntvalue_i => adc_str_cntvaluein_i,
cha_cntvalue_i => adc_cha_cntvaluein_i,
chb_cntvalue_i => adc_chb_cntvaluein_i,
str_cntvalue_o => adc_str_cntvalueout_o
);
-- Extend to 16-bit and register ADC data output
-- p_extend_adc_output : process (clk_adc)
-- begin
-- if (rising_edge(clk_adc)) then
p_extend_adc_output : process (adc_str)
begin
if (rising_edge(adc_str)) then
-- Left justify the data of both channels on 16-bits
adc_dout_a <= adc_cha_sdr(13) & adc_cha_sdr(13) & adc_cha_sdr;
adc_dout_b <= adc_chb_sdr(13) & adc_chb_sdr(13) & adc_chb_sdr;
-- adc_dout_a <= std_logic_vector(unsigned(adc_dout_a)+1);
-- adc_dout_b <= std_logic_vector(unsigned(adc_dout_b)-1);
end if;
end process;
adc_dout_o <= adc_dout_a & adc_dout_b;
--adc_dout_o <= dac_din_c & dac_din_d;
-- DAC Interface
cmp_dac_if : fmc150_dac_if
port map
(
rst_i => mmcm_adc_locked,
clk_dac_i => clk_adc,
clk_dac_2x_i => clk_adc_2x,
dac_din_c_i => dac_din_c,
dac_din_d_i => dac_din_d,
dac_data_p_o => dac_data_p,
dac_data_n_o => dac_data_n,
dac_dclk_p_o => dac_dclk_p,
dac_dclk_n_o => dac_dclk_n,
dac_frame_p_o => dac_frame_p,
dac_frame_n_o => dac_frame_n,
txenable_o => txenable
);
mmcm_adc_locked_o <= mmcm_adc_locked;
-- Reference signal generation (need external netlist file)
-- cmp_sin_cos : sin_cos
-- port map
-- (
-- clk => clk_adc,
-- cosine => dac_din_c,
-- sine => dac_din_d,
-- phase_out => open
-- );
-- FMC150 control (SPI and direct signals)
cmp_fmc150_ctrl : fmc150_spi_ctrl
port map
(
rst => rst,
clk => clk_100MHz,
rd_n_wr => rd_n_wr,
addr => addr,
idata => idata,
odata => odata,
busy => busy,
cdce72010_valid => cdce72010_valid,
ads62p49_valid => ads62p49_valid,
dac3283_valid => dac3283_valid,
amc7823_valid => amc7823_valid,
external_clock => external_clock,
adc_n_en => adc_n_en,
adc_sdo => adc_sdo,
adc_reset => adc_reset,
cdce_n_en => cdce_n_en,
cdce_sdo => cdce_sdo,
cdce_n_reset => cdce_n_reset,
cdce_n_pd => cdce_n_pd,
ref_en => ref_en,
pll_status => pll_status,
dac_n_en => dac_n_en,
dac_sdo => dac_sdo,
mon_n_en => mon_n_en,
mon_sdo => mon_sdo,
mon_n_reset => mon_n_reset,
mon_n_int => mon_n_int,
spi_sclk => spi_sclk,
spi_sdata => spi_sdata,
prsnt_m2c_l => prsnt_m2c_l
);
end rtl;
\ No newline at end of file
-------------------------------------------------------------------------------------
-- FILE NAME : pulse2pulse.vhd
--
-- AUTHOR : Peter Kortekaas
--
-- COMPANY : 4DSP
--
-- ITEM : 1
--
-- UNITS : Entity - pulse2pulse
-- architecture - pulse2pulse_syn
--
-- LANGUAGE : VHDL
--
-------------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------------
-- DESCRIPTION
-- ===========
--
-- This file transfers a pulse from one clock domain (in_clk) to another (out_clk).
--
-------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all ;
use ieee.std_logic_arith.all ;
use ieee.std_logic_unsigned.all ;
use ieee.std_logic_misc.all ;
entity pulse2pulse is
port (
in_clk : in std_logic;
out_clk : in std_logic;
rst : in std_logic;
pulsein : in std_logic;
inbusy : out std_logic;
pulseout : out std_logic
);
end pulse2pulse;
architecture syn of pulse2pulse is
-----------------------------------------------------------------------------------
--constant declarations
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
--constant declarations
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
--signal declarations
-----------------------------------------------------------------------------------
signal out_set :std_logic;
signal out_set_prev :std_logic;
signal out_set_prev2 :std_logic;
signal in_set :std_logic;
signal outreset :std_logic;
signal in_reset :std_logic;
signal in_reset_prev :std_logic;
signal in_reset_prev2:std_logic;
-----------------------------------------------------------------------------------
--component declarations
-----------------------------------------------------------------------------------
--*********************************************************************************
begin
--*********************************************************************************
-----------------------------------------------------------------------------------
--component instantiations
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
--synchronous processes
-----------------------------------------------------------------------------------
in_proc:process(in_clk,rst)
begin
if(rst = '1') then
in_reset <= '0';
in_reset_prev <= '0';
in_reset_prev2<= '0';
in_set <= '0';
elsif(in_clk'event and in_clk = '1') then
--regitser a pulse on the pulse in port
--reset the signal when the ouput has registerred the pulse
if (in_reset_prev = '1' and in_reset_prev2 = '1') then
in_set <= '0';
elsif (pulsein = '1') then
in_set <= '1';
end if;
--register the reset signal from the other clock domain
--three times. double stage synchronising circuit
--reduces the MTB
in_reset <= outreset;
in_reset_prev <= in_reset;
in_reset_prev2 <= in_reset_prev;
end if;
end process in_proc;
out_proc:process(out_clk,rst)
begin
if(rst = '1') then
out_set <= '0';
out_set_prev <= '0';
out_set_prev2 <= '0';
outreset <= '0';
pulseout <= '0';
elsif(out_clk'event and out_clk = '1') then
--generate a pulse on the outpput when the
--set signal has travelled through the synchronising fip flops
if (out_set_prev = '1' and out_set_prev2 = '0') then
pulseout <= '1';
else
pulseout <= '0';
end if;
--feedback the corret reception of the set signal to reset the set pulse
if (out_set_prev = '1' and out_set_prev2 = '1') then
outreset <= '1';
elsif (out_set_prev = '0' and out_set_prev2 = '0') then
outreset <= '0';
end if;
--register the reset signal from the other clock domain
--three times. double stage synchronising circuit
--reduces the MTB
out_set <= in_set;
out_set_prev <= out_set;
out_set_prev2 <= out_set_prev;
end if;
end process out_proc;
-----------------------------------------------------------------------------------
--asynchronous processes
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
--asynchronous mapping
-----------------------------------------------------------------------------------
inbusy <= in_set or in_reset_prev;
-------------------
-------------------
end syn;
\ No newline at end of file
files = ["ads62p49_init_mem.ngc", "amc7823_init_mem.ngc", "cdce72010_init_mem_ext.ngc",
"cdce72010_init_mem_int.ngc", "dac3283_init_mem.ngc"];
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$0f640<,[o}e~g`n;"2*731&=$:,)<4-07845678=:0<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;8=5?0123456789:;<=>?0123456789:;<=>?01234567?9<;<=>?71734567>9K;<=>;0:26446789:><=>;0527416789:?<<>70127456781:8<K>=012145678=:;<=>70163?50709I;<=8?61634507;9:;<=8?21234537?9:;<=;?51A34537;9>;<=;?212346=6&9;j7<:5IORVP?GCL[KYHLJKR=30>586i2;?6D@_UU8B@ATE_[KOH_2>3;2=51=6>3CE\XZ5DHCGM972294:86?9:HLSQQ<CAKNB0<;50?30?40=AGZ^X7jfn`>21?699:1::7GAPTV9`lhe48?1<3?:;049KPRW]]0OCLJ@<0794;7238<1CXZ_UU8GKGBH48?1<3?:;049KPRW]]0ocxzn<0794;7238<1CXZ_UU8gkpre48?1<3??;08JJUSS2~oj0=4?>0285?OIX\^1{hl30;2=5<=52@D[YY4NDEPBPLCOANB7=7>11891>LHW]]0JHI\MTHGKMBN;93:5=95=:HLSQQ<CAYKOE]2>:1<20>4=AGZ^X7JFPCFJT97=87;>7?4@UURVP?BHXHND\1?50?36?7<H]]Z^X7J@PCFLT97=87;;794FNQWW>RCF4:0;2<<45;KMTPR=imnym1:50?31?0<NFY__6ljkrc>7>586?2?1CXZ_UU8q`dbczlih094?>0282sj:=:jk?>57/257=?2@D[YY4XECUF82<76l1JHI\NRECG@W:76o1JHI\NRECG@W:687l0MIJ]ASFB@AT;984m7LJKR@PGEABU4885=<5NDEPBVAGCL[6:?7>1f:CG@WGULHNO^1?<>d9B@ATFZMKOH_2>>d9B@ATFZMKOH_2=>d9B@ATFZMKOH_2<>d9B@ATFZMKOH_2;>d9B@ATFZMKOH_2:>d9B@ATFZMKOH_29>d9B@ATFZMKOH_28>d9B@ATFZMKOH_27>d9B@ATFZMKOH_26>g9B@ATF\@OCEJF30?32?DBCZH^BIEGHH=394;`<IMNYMYGJHHEK848a3HNO^OZFEIKDL969981JHI\MTHGKMBN;93:5j6OKDS@WM@NNOA6:2h5NDEPASWGCL[6;2k5NDEPASWGCL[6:<3h4AEFQFRTFLMX7=<0i;@FGVGQUIMNY0<<1109B@ATE_[KOH_2>3;2=b>GCL[H\^LJKR=30:`=FLMXI[_OKDS>2:`=FLMXI[_OKDS>1:`=FLMXI[_OKDS>0:`=FLMXI[_OKDS>7:`=FLMXI[_OKDS>6:`=FLMXI[_OKDS>5:`=FLMXI[_OKDS>4:`=FLMXI[_OKDS>;:`=FLMXI[_OKDS>::6=FDE90NX<7;CWP[LHAG880OEKLK^NJG@HTMV^R\H74CMIBVAEKC01H@FLXRBNH=>EHEDC_XHJ>4:ALV@Y@MGOYMYG@N^KMBJ1<K[OJXHJk;EGOE\CCW^XBXH64DHCGM96912NBMIG311<:?AOFL@6:=374DHCGM975601OELJF<01==>BNIMC7=90m;EKB@L:6=3:556JFAEK?508?3MCJHD2>>99GMDBN4;437IGNDH>0:==CAHNB0907;EKB@L:2611OELJF<7<;?AOFL@6<255KI@FJ8=8?3MCJHD26>99GMGBN49427IGMDH>24;?<L@HOE1?>>89GMGBN488556JFBEK?568>3MCIHD2>4?`8@LDCA5;>6=06;EKA@L:6=720HDLKI=3=<>BNJMC7>364DH@GM95902NBNIG34?:8@LDCA5?546JFBEK?2;><L@HOE1918:FJFAO;0720HDLKI=;=e>BNXHNB\1>1c:FJTDBNX5;1<3o4DHRB@LV;97k0HD^MDHR?4;e<L@ZIHD^31;2=e>BNXKNB\1?18:FLEAI;8730HBOKO=33:<=CGHND0<?19:FLEAI;9;427IANDN>27;?<LFKOC1?;>c9GKDBH48?1<374DNCGK972611OCLJ@<0<;?AIFLF69255KO@FL868?3MEJHB2;>99GKDBH4<437IANDN>5:==CGHND0:07;EMB@J:?611OCLJ@<8<4?AIFW[OL46J@BEM?4;?<LFHOC1??>89GKGBH48;556J@BEM?578>3MEIHB2>3?;8@JDCG5;?2o5KOCFL843=8730HBLKO=36:==CGKND0<07;EMA@J:5611OCOJ@<2<;?AIELF6?255KOCFL808?3MEIHB29>99GKGBH4>437IAMDN>;:==CGKND0408;EMA[WC@i2ND\LJ@P=2=g>BHXHND\1?50?c8@JVFLFZ7=3o4DNRA@JV;87i0HB^MDNR?5?69i2ND\OJ@P=3=3>CII[NNB:5JNCUQAK3<NHFXI<5H3:EM@==NF@^[S=>7;HLJPUY7911BBDZ__10;?LHN\YU;?55FNHVS[52?3@DBX]Q?599JJLRWW9<37D@FTQ]332=NF@^T<=94IOKW[5703@DBXR>=7:KMMQY7;>1BBDZP0558MKOSW9?<7D@FT^253>OIA]U;;:5FNHV\4=1<AGC_S=78;HLJPZ6F?2CEEYQ?B69JJLRX8J=0ECG[_1F4?LHN\V:N;6GAIU]3B2=NF@^T==94IOKW[4703@DBXR?=7:KMMQY6;>1BBDZP1558MKOSW8?<7D@FT^353>OIA]U:;:5FNHV\5=1<AGC_S<78;HLJPZ7F?2CEEYQ>B69JJLRX9J=0ECG[_0F4?LHN\V;N;6GAIU]2B2=NF@^T>=94IOKW[7703@DBXR<=7:KMMQY5;>1BBDZP2558MKOSW;?<7D@FT^053>OIA]U9;:5FNHV\6=1<AGC_S?78;HLJPZ4F?2CEEYQ=B69JJLRX:J=0ECG[_3F4?LHN\V8N;6GAIU]1B2=NF@^T?=94IOKW[6703@DBXR==7:KMMQY4;>1BBDZP3558MKOSW:?<7D@FT^153>OIA]U8;:5FNHV\7=1<AGC_S>78;HLJPZ5F?2CEEYQ<B69JJLRX;J=0ECG[_2F4?LHN\V9N;6GAIU]0B3=NF@^TM;5FNHV\F<=NF@^TJDBJ6:NLEACC?2FDKDMNLb9Neoiu^lxxeb`l;LkmkwPbzzcdb?5A129M555<F8;97C<<;O0;7>H51:1E?==4N230?K55;2D8?>5A3518J6343G9=?6@<729M7=5<F:387C:?3:L756=I<;90B9==;O51?K>53G3m7CLPBTQSMKYWZFZX;6@JTVMQO1=IGGO97BE>;Q68TDTSi2ZBBRLZSHF[f>VNFVH^_COBE99QEHD60L;37_OB_LMGA4?<ZMKOH_QLOMNJWLIIWA]HCCHFGb9QADBX_@N_DROl;SGB@ZQNL]BTN85]EFAFf>TBOJOJ^HILE79QABEBJm1YIJMCK@PGVFJL?2XNKNBDBe9QWQTFEHXXX_OB7:PPPWGJJm1Y_Y\JG@PPPWC@?2XXX_KHB038VVRUMNU[^DA]IU[\E47<ZZ^YIJQ_RHMQMQ_XJ11XM[KKAUC25>UOZLMTIUZ]ABV\JBEb3ZBYIJQBIO]PM_C6;2YBARM@LMKPMJHXKAOHGl5\IL]GASODM11XGD^PPHL5?VIRZJO<7^\YAM]B3>UU^HFTN>5[DQ68P\VB<o1^<"lck^ofiZabflxjxb| v`nj`+et|{%ym`b`oqY3Y+tfe'x$z;Qfnhv-vdk([Y$\EIKPPSKN5=(uidk0Y^K]_@NJEVe<]ZOYS[G\ICNF7>PDK01]EHYPTXRF3>PNZ]OS:;5XE@>3:3=PMH6:2;5XE@>1:==PMH686=09;VGB868?3^OI[H2?>99TAGQB48437ZKMWD>1:==PMK]N0>07;VGAS@:3611\IOYJ<4<;?RCE_L6=2l5XECUF82<7611\IOYJ<6<a?RTN\LUME_][c:UQMQCXEFNNSLm4WSKWAZKHLLUIh6Y]IUG\SLBS@VKo7Z\FTD]TMAROWK;o7UGCIOZ.\AD'8';+_Y[M 1,2$DUDA@<0T^ZCIC58\VRXOGN<7U][_WA@f>^XKFXNSD@IO79[`gYNlo1SheQ_rhoUawungg;;7Ujb_LcikwPbzzcdb<>4Xeo\Ilhhz_oydaa3:[fw==flmxj$='7;`fgvd.6!11jhi|n(3+;?dbczh"8%55ndepb,1/?3hno~l2?>99b`atf48437ljkr`>1:==flmxj0>0n;`fgvd:329437ljkr`>7:==flmxi$='7;`fgvg.6!11jhi|m(3+;?dbczk"8%55ndepa,1/f3hno~o2;:1<25>gc{?8{84Qfnhv\i`k5k2ko;<48]jjlrXelg'naePmdo\c`hX~=U8 CAAE-LLJ@27i2ko;<48]jjlrXelg'naePmdo\c`hX~=U8 vmPaefqeZqnl}b69!mPaefqfZqnl}b69!mPamelvlroe4;'oRlvtd]pmc:1%iTobcboo]`hn;7$jUoikozlu]geqg:8%iThd}nbmg\sdtiWkb}Snacl<2/gZbn{hhgiRynro]alsYuigmn1="l_icp[`hf59&hSeo|_dla95*dWakxSd`eebvfvw;7$jUcm~Qbel]lqqvr|Vxnk~Qn=1.`[mgtWdofSb{{ptv\v`atWk7; nQgar]nq}Yh}}z~xR|jgr]b95*dWakxS`{w_nwwtprXzlmxSo3?,b]kevYumninm0>#c^jbwZtbojoi1="l_icp[wusi4:'oRfns^pppg;7$jUcm~Q|ogvfgfYnfySkhs^c>4)eX`hyTbh{eba\kprw}}Uyij}Pb<2/gZoia}UmeakPn`of9dbt>;z?5Rgaiu]nah(jao&hSd`ft`]uei;7$jUbbdzm_wco95*dWeejhRgaiu]emic:9%iTahcPtxrf96*dWdsS}gemkmaZusinox1="l_qpjiZr~xl7: nQ}e`f\``vs`Vk6??"l_sgb`Zbbx}bTn0==,b]qadbX`ndRo217.`[wcflV}bhyfPb<35(fYu{}U{~da}iu{\e8EB$jUyyQrhmqmqXj4IN nQ}su]w}uc:[PDH nQ}supbiZg:8%iT~~z}al]a95*dWzcfSnaclhqjkkYd`li`1LBC,b]vw`Yeq}oT{ho20-a\qvcXjp~nSzkm=1.`[pubWmommxb{_ecwe86+kVxiRklc<2/gZstmVydjyklc<2/gZqbiV}bhyf21-a\s`dX`nd0?#c^uqmqcXllzdRo233.`[rtn|lUoi}zg_c?06)eX{ciRc`dd]b9RTN\LUME_][,b]tvlrbWdeoiRl2WSKWAZ@NZZ^'oRy}iug\slbs`Vk6=;"l_vpjp`Ypam~cSo3>6-aliuiimg~Tblcj=`fp27v31VceeyQbel.~6==flz<9|97Piokw[hcjWkf`S`kb_fgm[s2X;VrxxR?=c:`ooZkbeVmnbRx;_2.#\ljnfq*HC_K/Gdlfvdrhz);8">:4cmib0>ekck=0hog{esp4?aoii!:";6jfn`*2-==cagk#=='7;ekme-76!11oeco'13+;?aoii!;8%55kioc+51/?3mcem%?:)69gmkg/: =0hd`n(2+4?aoii!>";6jfn`*6-2=cagk#:$94dhlb,2/03mcem%6&7:fjjd.>!h1oeco31483:2=cagh#<$94dhla,4/?3mcen%??)99gmkd/98#37igab)31-==cagh#=>'7;ekmf-73!11oecl'14+4?aoij!8";6jfnc*0-2=cagh#8$94dhla,0/03mcen%8&7:fjjg.0!>1oecl'8(58`lhe 0#j7igab=36>58?3me~xl&?)99gkprf 8#27iazt`*24,?<lfm%?>)89gkprf 88"56j`uuc+56/>3me~xl&>4(;8`jssi!;>%55kotvb,7/?3me~xl&<)99gkprf =#37iazt`*6-==cg|~j$;'7;emvpd.0!11ocxzn(9+;?air|h"2%55kotvb858>3me~xl2>0?;8`jssi5;:245kotvb844912ndyyo312<:?air|h6:83l4dnwwe97229427iazt`>21;><lfm1?18:flqqg;:720hb{{a=1=<>bh}}k78364dnwwe93902ndyyo36?:8`jssi5=546j`uuc?<;><lfm1718:flqqd/8 20hb{{b)3*=>bh}}h#=='6;emvpg.69 30hb{{b)31-<=cg|~i$<=&9:flqqd/9=#27iaztc*21,><lfn%<&8:flqqd/; 20hb{{b)6*<>bh}}h#9$64dnwwf-0.02ndyyl'7(:8`jssj!2"46j`uu`+=,d<lfn1?::1<;?`bnn;dlh>5jn`18akdc3`dainzkbhvfvwb<ag`noy}miugqv==iojh~eajl;sfb`atbkj";%n5}d`fgv`ed 8#h7jndepfgf.5!j1yhljkrda`,6/d3{njhi|jcb*7-f=ulhno~hml<1<f?wbflmxnon2;:1<5?wc`klk=7khcd`7?wusi=1yyl8;r`jp`tu9m1a}!Pcf-b`v05x=3Tecg{_lgn*kah>2}nm%>&8:ufe96=87<0{hl'0(:8s`d;83:5qMN15g8DE~6l90M694>{R6`>4db2>0:?>>=fb805ge5sg;?i7?4n06e>3=#9=i1=994}R6b>4db2>0:?>>=fb805ge53Zl;6<m<:1827665nj08=om=;R6b>4e4290:?>>=fb805ge23m;=>7>51;3xW1e=9ko1;7?<310eg?56jj80zY?=9;295?7=91qX8n4>bd84>4548;lh6>?mc39'564=n81]=9j52zwe6?7<}o91<6s+10295`=e9?81<7?9:2822~N6;91Q8;4={0`955<z,88o6<8=;%37f?71>2c:984?:%326?72i2d:=<4?;:k211<72-;:>7?:a:l254<632c:9>4?:%326?72i2d:=<4=;:k217<72-;:>7?:a:l254<432c:9<4?:%326?72i2d:=<4;;:m2=6<72-;:>7?n2:l254<732e:5?4?:%326?7f:2d:=<4>;:m2=4<72-;:>7?n2:l254<532e:5=4?:%326?7f:2d:=<4<;:m2<c<72-;:>7?n2:l254<332e:4h4?:%326?7f:2d:=<4:;:m2=g<72-;:>7?n2:l254<132e:5l4?:%326?7f:2d:=<48;:m2=<<72-;:>7?n2:l254<?32e:554?:%326?7f:2d:=<46;:m2=2<72-;:>7?n2:l254<f32e:5;4?:%326?7f:2d:=<4m;:m2=0<72-;:>7?n2:l254<d32e:594?:%326?7f:2d:=<4k;:m2<a<72-;:>7?n2:l254<b32e:4n4?:%326?7f:2d:=<4i;:k222<722h:?<4?:083>5}O9::0(<<k:012?j77n3:17pln4;295?6=8rB:?=5+13f9e1=hi:0;66sm4483>0b=;3;3wE?<0:X72?75s8n1=?4>3;3a>4e=990:=7m5d;31>4d=k3;86<m5d;33>47=9m0v(<<k:046?!2028<87):m:047?!75=3;0(<<;:073?!77j3;;i6g>c383>>i6k10;6)?>2;3`e>h6980;76a>c683>!76:3;hm6`>1082?>i6k?0;6)?>2;3`e>h6980976a>c483>!76:3;hm6`>1080?>i6k=0;6)?>2;3`e>h6980?76g>bg83>>o6k90;66g>cc83>>o6kj0;66g>d083>!76:3;o>6`>1083?>o6l:0;6)?>2;3g0>h6980;76g>5483>!76:3;>m6`>1083?>o6==0;6)?>2;36e>h6980:76g>5283>!76:3;>m6`>1081?>o6=;0;6)?>2;36e>h6980876g>5083>!76:3;>m6`>1087?>o6>90;6)?>2;355>h6980;76g>5g83>!76:3;==6`>1082?>o6=l0;6)?>2;355>h6980976g>5e83>!76:3;==6`>1080?>o6=j0;6)?>2;355>h6980?76g>ce83>>o6kl0;66a>cg83>>i61:0;6)?>2;3b6>h6980;76a>9383>!76:3;j>6`>1082?>i6180;6)?>2;3b6>h6980976a>9183>!76:3;j>6`>1080?>i60o0;6)?>2;3b6>h6980?76a>8d83>!76:3;j>6`>1086?>i61k0;6)?>2;3b6>h6980=76a>9`83>!76:3;j>6`>1084?>i6100;6)?>2;3b6>h6980376a>9983>!76:3;j>6`>108:?>i61>0;6)?>2;3b6>h6980j76a>9783>!76:3;j>6`>108a?>i61<0;6)?>2;3b6>h6980h76a>9583>!76:3;j>6`>108g?>i60m0;6)?>2;3b6>h6980n76a>8b83>!76:3;j>6`>108e?>i6j=0;6)?>2;3a`>h6980;76a>b283>!76:3;ih6`>1082?>i6j;0;6)?>2;3a`>h6980976a>b083>!76:3;ih6`>1080?>i6j90;6)?>2;3a`>h6980?76a>ag83>!76:3;ih6`>1086?>i6jj0;6)?>2;3a`>h6980=76a>bc83>!76:3;ih6`>1084?>i6jh0;6)?>2;3a`>h6980376a>b883>!76:3;ih6`>108:?>i6j10;6)?>2;3a`>h6980j76a>b683>!76:3;ih6`>108a?>i6j?0;6)?>2;3a`>h6980h76a>b483>!76:3;ih6`>108g?>i6il0;6)?>2;3a`>h6980n76a>ae83>!76:3;ih6`>108e?>o6>>0;66g>6983>>o6?80;6)?>2;34e>h6980;76g>7183>!76:3;<m6`>1082?>o6>o0;6)?>2;34e>h6980976g>6d83>!76:3;<m6`>1080?>o6>m0;6)?>2;34e>h6980?76g>6b83>!76:3;<m6`>1086?>o6?00;6)?>2;34e>h6980=76g>7983>!76:3;<m6`>1084?>o6?>0;6)?>2;34e>h6980376g>7783>!76:3;<m6`>108:?>o6?<0;6)?>2;34e>h6980j76g>7583>!76:3;<m6`>108a?>o6?:0;6)?>2;34e>h6980h76g>7383>!76:3;<m6`>108g?>o6>k0;6)?>2;34e>h6980n76g>6`83>!76:3;<m6`>108e?>o60;0;6)?>2;3;f>h6980;76g>8083>!76:3;3n6`>1082?>o6090;6)?>2;3;f>h6980976g>7g83>!76:3;3n6`>1080?>o6?l0;6)?>2;3;f>h6980?76g>7e83>!76:3;3n6`>1086?>o60h0;6)?>2;3;f>h6980=76g>8883>!76:3;3n6`>1084?>o6010;6)?>2;3;f>h6980376g>8683>!76:3;3n6`>108:?>o60?0;6)?>2;3;f>h6980j76g>8483>!76:3;3n6`>108a?>o60=0;6)?>2;3;f>h6980h76g>8283>!76:3;3n6`>108g?>o6?j0;6)?>2;3;f>h6980n76g>7c83>!76:3;3n6`>108e?>o6k80;66a>6883>>d6<00;6<4?:1y'57b=i=1C=964H013?jg42900qo?;a;295?6=8r.:>i4>309K51><@89;7b??f;29?xd6:l0;65>50;2x 44c28;87E?;8:J275=]<?0nw<:5148;><<6>3;<6<65188b>g<b2o0:j7?n:|l;3?6<f031<6*n5;18 d0=;2.j;7=4$`:97>"f1390(lo53:&bf?5<,hi1?6*nd;78 dc=>2.jj7:4$c297>"e9390(o<53:&a7?5<,k>1?6*m5;18 g0=;2.i;7=4$c:97>"e1390(oo53:&af?5<,ki1?6*md;18 gc=;2.ij7=4$b297>"d9390(n<53:&`7?5<,j>1?6*l5;18 f0=;2.h;7=4$b:97>"d1390(no53:&`f?5<,ji1?6*ld;18 fc=;2.hj7=4$e297>"c9390(i<53:&g7?5<,m>1?6*k5;18 a0=;2.o;7=4$e:97>"c1390(io53:&gf?5<,mi1?6*kd;18 ac=;2.oj7=4$d297>"b9390(h<53:&f7?5<,l>1?6*j5;18 `0=;2.n;7=4$d:97>"b1390(ho53:&ff?5<,li1?6*jd;08 `c=:2.nj7??d:&251<6:j1/=<;54e9m540=9;1e=<95139'577=9820(<<=:03;?!75>3>?7)?=7;307>"6:h097)?=b;08 42428>97)?;4;376>h6<<0:>6`>47826>"6::0j>6g;8;29?l2>2900el>50;9je4<722c:=44?::k25d<722c:=o4?:I31<>=n98i1<7F>2998m47c2900e<?j:188m47a2900e<<?:188m73=83.:=?4=4:l254<732c9?7>5$031>72<f8;:6<54i3094?"69;0986`>1081?>o593:1(<?=:368j4762:10e?k50;&257<5<2d:=<4;;:k1`?6=,8;96?:4n032>0=<a;i1<7*>13810>h6980=76g=b;29 4752;>0b<?>:698m7g=83.:=?4=4:l254<?32c957>5$031>72<f8;:6454i3:94?"69;0986`>108b?>o5?3:1(<?=:368j4762k10e?850;&257<5<2d:=<4l;:k14?6=,8;96?:4n032>a=<a:;1<7*>13804>h6980;7E?=8:9j6c<72-;:>7=?;o325?7<@88376g<4;29 4752:90b<?>:19K57><3`996=4+100976=i98;1=6F>2998m6g=83.:=?4<9:l254<732c847>5$031>6?<f8;:6<54i2594?"69;0856`>1081?>o4>3:1(<?=:2;8j4762:10e9=50;&257<412d:=<4;;:k76?6=,8;96>74n032>0=<a=;1<7*>1380=>h6980=76g;0;29 4752:30b<?>:698m6`=83.:=?4<9:l254<?32c8i7>5$031>6?<f8;:6454i2f94?"69;0856`>108b?>o4k3:1(<?=:2;8j4762k10e>l50;&257<412d:=<4l;:k01?6=,8;96>74n032>a=<a<?1<7*>13860>h6980;76g:3;29 4752<>0b<?>:098m04=83.:=?4:4:l254<532c>=7>5$031>02<f8;:6>54i4294?"69;0>86`>1087?>o3n3:1(<?=:468j4762<10e8k50;&257<2<2d:=<49;:k6`?6=,8;968:4n032>2=<a<i1<7*>13860>h6980376g:b;29 4752<>0b<?>:898m0g=83.:=?4:4:l254<f32c>57>5$031>02<f8;:6o54i4:94?"69;0>86`>108`?>o2?3:1(<?=:468j4762m10e8850;&257<2<2d:=<4j;:k7a?6=,8;968:4n032>c=<a?<1<7*>13851>h6980;76g94;29 4752??0b<?>:098m35=83.:=?495:l254<532c=>7>5$031>33<f8;:6>54i7394?"69;0=96`>1087?>o183:1(<?=:778j4762<10e;h50;&257<1=2d:=<49;:k5a?6=,8;96;;4n032>2=<a?n1<7*>13851>h6980376g9c;29 4752??0b<?>:898m3d=83.:=?495:l254<f32c=m7>5$031>33<f8;:6o54i7;94?"69;0=96`>108`?>o103:1(<?=:778j4762m10e;950;&257<1=2d:=<4j;:k6b?6=,8;96;;4n032>c=<a>81<7*>13845>h6980;76g80;29 4752>;0b<?>:098m23=83.:=?484:l254<732c<?7>5$031>22<f8;:6<54o6f94?"69;0<o6`>1083?>i0j3:1(<?=:6a8j4762810c:o50;&257<0k2d:=<4=;:m4=?6=,8;96:m4n032>6=<g>21<7*>1384g>h6980?76a87;29 4752>i0b<?>:498k=0=83.:=?48c:l254<132e397>5$031>2e<f8;:6:54o9694?"69;0<o6`>108;?>i?;3:1(<?=:6a8j4762010c5<50;&257<0k2d:=<4n;:m;5?6=,8;96:m4n032>g=<g1:1<7*>1384g>h6980h76a8f;29 4752>i0b<?>:e98k2c=83.:=?48c:l254<b32e<:7>5$031>2e<f8;:6k54o9d94?"69;03i6`>1083?>i?l3:1(<?=:9g8j4762810c5m50;&257<?m2d:=<4=;:m;f?6=,8;965k4n032>6=<g1k1<7*>138;a>h6980?76a79;29 47521o0b<?>:498k<>=83.:=?47e:l254<132e2;7>5$031>=c<f8;:6:54o8494?"69;03i6`>108;?>i>=3:1(<?=:9g8j4762010c4:50;&257<?m2d:=<4n;:m:7?6=,8;965k4n032>g=<g081<7*>138;a>h6980h76a61;29 47521o0b<?>:e98k<6=83.:=?47e:l254<b32e347>5$031>=c<f8;:6k54o8a94?"69;02n6`>1083?>i>i3:1(<?=:8`8j4762810c4h50;&257<>m2d:=<4?;:m:`?6=,8;964k4n032>4=<a8936=4+1009561<f8;:6=5G13:8?l74>3:1(<?=:014?k7693;0D<<7;:k270<72-;:>7?<7:l254<532c:?94?:%326?74?2d:=<4<;:k204<72-;:>7?;0:l254<73A;9465f12d94?"69;0:8=5a10395>N6:110e<=j:18'544=9=:0b<?>:39K57><3`;8h7>5$031>4273g;:=7=4H00;?>o6;j0;6)?>2;374>h6980?76g>3c83>!76:3;?<6`>1086?>o6;h0;6)?>2;374>h6980=76g>3883>!76:3;?<6`>1084?>{t9<h1<7=t^076?875m38n70?=e;60?xu6=00;6>uQ1468944b2;n01<<j:508yv7203:1?vP>529>57c=:j16=?k5409~w4302908wS?:2:?26`<5j27:>h4;0:p500=839pR<;>;<31a?4f34;9i7=i;|q222<72:qU=;94=00f>1><588n6974}r3b7?6=:rT:5>5213g9<d=z{8k:6=4={_3:6>;6:l0356s|1`294?4|V83:70?=e;;;?xu61o0;6?uQ1828944b20=0q~?6e;296~X60o16=?k5939~w4?c2909wS?7e:?26`<>92wx=lm50;0xZ4?e34;9i77?;|q2eg<72;qU=4o4=00f>=><uz;jm7>52z\2=<=:9;o1;55rs0c:>5<5sW;2463>2d843>{t9h21<7<t^0;4?875m32=7p}>a683>7}Y90<01<<j:978yv7f>3:1>vP>949>57c=091v<o::181[7><27:>h48f:p5d2=838pR<6k;<31a?1b3ty:5n4?:3y]5=e<588n6:84}r3`=?6==>qU=o:4^0`0?[7e:2T:n<5Q1c28Z4ga3W;io6P>bc9]5gg<V8h27S?m8:\2f2=Y9k<0R<l:;_3ba>X6im1U=n64^0a4?[7d>2T:o85Q1b68942>2h901<<j:03:?875m3;:m63>2d825a=:9;o1=<k4=00f>47a34;9i7?=0:?26`<5=27:>h4=3:?26`<5:27:>h4=1:?26`<5127:>h4=8:?26`<5?27:>h4=6:?26`<5827:>h4<a:?26`<4027:>h4<7:?26`<4>27:>h4<d:?26`<4k27:>h4<b:?26`<4=27:>h4:5:?26`<2;27:>h4:2:?26`<2927:>h4:0:?26`<3n27:>h4:e:?26`<2l27:>h4:c:?26`<2j27:>h4:a:?26`<2127:>h4:8:?26`<2?27:>h4:6:?26`<3m27:>h496:?26`<1<27:>h493:?26`<1:27:>h491:?26`<1827:>h49f:?26`<1m27:>h49d:?26`<1k27:>h49b:?26`<1i27:>h499:?26`<1027:>h497:?26`<2n27:>h482:?26`<0827:>h485:?26`<0;27:>h4>349>57c=9:>01<<j:01`?875m3;8n63>2d827d=:9;o1=>74}rd7>5<3s4;?m7??f:?26`<f827:>h4n1:?26`<4m2wv<88:181[71?27?97?97:&26c<a?2wx=8l50;0xZ43234>>6<;:;%31b?7702wx=8750;0xZ43334>>6<;;;%31b?7712wx=8650;0xZ43434>>6<;<;%31b?77i2wx=8950;0xZ43534>>6<;=;%31b?`23ty:9;4?:3y]507<5=?1=8?4$00e>c0<uz;j?7>52z\2=6=:<<0:5>5+13d9b==z{8k:6=4={_3:6>;3=3;2>6*>2g8e=>{t9h:1<7<t^0;2?822283:7)?=f;db?xu61o0;6?uQ1828913=90:0(<<i:g`8yv7>m3:1>vP>8g9>00<60o1/=?h5fb9~w4?c2909wS?7e:?71?7?m2.:>k4id:p5de=838pR<7m;<66>4?e3-;9j7hj;|q2eg<72;qU=4o4=5795<g<,88m6kh4}r3be?6=:rT:54524482=<=#9;l1==>4}r3b=?6=:rT:55524482===#9;l1==?4}r3b<?6=:rT:5:524482=2=#9;l1==<4}r3b3?6=:rT:5;524482=3=#9;l1===4}r3b2?6=:rT:58524482=0=#9;l1==:4}r3b1?6=:rT:59524482=1=#9;l1==;4}r3b0?6=:rT:4i524482<a=#9;l1==84}r3:g?6=:rT:4n524482<f=#9;l1==94}|l265<72;qC=>>4}o315?6=:rB:?=5rn001>5<5sA;8<6sa13194?4|@89;7p`>2583>7}O9::0qc?=5;296~N6;91vb<<9:181M7482we=?950;0xL4573td:>54?:3yK566<ug;957>52zJ275=zf88j6=4={I304>{i9;h1<7<tH013?xh6:j0;6?uG1228yk75l3:1>vF>319~j44b2909wE?<0:m57`=838pD<=?;|l275<72;qC=>>4}o305?6=:rB:?=5rn011>5<5sA;8<6sa12194?4|@89;7p`>3583>7}O9::0qc?<5;296~N6;91vb<?j:182M7482we=<h50;3xL4573twvqMNL{06f>42d8k3o;pNOBz2~DEV|uIJ
\ No newline at end of file
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$31740<,[o}e~g`n;"2*731&=$:,)<4-07845678=:0<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;8=5?0123456789:;<=>?0123456789:;<=>?1073EC7798>;O<6?1013EC77988;O<6;0:22546F81::==>M17224C6F81::<H>M17224A>789::<O6?81224D6789:;<LHIFG185+66i2;?6D@_UU8B@ATFZMKOH_2>3;2=5d=6<3CE\XZ5AEFQFRTFLMX7=>4?>06853<NFY__6IGNDH>21?699=1::7GAPTV9@LDCA5;>6=0>5:35>JSSX\^1HBOKO=36>586=2;=6B[[PTV9@JDCG5;>6=0>0:39MKVR\3}nm1>50?33?4<NFY__6zkm<183:4?<:3CE\XZ5AEFQEQOB@@MC0<4?>0;86?OIX\^1MIJ]BUKFLLAO480;2<:42;KMTPR=L@ZJHD^31;2=51=52@D[YY4KIQ@GMU:6294:96<5OTVSQQ<CGYKOC]2>:1<21>4=G\^[YY4KOQ@GKU:6294:?6==:HLSQQ<cagk7?<4?>01877<NFY__6igab=12>586=2996B[[PTV9`jssi59:6=0>5:11>JSSX\^1hb{{b=12>58682>1EC^ZT;UFE95=87;9784FNQWW>dbczh6?6=0>2:79MKVR\3kohl34;2=52=22F__\XZ5recg`wcdk5>1<3??;7to|727|ol:=88"1008<?OIX\^1[HLXE=594;c<IMNYM_JNDEP?4;`<IMNYM_JNDEP?558a3HNO^L\KAEFQ8479n2KOH_O]D@FGV97568;0MIJ]ASFB@AT;9:0;2k5NDEPBVAGCL[6:?3k4AEFQEWBFLMX7=3k4AEFQEWBFLMX7>3k4AEFQEWBFLMX7?3k4AEFQEWBFLMX783k4AEFQEWBFLMX793k4AEFQEWBFLMX7:3k4AEFQEWBFLMX7;3k4AEFQEWBFLMX743k4AEFQEWBFLMX753h4AEFQEQOB@@MC0=0>1:CG@WGSALBBKE2>:1<e?DBCZH^BIEGHH=3=b>GCL[H_EHFFGI>3:47<IMNYNYGJHHEK84<76o1JHI\MTHGKMBN;97o0MIJ]BVPB@AT;87l0MIJ]BVPB@AT;994m7LJKRCUQEABU48;5j6OKDS@TVDBCZ5;92<?4AEFQFRTFLMX7=>4?>g9B@ATE_[KOH_2>3?g8EABUJ^XJHI\31?g8EABUJ^XJHI\32?g8EABUJ^XJHI\33?g8EABUJ^XJHI\34?g8EABUJ^XJHI\35?g8EABUJ^XJHI\36?g8EABUJ^XJHI\37?g8EABUJ^XJHI\38?g8EABUJ^XJHI\39?18EIJ43K_946LZS^KMBJ753JBNOFQCIBGMW@YSQYO27NBDASF@HN?<KEAI[_MCK89@KHKN\]OO=95LOSG\C@HBZH^BCCQFNGM4?FTBI]OOh6JJL@[F@ZQUA]O37IGNDH>3:<=CAHNB0<>19:FJEAO;98427IGNDH>26;?<L@KOE1?<>89GMDBN48>5n6JFAEK?50<7601OELJF<07=<>BNIMC7=364DHCGM94902NBMIG33?:8@LGCA5>546JFAEK?1;><L@KOE1818:FJEAO;?720HDOKI=:=<>BNIMC75364DH@GM96912NBNIG311<:?AOEL@6:=374DH@GM975601OEOJF<01==>BNJMC7=90m;EKA@L:6=3:556JFBEK?508?3MCIHD2>>99GMGBN4;437IGMDH>0:==CAKNB0907;EKA@L:2611OEOJF<7<;?AOEL@6<255KICFJ8=8?3MCIHD26>`9GMUGCAY6;2n5KIQCGMU:6294j7IG_AEKS848f3MC[NIG_<1<`?AOWJMC[0<4?>`9GMUDCAY6:255KO@FL858>3MEJHB2>0?;8@JGCG5;:245KO@FL844912NDMIA312<:?AIFLF6:83l4DNCGK97229427IANDN>21;><LFKOC1?18:FLEAI;:720HBOKO=1=<>BHIME78364DNCGK93902NDMIA36?:8@JGCG5=546J@AEM?<;><LFKOC1717:FLEZTBO11OCOJ@<1<:?AIELF6:<374DN@GK976601OCOJ@<00==>BHJME7=>06;EMA@J:6<7h0HBLKO=36>58>3MEIHB2>5?:8@JDCG5;546J@BEM?6;><LFHOC1=18:FLFAI;<720HBLKO=7=<>BHJME7:364DN@GK91902NDNIA38?:8@JDCG535;6J@B^PFCd=CGYKOC]2?>b9GKUGCGY6:6=0n;EMSEAIW484j7IA_BEMS858d3ME[NIA_<083:d=CGYHOC]2>>69FJDTCMG=0ICLXRDL6?CGK[L;0K>5HNE:8MKOSXV:;46GAIUR\44><AGC_\R>=8:KMMQVX8:20ECG[P^27<>OIA]ZT<864IOKWTZ6102CEEY^P0658MKOSW9:<7D@FT^223>OIA]U;>:5FNHV\461<AGC_S=:8;HLJPZ62?2CEEYQ?669JJLRX8>=0ECG[_1:4?LHN\V:2;6GAIU]3E2=NF@^T<O94IOKW[5E03@DBXR>K7:KMMQY7M>1BBDZP0G58MKOSW8:<7D@FT^323>OIA]U:>:5FNHV\561<AGC_S<:8;HLJPZ72?2CEEYQ>669JJLRX9>=0ECG[_0:4?LHN\V;2;6GAIU]2E2=NF@^T=O94IOKW[4E03@DBXR?K7:KMMQY6M>1BBDZP1G58MKOSW;:<7D@FT^023>OIA]U9>:5FNHV\661<AGC_S?:8;HLJPZ42?2CEEYQ=669JJLRX:>=0ECG[_3:4?LHN\V82;6GAIU]1E2=NF@^T>O94IOKW[7E03@DBXR<K7:KMMQY5M>1BBDZP2G58MKOSW::<7D@FT^123>OIA]U8>:5FNHV\761<AGC_S>:8;HLJPZ52?2CEEYQ<669JJLRX;>=0ECG[_2:4?LHN\V92;6GAIU]0E2=NF@^T?O94IOKW[6E03@DBXR=K7:KMMQY4M>1BBDZP3G48MKOSWH<0ECG[_C;8MKOSWOCGI;5CO@FF@2=KGNCHMAm4M`hlvScu{`eeo6CfnnpUawungg80B<=4N020?K76:2D9?6@;429M005<F=<87C:83:L7<6=I<090B8><;O727>H2::1E9>=4N460?K32;2D>:>5A5618J0>43G?2?6@9029M245<F?887C8<3:L506=I><90B;8<;O447>H10:1E:4<4N618J2643G=:?6@8229M365<F>>87C9:2:L;6>H>n2DISO[\PHL\TWIW[>1EIYY@RJ68JJHB:2E@=6^;;QCQPd=WAGUIY^GKXc9SMKYE]ZDJAH64R@OA5=C602XJARC@DD3:?WBFLMXTOBBCIRKLJZNPKFDMEJm4RDCG[ROC\AUJo6\JAE]TMAROWK?0^HILEc9QABEBI[OLOH84RDE@AGb<ZLMH@FO]DSAOO2=UMNIGGOj4RRVQEHGU[]XJA:5]SUPBIGb<ZZ^YIJO]SUPFC2=U[]XNKO?>;SQWV@AXX[CD^DZV_@32?WUSZLMT\_G@RHVZ[G><[H\NHLZN109PLWC@WLR_^LM[_OE@a>UOZLMTAD@PSHXF56=TADUHCABFSHMM[FNBKBk0_DCPDDTJG@><[BC[S]GA6:QLQWEB?2YYZLBPA69PVSGKWK90XI^;;U[SA1`<]9%i`fQbel]dakcui}ey#{ocie,`wqt(zhggcb~T0\,qeh(u'<Tecg{.scn+VV)_@NNS]\FM0:-vdkf3\YN^ROCI@Q`?PUBZV\B_DLCE29UGF?<^@O\SYW_E69UMWRBP?<0[HO30?48S@G;97<0[HO32?:8S@G;;3:5:6YJA=1=<>QBJ^O7<364WD@TA97902]NNZK32?:8S@DPM59546YJBVG?0;><_LH\I1;18:UFFRC;>7k0[HLXE=594;><_LH\I191b:UQMQCXN@XXXn5XRHVF[HICMVKh7Z\FTD]NKACXJm1\^DZJ_VKGPMYFl2]YEYKPWHFWLZD6l2RB@D@W-YFA$5(6(Z^^N->!1!CPGLO13QY_@DL8;YQW[BHC?2RXXRXLCc9[[FIUMVCEJB84Xe`\Ma`<PmbT\gbVdppmjh682RoaRCnjnpUawungg;;7Ujb_LkmkwPbzzcdb>5Ver:8eabui!:"46okdsc+5,><imnym%<&8:cg`wg/; 20mij}a)6*<>gcl{k7<364aefqe97902koho32?:8eabui595m6okdsc?0?6902koho34?:8eabuj!:"46okds`+5,><imnyn%<&8:cg`wd/; 20mij}b)6*e>gcl{h787>1119bif1?::UbbdzPmdo1f>gjk>29?Rgaiu]nah*edbUfi`Qheo]u0Z5+FFDN CAAE524?dkd?188Sd`ft^ofi)dkcVgnaRijn^t7[6*|kVkohoPwhfwl83+kVkohlPwhfwl83+kVkgkb|ftio>5)eXjp~nS~gue<;/gZehedeeSnbd=1.`[acai|fSio{a<2/gZbn{hhgiRynro]alsYdgef6<!mPdhqbficXhxeSofy_scmc`;7$jUcm~Qjn`?3(fYoizUnbo3?,b]kevYnfcohxh|}=1.`[mgtWdofSb{{ptv\v`atWh7; nQgar]nahYh}}z~xR|jgr]a95*dWakxS`{w_nwwtprXzlmxSl3?,b]kevYj}qUdyy~zt^pfcvYe59&hSeo|_sgdg`g:8%iTdl}Prde`ag;7$jUcm~Q}suc>4)eX`hyT~~zm=1.`[mgtWzemxhml_hlsqqYumnyTm0>#c^jbwZuhn}ohoRaztqww[wc`{Vh6<!mPiokw[cokmVdjah3nmb5;66Ynf`~Tahc!mhd/gZoia}kTzlb20-a\mkosjV|j`0>#c^nleaYnf`~Tjdbj=0.`[hcjW}s{i0=#c^ov|ZvnxlfbbhQ|t`efw86+kVzye`Q{yqg>5)eXzlkoSikti]b964+kVxnmiQkeqvk[g;4:%iT~hok_vkgpmYf5:8'oR|jae]tmaroWk78>!mPrrv\twohz`~rSl3LE-a\vvrXx{cd~dzv_c?@A)eXzz~Txt~j=R[MG)eXzz~ym`Qn=1.`[wuszhgTn0>#c^qjiZehdecxeb`Pcig`o8GKD%iTy~kPbxvf[rcf59&hSx}j_c{waZqbj4:'oR{|e^ffbdsk|Vnjxl3?,b]vw`Ybkj7; nQzsd]pkcrbkj7; nQxe`]tmaro58&hSzkm_vkgpm;6$jU|~dzj_egspmYf5:8'oRy}iug\``vs`Vh6??"l_vpjp`YjgmoTm0Y]IUG\BLTT\%iT{g{e^ol``Ye5^XBXHQIISQW(fYpz`~nSzgkti]b964+kV}yeykPwhfwlZd:;;&hc`~`ndlw[kgjm4kfo:6=3^kmmqYjmd&v>:5nmb5;66Ynf`~TahcPbmi\i`kXoldTz9Q<_yqw[44d3kf`S`kb_fgm[s2X;%*Seagax!ALV@&@mgoymya} 01-71=ddbk?7nbdb69gflrbz{=0hd`n(1+4?aoii!;"46jfn`*24,><l`dj$<?&8:fjjd.6: 20hd`n(01*<>bnfh":8$64dhlb,43.02nbbl&>6(:8`lhf 8="46jfn`*2<,><l`dj$<7&7:fjjd.5!11oeco'21+;?aoii!8:%55kioc+67/?3mcem%<<)99gmkg/:=#37igaa)06-==cagk#>;'7;ekme-40!11oeco'29+;?aoii!82%:5kioc+7,><l`dj$>>&8:fjjd.49 =0hd`n(5+4?aoii!?";6jfn`*5-2=cagk#;$94dhlb,=/03mcem%7&a:fjjd:493:5;6jfnc*3-2=cagh#=$64dhla,46.02nbbo&>1(:8`lhe 88"46jfnc*27,><l`di$<:&8:fjjg.6= 20hd`m(04*<>bnfk":;$64dhla,4>.02nbbo&>9(58`lhe ;#37igab)03-==cagh#><'7;ekmf-45!11oecl'22+;?aoij!8?%55kio`+60/?3mcen%<9)99gmkd/:>#37igab)0;-==cagh#>4'8;ekmf-5.02nbbo&<0(:8`lhe :;";6jfnc*7-2=cagh#9$94dhla,3/03mcen%9&7:fjjg.?!>1oecl'9(c8`lhe4:;1<364dnwwe-6.02ndyyo'1(;8`jssi!;;%45kotvb,47.12ndyyo'13+:?air|h":?$74dnwwe-73!01ocxzn(07*=>bh}}k#=;'6;emvpd.6? 30hb{{a)3;-<=cg|~j$<7&8:flqqg/: 30hb{{a)03-<=cg|~j$??&9:flqqg/:;#27iazt`*17,?<lfm%<;)89gkprf ;?"56j`uuc+63/>3me~xl&=7(;8`jssi!83%45kotvb,7?.02ndyyo'3(;8`jssi!9;%45kotvb,67.02ndyyo'4(:8`jssi!?"46j`uuc+2,><lfm%9&8:flqqg/0 20hb{{a);*<>bh}}k7<374dnwwe977601ocxzn<03==>bh}}k7=?06;emvpd:6;730hb{{a=37:<=cg|~j0<;19:flqqg;9?427iazt`>23;?<lfm1?7>89gkprf483546j`uuc?5;?<lfm1<?>89gkprf4;;556j`uuc?678>3me~xl2=3?;8`jssi58?245kotvb873912ndyyo327<:?air|h69;374dnwwe94?601ocxzn<3;=<>bh}}k7>374dnwwe9576k1ocxzn<2394;?<lfm1=>>99gkprf4:437iazt`>7:==cg|~j0807;emvpd:1611ocxzn<6<;?air|h63255kotvb8<8?3me~xo&?)99gkpre 8#27iaztc*24,?<lfn%?>)89gkpre 88"56j`uu`+56/>3me~xo&>4(;8`jssj!;>%45kotva,40.12ndyyl'16+:?air|k":4$74dnwwf-7>!11ocxzm(3+:?air|k"9<$74dnwwf-46!01ocxzm(30*=>bh}}h#>>'6;emvpg.5< 30hb{{b)06-<=cg|~i$?8&9:flqqd/:>#27iaztc*1<,?<lfn%<6)99gkpre :#27iaztc*04,?<lfn%=>)99gkpre =#37iaztc*6-==cg|~i$;'7;emvpg.0!11ocxzm(9+;?air|k"2%o5kotva867=8720iigi2oeg7>cii:1nboj4iohfgqbea}oy~i5fnkg`pvdn|lxy46`hccwjhae<zmkohklc)2*g>tcimnyinm'1(a8vagcl{oho%<&c:pgeabumji#?$m4recg`wcdk!>"o6|kaefqafe;87o0~iokdsg`g92=87<0~hile`48v`admk>0~~zn4:pppg1<{kci|>c:vnt*Ydo&kfo:6=3^kmmqYjmd$ekb84wdc+4,><lk7<7>16:uff-6.02}nn1>50?CDu7dm2JKt?<i:G87>4}T<k09=i49:01047`d2:;2>?ua14f95>h6=l0=7)?:b;362>{T<009=i49:01047`d2:;2>?5\eg8167<72898<?hl:23:67=T<009>?4?:01047`d2:;2>85k16394?7=9rY?n7<>d;495657:oi1?<7=2:tW56>=83;1=7<7{R6a>77c2?0:?>>=fb805<453-;?=7h?;W36g?4|}o;1=6{i2;28y!76n3;o7o?81;2963<42;<pD<=i;[66>7}6i3;<6p*>3b8234=#9<k1=:;4i047>5<#9;;1=;74n003>5=<a8<86=4+133953?<f88;6<54i041>5<#9;;1=;74n003>7=<a8<:6=4+133953?<f88;6>54i043>5<#9;;1=;74n003>1=<g8n?6=4+13395c5<f88;6=54o0f0>5<#9;;1=k=4n003>4=<g8n:6=4+13395c5<f88;6?54o0f3>5<#9;;1=k=4n003>6=<g8im6=4+13395c5<f88;6954o0af>5<#9;;1=k=4n003>0=<g8io6=4+13395c5<f88;6;54o0a`>5<#9;;1=k=4n003>2=<g8ii6=4+13395c5<f88;6554o0ab>5<#9;;1=k=4n003><=<g8i26=4+13395c5<f88;6l54o0a;>5<#9;;1=k=4n003>g=<g8i=6=4+13395c5<f88;6n54o0a6>5<#9;;1=k=4n003>a=<g8i?6=4+13395c5<f88;6h54o0a0>5<#9;;1=k=4n003>c=<g8i96=4+13395c5<f88;6<>4;n3`5?6=,88:6<h<;o314?7632e:o=4?:%315?7a;2d:>=4>2:9l5g`=83.:><4>f29m576=9:10c<lj:18'577=9o90b<<?:068?j7el3:1(<<>:0d0?k7583;>76a>d`83>!7593;m?6`>21822>=h9m31<7*>2082b6=i9;:1=:54o0f;>5<#9;;1=k=4n003>4><3f;o;7>5$002>4`43g;9<7?6;:m2`3<72-;9=7?i3:l265<6i21d=i;50;&264<6n:1e=?>51c98k4b5290/=??51g18j44728i07b?l7;29 44628l87c?=0;3g?>i6jj0;6)?=1;3e7>h6:90:i65`1c`94?"6:80:j>5a13295c=<a8==6=44b063>5<6290;wE?<f:&27f<6<91d=<k50;9~fd5=83;1<7>tH01e?!74k3k87bo=:188yg232902h7=529yK56`<R=?1=?u>c;f9a?7f28h1=:4>8;36>40=l3;j6<;5e;3a>40=9>0:47?l:|&27f<6?=1/8;4>739'0d<6?:1/=>:51:&276<6=o1/=<o510f8m7462900c?<8:18'577=:;30b<<?:198k741290/=??523;8j4472810c?<::18'577=:;30b<<?:398k743290/=??523;8j4472:10c?<<:18'577=:;30b<<?:598m77b2900e??i:188m74f2900e?<m:188m757290/=??52238j4472910e?==:18'577=::90b<<?:198m403290/=??517;8j4472910e<8<:18'577=9?30b<<?:098m405290/=??517;8j4472;10e<8>:18'577=9?30b<<?:298m407290/=??517;8j4472=10e<8i:18'577=9>:0b<<?:198m40b290/=??51628j4472810e<8k:18'577=9>:0b<<?:398m40d290/=??51628j4472:10e<8m:18'577=9>:0b<<?:598m74d2900e?<k:188k74b2900c<j;:18'577=9o90b<<?:198k4b4290/=??51g18j4472810c<j>:18'577=9o90b<<?:398k4b7290/=??51g18j4472:10c<mi:18'577=9o90b<<?:598k4eb290/=??51g18j4472<10c<mk:18'577=9o90b<<?:798k4ed290/=??51g18j4472>10c<mm:18'577=9o90b<<?:998k4ef290/=??51g18j4472010c<m6:18'577=9o90b<<?:`98k4e?290/=??51g18j4472k10c<m9:18'577=9o90b<<?:b98k4e2290/=??51g18j4472m10c<m;:18'577=9o90b<<?:d98k4e4290/=??51g18j4472o10c<m=:18'577=9o90b<<?:028?j7d93:1(<<>:0d0?k7583;:76a>c183>!7593;m?6`>21826>=h9kl1<7*>2082b6=i9;:1=>54o0`f>5<#9;;1=k=4n003>42<3f;ih7>5$002>4`43g;9<7?:;:m2`d<72-;9=7?i3:l265<6>21d=i750;&264<6n:1e=?>51698k4b?290/=??51g18j44728207b?k7;29 44628l87c?=0;3:?>i6l?0;6)?=1;3e7>h6:90:m65`1e794?"6:80:j>5a13295g=<g8n96=4+13395c5<f88;6<m4;n3`3?6=,88:6<h<;o314?7c32e:nn4?:%315?7a;2d:>=4>e:9l5gd=83.:><4>f29m576=9o10c??::18'577=:8i0b<<?:198k773290/=??520a8j4472810c??=:18'577=:8i0b<<?:398k776290/=??520a8j4472:10c???:18'577=:8i0b<<?:598k76a290/=??520a8j4472<10c?>j:18'577=:8i0b<<?:798k76c290/=??520a8j4472>10c?>l:18'577=:8i0b<<?:998k76e290/=??520a8j4472010c?>n:18'577=:8i0b<<?:`98k76>290/=??520a8j4472k10c?>8:18'577=:8i0b<<?:b98k761290/=??520a8j4472m10c?>::18'577=:8i0b<<?:d98k763290/=??520a8j4472o10c?><:18'577=:8i0b<<?:028?j47:3:1(<<>:33`?k7583;:76a=0083>!75938:o6`>21826>=h:9:1<7*>20815f=i9;:1=>54o0de>5<#9;;1><m4n003>42<3f;mi7>5$002>77d3g;9<7?:;:m15g<72-;9=7<>c:l265<6>21d><o50;&264<59j1e=?>51698k77>290/=??520a8j44728207b<>8;29 4462;;h7c?=0;3:?>i59>0;6)?=1;02g>h6:90:m65`20494?"6:809=n5a13295g=<g;;86=4+133964e<f88;6<m4;n03<?6=,88:6??l;o314?7c32e:ji4?:%315?46k2d:>=4>e:9l5ce=83.:><4=1b9m576=9o10e<99:188m4102900e<7=:18'577=9030b<<?:198m4?6290/=??518;8j4472810e<6i:18'577=9030b<<?:398m4>b290/=??518;8j4472:10e<6k:18'577=9030b<<?:598m4>d290/=??518;8j4472<10e<6m:18'577=9030b<<?:798m4>f290/=??518;8j4472>10e<66:18'577=9030b<<?:998m4>?290/=??518;8j4472010e<68:18'577=9030b<<?:`98m4>1290/=??518;8j4472k10e<6;:18'577=9030b<<?:b98m4>4290/=??518;8j4472m10e<6=:18'577=9030b<<?:d98m4>6290/=??518;8j4472o10e<6?:18'577=9030b<<?:028?l70n3:1(<<>:0;:?k7583;:76g>7d83>!7593;256`>21826>=n9>n1<7*>2082=<=i9;:1=>54i05`>5<#9;;1=474n003>42<3`;<n7>5$002>4?>3g;9<7?:;:k2==<72-;9=7?69:l265<6>21b=4950;&264<6101e=?>51698m4?1290/=??518;8j44728207d?65;29 44628327c?=0;3:?>o61=0;6)?=1;3:=>h6:90:m65f18194?"6:80:545a13295g=<a83;6=4+13395<?<f88;6<m4;h3;1?6=,88:6<76;o314?7c32c:;l4?:%315?7>12d:>=4>e:9j52?=83.:><4>989m576=9o10e<l<:18'577=9kk0b<<?:198m4d5290/=??51cc8j4472810e<l?:18'577=9kk0b<<?:398m4ga290/=??51cc8j4472:10e<oj:18'577=9kk0b<<?:598m4gc290/=??51cc8j4472<10e<ol:18'577=9kk0b<<?:798m4ge290/=??51cc8j4472>10e<on:18'577=9kk0b<<?:998m4g>290/=??51cc8j4472010e<o7:18'577=9kk0b<<?:`98m4g0290/=??51cc8j4472k10e<o::18'577=9kk0b<<?:b98m4g3290/=??51cc8j4472m10e<o<:18'577=9kk0b<<?:d98m4g5290/=??51cc8j4472o10e<o>:18'577=9kk0b<<?:028?l7f83:1(<<>:0`b?k7583;:76g>9g83>!7593;im6`>21826>=n90o1<7*>2082fd=i9;:1=>54i0;g>5<#9;;1=oo4n003>42<3`;2o7>5$002>4df3g;9<7?:;:k2f<<72-;9=7?ma:l265<6>21b=o650;&264<6jh1e=?>51698m4d0290/=??51cc8j44728207d?m6;29 44628hj7c?=0;3:?>o6j<0;6)?=1;3ae>h6:90:m65f1c694?"6:80:nl5a13295g=<a8h:6=4+13395gg<f88;6<m4;h3b2?6=,88:6<ln;o314?7c32c:5o4?:%315?7ei2d:>=4>e:9j5<g=83.:><4>b`9m576=9o10e?<?:188k41?2900n<;7:182>5<7s-;8o7o<;I363>N6;o1dm?4?::a50?=83;1<7>t$01`>4273A;>;6F>3g9l54c=831vn<=k:18;4?6=8r.:?n4>239K501<@89m7W:::dye>46=?321=<4>2;30>42=13k1n7m51d82=?{i0?0;7c77:19'e1<43-k>6>5+a780?!g02:1/m54<;%c:>6=#ih087)om:29'ef<23-ko695+ad80?!ga2:1/n=4<;%`2>6=#j;087)l<:29'f1<43-h>6>5+b780?!d02:1/n54<;%`:>6=#jh087)lm:29'ff<43-ho6>5+bd80?!da2:1/o=4<;%a2>6=#k;087)m<:29'g1<43-i>6>5+c780?!e02:1/o54<;%a:>6=#kh087)mm:29'gf<43-io6>5+cd80?!ea2:1/h=4<;%f2>6=#l;087)j<:29'`1<43-n>6>5+d780?!b02:1/h54<;%f:>6=#lh087)jm:29'`f<43-no6>5+dd80?!ba2:1/i=4<;%g2>6=#m;087)k<:29'a1<43-o>6>5+e780?!c02:1/i54<;%g:>6=#mh087)km:29'af<53-oo6?5+ed825f=#9;91=>l4$007>1e<f88>6<<4n005>44<,89;6<<8;%305?75?2.:?84;3:&273<6<;1/=>752:&27d<53-;>>7?:1:&216<6=81e=8:5139m503=9;1/=><5a09j02<722c?47>5;h;e>5<<ah:1<75f13:94?=n9;31<75f13c94?N6;>10e<<m:18K561<3`;9o7>5;h31`?6=3`;9i7>5;h31b?6=3`8?6=4+133966=i9;:1<65f2383>!7593887c?=0;38?l46290/=??5229m576=:21b>=4?:%315?443g;9<7=4;h0g>5<#9;;1>>5a13290>=n:j0;6)?=1;00?k7583?07d<m:18'577=::1e=?>56:9j6d<72-;9=7<<;o314?1<3`826=4+133966=i9;:1465f2983>!7593887c?=0;;8?l40290/=??5229m576=i21b>;4?:%315?443g;9<7l4;h06>5<#9;;1>>5a1329g>=n9o0;6)?=1;00?k7583n07d=?:18'577=:o1e=?>50:J272=<a;o1<7*>2081b>h6:90:7E?<7:9j76<72-;9=7==;o314?6<@89<76g<1;29 4462:80b<<?:09K561<3`926=4+13397==i9;:1<65f3683>!7593937c?=0;38?l51290/=??5399m576=:21b?84?:%315?5?3g;9<7=4;h61>5<#9;;1?55a13290>=n<80;6)?=1;1;?k7583?07d:?:18'577=;11e=?>56:9j7c<72-;9=7=7;o314?1<3`9n6=4+13397==i9;:1465f3e83>!7593937c?=0;;8?l5d290/=??5399m576=i21b?o4?:%315?5?3g;9<7l4;h1b>5<#9;;1?55a1329g>=n;=0;6)?=1;1;?k7583n07d;;:18'577==:1e=?>50:9j17<72-;9=7;<;o314?7<3`?:6=4+133916=i9;:1>65f5183>!7593?87c?=0;18?l2a290/=??5529m576=<21b8h4?:%315?343g;9<7;4;h7g>5<#9;;19>5a13292>=n=j0;6)?=1;70?k7583=07d;m:18'577==:1e=?>58:9j1d<72-;9=7;<;o314??<3`?26=4+133916=i9;:1m65f5983>!7593?87c?=0;`8?l30290/=??5529m576=k21b9;4?:%315?343g;9<7j4;h76>5<#9;;19>5a1329a>=n<m0;6)?=1;70?k7583l07d8::18'577=>=1e=?>50:9j26<72-;9=78;;o314?7<3`<96=4+133921=i9;:1>65f6083>!7593<?7c?=0;18?l07290/=??5659m576=<21b9k4?:%315?033g;9<7;4;h4f>5<#9;;1:95a13292>=n>m0;6)?=1;47?k7583=07d8l:18'577=>=1e=?>58:9j2g<72-;9=78;;o314??<3`<j6=4+133921=i9;:1m65f6883>!7593<?7c?=0;`8?l0?290/=??5659m576=k21b::4?:%315?033g;9<7j4;h45>5<#9;;1:95a1329a>=n=l0;6)?=1;47?k7583l07d9>:18'577=?91e=?>50:9j2c<72-;9=79?;o314?7<3`=?6=4+133936=i9;:1<65f7383>!7593=87c?=0;38?j1d290/=??57c9m576=821d;l4?:%315?1e3g;9<7?4;n5:>5<#9;;1;o5a13296>=h?10;6)?=1;5a?k7583907b98:18'577=?k1e=?>54:9l33<72-;9=79m;o314?3<3f2>6=4+13393g=i9;:1:65`8583>!7593=i7c?=0;58?j>4290/=??57c9m576=021d4?4?:%315?1e3g;9<774;n:2>5<#9;;1;o5a1329e>=h090;6)?=1;5a?k7583h07b9i:18'577=?k1e=?>5c:9l3`<72-;9=79m;o314?b<3f=o6=4+13393g=i9;:1i65`7483>!7593=i7c?=0;d8?j>b290/=??58e9m576=821d4n4?:%315?>c3g;9<7?4;n:a>5<#9;;14i5a13296>=h0h0;6)?=1;:g?k7583907b66:18'577=0m1e=?>54:9l<=<72-;9=76k;o314?3<3f3<6=4+1339<a=i9;:1:65`9783>!75932o7c?=0;58?j?2290/=??58e9m576=021d594?:%315?>c3g;9<774;n;0>5<#9;;14i5a1329e>=h1;0;6)?=1;:g?k7583h07b7>:18'577=0m1e=?>5c:9l=5<72-;9=76k;o314?b<3f2m6=4+1339<a=i9;:1i65`8683>!75932o7c?=0;d8?j?e290/=??59`9m576=821d544?:%315??f3g;9<7?4;n;f>5<#9;;15i5a13294>=h1j0;6)?=1;;g?k7583;07d?;7;29 44628>=7c?=0;28L45032c:884?:%315?73>2d:>=4>;I303>=n9=>1<7*>208203=i9;:1>65f15194?"6:80:8;5a13297>=n9<:1<7*>20820c=i9;:1<6F>3698m42b290/=??515d8j447281C=>94;h37`?6=,88:6<:i;o314?4<@89<76g>4b83>!7593;?j6`>2180?M74?21b=9l50;&264<6<o1e=?>54:9j51g=83.:><4>4g9m576==21b=9750;&264<6<o1e=?>56:9j51>=83.:><4>4g9m576=?21v<8n:180[71<27:?i4=d:?27a<3:2wx=;650;1xZ40434;8h7<l;<30`?263ty:::4?:2y]534<589o6?l4=01g>16<uz;=:7>53z\224=:9:n1>l5212f97c=z{8<>6=4<{_354>;6;m09563>3e80a>{t9><1<7=t^055?874l3><70?<d;6;?xu6n=0;6?uQ1e68945c21o0q~?i2;296~X6l:16=>j58b9~w4`72909wS?k1:?27a<?j2wx=hh50;0xZ4b734;8h76n;|q2a`<72;qU=nh4=01g>=?<uz;nh7>52z\2g`=:9:n1455rs0g`>5<5sW;hh63>3e8:3>{t9lh1<7<t^0a`?874l33=7p}>e`83>7}Y9jh01<=k:878yv7b13:1>vP>c`9>56b=1=1v<k7:181[7d127:?i463:p5`1=838pR<m7;<30`??53ty:i84?:3y]5f0<589o64?4}r3f0?6=:rT:o85212f9=5=z{8o86=4={_3`0>;6;m03j6s|1d094?4|V8i870?<d;:4?xu6m80;6?uQ1b08945c2>i0q~?j0;296~X6k816=>j57`9~w4ba2909wS?l0:?27a<012wx=ik50;0xZ4da34;8h797;|q2`a<72;qU=ok4=01g>21<uz;oo7>52z\2fa=:9:n1;;5rs0da>5<5sW;om63>3e8;1>{t9ok1<7<t^0f:?874l32?7p}>f883>7}Y9m201<=k:918yv7a03:1>vP>d69>56b=0;1v<h8:181[7c>27:?i471:p5c0=838pR<j:;<30`?>73ty:j84?:3y]5a4<589o6:h4}r3e5?6=:rT:o:5212f93`=z{8o=6=4={_3ag>;6;m0<h6s|1e`94?4|V8hi70?<d;56?xu5:10;6;9t^336?[46<2T9=?5Q2038Z7773W8;j6P=0d9]65b<V;:h7S<?b:\14d=Y:930R?>8;_032>X58<1U>=:4^320?[47:2T9<<5Q2128Z4`a3W;mi6P=1c9]64g<V;;27S<>8:\152=Y:8<0R??<;_03<>X6nm1U=km4^304?[45>2T9>85Q2368Z74434;>47o=;<30`?75027:?i4>289>56b=9;i01<=k:00g?874l3;9i63>3e826c=:9:n1>95212f967=:9:n1><5212f965=:9:n1>55212f962=:9:n1>;5212f960=:9:n1=k5212f97<=:9:n1?:5212f973=:9:n1?85212f97f=:9:n1?o5212f97d=:9:n1?95212f911=:9:n19?5212f914=:9:n19=5212f90c=:9:n18h5212f91a=:9:n19n5212f91g=:9:n19l5212f91<=:9:n1955212f912=:9:n19;5212f910=:9:n18i5212f920=:9:n1:>5212f927=:9:n1:<5212f925=:9:n19k5212f92`=:9:n1:i5212f92f=:9:n1:o5212f92d=:9:n1:45212f92==:9:n1::5212f923=:9:n19h5212f934=:9:n1:k5212f931=:9:n1;?5212f9512<589o6<:<;<30`?73j27:?i4>4`9>56b=9=301<=k:06;?xua;3:18v3>58825`=:9:n15k5212f9e5=:9:n1?i5r}r342?6=:rT:;;52458233=#9:o1j;5rs04b>5<5sW;=863;4;350>"6;l0:=<5rs04;>5<5sW;=?63;4;357>"6;l0:=55rs044>5<5sW;=>63;4;356>"6;l0:=45rs045>5<5sW;==63;4;355>"6;l0m86s|17794?4|V8<;70:;:043?!74m3l>7p}>f583>7}Y9m>019:51e68 45b2o=0q~?i2;296~X6l:16894>d29'56c=n11v<h?:181[7c927?87?k1:&27`<a12wx=hh50;0xZ4b734>?6<j?;%30a?`f3ty:ih4?:3y]5f`<5=>1=nh4$01f>cd<uz;nh7>52z\2g`=:<=0:oh5+12g9bf=z{8oh6=4={_3``>;3<3;hh6*>3d8e`>{t9lh1<7<t^0a`?82328ih7)?<e;df?xu6mh0;6?uQ1b`8912=9jh0(<=j:gd8yv7b13:1>vP>c`9>01<6kh1/=>k51128yv7b03:1>vP>c89>01<6k01/=>k51138yv7b?3:1>vP>c99>01<6k11/=>k51108yv7b=3:1>vP>c79>01<6k?1/=>k51118yv7b<3:1>vP>c49>01<6k<1/=>k51168yv7b;3:1>vP>c59>01<6k=1/=>k51178yv7b:3:1>vP>c29>01<6k:1/=>k51148yv7b93:1>vP>c39>01<6k;1/=>k51158yv7b83:1>vP>c09>01<6k81/=>k511:8yv7cn3:1>vP>c19>01<6k91/=>k511;8yv7cm3:1>vP>bg9>01<6jo1/=>k511c8yv7cl3:1>vP>bd9>01<6jl1/=>k511`8yv7ck3:1>vP>be9>01<6jm1/=>k511a8yv7aj3:1>vP>d`9>01<6lh1/=>k511f8yv7ai3:1>vP>d89>01<6l01/=>k511g8yv7a13:1>vP>d99>01<6l11/=>k511d8yv7a03:1>vP>d69>01<6l>1/=>k51028yv7a?3:1>vP>d79>01<6l?1/=>k51008yv7a>3:1>vP>d49>01<6l<1/=>k51018yv7a=3:1>vP>d39>01<6l;1/=>k51068yv7a93:1>vP>c69>01<6k>1/=>k51078yv7b>3:1>vP>bb9>01<6jj1/=>k51048yv7cj3:1>vP>bc9>01<6jk1/=>k51058yxh6090;6?uG12d8yk7?93:1>vF>3g9~j4>52909wE?<f:m5=5=838pD<=i;|l2<1<72;qC=>h4}o3;1?6=:rB:?k5rn0:5>5<5sA;8j6sa19594?4|@89m7p`>8983>7}O9:l0qc?79;296~N6;o1vb<6n:181M74n2we=5l50;0xL45a3td:4n4?:3yK56`<ug;3h7>52zJ27c=zf82n6=4={I30b>{i91l1<7<tH01e?xh6190;6?uG12d8yk7>93:1>vF>3g9~j4?52909wE?<f:m5<5=838pD<=i;|l2=1<72;qC=>h4}o3:1?6=:rB:?k5rn0;5>5<5sA;8j6sa18594?4|@89m7p`>9983>7}O9:l0qc?69;296~N6;o1vb<7n:181M74n2we=4l50;0xL45a3td:5n4?:3yK56`<ug;2h7>52zJ27c=zf83n6=4={I30b>{i90l1<7<tH01e?xh6i90;6?uG12d8yk7f93:1>vF>3g9~j4g52909wE?<f:m5d5=838pD<=i;|l2e1<72;qC=>h4}o3b1?6=:rB:?k5rn05f>5<6sA;8j6sa16d94?7|@89m7psr}AB@4eb2<=?:>>=4|BCF~6zHIZpqMN
\ No newline at end of file
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$05:44<,[o}e~g`n;"2*73?(-80!<;40123416<89:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?01234567<91;<=>?0123456789:;<=>?0123456609I3<=>?51@3FCE7:OK=4=>?C5;5<567802:m6?;:HLSQQ<FLMXJ^IOKDS>27?699h1:87GAPTV9EABUJ^XJHI\31283:42<9?0BB][[:EKB@L:6=3:5=95>6;KMTPR=L@HOE1?::1<21>712F__\XZ5DNCGK972294:96?9:NWWTPR=LFHOC1?::1<2=>4=AGZ^X7OKDSCWM@NNOA6:6=0>9:09MKVR\3KOH_L[IDJJCM:6294:86<5IORVP?BNXHNB\1?50?37?7<NFY__6IG_BEKS84<768?0>7AZTQWW>AIWIME[0<4?>0786?IR\Y__6IA_BEMS84<768?0??4@UURVP?bh}}k7?<4?>0280?OIX\^1[HO33;2=57=32@D[YY4ndepb86<768:0:{bw252wbc76=?'98=573923441109:;<=898123453B11:;<=:98523455?;1>;<=<9896341710;I;>4>>2::9MKVR\3]NNZK37;2=a>GCL[KYHLJKR=2=b>GCL[KYHLJKR=33:c=FLMXJ^IOKDS>25;`<IMNYM_JNDEP?578692KOH_O]D@FGV974294m7LJKR@PGEABU4895i6OKDSCQ@DBCZ5;5i6OKDSCQ@DBCZ585i6OKDSCQ@DBCZ595i6OKDSCQ@DBCZ5>5i6OKDSCQ@DBCZ5?5i6OKDSCQ@DBCZ5<5i6OKDSCQ@DBCZ5=5i6OKDSCQ@DBCZ525i6OKDSCQ@DBCZ535j6OKDSCWM@NNOA6;2<?4AEFQEQOB@@MC0<4?>g9B@ATF\@OCEJF31?d8EABUJ]CNDDIG<1<25>GCL[H_EHFFGI>2>58a3HNO^OZFEIKDL979m2KOH_LXR@FGV969n2KOH_LXR@FGV9776o1JHI\MWSCG@W:697l0MIJ]BVPB@AT;9;4:=6OKDS@TVDBCZ5;86=0i;@FGVGQUIMNY0<=1e:CG@WDPZHNO^1?1e:CG@WDPZHNO^1<1e:CG@WDPZHNO^1=1e:CG@WDPZHNO^1:1e:CG@WDPZHNO^1;1e:CG@WDPZHNO^181e:CG@WDPZHNO^191e:CG@WDPZHNO^161e:CG@WDPZHNO^1713:COH==E]ZUBBKA>2:AKAFMXD@INB^KPTXRF0>EKC9<0OAE>8148GIM5?9?0OAE=X99@HN4_91:>7NBD9178GIMF9>1H@FO>D358GIMF9M><7NBDA0F;=>EKCHXOOAE:;BNHF4?<KEAI[_MCK49@HNE6=2IGGI?:;BNH@Se<KEAOZRJFVHFF1>EKCOR37NBDFY3;4<=DGDGBXYKK159@KWCXOLDN^LZFOO]JJCI03JXNMYKKd:FFHD_BLV]YEYK7;EKB@L:7601OELJF<02==>BNIMC7=<06;EKB@L:6:730HDOKI=30:<=CAHNB0<:1b:FJEAO;9<0;245KI@FJ843902NBMIG31?:8@LGCA58546JFAEK?7;><L@KOE1:18:FJEAO;=720HDOKI=4=<>BNIMC7;364DHCGM9>902NBMIG39?:8@LDCA5:556JFBEK?558>3MCIHD2>1?;8@LDCA5;9245KICFJ845912NBNIG315<a?AOEL@6:97>19:FJFAO;9<437IGMDH>2:==CAKNB0?07;EKA@L:4611OEOJF<5<;?AOEL@6>255KICFJ838?3MCIHD28>99GMGBN41437IGMDH>::d=CAYKOE]2?>b9GMUGCAY6:6=0n;EKSEAOW484j7IG_BEKS858d3MC[NIG_<083:d=CAYHOE]2>>99GKDBH49427IANDN>24;?<LFKOC1?>>89GKDBH488556J@AEM?568>3MEJHB2>4?`8@JGCG5;>6=06;EMB@J:6=720HBOKO=3=<>BHIME7>364DNCGK95902NDMIA34?:8@JGCG5?546J@AEM?2;><LFKOC1918:FLEAI;0720HBOKO=;=3>BHIVXNK55KOCFL858>3MEIHB2>0?;8@JDCG5;:245KOCFL844912NDNIA312<:?AIELF6:83l4DN@GK97229427IAMDN>21;><LFHOC1?18:FLFAI;:720HBLKO=1=<>BHJME78364DN@GK93902NDNIA36?:8@JDCG5=546J@BEM?<;><LFHOC1717:FLFZTBOh1OC]OKOQ>3:f=CGYKOC]2>:1<b?AIWIME[0<0n;EMSFAIW494h7IA_BEMS84<76h1OC]LKOQ>2:2=BFHXOIC94EO@TV@H23OKG_H?4G29DJA><AGC_\R>?8:KMMQVX8820ECG[P^21<>OIA]ZT<>64IOKWTZ6302CEEY^P04:8MKOSXV:=46GAIUR\421<AGC_S=>8;HLJPZ66?2CEEYQ?269JJLRX8:=0ECG[_164?LHN\V:>;6GAIU]322=NF@^T<:94IOKW[5>03@DBXR>67:KMMQY7I>1BBDZP0C58MKOSW9I<7D@FT^2G3>OIA]U;I:5FNHV\4C1<AGC_S<>8;HLJPZ76?2CEEYQ>269JJLRX9:=0ECG[_064?LHN\V;>;6GAIU]222=NF@^T=:94IOKW[4>03@DBXR?67:KMMQY6I>1BBDZP1C58MKOSW8I<7D@FT^3G3>OIA]U:I:5FNHV\5C1<AGC_S?>8;HLJPZ46?2CEEYQ=269JJLRX::=0ECG[_364?LHN\V8>;6GAIU]122=NF@^T>:94IOKW[7>03@DBXR<67:KMMQY5I>1BBDZP2C58MKOSW;I<7D@FT^0G3>OIA]U9I:5FNHV\6C1<AGC_S>>8;HLJPZ56?2CEEYQ<269JJLRX;:=0ECG[_264?LHN\V9>;6GAIU]022=NF@^T?:94IOKW[6>03@DBXR=67:KMMQY4I>1BBDZP3C58MKOSW:I<7D@FT^1G3>OIA]U8I:5FNHV\7C0<AGC_SL84IOKW[G?<AGC_SKGCE79OKDBBL?1GCNEJD69OKBODIEi0Ald`rWgqwliik2Gbbb|Yesqjkk4<F980B<94NDVTKWM33GEEI55@.95{`ZJ63Y>0\L\[a:RJJZDR[@NSn6^FN^@VWKGJM?1[_IAAE99QEHD60L;37_OB_LMGA4?<ZMKOH_QLOMNJWLIIWA]HCCHFGb9QADBX_@N_DROl;SGB@ZQNL]BTN85]EFAFf>TBOJOJ^HILE79QABEBJm1YIJMCK@PGVFJL?2XNKNBDBe9QWQTFEHXXX_OB7:PPPWGJJm1Y_Y\JG@PPPWC@?2XXX_KHB038VVRUMNU[^DA]IU[\E47<ZZ^YIJQ_RHMQMQ_XJ11XM[KKAUC25>UOZLMTIUZ]ABV\JBEb3ZBYIJQBIO]PM_C6;2YBARM@LMKPMJHXKAOHGl5\IL]GASODM11XGD^PPHL5?VIRZJO<7^\YAM]B3>UU^HFTN;5\T@VVW6=SLY>0XT^J709V4*~t|VhggRcjm^efj`tf|fx$kco{iwgaib(ii}c}iRlck^ofiZabf&|j`dj!crvq+wgjdfe{W=S!r`o-v*p1W`dbx#|nm.QS*ROCMVZYE@?7.scng>STM[U]E^GMLD18RFE>3_CN[RZVPD58RLTSMQ<=7ZKN<1<5?RCF484=7ZKN<3<;?RCF4:0;2;5XE@>0:==PMK]N0=07;VGAS@:6611\IOYJ<3<;?RCE_L68255XECUF818?3^OI[H2:>99TAGQB4?4j7ZKMWD>4>58?3^OI[H28>c9TVLRBWOCY_Ym4WSKWAZKHLLUJo6Y]IUG\IJBBWKn0[_G[E^UJ@QNXIm1\^DZJ_VKGPMYE9m1SEAGAX,ZGF%6)9)Y_YO.?.0"BWFON>2RXXAGM7:ZPPZAIL>1S_YQYCB`8\ZEHZLUBBKA9;Yfa[Lba3QncS]|fmWgqwlii991Sh`QBakmqR`ttafd:<6Vkm^OjjjtQm{ybcc=4Xrv0?\ct02koho30?:8eabui5;546okdsc?6;g<imnym1=50?:8eabui595=55mlj]nahY`mgUlick}ib]`wqt6>2hggRcjm^efjZvuadU|eizg219ahnYjmdUlicQrho\swgwxlxTz;Qfnhve?gjlWdofSjka_ums55=edbUfi`Qheo]u2Z55k2hggRcjm^efjZp1W:&+Tdbfny"@KWC'Oldn~lz`r!30*1733kf`S`kb_fgm[s0X;Vrxx<=4bmi\i`kXagz~xRlcobi20>dkcVgnaRaztqww[gjhkb;=7njle60355Ynf`~TahcPeyv7ba=dljo<>=??_hljpZkbeVosx!lck^ofiZabfV|=S>"tc^cg`wgX`nd0:#c^cg`wdX`nd0:#c^cocjtn|ag6=!mPayk\maYpam~c19"l_`zj[vjf~lUu}k20-a\e}oX|pzn1<"l_c{waZunrl72 nQlololjZekc4:'oRjjf`wopZbf|h7; nQkircah`Ypi{dTnexPcnno95*dWmcxmobj_vcqjZdo~Vxjbjk20-a\aigeg{keb`Pdhp>@?)KZ&Rb`d`w_qpln`es{&GG:=;PSxqwahYaej;><Rzjsu`fjfn6:VosxRmcobi\FUKXIMITHIMPDLC,muehzlUoe!{mq-\gb)+kVoemobj_20amqYflmxn~3?,b]eehokq4|b~ykw6-a\lduXiqcTei3?,b]kevYbfh7; nQgar]fjg;7$jUcm~Qfnkg`p`tu59&hSeo|_lgn[jssx|~T~hi|_`?3(fYoizUfi`Q`uurvpZtbozUi1="l_icp[hsWf|xzPrdep[d;7$jUcm~Qbuy]lqqvr|Vxnk~Qm=1.`[mgtW{oloho20-a\lduXzlmhio3?,b]kevYu{}k6<!mPh`q\vvre59&hSeo|_rmep`edW`d{yyQ}efq\e86+kVbjR}`fug`gZir|ySkhs^`>4)eXagcSkgce^lbi`;dljo<>=??_hljpZkbeVosx#cff-a\mkosiV|j`0>#c^kmmqdX~hf6<!mPiovfvcgdmV~r|h3?,b]okdbXagcSkgce<3/gZkbeV~r|h3<,b]nq}YwayogeckPsucdav;7$jU{~dcPtxrf94*dW{ojhRjjpuj\e871$jUyiljPddrwlZd:9?&hSknd^uj`qnXi499 nQ}e`f\slbs`Vh6??"l_sqw[utng{cuRo2CD.`[wusWyxbcg{y^`>G@*dW{ySywe<QZJF*dW{y~lcPa<2/gZtt|{kfSo3?,b]pmhYdgefbdaa_bjfgn;FDE&hSx}j_c{waZqbi4:'oR{|e^`zp`Ypmk7; nQzsd]gacgrd}Uomyo20-a\qvcXmji6<!mPurg\wj`smji6<!mPwdc\slbs`4;'oRyjb^uj`qn:9%iT{g{e^fftqnXi4;= nQxrhvf[acw|aUi1<8#c^uqmqcXefnnSl3XRHVF[COU[]&hSz|ftd]nkacXj4]YEYKPFHPPP)eX{ciRyfduj\e855$jU|~dzj_vkgpmYe5:8'oRvkewk`acgjaes6zd|{ey4~6d=dljo<>=??_hljpZkbeVosx!lck^ofiZabfV|=S>"t}59`hng?3me~xl2?>89gkprf48:556j`uuc?548>3me~xl2>2?;8`jssi5;8245kotvb842912ndyyo314<:?air|h6::374dnwwe970601ocxzn<0:==>bh}}k7=407;emvpd:6601ocxzn<32==>bh}}k7><06;emvpd:5:730hb{{a=00:<=cg|~j0?:19:flqqg;:<427iazt`>12;?<lfm1<8>89gkprf4;2556j`uuc?6<8?3me~xl2=>89gkprf4::5n6j`uuc?74<7601ocxzn<23=<>bh}}k7?364dnwwe92902ndyyo35?:8`jssi5<546j`uuc?3;><lfm1618:flqqg;1720bjmmuhngyEFw9990LMv>528E>1<6sZ?86<:<:023>4548==m6?=:5cym517=92d:8?49;%30b?74i2wX9<4>428245<6;::?;k4=3441?V`028=36=4>32273c<5;<<>7^;>:05;>5<6;::?;k4=3444?a72;3:1=7?tS419515=99:1=>=?46d9663192|_=<m50;395?40sZ?86<:<:023>4548==m6?=:609'573=n01]=9>52zwee?7<}oh1<6s+110951=e9<91<7<::2813~N6::1/=??51418^6e=:r;86<?5}%30a?73n2.8h7?:5:&66?72<2.:=54>;%323?73<2c:844?:%330?7302d:<>4?;:k202<72-;;87?;8:l246<632c:8;4?:%330?7302d:<>4=;:k200<72-;;87?;8:l246<432c:9;4?::m235<72-;;87?9f:l246<732e::h4?:%330?71n2d:<>4>;:m22f<72-;;87?9f:l246<532e::o4?:%330?71n2d:<>4<;:m22d<72-;;87?9f:l246<332e::44?:%330?71n2d:<>4:;:m22=<72-;;87?9f:l246<132e:::4?:%330?71n2d:<>48;:m223<72-;;87?9f:l246<?32e::84?:%330?71n2d:<>46;:m221<72-;;87?9f:l246<f32e::>4?:%330?71n2d:<>4m;:m224<72-;;87?9f:l246<d32e::=4?:%330?71n2d:<>4k;:m21c<72-;;87?9f:l246<b32e:9h4?:%330?71n2d:<>4i;:m21a<72-;;87?9f:l246<6821d=8m50;&241<6>o1e===51098k43e290/==:517d8j46428807b?:a;29 46328<m7c??3;30?>i6=00;6)??4;35b>h68:0:865`14:94?"68=0::k5a111950=<g8=<6=4+116953`<f8:86<84;n342?6=,8:?6<8i;o337?7032e:;84?:%330?71n2d:<>4>8:9l522=83.:<94>6g9m555=9010c<9<:18'552=9?l0b<><:0c8?j70:3:1(<>;:04e?k77;3;i76a>7083>!77<3;=j6`>0282g>=h9?n1<7*>05822c=i9991=i54o041>5<#99>1=;h4n020>4c<3f;>;7>5$027>40a3g;;?7?i;:`27a<7280;6=u+1339572<@89i7E?=3:m244<722wi=>m50;394?6|,88:6ll4H01a?M75;2ejm7>5;|`267<721:1<7>t$002>4613A;8n6F>229Y7f<bsk0h6849:e8f>c<683=14775a;35>44=ug2n6=5aa183?!gd2:1/mi4<;%cf>6=#io087)l?:29'f4<43-h96>5+b280?!d328?0(o;54:&a2?5<,k=1?6*m8;18 g?=;2.im7=4$c`97>"ek390(oj53:&aa?5<,kl1?6*l0;18 f7=;2.h>7=4$b197>"d<390(n;53:&`2?5<,j=1?6*l8;18 f?=;2.hm7=4$b`97>"dk390(nj53:&`a?5<,jl1?6*k0;18 a7=;2.o>7=4$e197>"c<390(i;53:&g2?5<,m=1?6*k8;18 a?=;2.om7=4$e`97>"ck390(ij53:&ga?5<,ml1?6*j0;18 `7=;2.n>7=4$d197>"b<390(h;53:&f2?5<,l=1?6*j8;18 `?=;2.nm7=4$d`97>"bk390(hj53:&fa?5<,ll1?6*i0;18 c7=;2.m>7=4$g197>"a<380(k;52:&e2?`a3-;;;7?=0:&24=<2<2d:<44>2:l24d<6:2.:=94>0c9'543=99h0(<?6:2`8 47f288=7)?>d;08 47b2;1/=>851278 450289>7c?<8;31?k7413;97)?>6;c:?l2?2900e9o50;9je2<722cj47>5;h33g?6=3`;;h7>5;h33a?6=@8;i76g>0g83>M76j21b=<>50;9j547=831b=<<50;9j545=831b=n4?:%330?7e3g;;?7>4;h3b>5<#99>1=o5a11195>=n900;6)??4;3a?k77;3807d?7:18'552=9k1e===53:9j60<72-;;87?m;o337?2<3`8?6=4+11695g=i9991965f2283>!77<3;i7c??3;48?l45290/==:51c9m555=?21b><4?:%330?7e3g;;?764;h03>5<#99>1=o5a1119=>=n9o0;6)??4;3a?k77;3k07d?j:18'552=9k1e===5b:9j5a<72-;;87?m;o337?e<3`;<6=4+11695g=i9991h65f2983>!77<38<7c??3;28L47e32c9:7>5$027>71<f8:86<5G10`8?l4e290/==:52`9m555=82B:=o54i3;94?"68=09m6`>0282?M76j21b?<4?:%330?573g;;?7>4;h0e>5<#99>1?=5a11195>=n:l0;6)??4;13?k77;3807d<k:18'552=;91e===53:9j7d<72-;;87=?;o337?2<3`926=4+116975=i9991965f3983>!77<39;7c??3;48?l50290/==:5319m555=?21b?;4?:%330?573g;;?764;h16>5<#99>1?=5a1119=>=n;=0;6)??4;13?k77;3k07d=<:18'552=;91e===5b:9j77<72-;;87=?;o337?e<3`8h6=4+116975=i9991h65f5b83>!77<3?i7c??3;28?l3f290/==:55c9m555=921b944?:%330?3e3g;;?7<4;h7;>5<#99>19o5a11197>=n=>0;6)??4;7a?k77;3>07d;9:18'552==k1e===55:9j20<72-;;87;m;o337?0<3`<?6=4+11691g=i9991;65f6283>!77<3?i7c??3;:8?l05290/==:55c9m555=121b:<4?:%330?3e3g;;?7o4;h43>5<#99>19o5a1119f>=n=o0;6)??4;7a?k77;3i07d;j:18'552==k1e===5d:9j1a<72-;;87;m;o337?c<3`?>6=4+11691g=i9991j65f6e83>!77<3<h7c??3;28?l0e290/==:56b9m555=921b:l4?:%330?0d3g;;?7<4;h4:>5<#99>1:n5a11197>=n>10;6)??4;4`?k77;3>07d88:18'552=>j1e===55:9j33<72-;;878l;o337?0<3`=>6=4+11692f=i9991;65f7583>!77<3<h7c??3;:8?l14290/==:56b9m555=121b;?4?:%330?0d3g;;?7o4;h52>5<#99>1:n5a1119f>=n?90;6)??4;4`?k77;3i07d8i:18'552=>j1e===5d:9j2`<72-;;878l;o337?c<3`<=6=4+11692f=i9991j65f7883>!77<3=37c??3;28?l10290/==:5799m555=921b;n4?:%330?1e3g;;?7>4;h5b>5<#99>1;o5a11195>=h0=0;6)??4;:0?k77;3:07b6=:18'552=0:1e===51:9l<4<72-;;876<;o337?4<3f2;6=4+1169<6=i9991?65`7g83>!77<3287c??3;68?j1b290/==:5829m555==21d4i4?:%330?>43g;;?784;n:`>5<#99>14>5a11193>=h0k0;6)??4;:0?k77;3207b6n:18'552=0:1e===59:9l<<<72-;;876<;o337?g<3f236=4+1169<6=i9991n65`8683>!77<3287c??3;a8?j>1290/==:5829m555=l21d484?:%330?>43g;;?7k4;n5g>5<#99>14>5a1119b>=h1?0;6)??4;;6?k77;3:07b7;:18'552=1<1e===51:9l=6<72-;;877:;o337?4<3f396=4+1169=0=i9991?65`9083>!77<33>7c??3;68?j?7290/==:5949m555==21d5k4?:%330??23g;;?784;n;f>5<#99>1585a11193>=h1m0;6)??4;;6?k77;3207b7l:18'552=1<1e===59:9l=g<72-;;877:;o337?g<3f3j6=4+1169=0=i9991n65`9883>!77<33>7c??3;a8?j??290/==:5949m555=l21d5:4?:%330??23g;;?7k4;n:e>5<#99>1585a1119b>=hi:0;6)??4;c1?k77;3:07bo>:18'552=i;1e===51:9le3<72-;;87o:;o337?6<3fk?6=4+1169e0=i9991=65f13`94?"68=0:>l5a11194>N69k10e<<6:18'552=9;k0b<><:09K54d<3`;947>5$027>44f3g;;?7<4;h313?6=,8:?6<<n;o337?5<3`;887>5$027>4543g;;?7>4H03a?>o6;;0;6)??4;307>h68:0:7E?>b:9j567=83.:<94>329m555=:2B:=o54i013>5<#99>1=>=4n020>6=O98h07d?=f;29 46328987c??3;68?l75m3:1(<>;:010?k77;3?07d?=d;29 46328987c??3;48?l75k3:1(<>;:010?k77;3=07p}ic;290~;6;m0:<<52130970=:9;81m:521309e==z{on1<7:;{<30g?gf34;9>7?l;<316?7f34;9>7?6;<316?7?34;9>7<:;<316?4734;9>7?i;<316?7b34;9>7?k;<316?7034;9>7=>;<316?4a34;9>7<j;<316?4c34;9>7=n;<316?5334;9>7=<;<316?5534;9>7<l;<316?3d34;9>7;n;<316?3>34;9>7;7;<316?3034;9>7;9;<316?0234;9>78;;<316?0434;9>78=;<316?0634;9>78?;<316?3a34;9>7;j;<316?3c34;9>7;:;<316?0c34;9>78m;<316?0f34;9>786;<316?0?34;9>788;<316?1134;9>79:;<316?1334;9>79<;<316?1534;9>79>;<316?1734;9>78i;<316?0b34;9>789;<316?1>34;9>798;<316?1d34;9>79n;<316?75027:>?4>269>574=9;l01<<=:00f?875:3;9h63>23826f=:9;81==m4=001>46c34;9>7?>0:?267<69816=?<51008944528;87p}>5683>7}Y9<=01<<=:6f8yv71:3:1>vP>639>574=0<1v<8k:181[71l27:>?476:p527=838pR<9>;<316?>03ty:;?4?:3y]524<58896564}r347?6=:rT:;>521309<<=z{8=?6=4={_340>;6:;03m6s|16794?4|V8=>70?=2;:a?xu6??0;6?uQ1648944521i0q~?87;296~X6?>16=?<58e9~w43?2909wS?:8:?267<0m2wx=8750;0xZ43>34;9>79i;|q21d<72;qU=8o4=001>=6<uz;>n7>52z\21g=:9;814<5rs07`>5<5sW;>o63>238;6>{t9<n1<7<t^07g?875:32?7p}>5d83>7}Y9<o01<<=:9d8yv72n3:1>vP>5g9>574=1>1v<8?:181[71827:>?468:p537=838pR<8>;<316??>3ty::>4?:3y]535<588964o4}r350?6=:rT::9521309=g=z{8<>6=4={_351>;6:;02o6s|17494?4|V8<=70?=2;;g?xu6>>0;6?uQ1758944520o0q~?98;296~X6>116=?<59g9~w40>2909wS?99:?267<>82wx=;o50;0xZ40f34;9>77>;|q22g<72;qU=;l4=001><4<uz;=o7>52z\22f=:9;815>5rs04f>5<5sW;=i63>238:0>{t9>:1<7<t^053?875:33=7p}>5783>6}Y9<<01<<=:5:894452=k0q~?;5;297~X6<<16=?<5209>574=;?1v<:9:180[73>27:>?4=2:?267<4?2wx=9950;1xZ42034;9>7<<;<316?5?3ty:844?:2y]51?<58896?:4=001>6?<utdi97>51zJ266=zfk<1<7?tH000?xhe?3:1=vF>229~jg>=83;pD<<<;|la=?6=9rB:>>5rncc94?7|@8887p`mb;295~N6::1vbom50;3xL4443tdih7>51zJ266=zfko1<7?tH000?xhen3:1=vF>229~jf6=83;pD<<<;|l`5?6=9rB:>>5rnb094?7|@8887p`l3;295~N6::1vbn:50;3xL4443tdh97>51zJ266=zfj<1<7?tH000?xhd?3:1=vF>229~jf>=83;pD<<<;|l`=?6=9rB:>>5rnbc94?7|@8887p`lb;295~N6::1vbnm50;3xL4443tdhh7>51zJ266=zfjo1<7?tH000?xhdn3:1=vF>229~ja6=83;pD<<<;|lg5?6=9rB:>>5rne094?7|@8887p`k3;295~N6::1vbi:50;3xL4443tdo97>51zJ266=zfm<1<7?tH000?xhc?3:1=vF>229~ja>=83;pD<<<;|lg=?6=9rB:>>5rnec94?7|@8887p`kb;295~N6::1vqpsO@By246<2<=ioi8sO@Cy3yEFWstJK
\ No newline at end of file
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$30e40<,[o}e~g`n;"2*731&=$:,)<4-07845678=:0<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;8=5?0123456789:;<=>?0123456789::4=M?012305D7=OI9;=O98173GF?109:;<46<;0,35d=6<3CE\XZ5AEFQEWBFLMX7=>4?>0c851<NFY__6LJKRCUQEABU4891<3?;;049MKVR\3NBMIG31483:42<9?0BB][[:EKA@L:6=3:5=85>6;MVPUSS2MEJHB2>5;2=50=6>3E^X][[:EMA@J:6=3:5==5>:HLSQQ<pmh6;6=0>0:39MKVR\3}nn1>50?3:?7<NFY__6LJKR@VJAMO@@5;1<3?6;38JJUSS2HNO^OZFEIKDL97=87;?7?4FNQWW>AOWIMC[0<4?>0686?OIX\^1HD^MDHR?5?699<196B[[PTV9@JVFLFZ7=7>11491>JSSX\^1HB^MDNR?5?699:18>7GAPTV9`lhf4:;1<3?<;209MKVR\3nbbo2<1;2=50=4:3E^X][[:emvpd:493:5=85<2;MVPUSS2me~xo2<1;2=55=32@D[YY4XE@>0>586:2>1EC^ZT;cg`wg;;3:5=?5;:HLSQQ<flmxi0>4?>0580?IR\Y__6jndepfgf:4294:<68yly074q`a98?=!<:?;91;4566??2;<=>?67:34567=L33<=>?47:34567;19;8=>?27:345659?28O==:0008<?OIX\^1[HLXE=594;c<IMNYM_JNDEP?4;`<IMNYM_JNDEP?558a3HNO^L\KAEFQ8479n2KOH_O]D@FGV97568;0MIJ]ASFB@AT;9:0;2k5NDEPBVAGCL[6:?3k4AEFQEWBFLMX7=3k4AEFQEWBFLMX7>3k4AEFQEWBFLMX7?3k4AEFQEWBFLMX783k4AEFQEWBFLMX793k4AEFQEWBFLMX7:3k4AEFQEWBFLMX7;3k4AEFQEWBFLMX743k4AEFQEWBFLMX753h4AEFQEQOB@@MC0=0>1:CG@WGSALBBKE2>:1<e?DBCZH^BIEGHH=3=b>GCL[H_EHFFGI>3:47<IMNYNYGJHHEK84<76o1JHI\MTHGKMBN;97o0MIJ]BVPB@AT;87l0MIJ]BVPB@AT;994m7LJKRCUQEABU48;5j6OKDS@TVDBCZ5;92<?4AEFQFRTFLMX7=>4?>g9B@ATE_[KOH_2>3?g8EABUJ^XJHI\31?g8EABUJ^XJHI\32?g8EABUJ^XJHI\33?g8EABUJ^XJHI\34?g8EABUJ^XJHI\35?g8EABUJ^XJHI\36?g8EABUJ^XJHI\37?g8EABUJ^XJHI\38?g8EABUJ^XJHI\39?18EIJ43K_946LZS^KMBJ753JBNOFQCIBGMW@YSQYO27NBDASF@HN?<KEAI[_MCK89@KHKN\]OO=95LOSG\C@HBZH^BCCQFNGM4?FTBI]OOh6JJL@[F@ZQUA]O37IGNDH>3:<=CAHNB0<>19:FJEAO;98427IGNDH>26;?<L@KOE1?<>89GMDBN48>5n6JFAEK?50<7601OELJF<07=<>BNIMC7=364DHCGM94902NBMIG33?:8@LGCA5>546JFAEK?1;><L@KOE1818:FJEAO;?720HDOKI=:=<>BNIMC75364DH@GM96912NBNIG311<:?AOEL@6:=374DH@GM975601OEOJF<01==>BNJMC7=90m;EKA@L:6=3:556JFBEK?508?3MCIHD2>>99GMGBN4;437IGMDH>0:==CAKNB0907;EKA@L:2611OEOJF<7<;?AOEL@6<255KICFJ8=8?3MCIHD26>`9GMUGCAY6;2n5KIQCGMU:6294j7IG_AEKS848f3MC[NIG_<1<`?AOWJMC[0<4?>`9GMUDCAY6:255KO@FL858>3MEJHB2>0?;8@JGCG5;:245KO@FL844912NDMIA312<:?AIFLF6:83l4DNCGK97229427IANDN>21;><LFKOC1?18:FLEAI;:720HBOKO=1=<>BHIME78364DNCGK93902NDMIA36?:8@JGCG5=546J@AEM?<;><LFKOC1717:FLEZTBO11OCOJ@<1<:?AIELF6:<374DN@GK976601OCOJ@<00==>BHJME7=>06;EMA@J:6<7h0HBLKO=36>58>3MEIHB2>5?:8@JDCG5;546J@BEM?6;><LFHOC1=18:FLFAI;<720HBLKO=7=<>BHJME7:364DN@GK91902NDNIA38?:8@JDCG535;6J@B^PFCd=CGYKOC]2?>b9GKUGCGY6:6=0n;EMSEAIW484j7IA_BEMS858d3ME[NIA_<083:d=CGYHOC]2>>69FJDTCMG=0ICLXRDL6?CGK[L;0K>5HNE:8MKOSXV:;46GAIUR\44><AGC_\R>=8:KMMQVX8:20ECG[P^27<>OIA]ZT<864IOKWTZ6102CEEY^P0658MKOSW9:<7D@FT^223>OIA]U;>:5FNHV\461<AGC_S=:8;HLJPZ62?2CEEYQ?669JJLRX8>=0ECG[_1:4?LHN\V:2;6GAIU]3E2=NF@^T<O94IOKW[5E03@DBXR>K7:KMMQY7M>1BBDZP0G58MKOSW8:<7D@FT^323>OIA]U:>:5FNHV\561<AGC_S<:8;HLJPZ72?2CEEYQ>669JJLRX9>=0ECG[_0:4?LHN\V;2;6GAIU]2E2=NF@^T=O94IOKW[4E03@DBXR?K7:KMMQY6M>1BBDZP1G58MKOSW;:<7D@FT^023>OIA]U9>:5FNHV\661<AGC_S?:8;HLJPZ42?2CEEYQ=669JJLRX:>=0ECG[_3:4?LHN\V82;6GAIU]1E2=NF@^T>O94IOKW[7E03@DBXR<K7:KMMQY5M>1BBDZP2G58MKOSW::<7D@FT^123>OIA]U8>:5FNHV\761<AGC_S>:8;HLJPZ52?2CEEYQ<669JJLRX;>=0ECG[_2:4?LHN\V92;6GAIU]0E2=NF@^T?O94IOKW[6E03@DBXR=K7:KMMQY4M>1BBDZP3G48MKOSWH<0ECG[_C;8MKOSWOCGI;5CO@FF@2=KGNCHMAm4M`hlvScu{`eeo6CfnnpUawungg80B<=4N021?K443G>8?6@;429M005<F=<87C:83:L7<6=I<090B8><;O727>H2::1E9>=4N460?K32;2D>:>5A5618J0>43G?2?6@9029M245<F?887C8<3:L506=I><90B;8<;O447>H10:1E:4<4N618J2643G=:?6@8229M365<F>>97C6=;O;e?KDXJ\Y[ECQ_RNRP3>HB\^EYG95AOOG1?JM63Y>0\L\[a:RJJZDR[@NSn6^FN^@VWKGJM11YM@L>8D3;?WGJWDEOI<74RECG@WYDGEFB_DAA_IU@KK@NOj1YILJPWHFWLZGd3[OJHRYFDUJ\F0=UMNINn6\JGBGBV@ADM?1YIJMJBe9QABEKCHXO^NBD7:PFCFJLJm1Y_Y\NM@PPPWGJ?2XXX_OBBe9QWQTBOHXXX_KH7:PPPWC@J8;0^^Z]EF]SVLIUA]STM<?4RRVQABYWZ@EYEYWPB99PESCCI]K:=6]GRDE\A]RUIJ^TBJMj;RJQABYJAGUXEWK>3:QJIZEHDECXEB@PCIG@Od=TADUOI[GLE99POLVXX@D=7^AZRBG4?VTQIEUJ;6]]V@N\F6=SLY>0XT^J4g9V4*dkcVgnaRijndpbpjt(~hfbh#m|ts-qehjhgyQ;Q#|nm/p,r3Ynf`~%~lc SQ,TMACXX[CF=5 }alc8QVCUWHFBM^m4URGQ[SOTAKFN?6XLC89UM@QX\PZN;6XFRUG[23=PMH6;2;5XE@>2:3=PMH69255XE@>0>5813^OJ0>07;VGAS@:7611\IOYJ<0<;?RCE_L69255XECUF868?3^OI[H2;>99TAGQB4<437ZKMWD>5:d=PMK]N0:4?>99TAGQB4>4i7Z\FTD]EMWUSk2]YEYKPMNFF[De<_[C_IRC@DD]A`>QUA]OT[DJ[H^Cg?RTN\LU\EIZG_C3g?]OKAGR&TIL/0/3#WQSE(9$:,L]LIH48\VRKAK=0T^ZPGOF4?]USW_IHn6VPCNPF[LHAG?1ShoQFdg9[`mYWz`g]i}foo33?]bjWDkacXjrrklj46<PmgTAd``rWgqwlii;2Sn55ndepb,5/?3hno~l&>)99b`atf ;#37ljkr`*0-==flmxj0=07;`fgvd:6611jhi|n<3<b?dbczh686=07;`fgvd:4611jhi|m(1+;?dbczk":%55ndepa,7/?3hno~o&<)`9b`ate4:0;2?m4bmi\i`kXoldTz9Q<,!Zjhlh(JEYI-Ijndpbpjt'9:$8=;5ldbg46577W`dbxRcjm^kmp67<kmin;?>>0^kmmqYjmdUbby"mlj]nahY`mgU}8R=#NNLF(KIIM=;27njle60355Ynf`~TahcPiov/fimXelgTkh`Pv5]0(~eXimnymRyfduj>0)eXimnynRyfduj>0)eXiemd~dzgm<3/gZd~|lUxewk29-a\gjkjggUh`f3?,b]gacgrd}Uomyo20-a\`lufjeoT{l|a_cju[fikd4:'oRjfs``oaZqfzgUid{Q}aoef95*dWakxSh`n=1.`[mgtWldi1="l_icp[lhmmj~n~3?,b]kevYjmdUdyy~zt^pfcvYf59&hSeo|_lgn[jssx|~T~hi|_c?3(fYoizUfyuQ`uurvpZtbozUj1="l_icp[hsWf|xzPrdep[g;7$jUcm~Q}efafe86+kVbjR|jgbga95*dWakxS}{a<2/gZnf{Vxxxo3?,b]kevYtgo~nonQfnqww[wc`{Vk6<!mPh`q\wj`smjiTcxzuu]qabuXj4:'oRgaiu]emicXfhgn1njle60355Ynf`~TahcPiov-il`+kVceeyoPv`n>4)eXagcnRxnl<2/gZjhimUbbdzPfhnf94*dWdofSywe<1/gZkrpVzb|hbfnd]ppdab{4:'oR~}il]w}uc:9%iT~hok_egspmYf58<'oR|jae]gauroWk7::!mPrdcg[roc|aUj1><#c^pfeaYpam~cSo3<2-a\vvrXx{cd~dzv_`?@A)eXzz~T|g`rhvz[g;DM%iT~~zPtxrf9V_IK%iT~~z}al]b95*dW{y~lcPb<2/gZuneVid`ag|inl\gmcdc4KG@!mPurg\f|rbW~oj1="l_tqf[gsmV}nn0>#c^wpaZbbnhgxRjnt`?3(fYr{lUnon3?,b]vw`Ytgo~non3?,b]tadYpam~c1<"l_vga[roc|a7: nQxrhvf[acw|aUj1<8#c^uqmqcXllzdRl217.`[rtn|lUfcikPa<UQMQCXN@XXX!mPwskwaZkhllUi1Z\FTD]EMWUS$jU|~dzj_vkgpmYf5:8'oRy}iug\slbs`Vh6??"lolrlj`hsWgkfi0mkcd51446XagcS`kb_hlw(x4c3jnhi:<?11]jjlrXelgTeczPbmi\i`kXoldTz9Q<_yqw[42<keaj86mckc58`gosm{x<7igaa)2*3>bnfh":%55kioc+55/?3mcem%?>)99gmkg/9;#37igaa)30-==cagk#=9'7;ekme-72!11oeco'17+;?aoii!;<%55kioc+5=/?3mcem%?6)69gmkg/: 20hd`n(32*<>bnfh"9=$64dhlb,74.02nbbl&=3(:8`lhf ;>"46jfn`*11,><l`dj$?8&8:fjjd.5? 20hd`n(3:*<>bnfh"95$94dhlb,6/?3mcem%=?)99gmkg/;8#<7igaa)6*3>bnfh">%:5kioc+2,1<l`dj$:'8;ekme->.?2nbbl&6)`9gmkg;;80;2:5kio`+4,1<l`di$<'7;ekmf-77!11oecl'10+;?aoij!;9%55kio`+56/?3mcen%?;)99gmkd/9<#37igab)35-==cagh#=:'7;ekmf-7?!11oecl'18+4?aoij!8"46jfnc*14,><l`di$??&8:fjjg.5: 20hd`m(31*<>bnfk"98$64dhla,73.02nbbo&=6(:8`lhe ;="46jfnc*1<,><l`di$?7&7:fjjg.4!11oecl'31+;?aoij!9:%:5kio`+0,1<l`di$8'8;ekmf-0.?2nbbo&8)69gmkd/0 =0hd`m(8+b?aoij59:6=07;emvpd.7!11ocxzn(0+:?air|h":<$74dnwwe-76!01ocxzn(00*=>bh}}k#=>'6;emvpd.6< 30hb{{a)36-<=cg|~j$<8&9:flqqg/9>#27iazt`*2<,?<lfm%?6)99gkprf ;#27iazt`*14,?<lfm%<>)89gkprf ;8"56j`uuc+66/>3me~xl&=4(;8`jssi!8>%45kotvb,70.12ndyyo'26+:?air|h"94$74dnwwe-4>!11ocxzn(2+:?air|h"8<$74dnwwe-56!11ocxzn(5+;?air|h">%55kotvb,3/?3me~xl&8)99gkprf 1#37iazt`*:-==cg|~j0=06;emvpd:68730hb{{a=32:<=cg|~j0<<19:flqqg;9:427iazt`>20;?<lfm1?:>89gkprf48<556j`uuc?528>3me~xl2>8?;8`jssi5;2255kotvb848>3me~xl2=0?;8`jssi58:245kotvb874912ndyyo322<:?air|h698374dnwwe942601ocxzn<34==>bh}}k7>:06;emvpd:50730hb{{a=0::==cg|~j0?06;emvpd:487h0hb{{a=12>58>3me~xl2<1?:8`jssi59546j`uuc?0;><lfm1;18:flqqg;>720hb{{a=5=<>bh}}k74364dnwwe9?902ndyyl'0(:8`jssj!;"56j`uu`+55/>3me~xo&>1(;8`jssj!;9%45kotva,45.12ndyyl'15+:?air|k":9$74dnwwf-71!01ocxzm(05*=>bh}}h#=5'6;emvpg.61 20hb{{b)0*=>bh}}h#>='6;emvpg.59 30hb{{b)01-<=cg|~i$?=&9:flqqd/:=#27iaztc*11,?<lfn%<9)89gkpre ;="56j`uu`+6=/>3me~xo&=9(:8`jssj!9"56j`uu`+75/>3me~xo&<1(:8`jssj!>"46j`uu`+1,><lfn%8&8:flqqd/? 20hb{{b):*<>bh}}h#5$l4dnwwf95629437hjff3ld`6=bfh90iclk;hliafrcj`~n~j4iohfgquea}oy~55agb`vmibd3{njhi|jcb*3-f=ulhno~hml(0+`?wbflmxnon&=)b9q`dbczlih$>'l;sfb`atbkj6;2h5}d`fgv`ed4:0;2;5}efafe3=umninn95}suc7?wusj>1xndzjrs01?qkw'Vil#njle60355Ynf`~TahcPiov-jbi13~oj$='7;vgb85<76?1|io&?)99tag:7294vLM~>c69CD}45i3L187?tS5`964?==3;8?=<ic;12aa>|f8?h6<5a14f92>"6=h0:985rS5;964?==3;8?=<ic;12aa><[ll1><k50;30754ak39:ii64S5;964c=83;8?=<ic;12aad<l8<n6=4>:0yP0g<5900>6<=<03d`>67bl11}X<=8:182>4<5?rY?n7<>9;795657:oi1?<kk8:&205<a82\:9o4={td2>4=rn;0;7p*>1d82g>d6>l0;6?;53;06M74m2P?97<t18822?{#9:h1=;k4$07:>40c3`;=>7>5$003>4013g;:j7>4;h355?6=,88;6<89;o32b?7<3`;=<7>5$003>4013g;:j7<4;h36b?6=,88;6<89;o32b?5<3f;o<7>5$003>4ca3g;:j7>4;n3`b?6=,88;6<ki;o32b?7<3f;hh7>5$003>4ca3g;:j7<4;n3`g?6=,88;6<ki;o32b?5<3f;hn7>5$003>4ca3g;:j7:4;n3`e?6=,88;6<ki;o32b?3<3f;h57>5$003>4ca3g;:j784;n3`<?6=,88;6<ki;o32b?1<3f;h;7>5$003>4ca3g;:j764;n3`2?6=,88;6<ki;o32b??<3f;h97>5$003>4ca3g;:j7o4;n3`0?6=,88;6<ki;o32b?d<3f;h>7>5$003>4ca3g;:j7m4;n3`5?6=,88;6<ki;o32b?b<3f;h<7>5$003>4ca3g;:j7k4;n3ab?6=,88;6<ki;o32b?`<3f;ii7>5$003>4ca3g;:j7??;:m2fa<72-;9<7?jf:l25c<6921d=om50;&265<6mo1e=<h51398k4de290/=?>51dd8j47a28907b?ma;29 44728om7c?>f;37?>i6j00;6)?=0;3fb>h69o0:965`1e494?"6:90:ik5a10d953=<g8n>6=4+13295``<f8;m6<94;n3g0?6=,88;6<ki;o32b?7?32e:h>4?:%314?7bn2d:=k4>9:9l5a4=83.:>=4>eg9m54`=9h10c<j>:18'576=9ll0b<?i:0`8?j7dm3:1(<<?:0ge?k76n3;h76a>c283>!7583;nj6`>1g82`>=h9k21<7*>2182ac=i98l1=h54o0`4>5<#9;:1=hh4n03e>4`<3`;<>7>5;c30b?6=93:1<vF>3d9'56d=9:l0c<?k:188ygg4290:6=4?{I30a>"6;k0j?6an2;29?xd3<3:15l4<:35xL45b3S>>6<<t1c8`>a<613;j6<8516820?722j0:57?;:e82e?7228<1=:4>b;'56d=9>;0(98517d8 1g=9>:0(<=<:09'564=9<o0(<?6:03`?l46l3:17b<=2;29 4472;8?7c?>f;28?j4593:1(<<?:307?k76n3;07b<=0;29 4472;8?7c?>f;08?j46n3:1(<<?:307?k76n3907d<>a;29?l46j3:17d<=5;29?l45>3:17d<=b;29 4472;8h7c?>f;28?l45l3:1(<<?:30f?k76n3:07d?92;29 44728<=7c?>f;28?l7193:1(<<?:045?k76n3;07d?90;29 44728<=7c?>f;08?l72n3:1(<<?:045?k76n3907d?9b;29 44728<h7c?>f;28?l71i3:1(<<?:04`?k76n3;07d?99;29 44728<h7c?>f;08?l7103:1(<<?:04`?k76n3907d<=7;29?l4503:17b<=9;29?j7c83:1(<<?:0ge?k76n3:07b?lf;29 44728om7c?>f;38?j7dl3:1(<<?:0ge?k76n3807b?lc;29 44728om7c?>f;18?j7dj3:1(<<?:0ge?k76n3>07b?la;29 44728om7c?>f;78?j7d13:1(<<?:0ge?k76n3<07b?l8;29 44728om7c?>f;58?j7d?3:1(<<?:0ge?k76n3207b?l6;29 44728om7c?>f;;8?j7d=3:1(<<?:0ge?k76n3k07b?l4;29 44728om7c?>f;`8?j7d:3:1(<<?:0ge?k76n3i07b?l1;29 44728om7c?>f;f8?j7d83:1(<<?:0ge?k76n3o07b?mf;29 44728om7c?>f;d8?j7em3:1(<<?:0ge?k76n3;;76a>be83>!7583;nj6`>1g825>=h9ki1<7*>2182ac=i98l1=?54o0`a>5<#9;:1=hh4n03e>45<3f;im7>5$003>4ca3g;:j7?;;:m2f<<72-;9<7?jf:l25c<6=21d=i850;&265<6mo1e=<h51798k4b2290/=?>51dd8j47a28=07b?k4;29 44728om7c?>f;3;?>i6l:0;6)?=0;3fb>h69o0:565`1e094?"6:90:ik5a10d95d=<g8n:6=4+13295``<f8;m6<l4;n3`a?6=,88;6<ki;o32b?7d32e:o>4?:%314?7bn2d:=k4>d:9l5g>=83.:>=4>eg9m54`=9l10c<l8:18'576=9ll0b<?i:0d8?j4693:1(<<?:33;?k76n3:07b<>0;29 4472;;37c?>f;38?j47m3:1(<<?:33;?k76n3807b<?d;29 4472;;37c?>f;18?j47k3:1(<<?:33;?k76n3>07b<?b;29 4472;;37c?>f;78?j47i3:1(<<?:33;?k76n3<07b<?9;29 4472;;37c?>f;58?j4703:1(<<?:33;?k76n3207b<?7;29 4472;;37c?>f;;8?j47>3:1(<<?:33;?k76n3k07b<?5;29 4472;;37c?>f;`8?j47;3:1(<<?:33;?k76n3i07b<?2;29 4472;;37c?>f;f8?j4793:1(<<?:33;?k76n3o07b<?0;29 4472;;37c?>f;d8?j7an3:1(<<?:33;?k76n3;;76a>fd83>!75838:46`>1g825>=h9on1<7*>21815==i98l1=?54o0d`>5<#9;:1><64n03e>45<3f;mn7>5$003>77?3g;:j7?;;:m2bd<72-;9<7<>8:l25c<6=21d><950;&265<5911e=<h51798k771290/=?>520:8j47a28=07b<>5;29 4472;;37c?>f;3;?>i59=0;6)?=0;02<>h69o0:565`20194?"6:909=55a10d95d=<g;;96=4+132964><f8;m6<l4;n03b?6=,88;6??7;o32b?7d32e9<94?:%314?4602d:=k4>d:9l5c?=83.:>=4=199m54`=9l10c<h7:18'576=:820b<?i:0d8?l70:3:17d?83;29?l7?m3:1(<<?:0;6?k76n3:07d?7d;29 447283>7c?>f;38?l7?j3:1(<<?:0;6?k76n3807d?7a;29 447283>7c?>f;18?l7?13:1(<<?:0;6?k76n3>07d?78;29 447283>7c?>f;78?l7??3:1(<<?:0;6?k76n3<07d?76;29 447283>7c?>f;58?l7?=3:1(<<?:0;6?k76n3207d?74;29 447283>7c?>f;;8?l7?;3:1(<<?:0;6?k76n3k07d?72;29 447283>7c?>f;`8?l7?83:1(<<?:0;6?k76n3i07d?8f;29 447283>7c?>f;f8?l70m3:1(<<?:0;6?k76n3o07d?8d;29 447283>7c?>f;d8?l70k3:1(<<?:0;6?k76n3;;76g>7c83>!7583;296`>1g825>=n9>k1<7*>2182=0=i98l1=?54i05:>5<#9;:1=4;4n03e>45<3`;<47>5$003>4?23g;:j7?;;:k232<72-;9<7?65:l25c<6=21b=4:50;&265<61<1e=<h51798m4?4290/=?>51878j47a28=07d?62;29 447283>7c?>f;3;?>o6180;6)?=0;3:1>h69o0:565f18294?"6:90:585a10d95d=<a82m6=4+13295<3<f8;m6<l4;h3;g?6=,88;6<7:;o32b?7d32c:4<4?:%314?7>=2d:=k4>d:9j520=83.:>=4>949m54`=9l10e<9::18'576=90?0b<?i:0d8?l7fn3:1(<<?:0`5?k76n3:07d?ne;29 44728h=7c?>f;38?l7fk3:1(<<?:0`5?k76n3807d?nb;29 44728h=7c?>f;18?l7fi3:1(<<?:0`5?k76n3>07d?n9;29 44728h=7c?>f;78?l7f03:1(<<?:0`5?k76n3<07d?n7;29 44728h=7c?>f;58?l7f>3:1(<<?:0`5?k76n3207d?n5;29 44728h=7c?>f;;8?l7f<3:1(<<?:0`5?k76n3k07d?n3;29 44728h=7c?>f;`8?l7f93:1(<<?:0`5?k76n3i07d?n0;29 44728h=7c?>f;f8?l7>n3:1(<<?:0`5?k76n3o07d?6e;29 44728h=7c?>f;d8?l7>l3:1(<<?:0`5?k76n3;;76g>9b83>!7583;i:6`>1g825>=n90h1<7*>2182f3=i98l1=?54i0;b>5<#9;:1=o84n03e>45<3`;257>5$003>4d13g;:j7?;;:k2==<72-;9<7?m6:l25c<6=21b=o;50;&265<6j?1e=<h51798m4d3290/=?>51c48j47a28=07d?m3;29 44728h=7c?>f;3;?>o6j;0;6)?=0;3a2>h69o0:565f1c394?"6:90:n;5a10d95d=<a8h;6=4+13295g0<f8;m6<l4;h3b`?6=,88;6<l9;o32b?7d32c:m?4?:%314?7e>2d:=k4>d:9j5<1=83.:>=4>b79m54`=9l10e<79:18'576=9k<0b<?i:0d8?l46k3:17b?84;29?g72?3:1=7>50z&27g<f;2B:9;5G12g8kd4=831vn<;7:182>5<7s-;8n7?<f:J213=O9:o0c<?k:188yg74k3:14=4?:1y'56d=9;;0D<;9;I30a>\3=3opi7h56;5955<693;96<=58;;9e?d=9l0:47sa8783?k??291/m94<;%c6>6=#i?087)o8:29'e=<43-k26>5+a`80?!ge2:1/mn4>d:&b`?2<,ho1?6*nf;18 g6=;2.i=7=4$c097>"e;390(o:53:&a1?5<,k<1?6*m7;18 g>=;2.i57=4$cc97>"ej390(om53:&a`?5<,ko1?6*mf;18 f6=;2.h=7=4$b097>"d;390(n:53:&`1?5<,j<1?6*l7;18 f>=;2.h57=4$bc97>"dj390(nm53:&``?5<,jo1?6*lf;18 a6=;2.o=7=4$e097>"c;390(i:53:&g1?5<,m<1?6*k7;18 a>=;2.o57=4$ec97>"cj390(im53:&g`?5<,mo1?6*kf;18 `6=;2.n=7=4$d097>"b;390(h:53:&f1?5<,l<1?6*j7;18 `>=;2.n57=4$dc97>"bj390(hm52:&f`?4<,lo1=<l4$001>45f3-;9?7:l;o310?753g;997?=;%31b?75>2.:?=4>279'562=<:1/=>;51538 45?2;1/=>752:&214<6=91/=8<51428j4342880b<;;:008 4562h;0e9950;9j0=<722c2j7>5;hc3>5<<a88<6=44i00;>5<<a8826=4G1248?l75i3:1D<=9;:k26g<722c:>n4?::k26a<722c:>h4?::k10?6=,88;6?=4n03e>5=<a;81<7*>21817>h69o0:76g=1;29 4472;90b<?i:398m76=83.:>=4=3:l25c<432c9h7>5$003>75<f8;m6954i3a94?"6:909?6`>1g86?>o5j3:1(<<?:318j47a2?10e?o50;&265<5;2d:=k48;:k1=?6=,88;6?=4n03e>==<a;21<7*>21817>h69o0276g=7;29 4472;90b<?i:`98m70=83.:>=4=3:l25c<e32c997>5$003>75<f8;m6n54i0d94?"6:909?6`>1g8g?>o483:1(<<?:3d8j47a291C=>84;h0f>5<#9;:1>k5a10d95>N6;?10e>=50;&265<4:2d:=k4?;I302>=n;80;6)?=0;11?k76n3;0D<=9;:k0=?6=,88;6>64n03e>5=<a:=1<7*>2180<>h69o0:76g<6;29 4472:20b<?i:398m63=83.:>=4<8:l25c<432c?>7>5$003>6><f8;m6954i5394?"6:90846`>1g86?>o383:1(<<?:2:8j47a2?10e>h50;&265<402d:=k48;:k0a?6=,88;6>64n03e>==<a:n1<7*>2180<>h69o0276g<c;29 4472:20b<?i:`98m6d=83.:>=4<8:l25c<e32c8m7>5$003>6><f8;m6n54i2694?"6:90846`>1g8g?>o2<3:1(<<?:418j47a2910e8<50;&265<2;2d:=k4>;:k65?6=,88;68=4n03e>7=<a<:1<7*>21867>h69o0876g;f;29 4472<90b<?i:598m1c=83.:>=4:3:l25c<232c>h7>5$003>05<f8;m6;54i4a94?"6:90>?6`>1g84?>o2j3:1(<<?:418j47a2110e8o50;&265<2;2d:=k46;:k6=?6=,88;68=4n03e>d=<a<21<7*>21867>h69o0i76g:7;29 4472<90b<?i:b98m00=83.:>=4:3:l25c<c32c>97>5$003>05<f8;m6h54i5f94?"6:90>?6`>1g8e?>o1=3:1(<<?:768j47a2910e;=50;&265<1<2d:=k4>;:k56?6=,88;6;:4n03e>7=<a?;1<7*>21850>h69o0876g90;29 4472?>0b<?i:598m0`=83.:>=494:l25c<232c=i7>5$003>32<f8;m6;54i7f94?"6:90=86`>1g84?>o1k3:1(<<?:768j47a2110e;l50;&265<1<2d:=k46;:k5e?6=,88;6;:4n03e>d=<a?31<7*>21850>h69o0i76g98;29 4472?>0b<?i:b98m31=83.:>=494:l25c<c32c=:7>5$003>32<f8;m6h54i4g94?"6:90=86`>1g8e?>o093:1(<<?:628j47a2910e;h50;&265<082d:=k4>;:k40?6=,88;6:=4n03e>5=<a>81<7*>21847>h69o0:76a8c;29 4472>h0b<?i:198k2g=83.:>=48b:l25c<632e<57>5$003>2d<f8;m6?54o6:94?"6:90<n6`>1g80?>i0?3:1(<<?:6`8j47a2=10c:850;&265<0j2d:=k4:;:m;1?6=,88;6:l4n03e>3=<g1>1<7*>2184f>h69o0<76a73;29 4472>h0b<?i:998k=4=83.:>=48b:l25c<>32e3=7>5$003>2d<f8;m6l54o9294?"6:90<n6`>1g8a?>i0n3:1(<<?:6`8j47a2j10c:k50;&265<0j2d:=k4k;:m4`?6=,88;6:l4n03e>`=<g>?1<7*>2184f>h69o0m76a7e;29 44721n0b<?i:198k=e=83.:>=47d:l25c<632e3n7>5$003>=b<f8;m6?54o9c94?"6:903h6`>1g80?>i?13:1(<<?:9f8j47a2=10c5650;&265<?l2d:=k4:;:m:3?6=,88;65j4n03e>3=<g0<1<7*>218;`>h69o0<76a65;29 44721n0b<?i:998k<2=83.:>=47d:l25c<>32e2?7>5$003>=b<f8;m6l54o8094?"6:903h6`>1g8a?>i>93:1(<<?:9f8j47a2j10c4>50;&265<?l2d:=k4k;:m;b?6=,88;65j4n03e>`=<g1=1<7*>218;`>h69o0m76a6b;29 44720k0b<?i:198k<?=83.:>=46a:l25c<632e2i7>5$003><b<f8;m6=54o8a94?"6:902h6`>1g82?>o6<?0;6)?=0;371>h69o0;7E?<6:9j512=83.:>=4>449m54`=92B:?;54i060>5<#9;:1=9;4n03e>7=<a8>96=4+1329513<f8;m6>54i06e>5<#9;:1=9k4n03e>5=O9:<07d?;d;29 44728>n7c?>f;38L45132c:8n4?:%314?73m2d:=k4=;I302>=n9=h1<7*>21820`=i98l1?6F>3798m42f290/=?>515g8j47a2=10e<:6:18'576=9=o0b<?i:498m42?290/=?>515g8j47a2?10e<:8:18'576=9=o0b<?i:698yv71?3:1?vP>639>56e=:j16=>m5409~w4022908wS?91:?27f<5j27:?n4;0:p532=839pR<8?;<30g?4f34;8o7=i;|q226<72:qU=8h4=01`>7?<589h6>k4}r346?6=;rT:;?5212a902=:9:i1855rs0d3>5<5sW;o<63>3b8;a>{t9lo1<7<t^0ae?874k32h7p}>eb83>7}Y9jn01<=l:9`8yv7bj3:1>vP>cb9>56e=0h1v<kn:181[7dj27:?n479:p5`?=838pR<mn;<30g?>?3ty:i54?:3y]5f?<589h6494}r3f3?6=:rT:o55212a9=3=z{8o=6=4={_3`3>;6;j0296s|1d794?4|V8i=70?<c;;7?xu6m=0;6?uQ1b78945d2090q~?j3;296~X6k=16=>m5939~w4c62909wS?l2:?27f<>92wx=h>50;0xZ4e634;8o77?;|q2`c<72;qU=n>4=01`>=`<uz;oi7>52z\2fc=:9:i14:5rs0fg>5<5sW;ii63>3b84g>{t9mi1<7<t^0`g?874k3=j7p}>dc83>7}Y9ki01<=l:6;8yv7ci3:1>vP>bc9>56e=?11v<j6:181[7ei27:?n487:p5a>=838pR<l6;<30g?113ty:j:4?:3y]5a0<589h65;4}r3e2?6=:rT:h85212a9<1=z{8l>6=4={_3g0>;6;j03?6s|1g694?4|V8n870?<c;:1?xu6n:0;6?uQ1e08945d21;0q~?i2;296~X6l816=>m5819~w4`62909wS?le:?27f<0n2wx=hj50;0xZ4e434;8o79j;|q2a7<72;qU=o64=01`>2b<uz;o;7>52z\2f2=:9:i1;85rs300>5<10rT9=<5Q2028Z76b3W8;h6P=0b9]65d<V;:j7S<?9:\14==Y:9=0R?>9;_031>X58:1U>=<4^322?[4782T:jk5Q1gg8Z4`c3W;mo6P>fc9]5cg<V;;<7S<>6:\150=Y:8>0R??<;_026>X58o1U>=:4^0d:?[7a02T9>?5Q2338Z7473W8:j63>568b6>;6;j0:>:5212a957><589h6<<m;<30g?75k27:?n4>2e9>56e=9;o01<=l:368945d2;801<=l:338945d2;:01<=l:3f8945d2;201<=l:358945d2;<01<=l:378945d28l01<=l:2;8945d2:=01<=l:248945d2:?01<=l:508945d2:i01<=l:2`8945d2:k01<=l:268945d2<>01<=l:408945d2<;01<=l:428945d2=l01<=l:5g8945d2<n01<=l:4a8945d2<h01<=l:4c8945d2<301<=l:4:8945d2<=01<=l:448945d2<?01<=l:5f8945d2??01<=l:718945d2?801<=l:738945d2?:01<=l:4d8945d2?o01<=l:7f8945d2?i01<=l:7`8945d2?k01<=l:7;8945d2?201<=l:758945d2?<01<=l:4g8945d2>;01<=l:7d8945d2>>01<=l:608945d28>870?<c;376>;6;j0:8l5212a951?<589h6<:7;<30g?73?2wxj>4?:5y>50>=98n01<=l:8d8945d2h:01<=l:2f8yxu6?;0;6?uQ1608912=9>80(<=k:g78yv71?3:1>vP>639>01<6>;1/=>j51038yv71=3:1>vP>609>01<6>81/=>j51058yv71<3:1>vP>619>01<6>91/=>j510:8yv71;3:1>vP>5g9>01<6=o1/=>j5f59~w4`72909wS?k0:?70?7c82.:?i4i6:p5`c=838pR<mi;<67>4ea3-;8h7h8;|q2af<72;qU=nj4=5695fb<,89o6k64}r3ff?6=:rT:on524582gf=#9:n1j45rs0gb>5<5sW;hn63;4;3`f>"6;m0mm6s|1d;94?4|V8ij70:;:0ab?!74l3li7p}>e983>7}Y9j3019:51b;8 45c2oi0q~?j7;296~X6k116894>c99'56b=nm1v<k9:181[7d?27?87?l7:&27a<am2wx=h;50;0xZ4e134>?6<m9;%30`?`a3ty:i94?:3y]5f3<5=>1=n;4$01g>4673ty:i>4?:3y]5f2<5=>1=n:4$01g>4663ty:i<4?:3y]5f4<5=>1=n<4$01g>4653ty:i=4?:3y]5f7<5=>1=n?4$01g>4643ty:hk4?:3y]5f6<5=>1=n>4$01g>4633ty:hh4?:3y]5g`<5=>1=oh4$01g>4623ty:hi4?:3y]5gc<5=>1=ok4$01g>4613ty:hn4?:3y]5gb<5=>1=oj4$01g>4603ty:ho4?:3y]5ge<5=>1=om4$01g>46?3ty:hl4?:3y]5gd<5=>1=ol4$01g>46>3ty:h44?:3y]5gg<5=>1=oo4$01g>46f3ty:h54?:3y]5g?<5=>1=o74$01g>46e3ty:j:4?:3y]5a0<5=>1=i84$01g>46d3ty:j;4?:3y]5a3<5=>1=i;4$01g>46c3ty:j84?:3y]5a2<5=>1=i:4$01g>46b3ty:j94?:3y]5a5<5=>1=i=4$01g>46a3ty:j>4?:3y]5a4<5=>1=i<4$01g>4773ty:j?4?:3y]5a7<5=>1=i?4$01g>4753ty:j<4?:3y]5fc<5=>1=nk4$01g>4743ty:ii4?:3y]5f5<5=>1=n=4$01g>4733ty:i?4?:3y]5g><5=>1=o64$01g>4723ty:h:4?:3y]5g1<5=>1=o94$01g>4713twe=:l50;0xL45b3td:;n4?:3yK56c<ug;<h7>52zJ27`=zf8=n6=4={I30a>{i9>l1<7<tH01f?xh6090;6?uG12g8yk7?93:1>vF>3d9~j4>52909wE?<e:m5=5=838pD<=j;|l2<1<72;qC=>k4}o3;1?6=:rB:?h5rn0:5>5<5sA;8i6sa19594?4|@89n7p`>8983>7}O9:o0qc?79;296~N6;l1vb<6n:181M74m2we=5l50;0xL45b3td:4n4?:3yK56c<ug;3h7>52zJ27`=zf82n6=4={I30a>{i91l1<7<tH01f?xh6190;6?uG12g8yk7>93:1>vF>3d9~j4?52909wE?<e:m5<5=838pD<=j;|l2=1<72;qC=>k4}o3:1?6=:rB:?h5rn0;5>5<5sA;8i6sa18594?4|@89n7p`>9983>7}O9:o0qc?69;296~N6;l1vb<7n:181M74m2we=4l50;0xL45b3td:5n4?:3yK56c<ug;2h7>52zJ27`=zf83n6=4={I30a>{i90l1<7<tH01f?xh6?00;6<uG12g8yk70i3:1=vF>3d9~yx{GHJq:o:48917371czHIHp<pNOPzCD
\ No newline at end of file
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$0f540<,[o}e~g`n;"2*731&=$:,)<4-07845678=:0<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;8=5?0153456789<;<=>?0173456789>;J=H?01135567898;<=>?0133757789:;;=>;0:234C628<:;<H>N0@234A628<:;<N>N0@234G628<:;<L>N0@234<628<:;<5>?0163?577?9:;8=??61234577=9:;<=??41234577;9I;>=??21236577998;8=??01C3E16<88:M<8>=002F476388:O<=>?002@456788:I<=>?002B456788:2<=>?002;4=64;2;%<<o4158JJUSS2HNO^L\KAEFQ845=87;j7<:5IORVP?GCL[H\^LJKR=30>586<2;=6D@_UU8GMDBN48?1<3?;;049MKVR\3NBNIG31483:45<9?0BB][[:ekme972294:?6?9:HLSQQ<cagh7=84?>07853<H]]Z^X7J@AEM?50<768?0=;4@UURVP?BHJME7=84?>07853<H]]Z^X7j`uuc?50<768?0=;4@UURVP?bh}}h7=84?>0285?OIX\^1{ho30;2=55=62@D[YY4xec>3>5861281EC^ZT;CG@WGSALBBKE2>:1<2=>4=AGZ^X7OKDS@WM@NNOA6:6=0>4:09MKVR\3NB\LJFP=394;733;0BB][[:EKSFAOW480;2<;42;MVPUSS2ME[MIA_<083:43<:3E^X][[:EMSFAIW480;2<>44;KMTPR=_LK7?7>11396>LHW]]0jhi|n<583:44<=3CE\XZ5aefqf92=87;<784@UURVP?tcimnyinm34;2=55=1~er98=zif0362(76:221EC^ZT;UFFRC;?3:5i6OKDSCQ@DBCZ5:5j6OKDSCQ@DBCZ5;;2k5NDEPBVAGCL[6:=3h4AEFQEWBFLMX7=?0>1:CG@WGULHNO^1?<:1<e?DBCZHXOMIJ]<01=a>GCL[KYHLJKR=3=a>GCL[KYHLJKR=0=a>GCL[KYHLJKR=1=a>GCL[KYHLJKR=6=a>GCL[KYHLJKR=7=a>GCL[KYHLJKR=4=a>GCL[KYHLJKR=5=a>GCL[KYHLJKR=:=a>GCL[KYHLJKR=;=b>GCL[K_EHFFGI>3:47<IMNYMYGJHHEK84<76o1JHI\NTHGKMBN;97l0MIJ]BUKFLLAO494:=6OKDS@WM@NNOA6:6=0i;@FGVGRNMACLD1?1e:CG@WDPZHNO^1>1f:CG@WDPZHNO^1??>g9B@ATE_[KOH_2>1?d8EABUJ^XJHI\313<25>GCL[H\^LJKR=30>58a3HNO^OY]AEFQ8459m2KOH_LXR@FGV979m2KOH_LXR@FGV949m2KOH_LXR@FGV959m2KOH_LXR@FGV929m2KOH_LXR@FGV939m2KOH_LXR@FGV909m2KOH_LXR@FGV919m2KOH_LXR@FGV9>9m2KOH_LXR@FGV9?9;2KG@>5MU3:8FPUXAGLD=?5LHDAH[IODMGYNSYW_E89@HNGULJF@56MCKCUQGIM>3JEFADZ[EE37?FIUMVMNBH\NTHMM[LHAG>1H^HO[EEf8@@JFQLNT[_G[E99GMDBN49427IGNDH>24;?<L@KOE1?>>89GMDBN488556JFAEK?568>3MCJHD2>4?`8@LGCA5;>6=06;EKB@L:6=720HDOKI=3=<>BNIMC7>364DHCGM95902NBMIG34?:8@LGCA5?546JFAEK?2;><L@KOE1918:FJEAO;0720HDOKI=;=<>BNJMC7<374DH@GM977601OEOJF<03==>BNJMC7=?06;EKA@L:6;730HDLKI=37:g=CAKNB0<;50?;8@LDCA5;>255KICFJ848?3MCIHD2=>99GMGBN4:437IGMDH>7:==CAKNB0807;EKA@L:1611OEOJF<6<;?AOEL@63255KICFJ8<8f3MC[MIG_<1<`?AOWIMC[0<4?>`9GMUGCAY6:2l5KIQ@GMU:76j1OE]LKIQ>2>58f3MC[NIG_<0<;?AIFLF6;245KO@FL846912NDMIA310<:?AIFLF6:>374DNCGK974601OCLJ@<06=f>BHIME7=84?>89GKDBH48?546J@AEM?5;><LFKOC1<18:FLEAI;;720HBOKO=6=<>BHIME79364DNCGK90902NDMIA37?:8@JGCG52546J@AEM?=;1<LFKT^HI7;EMA@J:7601OCOJ@<02==>BHJME7=<06;EMA@J:6:730HBLKO=30:<=CGKND0<:1b:FLFAI;9<0;245KOCFL843902NDNIA31?:8@JDCG58546J@BEM?7;><LFHOC1:18:FLFAI;=720HBLKO=4=<>BHJME7;364DN@GK9>902NDNIA39?58@JDXZLMj7IA_AEMS858d3ME[MIA_<083:d=CGYKOC]2>>`9GKUDCGY6;2n5KOQ@GKU:6294j7IA_BEMS84803LDJ^IKA7:GMFRTBF<1MMA]J1:E0?BHC02CEEY^P01:8MKOSXV::46GAIUR\47><AGC_\R><8:KMMQVX8=20ECG[P^26<>OIA]ZT<;64IOKWTZ60?2CEEYQ?069JJLRX88=0ECG[_104?LHN\V:8;6GAIU]302=NF@^T<894IOKW[5003@DBXR>87:KMMQY70>1BBDZP0858MKOSW9K<7D@FT^2A3>OIA]U;O:5FNHV\4A1<AGC_S=K8;HLJPZ6A?2CEEYQ>069JJLRX98=0ECG[_004?LHN\V;8;6GAIU]202=NF@^T=894IOKW[4003@DBXR?87:KMMQY60>1BBDZP1858MKOSW8K<7D@FT^3A3>OIA]U:O:5FNHV\5A1<AGC_S<K8;HLJPZ7A?2CEEYQ=069JJLRX:8=0ECG[_304?LHN\V88;6GAIU]102=NF@^T>894IOKW[7003@DBXR<87:KMMQY50>1BBDZP2858MKOSW;K<7D@FT^0A3>OIA]U9O:5FNHV\6A1<AGC_S?K8;HLJPZ4A?2CEEYQ<069JJLRX;8=0ECG[_204?LHN\V98;6GAIU]002=NF@^T?894IOKW[6003@DBXR=87:KMMQY40>1BBDZP3858MKOSW:K<7D@FT^1A3>OIA]U8O:5FNHV\7A1<AGC_S>K8;HLJPZ5A>2CEEYQN6:KMMQYE12CEEYQIIMG5?IIFLLN<7AAHIBCOg>Kfbfx]i}fooa8Ilhhz_oydaa2:L27>H68:1E=<<4N318J7>43G82?6@<029M745<F:887C=<3:L006=I;<90B>8<;O147>H40:1E?4=4N520?K26;2D?>>5A4208J24<F180B4h4NC]AQVVNFVZYC]]8;OGWSJTL<2DDBH<4OJ38T1=WI[^j7]GA_CWPMA^e3YCESO[\N@OF<>TFEK;3I<64R@O\IJBB901YHLJKR^ALHIOTAFDTDZM@NGKDg>TBIMU\EIZG_@a8V@GCW^COXEQM5:PFCFCe3[OLOHO]EFAF2>TBOJOIh6\JGBNHEWBUKEA<7_KHCMIA`>TT\[KFM_][R@O4?WUSZHGIh6\\TSGDEWUSZLM<7_][RDEA54=U[]XNKR^]INPJP\YF981Y_Y\JG^RQMJTN\PUI46]NVDFBPD763ZBYIJQJXUPBGQYIOJo0_E\JG^OJJZUNRL;87^GB_BMOHLUNGGUHDHMDa:QJIZBB^@IN46]DIQ]SMK0<[F_YOH94SSTBHZG03ZX]MAQM3:VGT1=SQYO?j6[?/cnh[hcjWnoeio{os-ueioc&jy~"|nmmmlt^6Z&{kf"!y6^kmmq(uid%X\#YFDD]SVLK60'xjal5ZSDP\EIOF[j1^_H\PVHQJFIC43_IH56XFEV]W]UC03_CYXHV96:UFE969>2]NM1?16:UFE94902]NM1=50?48S@G;;720[HLXE=2=<>QBJ^O7=364WD@TA94902]NNZK33?:8S@DPM5>546YJBVG?1;><_LH\I181a:UFFRC;?3:546YJBVG?3;d<_[C_IRHFRRV`?RTN\LUFCIKPAb9TVLRBWDEOIRLk;VPJP@YPAM^CSLj4WSKWAZQNL]BTN<j4XHNJJ]+_LK*;"<.\TT@#4+7'IZIBE;5WSUNJF2=_[]ULBI94XRV\RFEe3QUHC_KPIODL2>^cjVCoj6Vkh^RqmhPbzzcdb<>4Xeo\Idlhz_oydaa119[`hYJageyZh||inl0?\ct02koho'0(:8eabui!;"46okdsc+6,><imnym%=&8:cg`wg/< 20mij}a=2=<>gcl{k7=364aefqe94902koho33?c8eabui5>1<364aefqe92902kohl'0(:8eabuj!;"46okds`+6,><imnyn%=&8:cg`wd/< k0mij}b=694;4d3kf`S`kb_fgm[s2X;%*Seagax!ALV@&@mgoymya} 01-71=ddbk?7nbdb028`de4:19Tecg{_lgn6g=cij994>Qfnhv\i`k+jeaTahcPgdl\r1Y4$GEEI!@@ND633>bfk:83?Rgaiu]nah*edbUfi`Qheo]u0Z5+sjUjhi|n_vkgpm;2$jUjhi|m_vkgpm;2$jUj`ja}iujn94*dWksiR}fzd?:(fYdgdgdbRmck<2/gZbbnhgxRjnt`?3(fYcazki`hQxasl\fmpXkffg1="l_ekpegjbW~kybRlgv^pbjbc:8%iTdl}Peoc>4)eX`hyTicl20-a\lduXag`noyk}r<2/gZnf{VgnaRaztqww[wc`{Vk6<!mPh`q\i`kXg|~{yyQ}efq\f86+kVbjRczx^mvpussW{olRo20-a\lduXe|rTcxzuu]qabuXj4:'oRfns^pfcfcf59&hSeo|_sgdg`d:8%iTdl}Prrvb95*dWakxS}{b<2/gZnf{Vydjyklc^kmtprXzlmxSl3?,b]kevYtgo~nonQ`uurvpZtbozUi1="l_hljpZ`ndlUem`k2d`a06=5XagcS`kb.lke(fYnf`~jS{oc=1.`[lhn|kU}ma3?,b]okdbXagcSkgce<3/gZkbeV~r|h3<,b]nq}YwayogeckPsucdav;7$jU{~dcPtxrf94*dW{ojhRjjpuj\e855$jUyiljPddrwlZd:;;&hSknd^uj`qnXi4;= nQ}e`f\slbs`Vh6=;"l_sqw[utng{cuRo2CD.`[wusWyxbcg{y^`>G@*dW{ySywe<QZJF*dW{y~lcPa<2/gZtt|{kfSo3?,b]pmhYdgefbdaa_bjfgn;FDE&hSx}j_c{waZqbi4:'oR{|e^`zp`Ypmk7; nQzsd]gacgrd}Uomyo20-a\qvcXmji6<!mPurg\wj`smji6<!mPwdc\slbs`4;'oRyjb^uj`qn:9%iT{g{e^fftqnXi499 nQxrhvf[acw|aUi1><#c^uqmqcXefnnSl3XRHVF[COU[]&hSz|ftd]nkacXj4]YEYKPFHPPP)eX{ciRyfduj\e871$jU|~dzj_vkgpmYe58<'obcoogmpZhfel7omn==82]jjlrXelg'q?94d`a06=5XagcS`kb_cnh[hcjWnoeS{:P3^zppZ703mhbxh|}7:fjjd.7!>1oeco'1(:8`lhf 8:"46jfn`*25,><l`dj$<<&8:fjjd.6; 20hd`n(06*<>bnfh":9$94dhlb,7/03mcem%=&7:fjjd.3!>1oeco'5(58`lhf ?#<7igaa)5*3>bnfh"3%:5kioc+=,g<l`dj0<;50?58`lhe 9#<7igab)3*<>bnfk":<$64dhla,47.02nbbo&>2(:8`lhe 89"46jfnc*20,><l`di$<;&7:fjjg.5!>1oecl'3(58`lhe =#<7igab)7*3>bnfk"=%:5kio`+3,1<l`di$5'8;ekmf-?.i2nbbo2>5;2=<>bh}}k#<$64dnwwe-7.12ndyyo'11+:?air|h":=$74dnwwe-75!01ocxzn(01*=>bh}}k#=9'6;emvpd.6= 20hb{{a)0*<>bh}}k#?$64dnwwe-2.02ndyyo'5(:8`jssi!<"46j`uuc+3,><lfm%6&8:flqqg/1 20hb{{a=2==>bh}}k7==06;emvpd:69730hb{{a=31:<=cg|~j0<=19:flqqg;9=4i7iazt`>21?6912ndyyo314<;?air|h6:255kotvb878?3me~xl2<>99gkprf4=437iazt`>6:==cg|~j0;07;emvpd:0611ocxzn<9<;?air|h62255kotva,5/?3me~xo&>)89gkpre 8:"56j`uu`+54/>3me~xo&>2(;8`jssj!;8%45kotva,42.12ndyyl'14+;?air|k"9%55kotva,6/?3me~xo&;)99gkpre <#37iaztc*5-==cg|~i$:'7;emvpg.?!11ocxzm(8+a?air|k6:97>18:ggmc4iom90ico<;dla`>oiblihog{espg?lhmmj~xndzjrs:8jbee}`foo6|kaefqafe/8 i0~iokdsg`g-7.k2xomij}eba+6,e<zmkohklc)1*g>tcimnyinm'4(a8vagcl{oho1>1e:pgeabumji787>16:pfcfcf>2xnknkm4:pppd2<zz~i;6}miugqv4e<|dz$Sni d`a06=5XagcS`kb.oel2>qbi!:"46yja=294;0<lh#<$64wd`?4?69uIJ{=9k4@Az2`4<A2=0:w^:k:0`e>=<6;::9jn4<18f6k73n3;0b<;?:79'51b=9=20q^:m:0`e>=<6;::9jn4<18f6?V`628i?6=4>3221bf<490n>7^:m:0a7>5<6;::9jn4<18f;?a71>3:1=7?tS5f95g`=03;8?=<ic;12=a3<~];9m7>51;395=}T<m0:nk47:01047`d2:;2h85+1219b7=Q9=o1>v{i3;38qc2=82w/=<?51g9a530=83;=6>4>6zJ274=]<>09w<m5108~ 44b28<=7)?;c;357>o6=?0;6)?>3;36f>h69;0;76g>5483>!76;3;>n6`>1382?>o6==0;6)?>3;36f>h69;0976g>5283>!76;3;>n6`>1380?>o6=;0;6)?>3;36f>h69;0?76a>9583>!76;3;j?6`>1383?>i61:0;6)?>3;3b7>h69;0:76a>9383>!76;3;j?6`>1381?>i6180;6)?>3;3b7>h69;0876a>9183>!76;3;j?6`>1387?>i60o0;6)?>3;3b7>h69;0>76a>9b83>!76;3;j?6`>1385?>i61k0;6)?>3;3b7>h69;0<76a>9`83>!76;3;j?6`>138;?>i6100;6)?>3;3b7>h69;0276a>9983>!76;3;j?6`>138b?>i61>0;6)?>3;3b7>h69;0i76a>9783>!76;3;j?6`>138`?>i61<0;6)?>3;3b7>h69;0o76a>8d83>!76;3;j?6`>138f?>i60m0;6)?>3;3b7>h69;0m76g>6583>>d6;;0;6<4?:1yK567<,88n6<==;n324?6=3thj97>51;294~N6;81/=?k5a49le1<722wi8;4?:4f97?7?sA;8=6T;7;314c=9:0:87?l:0f954<6:3n1i7?<:0a9`?7328n1i7?>:0095`<z,88n6<86;%6;>4003->h6<87;%312?7<,88>6<;>;%33g?77n2c:o>4?::m2g<<72-;:?7?lb:l257<732e:o54?:%327?7dj2d:=?4>;:m2g2<72-;:?7?lb:l257<532e:o;4?:%327?7dj2d:=?4<;:m2g0<72-;:?7?lb:l257<332c:o=4?::k2g4<722c:on4?::k2ga<722c:h?4?:%327?7c;2d:=?4?;:k2`1<72-;:?7?k5:l257<732c:9;4?:%327?72j2d:=?4?;:k210<72-;:?7?:b:l257<632c:994?:%327?72j2d:=?4=;:k216<72-;:?7?:b:l257<432c:9?4?:%327?72j2d:=?4;;:k224<72-;:?7?92:l257<732c::=4?:%327?71:2d:=?4>;:k21c<72-;:?7?92:l257<532c:9h4?:%327?71:2d:=?4<;:k21a<72-;:?7?92:l257<332c:oh4?::k2gc<722e:h=4?::m2=1<72-;:?7?n3:l257<732e:5>4?:%327?7f;2d:=?4>;:m2=7<72-;:?7?n3:l257<532e:5<4?:%327?7f;2d:=?4<;:m2=5<72-;:?7?n3:l257<332e:4k4?:%327?7f;2d:=?4:;:m2=f<72-;:?7?n3:l257<132e:5o4?:%327?7f;2d:=?48;:m2=d<72-;:?7?n3:l257<?32e:544?:%327?7f;2d:=?46;:m2==<72-;:?7?n3:l257<f32e:5:4?:%327?7f;2d:=?4m;:m2=3<72-;:?7?n3:l257<d32e:584?:%327?7f;2d:=?4k;:m2<`<72-;:?7?n3:l257<b32e:4i4?:%327?7f;2d:=?4i;:m2f0<72-;:?7?me:l257<732e:n94?:%327?7em2d:=?4>;:m2f6<72-;:?7?me:l257<532e:n?4?:%327?7em2d:=?4<;:m2f4<72-;:?7?me:l257<332e:n=4?:%327?7em2d:=?4:;:m2fa<72-;:?7?me:l257<132e:nn4?:%327?7em2d:=?48;:m2fg<72-;:?7?me:l257<?32e:nl4?:%327?7em2d:=?46;:m2f<<72-;:?7?me:l257<f32e:n54?:%327?7em2d:=?4m;:m2f2<72-;:?7?me:l257<d32e:n;4?:%327?7em2d:=?4k;:m2ec<72-;:?7?me:l257<b32e:mh4?:%327?7em2d:=?4i;:k221<722c::84?::k237<72-;:?7?8b:l257<732c:;<4?:%327?70j2d:=?4>;:k235<72-;:?7?8b:l257<532c::k4?:%327?70j2d:=?4<;:k22`<72-;:?7?8b:l257<332c::i4?:%327?70j2d:=?4:;:k23d<72-;:?7?8b:l257<132c:;44?:%327?70j2d:=?48;:k23=<72-;:?7?8b:l257<?32c:;:4?:%327?70j2d:=?46;:k233<72-;:?7?8b:l257<f32c:;84?:%327?70j2d:=?4m;:k231<72-;:?7?8b:l257<d32c:;>4?:%327?70j2d:=?4k;:k22f<72-;:?7?8b:l257<b32c::o4?:%327?70j2d:=?4i;:k2<6<72-;:?7?7c:l257<732c:4?4?:%327?7?k2d:=?4>;:k2<4<72-;:?7?7c:l257<532c:4=4?:%327?7?k2d:=?4<;:k23c<72-;:?7?7c:l257<332c:;h4?:%327?7?k2d:=?4:;:k2<g<72-;:?7?7c:l257<132c:4l4?:%327?7?k2d:=?48;:k2<<<72-;:?7?7c:l257<?32c:454?:%327?7?k2d:=?46;:k2<2<72-;:?7?7c:l257<f32c:4;4?:%327?7?k2d:=?4m;:k2<0<72-;:?7?7c:l257<d32c:494?:%327?7?k2d:=?4k;:k23a<72-;:?7?7c:l257<b32c:;n4?:%327?7?k2d:=?4i;:k2g7<722e::l4?::`20d<7280;6=u+13g9e0=O9=30D<=>;nc7>5<<uk;?n7>51;294~"6:l0:??5G15;8L4563f;:<7>5;|`26c<721:1<7>t$00f>4733A;?56F>309Y02<bs8?1=;46:`823?7?2831=l4m:b8e>46=:90:n7sa8983?k?f291/m;4<;%c4>6=#i1087)o6:29'ed<43-ki6>5+ab80?!gc2:1/mh4;;%ce>0=#j90=7)l>:69'f7<43-h86>5+b580?!d22:1/n;4<;%`4>6=#j1087)l6:29'fd<43-hi6>5+bb80?!dc2:1/nh4<;%`e>6=#k9087)m>:29'g7<43-i86>5+c580?!e22:1/o;4<;%a4>6=#k1087)m6:29'gd<43-ii6>5+cb80?!ec2:1/oh4<;%ae>6=#l9087)j>:29'`7<43-n86>5+d580?!b22:1/h;4<;%f4>6=#l1087)j6:29'`d<43-ni6>5+db80?!bc2:1/hh4<;%fe>6=#m9087)k>:29'a7<43-o86>5+e580?!c22:1/i;4<;%g4>6=#m1087)k6:29'ad<43-oi6>5+eb80?!cc2:1/ih4=;%ge>7=#n90:<h5+107957b<,8;=69k4n034>44<f8;36<<4$001>47>3-;9?7?>9:&262<3=2.:>54>359'57d=:2.:>n4=;%370?73;2.:884>429m510=9;1e=995139'572=i:1b844?::k7e?6=3`k:6=44i`094?=n98k1<75f10`94?=n98i1<7F>2898m47c290C=?74;h32a?6=3`;:j7>5;h314?6=3`;9=7>5;h05>5<#9891>85a10094>=n:=0;6)?>3;06?k76:3;07d<<:18'545=:<1e=<<52:9j67<72-;:?7<:;o326?5<3`8m6=4+101960=i9881865f2d83>!76;38>7c?>2;78?l4c290/=<=5249m544=>21b>n4?:%327?423g;:>794;h0a>5<#9891>85a1009<>=n:h0;6)?>3;06?k76:3307d<6:18'545=:<1e=<<5a:9j6=<72-;:?7<:;o326?d<3`8<6=4+101960=i9881o65f2083>!76;38>7c?>2;f8?l55290/=<=5309m544=82B:>454i2294?"69:08=6`>1382?M75121b?84?:%327?533g;:>7>4H00:?>o4;3:1(<?<:268j475281C=?74;h1a>5<#9891?l5a10094>=n;00;6)?>3;1b?k76:3;07d=7:18'545=;h1e=<<52:9j72<72-;:?7=n;o326?5<3`>?6=4+10197d=i9881865f4283>!76;39j7c?>2;78?l25290/=<=53`9m544=>21b8<4?:%327?5f3g;:>794;h63>5<#9891?l5a1009<>=n;o0;6)?>3;1b?k76:3307d=j:18'545=;h1e=<<5a:9j7a<72-;:?7=n;o326?d<3`9h6=4+10197d=i9881o65f3783>!76;39j7c?>2;f8?l31290/=<=5549m544=821b994?:%327?323g;:>7?4;h70>5<#9891985a10096>=n=;0;6)?>3;76?k76:3907d;>:18'545==<1e=<<54:9j15<72-;:?7;:;o326?3<3`?m6=4+101910=i9881:65f5d83>!76;3?>7c?>2;58?l3c290/=<=5549m544=021b9n4?:%327?323g;:>774;h7a>5<#9891985a1009e>=n=h0;6)?>3;76?k76:3h07d;6:18'545==<1e=<<5c:9j1=<72-;:?7;:;o326?b<3`?<6=4+101910=i9881i65f4g83>!76;3?>7c?>2;d8?l00290/=<=5679m544=821b:84?:%327?013g;:>7?4;h47>5<#9891:;5a10096>=n>:0;6)?>3;45?k76:3907d8=:18'545=>?1e=<<54:9j24<72-;:?789;o326?3<3`=;6=4+101923=i9881:65f6g83>!76;3<=7c?>2;58?l0b290/=<=5679m544=021b:i4?:%327?013g;:>774;h4`>5<#9891:;5a1009e>=n>k0;6)?>3;45?k76:3h07d8n:18'545=>?1e=<<5c:9j2<<72-;:?789;o326?b<3`<36=4+101923=i9881i65f6183>!76;3<=7c?>2;d8?l14290/=<=5739m544=821b;<4?:%327?153g;:>7?4;h55>5<#9891;85a10094>=n?=0;6)?>3;56?k76:3;07b9j:18'545=?m1e=<<50:9l3f<72-;:?79k;o326?7<3f=i6=4+10193a=i9881>65`7`83>!76;3=o7c?>2;18?j1>290/=<=57e9m544=<21d;54?:%327?1c3g;:>7;4;n:4>5<#9891;i5a10092>=h0?0;6)?>3;5g?k76:3=07b6::18'545=?m1e=<<58:9l<1<72-;:?79k;o326??<3f286=4+10193a=i9881m65`8383>!76;3=o7c?>2;`8?j>6290/=<=57e9m544=k21d4=4?:%327?1c3g;:>7j4;n5e>5<#9891;i5a1009a>=h?>0;6)?>3;5g?k76:3l07b7?:18'545=0o1e=<<50:9l<`<72-;:?76i;o326?7<3f2o6=4+1019<c=i9881>65`8b83>!76;32m7c?>2;18?j>e290/=<=58g9m544=<21d4l4?:%327?>a3g;:>7;4;n;:>5<#98914k5a10092>=h110;6)?>3;:e?k76:3=07b78:18'545=0o1e=<<58:9l=3<72-;:?76i;o326??<3f3>6=4+1019<c=i9881m65`9583>!76;32m7c?>2;`8?j?4290/=<=58g9m544=k21d5?4?:%327?>a3g;:>7j4;n;2>5<#98914k5a1009a>=h000;6)?>3;:e?k76:3l07b7k:18'545=1j1e=<<50:9l=g<72-;:?77l;o326?7<3fk;6=4+1019=c=i9881<65`9d83>!76;33m7c?>2;38?l7413:1(<?<:01;?k76:3:0D<<6;:k272<72-;:?7?<8:l257<63A;9565f12494?"69:0:?55a10096>=n9:?1<7*>12827==i9881?65f15094?"69:0:8<5a10094>N6:010e<:?:18'545=9=;0b<?=:09K57?<3`;8j7>5$030>4263g;:>7<4H00:?>o6;l0;6)?>3;375>h69;087E?=9:9j56b=83.:=>4>409m544=<21b=>m50;&256<6<81e=<<55:9j56d=83.:=>4>409m544=>21b=>o50;&256<6<81e=<<57:9~w43d2908wS?:6:?26c<5n27:>k4;4:p50g=839pR<;:;<31b?4b34;9j7:<;|q21<<72:qU=8:4=00e>7b<588m69<4}r36<?6=;rT:9>5213d96f=:9;l18<5rs074>5<4sW;>>63>2g81f>;6:o0?<6s|17694?5|V8<?70?=f;6:?875n3>j7p}>a583>7}Y90>01<<i:9`8yv7f:3:1>vP>929>57`=0h1v<o>:181[7>:27:>k469:p5d6=838pR<7>;<31b???3ty:5k4?:3y]5<6<588m64=4}r3:a?6=:rT:4k5213d9=7=z{8ko6=4={_3:g>;6:o02=6s|1`a94?4|V83i70?=f;::?xu6ik0;6?uQ18c8944a2>30q~?na;296~X61016=?h5799~w4g>2909wS?68:?26c<??2wx=l650;0xZ4?034;9j769;|q2e2<72;qU=484=00e>=7<uz;j:7>52z\2=0=:9;l14=5rs0c6>5<5sW;3i63>2g84b>{t90n1<7<t^0:g?875n3=<7p}>c`83>01|V8h>7S?m4:\2f6=Y9k80R<l>;_3a4>X6jm1U=om4^0`a?[7ei2T:n45Q1c:8Z4d03W;i:6P>ag9]5dc<V8i27S?l8:\2g2=Y9j<0R<m:;<37e?g334;9j7?>a:?26c<69k16=?h510g8944a28;m70?=f;314>;6:o0:><5213d963=:9;l1>95213d966=:9;l1>?5213d96d=:9;l1>45213d96==:9;l1>:5213d964=:9;l1?o5213d97<=:9;l1?55213d972=:9;l1?h5213d97a=:9;l1?n5213d973=:9;l19;5213d911=:9;l19>5213d917=:9;l19<5213d915=:9;l19k5213d91`=:9;l19i5213d91f=:9;l19o5213d91d=:9;l1945213d91==:9;l19:5213d90c=:9;l1::5213d920=:9;l1:95213d926=:9;l1:?5213d924=:9;l1;=5213d92c=:9;l1:h5213d92a=:9;l1:n5213d92g=:9;l1:l5213d92<=:9;l1:55213d925=:9;l1;>5213d934=:9;l1;;5213d931=:9;l1=>84=00e>45234;9j7?<d:?26c<6;j16=?h512`8944a289j7p}i5;290~;6<k0:==5213d9e4=:9;l1m?5213d97c=zuz;=87>52z\221=:<?0::95+1229b==z{8?h6=4={_362>;3>3;>:6*>31824<=z{8?j6=4={_361>;3>3;>96*>31824d=z{8?26=4={_360>;3>3;>86*>31824g=z{8?36=4={_367>;3>3;>?6*>318e2>{t9<=1<7<t^071?82128?97)?<0;d4?xu6i=0;6?uQ1868910=90>0(<=?:g;8yv7f:3:1>vP>929>03<61:1/=>>5f`9~w4g62909wS?62:?72?7>:2.:?=4ib:p5d6=838pR<7>;<65>4?63-;8<7hl;|q2=c<72;qU=4>4=5495<6<,89;6kj4}r3:a?6=:rT:4k524782<c=#9::1jh5rs0cg>5<5sW;2o63;6;3:g>"6;90mj6s|1`a94?4|V83i70:9:0;a?!7483;;<6s|1``94?4|V83j70:9:0;b?!7483;;=6s|1`c94?4|V83270:9:0;:?!7483;;>6s|1`;94?4|V83370:9:0;;?!7483;;?6s|1`:94?4|V83<70:9:0;4?!7483;;86s|1`594?4|V83=70:9:0;5?!7483;;96s|1`494?4|V83>70:9:0;6?!7483;;:6s|1`794?4|V82n70:9:0:f?!7483;;;6s|18f94?4|V82o70:9:0:g?!7483;;46srn003>5<5sA;8=6sa13394?4|@89:7p`>2383>7}O9:;0qc?=3;296~N6;81vb<<;:181M7492we=?;50;0xL4563td:>;4?:3yK567<ug;9;7>52zJ274=zf8836=4={I305>{i9;31<7<tH012?xh6:h0;6?uG1238yk75j3:1>vF>309~j44d2909wE?<1:m57b=838pD<=>;|l26`<72;qC=>?4}o31b?6=:rB:?<5rn013>5<5sA;8=6sa12394?4|@89:7p`>3383>7}O9:;0qc?<3;296~N6;81vb<=;:181M7492we=>;50;0xL4563td:=h4?:0yK567<ug;:j7>51zJ274=zutwKLNu>4d8e3c320l2vLMLt0|BCT~{GH
\ No newline at end of file
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.wb_fmc150_pkg.all;
use work.wb_stream_pkg.all;
entity wb_fmc150 is
generic
(
g_packet_size : natural := 32
);
port
(
rst_n_i : in std_logic;
clk_sys_i : in std_logic;
clk_100Mhz_i : in std_logic;
clk_200Mhz_i : in std_logic;
-----------------------------
-- Wishbone signals
-----------------------------
wb_adr_i : in std_logic_vector(c_wishbone_address_width-1 downto 0) := (others => '0');
wb_dat_i : in std_logic_vector(c_wishbone_data_width-1 downto 0) := (others => '0');
wb_dat_o : out std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0) := (others => '0');
wb_we_i : in std_logic := '0';
wb_cyc_i : in std_logic := '0';
wb_stb_i : in std_logic := '0';
wb_ack_o : out std_logic;
wb_err_o : out std_logic;
wb_rty_o : out std_logic;
wb_stall_o : out std_logic;
-----------------------------
-- External ports
-----------------------------
--Clock/Data connection to ADC on FMC150 (ADS62P49)
adc_clk_ab_p_i : in std_logic;
adc_clk_ab_n_i : in std_logic;
adc_cha_p_i : in std_logic_vector(6 downto 0);
adc_cha_n_i : in std_logic_vector(6 downto 0);
adc_chb_p_i : in std_logic_vector(6 downto 0);
adc_chb_n_i : in std_logic_vector(6 downto 0);
--Clock/Data connection to DAC on FMC150 (DAC3283)
dac_dclk_p_o : out std_logic;
dac_dclk_n_o : out std_logic;
dac_data_p_o : out std_logic_vector(7 downto 0);
dac_data_n_o : out std_logic_vector(7 downto 0);
dac_frame_p_o : out std_logic;
dac_frame_n_o : out std_logic;
txenable_o : out std_logic;
--Clock/Trigger connection to FMC150
clk_to_fpga_p_i : in std_logic;
clk_to_fpga_n_i : in std_logic;
ext_trigger_p_i : in std_logic;
ext_trigger_n_i : in std_logic;
-- Control signals from/to FMC150
--Serial Peripheral Interface (SPI)
spi_sclk_o : out std_logic; -- Shared SPI clock line
spi_sdata_o : out std_logic; -- Shared SPI data line
-- ADC specific signals
adc_n_en_o : out std_logic; -- SPI chip select
adc_sdo_i : in std_logic; -- SPI data out
adc_reset_o : out std_logic; -- SPI reset
-- CDCE specific signals
cdce_n_en_o : out std_logic; -- SPI chip select
cdce_sdo_i : in std_logic; -- SPI data out
cdce_n_reset_o : out std_logic;
cdce_n_pd_o : out std_logic;
cdce_ref_en_o : out std_logic;
cdce_pll_status_i : in std_logic;
-- DAC specific signals
dac_n_en_o : out std_logic; -- SPI chip select
dac_sdo_i : in std_logic; -- SPI data out
-- Monitoring specific signals
mon_n_en_o : out std_logic; -- SPI chip select
mon_sdo_i : in std_logic; -- SPI data out
mon_n_reset_o : out std_logic;
mon_n_int_i : in std_logic;
--FMC Present status
prsnt_m2c_l_i : in std_logic;
-- Wishbone Streaming Interface Source
wbs_adr_o : out std_logic_vector(c_wbs_address_width-1 downto 0);
wbs_dat_o : out std_logic_vector(c_wbs_data_width-1 downto 0);
wbs_cyc_o : out std_logic;
wbs_stb_o : out std_logic;
wbs_we_o : out std_logic;
wbs_sel_o : out std_logic_vector((c_wbs_data_width/8)-1 downto 0);
wbs_ack_i : in std_logic;
wbs_stall_i : in std_logic;
wbs_err_i : in std_logic;
wbs_rty_i : in std_logic
);
end wb_fmc150;
architecture rtl of wb_fmc150 is
-----------------------------------------------------------------------------------------------
-- IP / user logic interface signals
-----------------------------------------------------------------------------------------------
--signal s_adc_dout : std_logic_vector(31 downto 0);
--signal s_clk_adc : std_logic;
signal regs_in : t_fmc150_out_registers;
signal regs_out : t_fmc150_in_registers;
signal wbs_stream_out : t_wbs_source_out;
signal wbs_stream_in : t_wbs_source_in;
-- FMC 150 testbench
signal cdce_pll_status : std_logic;
signal s_mmcm_adc_locked : std_logic;
signal s_adc_dout : std_logic;
signal s_clk_adc : std_logic;
-- Streaming control signals
signal s_wbs_packet_counter : unsigned;
signal s_addr : std_logic_vector(c_wbs_address_width-1 downto 0);
signal s_data : std_logic_vector(c_wbs_data_width-1 downto 0);
signal s_dvalid : std_logic;
signal s_sof : std_logic;
signal s_eof : std_logic;
signal s_error : std_logic;
signal s_bytesel : std_logic_vector((c_wbs_data_width/8)-1 downto 0);
signal s_dreq : std_logic;
begin
-- Glue logic
--adc_dout_o <= s_adc_dout;
--clk_adc_o <= s_clk_adc;
-----------------------------------------------------------------------------------------------
-- BUS / IP interface
-----------------------------------------------------------------------------------------------
--s_clk_out_pulse_sync(0) <= clk_100Mhz;
--gen_pulse_register_sync : for i in 0 to (C_SLV_DWIDTH/2)-1 generate
--
-- cmp_adc_delay_update : pulse2pulse
-- port map
-- (
-- in_clk => Bus2IP_Clk,
-- out_clk => s_clk_out_pulse_sync(i),
-- rst => not Bus2IP_Resetn,
-- pulsein => s_registers(FLAGS_PULSE_0)(i),
-- inbusy => open,
-- pulseout => s_pulse_register_sync(i)
-- );
--
--end generate;
--
--s_adc_delay_update <= s_pulse_register_sync(0);
cmp_fmc150_testbench: fmc150_testbench
port map
(
rst => rst,
clk_100Mhz => clk_100Mhz,
clk_200Mhz => clk_200Mhz,
adc_clk_ab_p => adc_clk_ab_p,
adc_clk_ab_n => adc_clk_ab_n,
adc_cha_p => adc_cha_p,
adc_cha_n => adc_cha_n,
adc_chb_p => adc_chb_p,
adc_chb_n => adc_chb_n,
dac_dclk_p => dac_dclk_p,
dac_dclk_n => dac_dclk_n,
dac_data_p => dac_data_p,
dac_data_n => dac_data_n,
dac_frame_p => dac_frame_p,
dac_frame_n => dac_frame_n,
txenable => txenable,
clk_to_fpga_p => clk_to_fpga_p,
clk_to_fpga_n => clk_to_fpga_n,
ext_trigger_p => ext_trigger_p,
ext_trigger_n => ext_trigger_n,
spi_sclk => spi_sclk,
spi_sdata => spi_sdata,
adc_n_en => adc_n_en,
adc_sdo => adc_sdo,
adc_reset => adc_reset,
cdce_n_en => cdce_n_en,
cdce_sdo => cdce_sdo,
cdce_n_reset => cdce_n_reset,
cdce_n_pd => cdce_n_pd,
ref_en => cdce_ref_en,
dac_n_en => dac_n_en,
dac_sdo => dac_sdo,
mon_n_en => mon_n_en,
mon_sdo => mon_sdo,
mon_n_reset => mon_n_reset,
mon_n_int => mon_n_int,
pll_status => cdce_pll_status,--regs_out.flgs_out_pll_status_i,
mmcm_adc_locked_o => s_mmcm_adc_locked,--regs_out.flgs_out_adc_clk_locked_i,
odata => regs_out.data_out_i,--s_odata,
busy => regs_out.flgs_out_spi_busy_i,--s_busy,
prsnt_m2c_l => regs_out.flgs_out_fmc_prst_i,--prsnt_m2c_l,
rd_n_wr => regs_in.flgs_in_spi_rw_o, --s_registers(FLAGS_IN_0)(FLAGS_IN_0_SPI_RW),
addr => regs_in.addr_o, --s_registers(ADDR)(15 downto 0),
idata => regs_in.data_in_o, --s_registers(DATAIN),
cdce72010_valid => regs_in.cs_cdce72010_o,--s_registers(CHIPSELECT)(CHIPSELECT_CDCE72010),
ads62p49_valid => regs_in.cs_ads62p49_o, --s_registers(CHIPSELECT)(CHIPSELECT_ADS62P49),
dac3283_valid => regs_in.cs_dac3283_o, --s_registers(CHIPSELECT)(CHIPSELECT_DAC3283),
amc7823_valid => regs_in.cs_amc7823_o, --s_registers(CHIPSELECT)(CHIPSELECT_AMC7823),
external_clock => regs_in.flgs_in_ext_clk_o, --s_registers(FLAGS_IN_0)(FLAGS_IN_0_EXTERNAL_CLOCK),
adc_delay_update_i => regs_in.flgs_pulse_o,--s_adc_delay_update,
adc_str_cntvaluein_i => regs_in.adc_dly_str_o,--s_registers(ADC_DELAY)(4 downto 0),
adc_cha_cntvaluein_i => regs_in.adc_dly_cha_o,--s_registers(ADC_DELAY)(12 downto 8),
adc_chb_cntvaluein_i => regs_in.adc_dly_chb_o,--s_registers(ADC_DELAY)(20 downto 16),
adc_str_cntvalueout_o => open,
adc_dout_o => s_adc_dout,
clk_adc_o => s_clk_adc
);
regs_out.flgs_out_pll_status_i <= cdce_pll_status;
regs_out.flgs_out_adc_clk_locked_i <= s_mmcm_adc_locked;
cmp_wb_fmc150_port : wb_fmc150_port
port map (
rst_n_i => rst_n_i,
clk_sys_i => clk_sys_i,
wb_adr_i => wb_adr_i,
wb_dat_i => wb_dat_i,
wb_dat_o => wb_dat_o,
wb_cyc_i => wb_cyc_i,
wb_sel_i => wb_sel_i,
wb_stb_i => wb_stb_i,
wb_we_i => wb_we_i,
wb_ack_o => wb_ack_o,
wb_stall_o => wb_stall_o,
clk_100Mhz => clk_100_i,
regs_i => regs_out,
regs_o => regs_in
);
cmp_wb_source_if : xwb_stream_source
port map(
clk_i => clk_sys_i,
rst_n_i => rst_n_i,
-- Wishbone Fabric Interface I/O
src_i => wbs_stream_in,
src_o => wbs_stream_out,
-- Decoded & buffered logic
addr_i => s_addr,
data_i => s_data,
dvalid_i => s_dvalid,
sof_i => s_sof,
eof_i => s_eof,
error_i => s_error,
bytesel_i => s_bytesel,
dreq_o => s_dreq
);
s_addr <= (others => '0');
s_data <= s_adc_dout;
s_dvalid <= cdce_pll_status and s_mmcm_adc_locked;
p_gen_sof_eof : process(s_clk_adc, rst_n_i)
begin
if rst_n_i = '0' then
s_sof <= '0';
s_eof <= '0';
s_wbs_packet_counter <= 0;
elsif rising_edge(s_clk_adc) then
-- Defaults assignments
s_sof <= '0';
s_eof <= '0';
-- Finish current transaction
if(s_wbs_packet_counter = g_packet_size) then
s_eof <= '1';
s_wbs_packet_counter <= 0;
elsif (s_wbs_packet_counter = 0) then
s_sof <= '1';
end if;
-- Increment counter if data is valid
if s_dvalid then
s_wbs_packet_counter <= s_wbs_packet_counter + 1;
end if;
end if;
end process;
s_error <= '0';
bytesel_i <= (others => '1');
wbs_adr_o <= wbs_stream_out.adr;
wbs_dat_o <= wbs_stream_out.dat;
wbs_cyc_o <= wbs_stream_out.cyc;
wbs_stb_o <= wbs_stream_out.cyc;
wbs_we_o <= wbs_stream_out.we;
wbs_sel_o <= wbs_stream_out.sel;
wbs_stream_in.ack <= wbs_ack_i;
wbs_stream_in.stall <= wbs_stall_i;
wbs_stream_in.err <= wbs_err_i;
wbs_stream_in.rty <= wbs_rty_i;
end rtl;
---------------------------------------------------------------------------------------
-- Title : Wishbone slave core for FMC ADC/DAC interface registers
---------------------------------------------------------------------------------------
-- File : wb_fmc150_port.vhd
-- Author : auto-generated by wbgen2 from xfmc150.wb
-- Created : Mon Oct 1 15:20:18 2012
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE xfmc150.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.fmc150_wbgen2_pkg.all;
entity wb_fmc150_port is
port (
rst_n_i : in std_logic;
clk_sys_i : in std_logic;
wb_adr_i : in std_logic_vector(2 downto 0);
wb_dat_i : in std_logic_vector(31 downto 0);
wb_dat_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
wb_stall_o : out std_logic;
clk_100Mhz : in std_logic;
regs_i : in t_fmc150_in_registers;
regs_o : out t_fmc150_out_registers
);
end wb_fmc150_port;
architecture syn of wb_fmc150_port is
signal fmc150_flgs_pulse_int : std_logic ;
signal fmc150_flgs_pulse_int_delay : std_logic ;
signal fmc150_flgs_pulse_sync0 : std_logic ;
signal fmc150_flgs_pulse_sync1 : std_logic ;
signal fmc150_flgs_pulse_sync2 : std_logic ;
signal fmc150_flgs_in_spi_rw_int : std_logic ;
signal fmc150_flgs_in_ext_clk_int : std_logic ;
signal fmc150_addr_int : std_logic_vector(15 downto 0);
signal fmc150_data_in_int : std_logic_vector(31 downto 0);
signal fmc150_cs_cdce72010_int : std_logic ;
signal fmc150_cs_ads62p49_int : std_logic ;
signal fmc150_cs_dac3283_int : std_logic ;
signal fmc150_cs_amc7823_int : std_logic ;
signal fmc150_adc_dly_str_int : std_logic_vector(4 downto 0);
signal fmc150_adc_dly_cha_int : std_logic_vector(4 downto 0);
signal fmc150_adc_dly_chb_int : std_logic_vector(4 downto 0);
signal ack_sreg : std_logic_vector(9 downto 0);
signal rddata_reg : std_logic_vector(31 downto 0);
signal wrdata_reg : std_logic_vector(31 downto 0);
signal bwsel_reg : std_logic_vector(3 downto 0);
signal rwaddr_reg : std_logic_vector(2 downto 0);
signal ack_in_progress : std_logic ;
signal wr_int : std_logic ;
signal rd_int : std_logic ;
signal allones : std_logic_vector(31 downto 0);
signal allzeros : std_logic_vector(31 downto 0);
begin
-- Some internal signals assignments. For (foreseen) compatibility with other bus standards.
wrdata_reg <= wb_dat_i;
bwsel_reg <= wb_sel_i;
rd_int <= wb_cyc_i and (wb_stb_i and (not wb_we_i));
wr_int <= wb_cyc_i and (wb_stb_i and wb_we_i);
allones <= (others => '1');
allzeros <= (others => '0');
--
-- Main register bank access process.
process (clk_sys_i, rst_n_i)
begin
if (rst_n_i = '0') then
ack_sreg <= "0000000000";
ack_in_progress <= '0';
rddata_reg <= "00000000000000000000000000000000";
fmc150_flgs_pulse_int <= '0';
fmc150_flgs_pulse_int_delay <= '0';
fmc150_flgs_in_spi_rw_int <= '0';
fmc150_flgs_in_ext_clk_int <= '0';
fmc150_addr_int <= "0000000000000000";
fmc150_data_in_int <= "00000000000000000000000000000000";
fmc150_cs_cdce72010_int <= '0';
fmc150_cs_ads62p49_int <= '0';
fmc150_cs_dac3283_int <= '0';
fmc150_cs_amc7823_int <= '0';
fmc150_adc_dly_str_int <= "00000";
fmc150_adc_dly_cha_int <= "00000";
fmc150_adc_dly_chb_int <= "00000";
elsif rising_edge(clk_sys_i) then
-- advance the ACK generator shift register
ack_sreg(8 downto 0) <= ack_sreg(9 downto 1);
ack_sreg(9) <= '0';
if (ack_in_progress = '1') then
if (ack_sreg(0) = '1') then
ack_in_progress <= '0';
else
fmc150_flgs_pulse_int <= fmc150_flgs_pulse_int_delay;
fmc150_flgs_pulse_int_delay <= '0';
end if;
else
if ((wb_cyc_i = '1') and (wb_stb_i = '1')) then
case rwaddr_reg(2 downto 0) is
when "000" =>
if (wb_we_i = '1') then
fmc150_flgs_pulse_int <= wrdata_reg(0);
fmc150_flgs_pulse_int_delay <= wrdata_reg(0);
end if;
rddata_reg(0) <= 'X';
rddata_reg(1) <= 'X';
rddata_reg(2) <= 'X';
rddata_reg(3) <= 'X';
rddata_reg(4) <= 'X';
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(4) <= '1';
ack_in_progress <= '1';
when "001" =>
if (wb_we_i = '1') then
fmc150_flgs_in_spi_rw_int <= wrdata_reg(0);
fmc150_flgs_in_ext_clk_int <= wrdata_reg(1);
end if;
rddata_reg(0) <= fmc150_flgs_in_spi_rw_int;
rddata_reg(1) <= fmc150_flgs_in_ext_clk_int;
rddata_reg(2) <= 'X';
rddata_reg(3) <= 'X';
rddata_reg(4) <= 'X';
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "010" =>
if (wb_we_i = '1') then
fmc150_addr_int <= wrdata_reg(15 downto 0);
end if;
rddata_reg(15 downto 0) <= fmc150_addr_int;
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "011" =>
if (wb_we_i = '1') then
fmc150_data_in_int <= wrdata_reg(31 downto 0);
end if;
rddata_reg(31 downto 0) <= fmc150_data_in_int;
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "100" =>
if (wb_we_i = '1') then
fmc150_cs_cdce72010_int <= wrdata_reg(0);
fmc150_cs_ads62p49_int <= wrdata_reg(1);
fmc150_cs_dac3283_int <= wrdata_reg(2);
fmc150_cs_amc7823_int <= wrdata_reg(3);
end if;
rddata_reg(0) <= fmc150_cs_cdce72010_int;
rddata_reg(1) <= fmc150_cs_ads62p49_int;
rddata_reg(2) <= fmc150_cs_dac3283_int;
rddata_reg(3) <= fmc150_cs_amc7823_int;
rddata_reg(4) <= 'X';
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "101" =>
if (wb_we_i = '1') then
fmc150_adc_dly_str_int <= wrdata_reg(4 downto 0);
fmc150_adc_dly_cha_int <= wrdata_reg(12 downto 8);
fmc150_adc_dly_chb_int <= wrdata_reg(20 downto 16);
end if;
rddata_reg(4 downto 0) <= fmc150_adc_dly_str_int;
rddata_reg(12 downto 8) <= fmc150_adc_dly_cha_int;
rddata_reg(20 downto 16) <= fmc150_adc_dly_chb_int;
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "110" =>
if (wb_we_i = '1') then
end if;
rddata_reg(31 downto 0) <= regs_i.data_out_i;
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when "111" =>
if (wb_we_i = '1') then
end if;
rddata_reg(0) <= regs_i.flgs_out_spi_busy_i;
rddata_reg(1) <= regs_i.flgs_out_pll_status_i;
rddata_reg(2) <= regs_i.flgs_out_adc_clk_locked_i;
rddata_reg(3) <= regs_i.flgs_out_fmc_prst_i;
rddata_reg(4) <= 'X';
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
ack_sreg(0) <= '1';
ack_in_progress <= '1';
when others =>
-- prevent the slave from hanging the bus on invalid address
ack_in_progress <= '1';
ack_sreg(0) <= '1';
end case;
end if;
end if;
end if;
end process;
-- Drive the data output bus
wb_dat_o <= rddata_reg;
-- Update ADC delay
process (clk_100Mhz, rst_n_i)
begin
if (rst_n_i = '0') then
regs_o.flgs_pulse_o <= '0';
fmc150_flgs_pulse_sync0 <= '0';
fmc150_flgs_pulse_sync1 <= '0';
fmc150_flgs_pulse_sync2 <= '0';
elsif rising_edge(clk_100Mhz) then
fmc150_flgs_pulse_sync0 <= fmc150_flgs_pulse_int;
fmc150_flgs_pulse_sync1 <= fmc150_flgs_pulse_sync0;
fmc150_flgs_pulse_sync2 <= fmc150_flgs_pulse_sync1;
regs_o.flgs_pulse_o <= fmc150_flgs_pulse_sync2 and (not fmc150_flgs_pulse_sync1);
end if;
end process;
-- SPI Read/Write flag
regs_o.flgs_in_spi_rw_o <= fmc150_flgs_in_spi_rw_int;
-- External Clock for ADC
regs_o.flgs_in_ext_clk_o <= fmc150_flgs_in_ext_clk_int;
-- SPI address
regs_o.addr_o <= fmc150_addr_int;
-- Data In for FMC150
regs_o.data_in_o <= fmc150_data_in_int;
-- Chipselect for cdce72010
regs_o.cs_cdce72010_o <= fmc150_cs_cdce72010_int;
-- Chipselect for ads62p49
regs_o.cs_ads62p49_o <= fmc150_cs_ads62p49_int;
-- Chipselect for dac3283
regs_o.cs_dac3283_o <= fmc150_cs_dac3283_int;
-- Chipselect for amc7823
regs_o.cs_amc7823_o <= fmc150_cs_amc7823_int;
-- ADC Strobe delay
regs_o.adc_dly_str_o <= fmc150_adc_dly_str_int;
-- ADC Channel A delay
regs_o.adc_dly_cha_o <= fmc150_adc_dly_cha_int;
-- ADC Strobe delay
regs_o.adc_dly_chb_o <= fmc150_adc_dly_chb_int;
-- Data out from FMC150
-- SPI Busy
-- CDCE72010 PLL Status
-- FPGA ADC clock locked
-- FMC present
rwaddr_reg <= wb_adr_i;
wb_stall_o <= (not ack_sreg(0)) and (wb_stb_i and wb_cyc_i);
-- ACK signal generation. Just pass the LSB of ACK counter.
wb_ack_o <= ack_sreg(0);
end syn;
-- Description of the wishbone interface for the wb_dma_interface core
peripheral {
name = "FMC ADC/DAC interface registers";
description = "FMC ADC/DAC interface";
-- Prefix for all generated ports
prefix = "fmc150";
-- Name of the vhdl entity to be generated
hdl_entity = "wb_fmc150_port";
-- Flags Pulse
reg {
name = "Input Flags for Pulsing Registers";
prefix = "flgs_pulse";
field {
name = "Update ADC delay";
description = "write 1: pulse ADC delay register.\
write 0: no effect";
--prefix = "start";
-- Pulse to start
type = MONOSTABLE;
clock = "clk_100Mhz";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
-- Input Flags
reg {
name = "Input Flags for FMC150";
prefix = "flgs_in";
field {
name = "SPI Read/Write flag";
description = "write 1: write to SPI. \
write 0: read from SPI";
prefix = "spi_rw";
type = BIT;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
field {
name = "External Clock for ADC";
description = "write 1: external clock for ADC. \
write 0: internal clock for ADC";
prefix = "ext_clk";
type = BIT;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
-- Address
reg {
name = "Address for Chips on FMC150";
prefix = "addr";
field {
name = "SPI address";
description = "Address of internal register";
--prefix = "addr";
type = SLV;
size = 16;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
-- Data In
reg {
name = "Data In for Chips on FMC150";
prefix = "data_in";
field {
name = "Data In for FMC150";
description = "Data to internal chip register";
--prefix = "data";
type = SLV;
size = 32;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
-- Chipselect
reg {
name = "Chipselect for Chips on FMC150";
prefix = "cs";
field {
name = "Chipselect for cdce72010";
description = "write 1: select chip cdce72010 for operation.\
write 0: no effect";
prefix = "cdce72010";
type = BIT;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
field {
name = "Chipselect for ads62p49";
description = "write 1: select chip ads62p49 for operation.\
write 0: no effect";
prefix = "ads62p49";
type = BIT;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
field {
name = "Chipselect for dac3283";
description = "write 1: select chip dac3283 for operation.\
write 0: no effect";
prefix = "dac3283";
type = BIT;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
field {
name = "Chipselect for amc7823";
description = "write 1: select chip amc7823 for operation.\
write 0: no effect";
prefix = "amc7823";
type = BIT;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
-- ADC delay
reg {
name = "ADC Delay";
prefix = "adc_dly";
field {
name = "ADC Strobe delay";
description = "write the strobe delay";
prefix = "str";
type = SLV;
size = 5;
align = 8;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
field {
name = "ADC Channel A delay";
description = "write the channel A delay";
prefix = "cha";
type = SLV;
size = 5;
align = 8;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
field {
name = "ADC Strobe delay";
description = "write the channel B delay";
prefix = "chb";
type = SLV;
size = 5;
align = 8;
--clock = "";
access_bus = READ_WRITE;
access_dev = READ_ONLY;
};
};
-- Data Out
reg {
name = "Data Out From Chips on FMC150";
prefix = "data_out";
field {
name = "Data out from FMC150";
description = "Data from internal chip register";
--prefix = "data";
type = SLV;
size = 32;
--clock = "";
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
};
-- Flags out
reg {
name = "Flags out from Chips on FMC150";
prefix = "flgs_out";
field {
name = "SPI Busy";
description = "read 1: spi busy.\
read 0: spi idle";
prefix = "spi_busy";
type = BIT;
--clock = "";
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
field {
name = "CDCE72010 PLL Status";
description = "read 1: PLL locked.\
read 0: PLL not locked";
prefix = "pll_status";
type = BIT;
--clock = "";
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
field {
name = "FPGA ADC clock locked";
description = "read 1: FPGA ADC PLL locked.\
read 0: FPGA ADC PLL not locked";
prefix = "adc_clk_locked";
type = BIT;
--clock = "";
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
field {
name = "FMC present";
description = "read 1: FMC present.\
read 0: FMC not present";
prefix = "fmc_prst";
type = BIT;
--clock = "";
access_bus = READ_ONLY;
access_dev = WRITE_ONLY;
};
};
};
---------------------------------------------------------------------------------------
-- Title : Wishbone slave core for FMC ADC/DAC interface registers
---------------------------------------------------------------------------------------
-- File : xfmc150_regs_pkg.vhd
-- Author : auto-generated by wbgen2 from xfmc150.wb
-- Created : Mon Oct 1 15:20:18 2012
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE xfmc150.wb
-- DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
---------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package fmc150_wbgen2_pkg is
-- Input registers (user design -> WB slave)
type t_fmc150_in_registers is record
data_out_i : std_logic_vector(31 downto 0);
flgs_out_spi_busy_i : std_logic;
flgs_out_pll_status_i : std_logic;
flgs_out_adc_clk_locked_i : std_logic;
flgs_out_fmc_prst_i : std_logic;
end record;
constant c_fmc150_in_registers_init_value: t_fmc150_in_registers := (
data_out_i => (others => '0'),
flgs_out_spi_busy_i => '0',
flgs_out_pll_status_i => '0',
flgs_out_adc_clk_locked_i => '0',
flgs_out_fmc_prst_i => '0'
);
-- Output registers (WB slave -> user design)
type t_fmc150_out_registers is record
flgs_pulse_o : std_logic;
flgs_in_spi_rw_o : std_logic;
flgs_in_ext_clk_o : std_logic;
addr_o : std_logic_vector(15 downto 0);
data_in_o : std_logic_vector(31 downto 0);
cs_cdce72010_o : std_logic;
cs_ads62p49_o : std_logic;
cs_dac3283_o : std_logic;
cs_amc7823_o : std_logic;
adc_dly_str_o : std_logic_vector(4 downto 0);
adc_dly_cha_o : std_logic_vector(4 downto 0);
adc_dly_chb_o : std_logic_vector(4 downto 0);
end record;
constant c_fmc150_out_registers_init_value: t_fmc150_out_registers := (
flgs_pulse_o => '0',
flgs_in_spi_rw_o => '0',
flgs_in_ext_clk_o => '0',
addr_o => (others => '0'),
data_in_o => (others => '0'),
cs_cdce72010_o => '0',
cs_ads62p49_o => '0',
cs_dac3283_o => '0',
cs_amc7823_o => '0',
adc_dly_str_o => (others => '0'),
adc_dly_cha_o => (others => '0'),
adc_dly_chb_o => (others => '0')
);
function "or" (left, right: t_fmc150_in_registers) return t_fmc150_in_registers;
function f_x_to_zero (x:std_logic) return std_logic;
function f_x_to_zero (x:std_logic_vector) return std_logic_vector;
end package;
package body fmc150_wbgen2_pkg is
function f_x_to_zero (x:std_logic) return std_logic is
begin
if(x = 'X' or x = 'U') then
return '0';
else
return x;
end if;
end function;
function f_x_to_zero (x:std_logic_vector) return std_logic_vector is
variable tmp: std_logic_vector(x'length-1 downto 0);
begin
for i in 0 to x'length-1 loop
if(x(i) = 'X' or x(i) = 'U') then
tmp(i):= '0';
else
tmp(i):=x(i);
end if;
end loop;
return tmp;
end function;
function "or" (left, right: t_fmc150_in_registers) return t_fmc150_in_registers is
variable tmp: t_fmc150_in_registers;
begin
tmp.data_out_i := f_x_to_zero(left.data_out_i) or f_x_to_zero(right.data_out_i);
tmp.flgs_out_spi_busy_i := f_x_to_zero(left.flgs_out_spi_busy_i) or f_x_to_zero(right.flgs_out_spi_busy_i);
tmp.flgs_out_pll_status_i := f_x_to_zero(left.flgs_out_pll_status_i) or f_x_to_zero(right.flgs_out_pll_status_i);
tmp.flgs_out_adc_clk_locked_i := f_x_to_zero(left.flgs_out_adc_clk_locked_i) or f_x_to_zero(right.flgs_out_adc_clk_locked_i);
tmp.flgs_out_fmc_prst_i := f_x_to_zero(left.flgs_out_fmc_prst_i) or f_x_to_zero(right.flgs_out_fmc_prst_i);
return tmp;
end function;
end package body;
/*
Register definitions for slave core: FMC ADC/DAC interface registers
* File : xfmc150_regs_regs.h
* Author : auto-generated by wbgen2 from xfmc150.wb
* Created : Mon Oct 1 15:20:18 2012
* Standard : ANSI C
THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE xfmc150.wb
DO NOT HAND-EDIT UNLESS IT'S ABSOLUTELY NECESSARY!
*/
#ifndef __WBGEN2_REGDEFS_XFMC150_WB
#define __WBGEN2_REGDEFS_XFMC150_WB
#include <inttypes.h>
#if defined( __GNUC__)
#define PACKED __attribute__ ((packed))
#else
#error "Unsupported compiler?"
#endif
#ifndef __WBGEN2_MACROS_DEFINED__
#define __WBGEN2_MACROS_DEFINED__
#define WBGEN2_GEN_MASK(offset, size) (((1<<(size))-1) << (offset))
#define WBGEN2_GEN_WRITE(value, offset, size) (((value) & ((1<<(size))-1)) << (offset))
#define WBGEN2_GEN_READ(reg, offset, size) (((reg) >> (offset)) & ((1<<(size))-1))
#define WBGEN2_SIGN_EXTEND(value, bits) (((value) & (1<<bits) ? ~((1<<(bits))-1): 0 ) | (value))
#endif
/* definitions for register: Input Flags for Pulsing Registers */
/* definitions for register: Input Flags for FMC150 */
/* definitions for field: SPI Read/Write flag in reg: Input Flags for FMC150 */
#define FMC150_FLGS_IN_SPI_RW WBGEN2_GEN_MASK(0, 1)
/* definitions for field: External Clock for ADC in reg: Input Flags for FMC150 */
#define FMC150_FLGS_IN_EXT_CLK WBGEN2_GEN_MASK(1, 1)
/* definitions for register: Address for Chips on FMC150 */
/* definitions for register: Data In for Chips on FMC150 */
/* definitions for register: Chipselect for Chips on FMC150 */
/* definitions for field: Chipselect for cdce72010 in reg: Chipselect for Chips on FMC150 */
#define FMC150_CS_CDCE72010 WBGEN2_GEN_MASK(0, 1)
/* definitions for field: Chipselect for ads62p49 in reg: Chipselect for Chips on FMC150 */
#define FMC150_CS_ADS62P49 WBGEN2_GEN_MASK(1, 1)
/* definitions for field: Chipselect for dac3283 in reg: Chipselect for Chips on FMC150 */
#define FMC150_CS_DAC3283 WBGEN2_GEN_MASK(2, 1)
/* definitions for field: Chipselect for amc7823 in reg: Chipselect for Chips on FMC150 */
#define FMC150_CS_AMC7823 WBGEN2_GEN_MASK(3, 1)
/* definitions for register: ADC Delay */
/* definitions for field: ADC Strobe delay in reg: ADC Delay */
#define FMC150_ADC_DLY_STR_MASK WBGEN2_GEN_MASK(0, 5)
#define FMC150_ADC_DLY_STR_SHIFT 0
#define FMC150_ADC_DLY_STR_W(value) WBGEN2_GEN_WRITE(value, 0, 5)
#define FMC150_ADC_DLY_STR_R(reg) WBGEN2_GEN_READ(reg, 0, 5)
/* definitions for field: ADC Channel A delay in reg: ADC Delay */
#define FMC150_ADC_DLY_CHA_MASK WBGEN2_GEN_MASK(8, 5)
#define FMC150_ADC_DLY_CHA_SHIFT 8
#define FMC150_ADC_DLY_CHA_W(value) WBGEN2_GEN_WRITE(value, 8, 5)
#define FMC150_ADC_DLY_CHA_R(reg) WBGEN2_GEN_READ(reg, 8, 5)
/* definitions for field: ADC Strobe delay in reg: ADC Delay */
#define FMC150_ADC_DLY_CHB_MASK WBGEN2_GEN_MASK(16, 5)
#define FMC150_ADC_DLY_CHB_SHIFT 16
#define FMC150_ADC_DLY_CHB_W(value) WBGEN2_GEN_WRITE(value, 16, 5)
#define FMC150_ADC_DLY_CHB_R(reg) WBGEN2_GEN_READ(reg, 16, 5)
/* definitions for register: Data Out From Chips on FMC150 */
/* definitions for register: Flags out from Chips on FMC150 */
/* definitions for field: SPI Busy in reg: Flags out from Chips on FMC150 */
#define FMC150_FLGS_OUT_SPI_BUSY WBGEN2_GEN_MASK(0, 1)
/* definitions for field: CDCE72010 PLL Status in reg: Flags out from Chips on FMC150 */
#define FMC150_FLGS_OUT_PLL_STATUS WBGEN2_GEN_MASK(1, 1)
/* definitions for field: FPGA ADC clock locked in reg: Flags out from Chips on FMC150 */
#define FMC150_FLGS_OUT_ADC_CLK_LOCKED WBGEN2_GEN_MASK(2, 1)
/* definitions for field: FMC present in reg: Flags out from Chips on FMC150 */
#define FMC150_FLGS_OUT_FMC_PRST WBGEN2_GEN_MASK(3, 1)
PACKED struct FMC150_WB {
/* [0x0]: REG Input Flags for Pulsing Registers */
uint32_t FLGS_PULSE;
/* [0x4]: REG Input Flags for FMC150 */
uint32_t FLGS_IN;
/* [0x8]: REG Address for Chips on FMC150 */
uint32_t ADDR;
/* [0xc]: REG Data In for Chips on FMC150 */
uint32_t DATA_IN;
/* [0x10]: REG Chipselect for Chips on FMC150 */
uint32_t CS;
/* [0x14]: REG ADC Delay */
uint32_t ADC_DLY;
/* [0x18]: REG Data Out From Chips on FMC150 */
uint32_t DATA_OUT;
/* [0x1c]: REG Flags out from Chips on FMC150 */
uint32_t FLGS_OUT;
};
#endif
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.wb_fmc150_pkg.all;
use work.wb_stream_pkg.all;
entity wb_fmc150 is
generic
(
g_packet_size : natural := 32
);
port
(
rst_n_i : in std_logic;
clk_sys_i : in std_logic;
clk_100Mhz_i : in std_logic;
clk_200Mhz_i : in std_logic;
-----------------------------
-- Wishbone signals
-----------------------------
wb_slv_i : t_wishbone_slave_in;
wb_slv_o : t_wishbone_slave_out;
-----------------------------
-- External ports
-----------------------------
--Clock/Data connection to ADC on FMC150 (ADS62P49)
adc_clk_ab_p_i : in std_logic;
adc_clk_ab_n_i : in std_logic;
adc_cha_p_i : in std_logic_vector(6 downto 0);
adc_cha_n_i : in std_logic_vector(6 downto 0);
adc_chb_p_i : in std_logic_vector(6 downto 0);
adc_chb_n_i : in std_logic_vector(6 downto 0);
--Clock/Data connection to DAC on FMC150 (DAC3283)
dac_dclk_p_o : out std_logic;
dac_dclk_n_o : out std_logic;
dac_data_p_o : out std_logic_vector(7 downto 0);
dac_data_n_o : out std_logic_vector(7 downto 0);
dac_frame_p_o : out std_logic;
dac_frame_n_o : out std_logic;
txenable_o : out std_logic;
--Clock/Trigger connection to FMC150
clk_to_fpga_p_i : in std_logic;
clk_to_fpga_n_i : in std_logic;
ext_trigger_p_i : in std_logic;
ext_trigger_n_i : in std_logic;
-- Control signals from/to FMC150
--Serial Peripheral Interface (SPI)
spi_sclk_o : out std_logic; -- Shared SPI clock line
spi_sdata_o : out std_logic; -- Shared SPI data line
-- ADC specific signals
adc_n_en_o : out std_logic; -- SPI chip select
adc_sdo_i : in std_logic; -- SPI data out
adc_reset_o : out std_logic; -- SPI reset
-- CDCE specific signals
cdce_n_en_o : out std_logic; -- SPI chip select
cdce_sdo_i : in std_logic; -- SPI data out
cdce_n_reset_o : out std_logic;
cdce_n_pd_o : out std_logic;
cdce_ref_en_o : out std_logic;
cdce_pll_status_i : in std_logic;
-- DAC specific signals
dac_n_en_o : out std_logic; -- SPI chip select
dac_sdo_i : in std_logic; -- SPI data out
-- Monitoring specific signals
mon_n_en_o : out std_logic; -- SPI chip select
mon_sdo_i : in std_logic; -- SPI data out
mon_n_reset_o : out std_logic;
mon_n_int_i : in std_logic;
--FMC Present status
prsnt_m2c_l_i : in std_logic;
-- Wishbone Streaming Interface Source
wbs_source_i : t_wbs_source_in;
wbs_source_o : t_wbs_source_out;
);
end wb_fmc150;
architecture rtl of wb_fmc150 is
component wb_fmc150
generic
(
g_packet_size : natural := 32
);
port
(
rst_n_i : in std_logic;
clk_sys_i : in std_logic;
clk_100Mhz_i : in std_logic;
clk_200Mhz_i : in std_logic;
-----------------------------
-- Wishbone signals
-----------------------------
wb_adr_i : in std_logic_vector(c_wishbone_address_width-1 downto 0) := (others => '0');
wb_dat_i : in std_logic_vector(c_wishbone_data_width-1 downto 0) := (others => '0');
wb_dat_o : out std_logic_vector(c_wishbone_data_width-1 downto 0);
wb_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0) := (others => '0');
wb_we_i : in std_logic := '0';
wb_cyc_i : in std_logic := '0';
wb_stb_i : in std_logic := '0';
wb_ack_o : out std_logic;
wb_err_o : out std_logic;
wb_rty_o : out std_logic;
wb_stall_o : out std_logic;
-----------------------------
-- External ports
-----------------------------
--Clock/Data connection to ADC on FMC150 (ADS62P49)
adc_clk_ab_p_i : in std_logic;
adc_clk_ab_n_i : in std_logic;
adc_cha_p_i : in std_logic_vector(6 downto 0);
adc_cha_n_i : in std_logic_vector(6 downto 0);
adc_chb_p_i : in std_logic_vector(6 downto 0);
adc_chb_n_i : in std_logic_vector(6 downto 0);
--Clock/Data connection to DAC on FMC150 (DAC3283)
dac_dclk_p_o : out std_logic;
dac_dclk_n_o : out std_logic;
dac_data_p_o : out std_logic_vector(7 downto 0);
dac_data_n_o : out std_logic_vector(7 downto 0);
dac_frame_p_o : out std_logic;
dac_frame_n_o : out std_logic;
txenable_o : out std_logic;
--Clock/Trigger connection to FMC150
clk_to_fpga_p_i : in std_logic;
clk_to_fpga_n_i : in std_logic;
ext_trigger_p_i : in std_logic;
ext_trigger_n_i : in std_logic;
-- Control signals from/to FMC150
--Serial Peripheral Interface (SPI)
spi_sclk_o : out std_logic; -- Shared SPI clock line
spi_sdata_o : out std_logic; -- Shared SPI data line
-- ADC specific signals
adc_n_en_o : out std_logic; -- SPI chip select
adc_sdo_i : in std_logic; -- SPI data out
adc_reset_o : out std_logic; -- SPI reset
-- CDCE specific signals
cdce_n_en_o : out std_logic; -- SPI chip select
cdce_sdo_i : in std_logic; -- SPI data out
cdce_n_reset_o : out std_logic;
cdce_n_pd_o : out std_logic;
cdce_ref_en_o : out std_logic;
cdce_pll_status_i : in std_logic;
-- DAC specific signals
dac_n_en_o : out std_logic; -- SPI chip select
dac_sdo_i : in std_logic; -- SPI data out
-- Monitoring specific signals
mon_n_en_o : out std_logic; -- SPI chip select
mon_sdo_i : in std_logic; -- SPI data out
mon_n_reset_o : out std_logic;
mon_n_int_i : in std_logic;
--FMC Present status
prsnt_m2c_l_i : in std_logic;
-- Wishbone Streaming Interface Source
wbs_adr_o : out std_logic_vector(c_wbs_address_width-1 downto 0);
wbs_dat_o : out std_logic_vector(c_wbs_data_width-1 downto 0);
wbs_cyc_o : out std_logic;
wbs_stb_o : out std_logic;
wbs_we_o : out std_logic;
wbs_sel_o : out std_logic_vector((c_wbs_data_width/8)-1 downto 0);
wbs_ack_i : in std_logic;
wbs_stall_i : in std_logic;
wbs_err_i : in std_logic;
wbs_rty_i : in std_logic
);
end component;
begin
cmp_wb_fmc150 : wb_fmc150
generic map
(
g_packet_size => g_packet_size
);
port
(
rst_n_i => rst_n_i,
clk_sys_i => clk_sys_i,
clk_100Mhz_i => clk_100Mhz_i,
clk_200Mhz_i => clk_200Mhz_i,
-----------------------------
-- Wishbone signals
-----------------------------
wb_adr_i => wb_adr_i,
wb_dat_i => wb_dat_i,
wb_dat_o => wb_dat_o,
wb_sel_i => wb_sel_i,
wb_we_i => wb_we_i,
wb_cyc_i => wb_cyc_i,
wb_stb_i => wb_stb_i,
wb_ack_o => wb_ack_o,
wb_err_o => wb_err_o,
wb_rty_o => wb_rty_o,
wb_stall_o => wb_stall_o,
-----------------------------
-- External ports
-----------------------------
--Clock/Data connection to ADC on FMC150 (ADS62P49)
adc_clk_ab_p_i => adc_clk_ab_p_i,
adc_clk_ab_n_i => adc_clk_ab_n_i,
adc_cha_p_i => adc_cha_p_i,
adc_cha_n_i => adc_cha_n_i,
adc_chb_p_i => adc_chb_p_i,
adc_chb_n_i => adc_chb_n_i,
--Clock/Data connection to DAC on FMC150 (DAC3283)
dac_dclk_p_o => dac_dclk_p_o,
dac_dclk_n_o => dac_dclk_n_o,
dac_data_p_o => dac_data_p_o,
dac_data_n_o => dac_data_n_o,
dac_frame_p_o => dac_frame_p_o,
dac_frame_n_o => dac_frame_n_o,
txenable_o => txenable_o,
--Clock/Trigger connection to FMC150
clk_to_fpga_p_i => clk_to_fpga_p_i,
clk_to_fpga_n_i => clk_to_fpga_n_i,
ext_trigger_p_i => ext_trigger_p_i,
ext_trigger_n_i => ext_trigger_n_i,
-- Control signals from/to FMC150
--Serial Peripheral Interface (SPI)
spi_sclk_o => spi_sclk_o, -- Shared SPI clock line
spi_sdata_o => spi_sdata_o, -- Shared SPI data line
-- ADC specific signals
adc_n_en_o => adc_n_en_o -- SPI chip select
adc_sdo_i => adc_sdo_i -- SPI data out
adc_reset_o => adc_reset_o -- SPI reset
-- CDCE specific signals
cdce_n_en_o => cdce_n_en_o -- SPI chip select
cdce_sdo_i => cdce_sdo_i -- SPI data out
cdce_n_reset_o => cdce_n_reset_o
cdce_n_pd_o => cdce_n_pd_o
cdce_ref_en_o => cdce_ref_en_o
cdce_pll_status_i => cdce_pll_status_i
-- DAC specific signals
dac_n_en_o => dac_n_en_o,-- SPI chip select
dac_sdo_i => dac_sdo_i, -- SPI data out
-- Monitoring specific signals
mon_n_en_o => mon_n_en_o, -- SPI chip select
mon_sdo_i => mon_sdo_i, -- SPI data out
mon_n_reset_o => mon_n_reset_o,
mon_n_int_i => mon_n_int_i,
--FMC Present status
prsnt_m2c_l_i => prsnt_m2c_l_i,
-- Wishbone Streaming Interface Source
wbs_adr_o => wbs_adr_o,
wbs_dat_o => wbs_dat_o,
wbs_cyc_o => wbs_cyc_o,
wbs_stb_o => wbs_stb_o,
wbs_we_o => wbs_we_o,
wbs_sel_o => wbs_sel_o,
wbs_ack_i => wbs_ack_i,
wbs_stall_i => wbs_stall_i,
wbs_err_i => wbs_err_i,
wbs_rty_i => wbs_rty_i
);
end component;
wbs_source_i.ack <= wbs_ack_i;
wbs_source_i.stall <= wbs_stall_i;
wbs_source_i.err <= wbs_err_i;
wbs_source_i.rty <= wbs_rty_i;
wbs_source_o.adr <= wbs_adr_o;
wbs_source_o.dat <= wbs_dat_o;
wbs_source_o.cyc <= wbs_cyc_o;
wbs_source_o.stb <= wbs_stb_o;
wbs_source_o.we <= wbs_we_o;
wbs_source_o.sel <= wbs_sel_o;
wb_slave_i.cyc <= wb_cyc_i;
wb_slave_i.stb <= wb_stb_i;
wb_slave_i.adr <= wb_adr_i;
wb_slave_i.sel <= wb_sel_i;
wb_slave_i.we <= wb_we_i;
wb_slave_i.dat <= wb_dat_i;
wb_slave_o.ack <= wb_ack_o;
wb_slave_o.err <= wb_err_o;
wb_slave_o.rty <= wb_rty_o;
wb_slave_o.stall <= wb_stall_o;
wb_slave_o.int <= '0';
wb_slave_o.dat <= wb_dat_o;
end rtl;
files = ["xwb_irq_mngr.vhd", "wb_irq_mngr.vhd"]
-- Simple IRQ Manager
-- Based on the original design by:
--
-- Fabrice Mousset (fabrice.mousset@laposte.net)
-- Project : Wishbone Interruption Manager (ARMadeus wishbone example)
-- See: http://www.armadeus.com/wiki/index.php?title=A_simple_design_with_Wishbone_bus
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use work.wishbone_pkg.all;
use work.gencores_pkg.all;
entity wb_irq_mngr is
generic(
g_irq_count : integer := 16;
g_irq_level : std_logic := '1';
g_interface_mode : t_wishbone_interface_mode := CLASSIC;
g_address_granularity : t_wishbone_address_granularity := BYTE
);
port(
-- Global Signals
clk_sys_i : in std_logic;
rst_n_i : in std_logic;
-- Wishbone interface signals
wb_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
wb_cyc_i : in std_logic;
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_adr_i : in std_logic_vector(c_wishbone_data_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;
--slave_i : in t_wishbone_slave_in;
--slave_o : out t_wishbone_slave_out;
-- irq from other IP
irq_req_i : in std_logic_vector(g_irq_count-1 downto 0);
-- Component external signals
irq_req_o : out std_logic
);
end wb_irq_mngr;
architecture rtl of wb_irq_mngr is
-- Read/Write regs
constant c_IRQ_REG_MASK : std_logic_vector(2 downto 0) := "000"; -- *reg* IRQ mask
constant c_IRQ_REG_ACK : std_logic_vector(2 downto 0) := "001"; -- *reg* IRQ acknowledge from master
-- Read regs
constant c_IRQ_REG_PEND : std_logic_vector(2 downto 0) := "010"; -- *reg* IRQ pending
-- Slave Wishbone structs
signal wb_in : t_wishbone_slave_in;
signal wb_out : t_wishbone_slave_out;
-- IRQ signals
signal irq_r : std_logic_vector(g_irq_count-1 downto 0);
signal irq_old : std_logic_vector(g_irq_count-1 downto 0);
signal irq_pend : std_logic_vector(g_irq_count-1 downto 0);
signal irq_ack : std_logic_vector(g_irq_count-1 downto 0);
signal irq_mask : std_logic_vector(g_irq_count-1 downto 0);
signal readdata : std_logic_vector(c_wishbone_data_width-1 downto 0);
signal rd_ack : std_logic;
signal wr_ack : std_logic;
signal sel : std_logic;
begin
-- External signals synchronization process
gen_sync_ff : for i in 0 to g_irq_count-1 generate
cmp_input_sync : gc_sync_ffs
generic map (
g_sync_edge => "positive")
port map (
rst_n_i => rst_n_i,
clk_i => clk_sys_i,
data_i => irq_req_i(i),
synced_o => irq_old(i),
ppulse_o => irq_r(i));
end generate gen_sync_ff;
-- Simple sel bus aggregate
sel <= '1' when (unsigned(not wb_in.sel) = 0) else '0';
-- Slave adapter for granularity (byte, word) and interface mode (classic, pipelined)
cmp_slv_adapter : wb_slave_adapter
generic map (
g_master_use_struct => true,
g_master_mode => CLASSIC,
g_master_granularity => WORD,
g_slave_use_struct => false,
g_slave_mode => g_interface_mode,
g_slave_granularity => g_address_granularity)
port map (
clk_sys_i => clk_sys_i,
rst_n_i => rst_n_i,
master_i => wb_out,
master_o => wb_in,
sl_adr_i => wb_adr_i,
sl_dat_i => wb_dat_i,
sl_sel_i => wb_sel_i,
sl_cyc_i => wb_cyc_i,
sl_stb_i => wb_stb_i,
sl_we_i => wb_we_i,
sl_dat_o => wb_dat_o,
sl_ack_o => wb_ack_o,
sl_stall_o => wb_stall_o
);
----------------------------------------------------------------------------
-- Interruption requests latching process on rising edge
----------------------------------------------------------------------------
p_int_req : process(clk_sys_i, rst_n_i)
begin
if(rst_n_i = '0') then
irq_pend <= (others => '0');
elsif rising_edge(clk_sys_i) then
irq_pend <= (irq_pend or (irq_r and irq_mask)) and (not irq_ack);
end if;
end process p_int_req;
----------------------------------------------------------------------------
-- Register reading process
----------------------------------------------------------------------------
p_read_reg : process(clk_sys_i, rst_n_i)
begin
if(rst_n_i = '0') then
rd_ack <= '0';
readdata <= (others => '0');
elsif rising_edge(clk_sys_i) then
rd_ack <= '0';
-- WB READ classic cycle
if(wb_in.stb = '1' and wb_in.we = '0' and wb_in.cyc = '1') then
rd_ack <= '1';
-- Decode address (partial decoding only). Word granularity.
if(wb_in.adr(4 downto 2) = c_IRQ_REG_MASK) then
readdata(g_irq_count-1 downto 0) <= irq_mask;
elsif(wb_in.adr(4 downto 2) = c_IRQ_REG_PEND) then
readdata(g_irq_count-1 downto 0) <= irq_pend;
--elsif(wbs_s1_address="10") then
--readdata <= std_logic_vector(to_unsigned(id,16));
else
readdata <= (others => '0');
end if;
end if;
end if;
end process p_read_reg;
----------------------------------------------------------------------------
-- Register update process
----------------------------------------------------------------------------
p_update_reg : process(clk_sys_i, rst_n_i)
begin
if(rst_n_i = '0') then
irq_ack <= (others => '0');
wr_ack <= '0';
irq_mask <= (others => '0');
elsif rising_edge(clk_sys_i) then
irq_ack <= (others => '0');
wr_ack <= '0';
-- WB WRITE classic cycle. Word granularity
if(wb_in.stb = '1' and wb_in.we = '0' and wb_in.cyc = '1' and sel = '1') then
wr_ack <= '1';
if(wb_in.adr(4 downto 2) = c_IRQ_REG_MASK) then
irq_mask <= wb_in.dat(g_irq_count-1 downto 0);
elsif(wb_in.adr(4 downto 2) = c_IRQ_REG_ACK) then
irq_ack <= wb_in.dat(g_irq_count-1 downto 0);
end if;
end if;
end if;
end process;
irq_req_o <= g_irq_level when(unsigned(irq_pend) /= 0 and rst_n_i = '1') else
not g_irq_level;
wb_out.ack <= rd_ack or wr_ack;
wb_out.dat <= readdata when (wb_in.stb = '1' and wb_in.we = '0' and wb_in.cyc = '1') else (others => '0');
wb_out.err <= '0';
wb_out.int <= '0';
wb_out.rty <= '0';
wb_out.stall <= '0';
end rtl;
-- Simple IRQ Manager
-- Based on the original design by:
--
-- Fabrice Mousset (fabrice.mousset@laposte.net)
-- Project : Wishbone Interruption Manager (ARMadeus wishbone example)
-- See: http://www.armadeus.com/wiki/index.php?title=A_simple_design_with_Wishbone_bus
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.wishbone_pkg.all;
use work.gencores_pkg.all;
entity xwb_irq_mngr is
generic(
g_irq_count : integer := 16;
g_irq_level : std_logic := '1';
g_interface_mode : t_wishbone_interface_mode := CLASSIC;
g_address_granularity : t_wishbone_address_granularity := BYTE
);
port(
-- Global Signals
clk_sys_i : in std_logic;
rst_n_i : in std_logic;
-- Wishbone interface signals
slave_i : in t_wishbone_slave_in;
slave_o : out t_wishbone_slave_out;
-- irq from other IP
irq_req_i : in std_logic_vector(g_irq_count-1 downto 0);
-- Component external signals
irq_req_o : out std_logic
);
end entity;
architecture rtl of xwb_irq_mngr is
component wb_irq_mngr
generic(
g_irq_count : integer := 16;
g_irq_level : std_logic := '1';
g_interface_mode : t_wishbone_interface_mode := CLASSIC;
g_address_granularity : t_wishbone_address_granularity := BYTE
);
port(
-- Global Signals
clk_sys_i : in std_logic;
rst_n_i : in std_logic;
-- Wishbone interface signals
wb_sel_i : in std_logic_vector(c_wishbone_data_width/8-1 downto 0);
wb_cyc_i : in std_logic;
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_adr_i : in std_logic_vector(c_wishbone_data_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;
--slave_i : in t_wishbone_slave_in;
--slave_o : out t_wishbone_slave_out;
-- irq from other IP
irq_req_i : in std_logic_vector(g_irq_count-1 downto 0);
-- Component external signals
irq_req_o : out std_logic
);
end component;
begin
cmp_wrapped_irq_mngr : wb_irq_mngr
generic map (
g_irq_count => g_irq_count,
g_irq_level => g_irq_level,
g_interface_mode => g_interface_mode,
g_address_granularity => g_address_granularity
)
port map (
clk_sys_i => clk_sys_i,
rst_n_i => rst_n_i,
wb_sel_i => slave_i.sel,
wb_cyc_i => slave_i.cyc,
wb_stb_i => slave_i.stb,
wb_we_i => slave_i.we,
wb_adr_i => slave_i.adr,
wb_dat_i => slave_i.dat,
wb_dat_o => slave_o.dat,
wb_ack_o => slave_o.ack,
wb_stall_o => slave_o.stall,
irq_req_i => irq_req_i,
irq_req_o => irq_req_o
);
slave_o.err <= '0';
slave_o.int <= '0';
slave_o.rty <= '0';
end rtl;
files = ["wb_stream_pkg.vhd", "xwb_stream_sink.vhd", "xwb_stream_source.vhd"]
-- Based on wb_fabric_pkg.vhd from Tomasz Wlostowski
-- Modified by Lucas Russo <lucas.russo@lnls.br>
library ieee;
use ieee.std_logic_1164.all;
package wb_stream_pkg is
-- Must be at least 2 bits wide
constant c_wbs_address_width : integer := 4;
-- Must be at least 16 bits wide
constant c_wbs_data_width : integer := 32;
subtype t_wbs_address is
std_logic_vector(c_wbs_address_width-1 downto 0);
subtype t_wbs_data is
std_logic_vector(c_wbs_data_width-1 downto 0);
subtype t_wbs_byte_select is
std_logic_vector((c_wbs_data_width/8)-1 downto 0);
constant c_WRF_DATA : unsigned(c_wbs_address_width-1 downto 0) := 0;
constant c_WRF_OOB : unsigned(c_wbs_address_width-1 downto 0) := 1;
constant c_WRF_STATUS : unsigned(c_wbs_address_width-1 downto 0) := 2;
constant c_WRF_USER : unsigned(c_wbs_address_width-1 downto 0) := 3;
--constant c_WRF_OOB_TYPE_RX : std_logic_vector(3 downto 0) := "0000";
--constant c_WRF_OOB_TYPE_TX : std_logic_vector(3 downto 0) := "0001";
type t_wb_stream_status_reg is record
is_hp : std_logic;
has_smac : std_logic;
has_crc : std_logic;
error : std_logic;
tag_me : std_logic;
match_class : std_logic_vector(7 downto 0);
end record;
type t_wbs_source_out is record
adr : t_wbs_address;
dat : c_wbs_data_width;
cyc : std_logic;
stb : std_logic;
we : std_logic;
sel : t_wbs_byte_select;
end record;
type t_wbs_source_in is record
ack : std_logic;
stall : std_logic;
err : std_logic;
rty : std_logic;
end record;
--type t_wrf_oob is record
-- valid: std_logic;
-- oob_type : std_logic_vector(3 downto 0);
-- ts_r : std_logic_vector(27 downto 0);
-- ts_f : std_logic_vector(3 downto 0);
-- frame_id : std_logic_vector(15 downto 0);
-- port_id : std_logic_vector(5 downto 0);
--end record;
subtype t_wbs_sink_in is t_wbs_source_out;
subtype t_wbs_sink_out is t_wbs_source_in;
type t_wbs_source_in_array is array (natural range <>) of t_wbs_source_in;
type t_wbs_source_out_array is array (natural range <>) of t_wbs_source_out;
subtype t_wbs_sink_in_array is t_wbs_source_out_array;
subtype t_wbs_sink_out_array is t_wbs_source_in_array;
function f_marshall_wbs_status (stat : t_wrf_status_reg) return std_logic_vector;
function f_unmarshall_wbs_status(stat : std_logic_vector) return t_wbs_status_reg;
constant cc_dummy_wbs_addr : std_logic_vector(c_wbs_address_width-1 downto 0):=
(others => 'X');
constant cc_dummy_wbs_dat : std_logic_vector(c_wbs_data_width-1 downto 0) :=
(others => 'X');
constant cc_dummy_wbs_sel : std_logic_vector(c_wbs_data_width/8-1 downto 0) :=
(others => 'X');
constant c_dummy_src_in : t_wbs_source_in :=
('0', '0', '0', '0');
constant c_dummy_snk_in : t_wbs_sink_in :=
(cc_dummy_wbs_addr, cc_dummy_wbs_dat, '0', '0', '0', cc_dummy_wbs_sel);
end wb_stream_pkg;
package body wb_stream_pkg is
function f_marshall_wbs_status(stat : t_wbs_status_reg)
return std_logic_vector is
-- Wishbone bus data_width is at least 16 bits
variable tmp : std_logic_vector(c_wbs_data_width-1 downto 0);
begin
tmp(0) := stat.is_hp;
tmp(1) := stat.error;
tmp(2) := stat.has_smac;
tmp(3) := stat.has_crc;
tmp(15 downto 8) := stat.match_class;
return tmp;
end function;
function f_unmarshall_wbs_status(stat : std_logic_vector) return t_wbs_status_reg is
variable tmp : t_wbs_status_reg;
begin
tmp.is_hp := stat(0);
tmp.error := stat(1);
tmp.has_smac := stat(2);
tmp.has_crc := stat(3);
tmp.match_class := stat(15 downto 8);
return tmp;
end function;
end wb_stream_pkg;
-------------------------------------------------------------------------------
-- Title : Wishbone Packet Fabric buffered packet sink
-- Project : WR Cores Collection
-------------------------------------------------------------------------------
-- File : xwb_fabric_sink.vhd
-- Author : Tomasz Wlostowski
-- Company : CERN BE-CO-HT
-- Created : 2012-01-16
-- Last update: 2012-01-22
-- Platform :
-- Standard : VHDL'93
-------------------------------------------------------------------------------
-- Description: A simple WB packet streaming sink with builtin FIFO buffer.
-- Outputs a trivial interface (start-of-packet, end-of-packet, data-valid)
-------------------------------------------------------------------------------
--
-- Copyright (c) 2011 CERN
--
-- This source file is free software; you can redistribute it
-- and/or modify it under the terms of the GNU Lesser General
-- Public License as published by the Free Software Foundation;
-- either version 2.1 of the License, or (at your option) any
-- later version.
--
-- This source is distributed in the hope that it will be
-- useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-- PURPOSE. See the GNU Lesser General Public License for more
-- details.
--
-- You should have received a copy of the GNU Lesser General
-- Public License along with this source; if not, download it
-- from http://www.gnu.org/licenses/lgpl-2.1.html
--
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2011-01-16 1.0 twlostow Created
-------------------------------------------------------------------------------
-- Modified by Lucas Russo <lucas.russo@lnls.br>
library ieee;
use ieee.std_logic_1164.all;
use work.genram_pkg.all;
use work.wb_stream_pkg.all;
entity xwb_stream_sink is
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
-- Wishbone Fabric Interface I/O
snk_i : in t_wbs_sink_in;
snk_o : out t_wbs_sink_out;
-- Decoded & buffered fabric
addr_o : out std_logic_vector(c_wbs_address_width-1 downto 0);
data_o : out std_logic_vector(c_wbs_data_width-1 downto 0);
dvalid_o : out std_logic;
sof_o : out std_logic;
eof_o : out std_logic;
error_o : out std_logic;
bytesel_o : out std_logic;
dreq_i : in std_logic
);
end xwb_fabric_sink;
architecture rtl of xwb_fabric_sink is
constant c_logic_width : integer := 4;
constant c_fifo_width : integer := c_wbs_data_width + c_wbs_address_width + 4;
constant c_fifo_depth : integer := 32;
constant c_logic_start : integer := c_wbs_data_width + c_wbs_address_width;
subtype c_logic_range is natural range c_wbs_address_width+c_wbs_data_width+c_logic_width-1 downto
c_wbs_address_width+c_wbs_data_width;
subtype c_data_range is natural range c_wbs_data_width-1 downto 0;
subtype c_addr_range is natural range c_wbs_address_width-1+c_wbs_data_width downto c_wbs_data_width;
signal q_valid, full, we, rd : std_logic;
signal fin, fout, fout_reg : std_logic_vector(c_fifo_width-1 downto 0);
signal cyc_d0, rd_d0 : std_logic;
signal pre_sof, pre_eof, pre_bytesel, pre_dvalid : std_logic;
signal post_sof, post_dvalid : std_logic;
signal post_addr : std_logic_vector(c_wbs_address_width-1 downto 0);
signal post_data : std_logic_vector(c_wbs_data_width-1 downto 0);
signal snk_out : t_wbs_sink_out;
begin -- rtl
p_delay_cyc_and_rd : process(clk_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
cyc_d0 <= '0';
rd_d0 <= '0';
else
if(full = '0') then
cyc_d0 <= snk_i.cyc;
end if;
rd_d0 <= rd;
end if;
end if;
end process;
pre_sof <= snk_i.cyc and not cyc_d0; -- sof
pre_eof <= not snk_i.cyc and cyc_d0; -- eof
pre_bytesel <= not snk_i.sel(0); -- bytesel
pre_dvalid <= snk_i.stb and snk_i.we and snk_i.cyc and not snk_out.stall; -- data valid
fin(c_data_range) <= snk_i.dat;
fin(c_addr_range) <= snk_i.adr;
fin(c_logic_range) <= pre_sof & pre_eof & pre_bytesel & pre_dvalid;
snk_out.stall <= full or (snk_i.cyc and not cyc_d0);
snk_out.err <= '0';
snk_out.rty <= '0';
p_gen_ack : process(clk_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
snk_out.ack <= '0';
else
snk_out.ack <= snk_i.cyc and snk_i.stb and snk_i.we and not snk_out.stall;
end if;
end if;
end process;
snk_o <= snk_out;
we <= '1' when fin(c_logic_range) /= "0000" and full = '0' else '0';
rd <= q_valid and dreq_i and not post_sof;
U_FIFO : generic_shiftreg_fifo
generic map (
g_data_width => c_fifo_width,
g_size => c_fifo_depth
)
port map (
rst_n_i => rst_n_i,
clk_i => clk_i,
d_i => fin,
we_i => we,
q_o => fout,
rd_i => rd,
almost_full_o => full,
q_valid_o => q_valid
);
p_fout_reg : process(clk_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
fout_reg <= (others => '0');
elsif(rd = '1') then
fout_reg <= fout;
end if;
end if;
end process;
post_data <= fout_reg(c_data_range);
post_addr <= fout_reg(c_addr_range);
post_sof <= fout_reg(c_logic_start+3) and rd_d0; --and q_valid;
post_dvalid <= fout_reg(c_logic_start);
sof_o <= post_sof and rd_d0;
dvalid_o <= post_dvalid and rd_d0;
error_o <= '1' when rd_d0 = '1' and (post_addr = std_logic_vector(c_WRF_STATUS)) and (f_unmarshall_wrf_status(post_data).error = '1') else '0';
eof_o <= fout_reg(c_logic_start+2) and rd_d0;
bytesel_o <= fout_reg(c_logic_start+1);
data_o <= post_data;
addr_o <= post_addr;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use work.genram_pkg.all;
use work.wb_stream_pkg.all;
entity wb_stream_sink is
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
snk_dat_i : in std_logic_vector(c_wbs_data_width-1 downto 0);
snk_adr_i : in std_logic_vector(c_wbs_address_width-1 downto 0);
snk_sel_i : in std_logic_vector((c_wbs_data_width/8)-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_ack_o : out std_logic;
snk_err_o : out std_logic;
snk_rty_o : out std_logic;
-- Decoded & buffered fabric
addr_o : out std_logic_vector(c_wbs_address_width-1 downto 0);
data_o : out std_logic_vector(c_wbs_data_width-1 downto 0);
dvalid_o : out std_logic;
sof_o : out std_logic;
eof_o : out std_logic;
error_o : out std_logic;
bytesel_o : out std_logic;
dreq_i : in std_logic
);
end wb_stream_sink;
architecture wrapper of wb_stream_sink is
component xwb_stream_sink
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
snk_i : in t_wbs_sink_in;
snk_o : out t_wbs_sink_out;
addr_o : out std_logic_vector(c_wbs_address_width-1 downto 0);
data_o : out std_logic_vector(c_wbs_data_width-1 downto 0);
dvalid_o : out std_logic;
sof_o : out std_logic;
eof_o : out std_logic;
error_o : out std_logic;
bytesel_o : out std_logic;
dreq_i : in std_logic);
end component;
signal snk_in : t_wbs_sink_in;
signal snk_out : t_wbs_sink_out;
begin -- wrapper
U_Wrapped_Sink : xwb_stream_sink
port map (
clk_i => clk_i,
rst_n_i => rst_n_i,
snk_i => snk_in,
snk_o => snk_out,
addr_o => addr_o,
data_o => data_o,
dvalid_o => dvalid_o,
sof_o => sof_o,
eof_o => eof_o,
error_o => error_o,
bytesel_o => bytesel_o,
dreq_i => dreq_i);
snk_in.adr <= snk_adr_i;
snk_in.dat <= snk_dat_i;
snk_in.stb <= snk_stb_i;
snk_in.we <= snk_we_i;
snk_in.cyc <= snk_cyc_i;
snk_in.sel <= snk_sel_i;
snk_stall_o <= snk_out.stall;
snk_ack_o <= snk_out.ack;
snk_err_o <= snk_out.err;
snk_rty_o <= snk_out.rty;
end wrapper;
-- Based on xwb_fabric_source.vhd from Tomasz Wlostowski
-- Modified by Lucas Russo <lucas.russo@lnls.br>
library ieee;
use ieee.std_logic_1164.all;
use work.genram_pkg.all;
use work.wb_stream_pkg.all;
entity xwb_stream_source is
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
-- Wishbone Fabric Interface I/O
src_i : in t_wbs_source_in;
src_o : out t_wbs_source_out;
-- Decoded & buffered logic
addr_i : in std_logic_vector(c_wbs_address_width-1 downto 0);
data_i : in std_logic_vector(c_wbs_data_width-1 downto 0);
dvalid_i : in std_logic;
sof_i : in std_logic;
eof_i : in std_logic;
error_i : in std_logic;
bytesel_i : in std_logic;
dreq_o : out std_logic
);
end xwb_fabric_source;
architecture rtl of xwb_fabric_source is
constant c_logic_width : integer := 4;
constant c_fifo_width : integer := c_wbs_data_width + c_wbs_address_width + 4;
constant c_fifo_depth : integer := 32;
constant c_logic_start : integer := c_wbs_data_width + c_wbs_address_width;
-- FIX. Workaround to vhdl limitation
constant almost_all_ones : std_logic_vector((c_wbs_data_width/8)-2 downto 0) := (others => '1');
-- FIFO out range
subtype c_logic_range is natural range c_wbs_address_width+c_wbs_data_width+c_logic_width-1 downto
c_wbs_address_width+c_wbs_data_width;
subtype c_data_range is natural range c_wbs_data_width-1 downto 0;
subtype c_addr_range is natural range c_wbs_address_width-1+c_wbs_data_width downto c_wbs_data_width;
--subtype c_sel_range is natural range c_wbs_address_width+c_wbs_data_width+(c_wbs_address_width/8)-1 downto c_wbs_address_width+c_wbs_data_width;
signal q_valid, full, we, rd, rd_d0 : std_logic;
signal fin, fout : std_logic_vector(c_fifo_width-1 downto 0);
signal pre_dvalid : std_logic;
signal pre_eof : std_logic;
signal pre_data : std_logic_vector(c_wbs_data_width-1 downto 0);
signal pre_addr : std_logic_vector(c_wbs_address_width-1 downto 0);
signal post_dvalid, post_eof, post_bytesel, post_sof : std_logic;
signal err_status : t_wrf_status_reg;
signal cyc_int : std_logic;
begin -- rtl
err_status.error <= '1';
dreq_o <= not full;
rd <= not src_i.stall;
we <= sof_i or eof_i or error_i or dvalid_i;
pre_dvalid <= dvalid_i or error_i;
pre_data <= data_i when (error_i = '0') else f_marshall_wrf_status(err_status);
pre_addr <= addr_i when (error_i = '0') else std_logic_vector(c_WRF_STATUS);
pre_eof <= error_i or eof_i;
fin <= sof_i & pre_eof & bytesel_i & pre_dvalid & pre_addr & pre_data;
U_FIFO : generic_shiftreg_fifo
generic map (
g_data_width => c_fifo_width,
g_size => c_fifo_depth
)
port map (
rst_n_i => rst_n_i,
clk_i => clk_i,
d_i => fin,
we_i => we,
q_o => fout,
rd_i => rd,
almost_full_o => full,
q_valid_o => q_valid
);
post_sof <= fout(c_logic_start+3);
post_eof <= fout(c_logic_start+2);
post_dvalid <= fout(c_logic_start);
p_gen_cyc : process(clk_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
cyc_int <= '0';
else
if(src_i.stall = '0' and q_valid = '1') then
if(post_sof = '1')then
cyc_int <= '1';
elsif(post_eof = '1') then
cyc_int <= '0';
end if;
end if;
end if;
end if;
end process;
src_o.cyc <= cyc_int or post_sof;
src_o.we <= '1';
src_o.stb <= post_dvalid and q_valid;
src_o.sel <= almost_all_ones & not fout(c_logic_start+1);
src_o.dat <= fout(c_data_range);
src_o.adr <= fout(c_addr_range);
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use work.wb_stream_pkg.all;
entity wb_stream_source is
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
-- Wishbone Fabric Interface I/O
src_dat_o : out std_logic_vector(c_wbs_address_width-1 downto 0);
src_adr_o : out std_logic_vector(c_wbs_data_width-1 downto 0);
src_sel_o : out std_logic_vector((c_wbs_data_width/8)-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_ack_i : in std_logic;
src_err_i : in std_logic;
-- Decoded & buffered fabric
addr_i : in std_logic_vector(c_wbs_address_width-1 downto 0);
data_i : in std_logic_vector(c_wbs_data_width-1 downto 0);
dvalid_i : in std_logic;
sof_i : in std_logic;
eof_i : in std_logic;
error_i : in std_logic;
bytesel_i : in std_logic;
dreq_o : out std_logic
);
end wb_stream_source;
architecture wrapper of wb_fabric_source is
component xwb_fabric_source
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
src_i : in t_wbs_source_in;
src_o : out t_wbs_source_out;
addr_i : in std_logic_vector(c_wbs_address_width-1 downto 0);
data_i : in std_logic_vector(c_wbs_data_width-1 downto 0);
dvalid_i : in std_logic;
sof_i : in std_logic;
eof_i : in std_logic;
error_i : in std_logic;
bytesel_i : in std_logic;
dreq_o : out std_logic);
end component;
signal src_in : t_wbs_source_in;
signal src_out : t_wbs_source_out;
begin -- wrapper
U_Wrapped_Source : xwb_fabric_source
port map (
clk_i => clk_i,
rst_n_i => rst_n_i,
src_i => src_in,
src_o => src_out,
addr_i => addr_i,
data_i => data_i,
dvalid_i => dvalid_i,
sof_i => sof_i,
eof_i => eof_i,
error_i => error_i,
bytesel_i => bytesel_i,
dreq_o => dreq_o);
src_cyc_o <= src_out.cyc;
src_stb_o <= src_out.stb;
src_we_o <= src_out.we;
src_sel_o <= src_out.sel;
src_adr_o <= src_out.adr;
src_dat_o <= src_out.dat;
src_in.rty <= '0';
src_in.err <= src_err_i;
src_in.ack <= src_ack_i;
src_in.stall <= src_stall_i;
end wrapper;
files = ["chipscope_icon.ngc", "chipscope_ila.ngc"]
\ No newline at end of file
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.6e
$0ae5=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>;<=??;7to|457|ol:=88"109;0>>789;;75>?1923456799:;<i5MSBCM[SOU\LR=86LZFF:8FPUXAGLD=6M8;BCSPPTB:2IN=?5LHDAH[IODMGYNSYW_E39@M1=DDB:=7NBD1925?FJL:>:>7NBD2Y:8GIM5P82;96MCK826?FJLI8=0OAEN1E04?FJLI8N?;6MCK@3G<0=DDBH:96MCKB36?FJLL8?0OAEKVb9@HNBQWMC]EIK:;BNHB]><KEAMT<6?3:AOV<=DGDGBXYKKb:ALJQTHD96;2n5LOOVQKI6;994h7NAATSMO49766j1HCCZ]OM2?578d3JEEX_AC0=30:f=DGG^YCA>315<`?FII\[EG<1?:>b9@KKRUGE:7=;0l;BMMPWIK85;<2n5LOOVQKI6;914h7NAATSMO497>6k1HCCZ]OM2?5;e<KFD_^BB?<32=g>EHF]XD@=2=1?a8GJHSZFF;0?<1c:ALJQTHD969?3m4CNLWVJJ74;>5o6M@NUPLH5:5=7i0OB@[RNN38709k2IDBY\@L1>13;e<KFD_^BB?<3:=g>EHF]XD@=2=9?`8GJHSZFF;0?0l;BMMPWIK859;2n5LOOVQKI6;;84h7NAATSMO49556j1HCCZ]OM2?768d3JEEX_AC0=17:`=DGG^YCA>33483:f=DGG^YCA>334<a?FII\[EG<1=1b:ALJQTHD96?2o5LOOVQKI6;=7h0OB@[RNN3838e3JEEX_AC0=5=f>EHF]XD@=27>c9@KKRUGE:753?;;BMQAZABFLXJXDAA_HLEK2=DZLK_II?4D59G55753MCh7IG\ACNF[ORFO=1O^NEl;EP@OZJHKHFTEn5KRBI\HJEFDVE>7KOCSD18BAE33ONHI>5IDD18BAT33ONYI<l4FSMN$'BXKEA),YA/"K]@HN$'\@M:n6H]OL"!NZEKC+*_C-,K_BNH&%RNO;k0J_AB #W\GIM%(]E+.GQLLJ #50678':;<=>?012#tV4f3OXDA-,Z_BNH&%RH(+_TOAE- 07345(789:;<=>? qQ;?CTHEVDHJ<5H3:EM@4=N:2C;>6G>2:K16>O4:2C?>6G:9:KMMQUSI]O87D@Ya:HWEBYD@HCE96DPCMI1?IO53EE=7AANDDF5?IIDCLN<7AAHIBCO0>JR\8>0@XZ=4:NVP12<D\^=;6CZXB[\H0=J]QL>96CZXG4`?Hgmg{\n~~g`nb9Nmkiu^lxxeb`=;O24?KCS_FX@:6@@CMKS3>HHELXLI<5@7:M-05bXD81[86^NRU0e?UCUAFN+.GQLLJ #75678':;<=>? qQ#LLAO(<:%<=>?01"&e>VNFVH^_DJWb:RJJZDR[GKFI45_K^JOQQHJ>2ZXHB@J1:S2?W3<ZLYNX:5]UOVFWQ7<[:1XIA;4SIKEP3=TG\XHI;5\T@VVW6=SKB90XIG<;UFL<>RBZDCEMA=4THE;?QOJMZZNO>5[MR58PKKXFL^27Y]PD^VL[O><\ZUASNBD9:VP[OYSGVN27Y]PU^VL[O?<\ZU^SYAPU59W]UC2l2_;#XQFCNL,MZ_B[VHXOL@!U^@P+LYR[LUXCKZMSBCM[@W7&@U^_HQWSU]WGNYPG[AJ^B[AD^GR5+SXAJEESO]LAO]AQCA4l2_;#XQFCNL,MZ_B[VHXOL@!U^@P+LYQ>'CXUC F_TQF[VIA\KYHMCQJQ1,V[GU5>2_;#XQFCNL,MZ_B[VHXOL@!U^@P+lBUKBUGCNOC2c9V4*SXAJEE#XQLME-D[QGUOL^P==S!I^LF4+SX\HXLIY<m;T2,QZODGG%^SNCK/F]WEWAB\R;:Q#GPND2-QZRFZNO_>o5Z0.W\MFII'\UHAI!H_UCQC@R\9;W%ER@J0/W\PDT@M]8i7X> U^K@KK)RWJGO#JQ[ASEFP^74U'CTBH>!U^VBVBCS:k1^<"[PIBMM+PYDEM%LSYO]GDVX51[)AVDN<#[PT@PDAQ4e3\:$YRGLOO-V[FKC'NU_M_IJTZ36Y+OXMX:%YRZNRFGW6d=R8&_TENAA/T]@IA)@W]KYKHZT6\,J[KC7&\U_M_IJT3c8Q5)RW@IDB"[PCLF,CZRFZNO_W:S!I^LF4+SX\HXLIY<n;T2,QZODGG%^SNCK/F]WEWAB\R2V"DQAE1,V[QGUOL^9m6[?/T]JGJH(]VIFH"IPT@PDAQ]>U'CTBH>!U^VBVBCS:j1^<"[PIBMM+PYDEM%^SNABM@LG[VCK'@>%JDU?]/W\HPR5l2_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV??]/W\HPR5l2_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV?>]/W\HPR5l2_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV?=]/W\HPR5l2_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV?<]/W\HPR5l2_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV?;]/W\HPR5l2_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV?:]/W\HPR5k2_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV?R.T]OQQ4d3\:$YRGLOO-V[FKC'\UHC@CNNE]PAI)N<'LBW?S!U^NVP7e<]9%^SDM@N.W\GHB(]VIDA@OAD^QFH*O3&OCP?P Z_MWW6f=R8&_TENAA/T]@IA)RWJEFAL@K_RGO+L2)N@Q?Q#[PLTV1g>S7'\UBOB@ U^AN@*SXKFGFMCJPSDN,M1(AAR?V"XQCUU0`?P6(]VCHCC!Z_BOG+PYDGDGJBIQ\EM-J0+@NS?W%YRBZT3a8Q5)RW@IDB"[PCLF,QZEHEDKEHR]JL.K7*CO\?T$^SA[[2b9V4*SXAJEE#XQLME-V[FIJEHDOS^KC/H6-BL]?U'_T@XZ=c:W3+PYNKFD$YRMBD.W\GJKJIGNT_HB I5,EM^?Z&\UGYY<l;T2,QZODGG%^SNCK/T]@KWCXAMUXIA!F4/DJ_5[)]VF^X?j4U1-V[LEHF&_TO@J U^ALV@YNLVYN@"G;.GKX55[)]VF^X?j4U1-V[LEHF&_TO@J U^ALV@YNLVYN@"G;.GKX54[)]VF^X?j4U1-V[LEHF&_TO@J U^ALV@YNLVYN@"G;.GKX57[)]VF^X?j4U1-V[LEHF&_TO@J U^ALV@YNLVYN@"G;.GKX56[)]VF^X?j4U1-V[LEHF&_TO@J U^ALV@YNLVYN@"G;.GKX51[)]VF^X?j4U1-V[LEHF&_TO@J U^ALV@YNLVYN@"G;.GKX50[)]VF^X?m4U1-V[LEHF&_TO@J U^ALV@YNLVYN@"G;.GKX5X(RWE__>n5Z0.W\MFII'\UHAI!Z_BMQAZOCWZOG#D:!FHY1Y+SXD\^9o6[?/T]JGJH(]VIFH"[PCNPF[LBX[LF$E9 IIZ1^*PYK]]8h7X> U^K@KK)RWJGO#XQLOSG\MAYTME%B8#HF[5_-QZJR\;i0Y=!Z_HALJ*SXKDN$YRM@RD]J@ZUBD&C?"KGT5\,V[ISS:j1^<"[PIBMM+PYDEM%^SNA]E^KG[VCK'@>%JDU9]/W\HPR5k2_;#XQFCNL,QZEJL&_TOB\J_HF\W@J(A=$MEV9R.T]OQQ4d3\:$YRGLOO-V[FKC'\UHC_KPIE]PAI)N<'LBW5S!U^NVP7e<]9%^SDM@N.W\GHB(]VID^HQFD^QFH*O3&OCP5P Z_MWW52=R8&_TENAA/T]@IA)RWZOGSc?m;T2,QZODGG%^SNCK/T]WEWAB\VIN=;5Z0.W\MFII'\UHAI!fSDN\j4d<]9%^SDM@N.W\GHB(a]KYKHZ311<2f>S7'\UBOB@ U^AN@*oSI[MNX1?>>0c8Q5)RW@IDB"[PCLF,mQGUOL^743?n;T2,QZODGG%^SNCK/hVBVBCS404:m6[?/T]JGJH(]VIFH"g[ASEFPZEB:j1^<"[PIBMM+PYD\[FTCXZ F^L@T^6Z&OUHAIU?]/W\LFC5k2_;#XQFCNL,QZESZEUDYY!I_OAS_5[)NVIFHV>R.T]OG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<>R.T]KG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<>R.T]OG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<?R.T]KG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<?R.T]OG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<<R.T]KG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<<R.T]OG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<=R.T]KG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<=R.T]OG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<:R.T]KG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<:R.T]OG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<;R.T]KG@4c3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<;R.T]OG@4d3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<S!U^J@A7e<]9%^SDM@N.W\GQTKWF__#KQACQY3Y+@XKDNP=P Z_MAF6f=R8&_TENAA/T]@PWJXG\^$JR@LPZ2^*CYDEMQ9Q#[PHBG1g>S7'\UBOB@ U^AWVIYH]]%MSCM_[1_-BZEJLR8V"XQCCD0`?P6(]VCHCC!Z_BVQHZIR\&LTBN^T0\,E[FKCS:W%YRFLE3a8Q5)RW@IDB"[PCUPO[JSS'OUEO]U?]/D\GHB\;T$^SAMJ2b9V4*SXAJEE#XQLTSN\KPR(NVDH\V>R.G]@IA]3U'_TDNK=c:W3+PYNKFD$YRM[RM]LQQ)AWGI[W=S!F^AN@^2Z&\UGOH<l;T2,QZODGG%^SNZ]L^MVP*@XFJZP<P I_BOG_0[)]VBHI?m4U1-V[LEHF&_TOY\C_NWW+CYIKYQ;Q#HPCLFX1X(RWEIN>n5Z0.W\MFII'\UHX_BPOTV,BZHDXR:V"KQLMEY5Y+SX@JO9o6[?/T]JGJH(]VI_^AQ@UU-E[KEWS9W%JRMBDZ4^*PYKKL8h7X> U^K@KK)RWJ^Y@RAZT.D\JFV\8T$MSNCK[6_-QZNDM;i0Y=!Z_HALJ*SXK]XGSB[[/G]MGU]7U'LTO@JT7\,V[IEB:j1^<"[PIBMM+PYD\[FTCXZ F^L@T^6Z&OUHAIU7]/W\LFC5k2_;#XQFCNL,QZESZEUDYY!I_OAS_5[)NVIFHV6R.T]OG@4d3\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW4S!U^J@A7e<]9%^SDM@N.W\GQTKWF__#KQACQY3Y+@XKDNP5P Z_MAF5`=R8&_TENAA/T]@PWJXG\^$YRMBDFPS44c<]9%^SDM@N.W\GQTKWF__#XQLMEEQT4463\:$YRGLOO-V[FRUDVE^X"[PD@VB[SGKAM837X> U^K@KK)RWJ^Y@RAZT.k@KHKFFMUL^]Q\EM>3:7><]9%^SDM@N.W\GQTKWF__#dM@MLCM@ZAUXVYN@1?1219V4*SXAJEE#XQLTSN\KPR(aMK_MRXNLHF15>S7'\UBOB@ U^QWEQ)AWZ^JXV>R.T]PPDR592_;#XQFCNL,QZUSI]%MS^ZNTZ3^*PYT\H^9=6[?/T]JGJH(]VY_MY!I_RVBP^4Z&\UXXLZ=1:W3+PYNKFD$YR][AU-E[VRF\R9V"XQ\T@V2e>S7'\UBOB@ U^QWEQ)RWJGOK_^?1e9V4*SXAJEE#XQ\T@V,QZBF\HU]MAGK1`9V4*SXAJEE#XQ\T@V,QZUSI]IFH<m4U1-V[LEHF&_T_YO[/T]PPDRDEMUe><5Z0.W\MFII'\UXXLZ U^QWEQYDF]%HE1?1209V4*SXAJEE#XQ\T@V,QZUSI]UHBY!LI=0=64=R8&_TENAA/T]PPDR(]VY_MYQLNU-@M959:81^<"[PIBMM+PYT\H^$YR][AU]@JQ)DA5>5><5Z0.W\MFII'\UXXLZ U^QWEQYDF]%HE1;1219V4*SXAJEE#XQ\T@V,QZUSI]UHBY!K<1<14>S7'\UBOB@ U^QWEQ)RWZ^JXRMAT.F?5;473\:$YRGLOO-V[VRF\&_T_YO[_BLW+A:56;:0Y=!Z_HALJ*SX[]K_#XQ\T@V\GKR(L595>=5Z0.W\MFII'\UXXLZ U^QWEQYDF]%O090=0:W3+PYNKFD$YR][AU-V[VRF\VIEX"J35?0`?P6(]VCHCC!Z_RVBP*SX[]K_SN@[/FY3Y+Ai@'_TAXVLY358Q5)RW@IDB"[PSUCW+PYT\H^TOCZ GZ2^*PYAL[O9:6[?/T]JGJH(]VY_MY!Z_RVBPZEI\&MP<P Z_MWW6==R8&_TENAA/T]PPDR(]VY_MYQLNU-D_5[)]VRD^NW=c:W3+PYNKFD$YR][AU-V[VRF\VIEX"IT1\,DjM(RWD_SOT<8;T2,QZODGG%^S^ZNT.W\WQGSWJD_#JU>]/W\BATB:?1^<"[PIBMM+PYT\H^$YR][AU]@JQ)@S8W%YRBZT3:8Q5)RW@IDB"[PSUCW+PYT\H^TOCZ GZ3^*PY_G[IR>n5Z0.W\MFII'\UXXLZ U^QWEQYDF]%LW?S!GoJ-QZKRPJS9;6[?/T]JGJH(]VY_MY!Z_RVBPZEI\&MP>P Z_GFQA70<]9%^SDM@N.W\WQGS'\UXXLZPCOV,C^4Z&\UGYY<7;T2,QZODGG%^S^ZNT.W\WQGSWJD_#JU=]/W\\JTDQ;i0Y=!Z_HALJ*SX[]K_#XQ\T@V\GKR(OR9V"J`G.T]NQ]E^:>1^<"[PIBMM+PYT\H^$YR][AU]@JQ)@S:W%YRHKRD05?P6(]VCHCC!Z_RVBP*SX[]K_SN@[/FY0Y+SXD\^946[?/T]JGJH(]VY_MY!Z_RVBPZEI\&MP?P Z_YMQG\4d3\:$YRGLOO-V[VRF\&_T_YO[_BLW+B]3U'MeD#[PMTZ@]71<]9%^SDM@N.W\WQGS'\UXXLZPCOV,C^2Z&\UMH_K=6:W3+PYNKFD$YR][AU-V[VRF\VIEX"IT4\,V[ISS:11^<"[PIBMM+PYT\H^$YR][AU]@JQ)@S=W%YRV@RB[13>S7'\UBOB@ U^QWEQ)RWZ^JXRMAT.EX1X(RWONYI?84U1-V[LEHF&_T_YO[/T]PPDRXKG^$KV;R.T]OQQ4?3\:$YRGLOO-V[VRF\&_T_YO[_BLW+B]2U'_TTB\LY328Q5)RW@IDB"[PSUCW+PYT\H^TOCZ S=2=65=R8&_TENAA/T]PPDR(]VY_MYQLNU-P848582_;#XQFCNL,QZUSI]%^S^ZNT^AMP*U;:78;7X> U^K@KK)RWZ^JX"[PSUCW[FHS'Z682?>4U1-V[LEHF&_T_YO[/T]PPDRXKG^$_1:1219V4*SXAJEE#XQ\T@V,QZUSI]UHBY!\<4<2g>S7'\UBOB@ U^QWEQ)RWZ^JXRFFGI3a?P6(]VCHCC!Z_RVBP*SX[]K_SAAX179V4*SXAJEE#XQ\T@V,QZRCG8h0Y=!Z_HALJ*SX[]K_#XQ[DN]ma}r6m2_;#XQFCNL,QZUSI]%bO@JPGSR3[VCK9j1^<"[PIBMM+PYT\H^$eIO[A^TBHLB612_;#XQFCNL,QZUSI]%b_YO[<1<2=>S7'\UBOB@ U^QWEQ)n[]K_0<0>9:W3+PYNKFD$YR][AU-jWQGS4;4:56[?/T]JGJH(]VY_MY!fSUCW8686k2_;#XQFCNL,QZUSI]%b_YO[CLF\G@7b3\:$YRGLOO-V[VRF\&cXXLZLME]@AZh6l2_;#XQFCNL,QZUSI]%b_YO[_BLW8586l2_;#XQFCNL,QZUSI]%b_YO[_BLW8486l2_;#XQFCNL,QZUSI]%b_YO[_BLW8786l2_;#XQFCNL,QZUSI]%b_YO[_BLW8686l2_;#XQFCNL,QZUSI]%b_YO[_BLW8186l2_;#XQFCNL,QZUSI]%b_YO[_BLW8086j2_;#XQFCNL,QZUSI]%b_YO[_IKDL4g<]9%^SDM@N.W\WQGS'`Y_MYQCOV3b?P6(]VCHCC!Z_RVBP*oSLFUeiuz=b:W3+PYNKFD$YR]VNB-D[V_IKV]D^IU?]/K\J@6)]VLO^?l4U1-V[LEHF&_T_T@L/F]P]KEX_FXOW<S!I^LF4+SXNMX9n6[?/T]JGJH(]VYRBN!H_R[MGZQHZMQ9Q#GPND2-QZ@CZ;h0Y=!Z_HALJ*SX[PDH#JQ\YOA\SJTCS:W%ER@J0/W\BAT5j2_;#XQFCNL,QZU^FJ%LS^WAC^ULVA]3U'CTBH>!U^DGV7d<]9%^SDM@N.W\W\HD'NUXUCMPWNPG_0[)AVDN<#[PFEP1f>S7'\UBOB@ U^QZJF)@WZSEORY@REY5Y+OXMX:%YRHKR0`8Q5)RW@IDB"[PSXL@+PY@G]UXUCM>d:W3+PYNKFD$YR]VNB-V[BISWZSEORF>d:W3+PYNKFD$YR]VNB-V[BISWZSEORB>7:W3+PYNKFD$YR]VNB-V[V_IK8o0Y=!Z_HALJ*SX[PDH#XQfD@VB[FKCWg;h7X> U^K@KK)RWZSEO"gKAUC\GHBXf8k0Y=!Z_HALJ*SX[PDH#dI@T^QZJF7a3\:$YRGLOO-V[V_IK&cLCYQ\YOA\LLAO9l1^<"[PIBMM+PYTQGI$eJA[_R[MGZJH_8o0Y=!Z_HALJ*SX[PDH#d]VNB]TKWB;87;n7X> U^K@KK)RWZSEO"g\YOA\SJTC484:i6[?/T]JGJH(]VYRBN!fSXL@[RIUL585=h5Z0.W\MFII'\UXUCM iR[MGZQHZM682<k4U1-V[LEHF&_T_T@L/hQZJFYPG[N783?j;T2,QZODGG%^S^WAC.kP]KEX_FXO080>e:W3+PYNKFD$YR]VNB-jW\HDW^EYH181129V4*SXAJEE#XQ[DH]qab573\:$YRGLOO-V[QBHWD_S#XQLS^OV\*O3&\UFYU?9/Lov|ZI69890Y=!Z_HALJ*SX\MET~hi>5:W3+PYNKFD$YRgKAUC\GHB6?2_;#XQFCNL,QZoCI]KTO@JPn008Q5)RW@IDB"[PiRGO[k7>3\:$YRGLOO-jGJKJIGNTK_^30?3:?P6(]VCHCC!fCNONEKBXO[Z7=3?6;T2,QZODGG%bOBCBAOF\W@J;87;j7X> U^K@KK)nKFGFMCJPSDN?5586i2_;#XQFCNL,mFIJEHDOS^KC<03=5d=R8&_TENAA/hALIHGILVYN@1?=>0c8Q5)RW@IDB"gLOLOBJAYTME6:?3?n;T2,QZODGG%bOBCBAOF\W@J;9=4:m6[?/T]JGJH(aJEFAL@K_RGO8439901^<"[PIBMM+lEHEDKEHR]JL=3=5<=R8&_TENAA/hALIHGILVYN@1<1189V4*SXAJEE#dM@MLCM@ZUBD595=45Z0.W\MFII'`IDA@OAD^QFH929901^<"[PIBMM+lEHEDKEHR]JL=7=5<=R8&_TENAA/hALIHGILVYN@181189V4*SXAJEE#dM@MLCM@ZUBD5=5=45Z0.W\MFII'`IDA@OAD^QFH9>9901^<"[PIBMM+lEHEDKEHR]JL=;=50=R8&_TENAA/hALV@YNL5:5=85Z0.W\MFII'`ID^HQFD=3=50=R8&_TENAA/hALV@YNL585=85Z0.W\MFII'`ID^HQFD=1=5<=R8&_TENAA/hALV@YNLVYN@1>11`9V4*SXAJEE#dM@RD]J@ZUBD5;>2<=4U1-V[LEHF&cOMYOPCLF21>S7'\UBOB@ iECWEZEJLVdm7X> U^K@KK)nL[I@i6[?/T]JGJH(aZOG==5Z0.W\MFII'`YN@R`i;T2,QZODGG%b_T@Le:W3+PYNKFD$eYJFe:W3+PYNKFD$eYJ@179V4*SXAJEE#dZKO^TFG9726890Y=!Z_HALJ*oSLFUeiuzk;T2,mVNNN]UDYYk4U1-jQUBF\LUDYY84UQFBP@e<]ZOYS[G\ICNF2>SXJ\LL96[PCMI0?SED12\BIZQ[YQG2`>^ND@DS!UJM 1,2$VRRJ):%=-O\CHK6?]IUKP<0T^ZCIC58\VRXOGN<7U][_WA@f>^XKFXNSD@IO79[`gYNlo1SheQ_rhoUawungg;;7Ujb_LcikwPbzzcdb<>4Xeo\Ilhhz_oydaa3:Zpp6d<WVUS@CCP_^2\[ZS7'\UBOB@ U^AN@*SXKFGFMCJPSDN,M1(AAR;?Q#[PLTV0g>YXWQFEARQP11]\[P6(]VCHCC!Z_BVQHZIR\&LTBN^T0\,E[FKCS88V"XQCCD1`?ZYXPEDFSRQ>1^]\Q5)RW@IDB"[PCUPO[JSS'OUEO]U?]/D\GHB\9:W%YRBLE2a8[ZY_DGGTSR?=_^]V4*SXAJEE#XQLTSN\KPR(NVDH\V>R.G]@IA]6<T$^SAMJ3b9\[Z^KFDUTS<=P_^W3+PYNKFD$YRM[RM]LQQ)AWGI[W=S!F^AN@^72U'_T@NK<b:]\[]JIEVUT=9QP_T2,QZODGG%^SNZ]L^MVP*@XFJZP<P I_BOG_4[)]VFHI>l4_^][HKKXWV;>SRQZ0.W\MFII'\UHX_BPOTV,BZHDXR:V"KQLMEY1Y+SXDJO8n6QP_YNMIZYX9?UTSX> U^K@KK)RWJ^Y@RAZT.D\JFV\8T$MSNCK[2_-QZJDM:h0SRQWLOO\[Z70WVU^<"[PIBMM+PYD\[FTCXZ F^L@T^6Z&OUHAIU;]/W\HFC4j2UTSUBAM^]\5=YXW\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW8S!U^N@A6d<WVUS@CCP_^3:[ZYR8&_TENAA/T]@PWJXG\^$JR@LPZ2^*CYDEMQ=Q#[PLBG0f>YXWQFEARQP1^]\Q5)RW@IDB"[PCLF,QZEHEDKEHR]JL.K7*CO\9;W%YRBZT2`8[ZY_DGGTSR<?_^]V4*SXAJEE#XQLTSN\KPR(NVDH\V>R.G]@IA]0U'_T@NK<b:]\[]JIEVUT><QP_T2,QZODGG%^SNZ]L^MVP*@XFJZP<P I_BOG_=[)]VFHI>l4_^][HKKXWV89SRQZ0.W\MFII'\UHX_BPOTV,BZHDXR:V"KQLMEY:Y+SXDJO9h6QP_YNMIZYX::UTSX> U^K@KK)RWJ^Y@RAZT.W\GHB@ZY:8<6QP_YNMIZYX:=UTSX> U^K@KK)RWJ^Y@RAZT.W\@DRFW_KGEI<n;^]\\IHJWVU99RQPU1-V[LEHF&_T_T@L/T]DKQYTQGI8n6QP_YNMIZYX:VUTY=!Z_HALJ*SXKDN$YRM@MLCM@ZUBD&C?"KGT11_-QZJR\:k0SRQWLOO\[Z5XWV_;#XQFCNL,QZEJL&_TOBCBAOF\W@J(A=$MEV6R.T]OQQ5f3VUTTA@B_^]7[ZYR8&_TENAA/T]@IA)RWJEFAL@K_RGO+L2)N@Q=Q#[PLTV0e>YXWQFEARQP5^]\Q5)RW@IDB"[PCLF,QZEHEDKEHR]JL.K7*CO\<T$^SA[[3`9\[Z^KFDUTS;QP_T2,QZODGG%^SNCK/T]@KHKFFMUXIA!F4/DJ_7[)]VF^X>o4_^][HKKXWV=TSR[?/T]JGJH(]VI_^AQ@UU-E[KEWS9W%JRMBDZ2^*PYKKL9i7RQPXMLN[ZY?WVU^<"[PIBMM+PYD\[FTCXZ F^L@T^6Z&OUHAIU>0\,V[IEB;k1TSRVCNL]\[<YXW\:$YRGLOO-V[FRUDVE^X"HPNBRX4X(AWJGOW<?R.T]OG@b<izseoRjjcnffv<=f{pdhS`{we:akmuudgyoTenaa2g9`llvtkfznSdm`n-akmuudgyoTenaa_w3\40Yf$GEEI!@@ND17a>eoayyhc}kPibmm(fnnxzid|hQfcnl\r4Y7=Vk'wnQzsd]marYwi{yn~0>#c^z`kZjn{}7Ey`ljr^AljqthdVZd~y}21:WpaZC|VHxol`2f`npa>Stm{UXol`PCicjj8STM[;0Icomld]IpdaXJ|ll1y|ze:WpaZSi}zooSO}lao?eeiub3\ynS^aitcq`ek;aieyn nQwddtjg``fe`fr1{g}tdz5(fYdg{oTxt~j=0.`[hgmg{U}i}foo?27)eXe`dd~Rxjrrklj87+kVh~eajPrdtjwlii59&hSna}e^obnjtX~lx6=!mPcnpf[hoig{U}i3=,b]`kwcXe`dd~Rocpic\r`t:1>&hS`hh_hf>5)eX}zoTnxh}=1.`[pubWzcf1="l_tqf[via|kyhmc3?,b]sewrXamidhhQ}efkpp`t:8%iTy~kPjucd[gsao4;'oR`zm^aljqthdVzd~y}21-a\qvcXkfd~bb?=0.`[pubWjeexac1<2/gZstmVidby|`l3?3(fYr{lUhccz}om1>4)eX}zoTob`{rnn795*dW|ynSnaatsmo186+kVxiRm`nuplh3;7$jU~hQloovqki1:8%iTy~kPcnlwvjj?59&hSx}j_bmmpwik14:'oR{|e^aljqthd8:6<!mPurg\gjhszff:=0>#c^wpaZehf}xd`<<20-a\qvcXkfd~bb>3<2/gZstmVidby|`l06>4)eX}zoTiuzPbrabj86+kVxiR{aurgg[gudig7; nQzsd]{wqYskbU|cenrnwm`87+kVosm`~ce^ffwlai5okgh"l_tqfvZudigUhdlga=0.~5g=d``zxob~j_haljZRNELY[INQACG11?fnnxzid|hQfcnl\r4Y7=Vk',Ugcioz#GJTB(Noeio{os"27+703je~byk}6:ap[hs02ixS`{w17c8mfiiWkyhmch4ibmm[gudigUiyki>c:k`kkYe{jkeSo{ig^VJI@UWMJUS_Yh4ibmm[fkcWmohcik6;haljZehzln0enaa_bvqhZir|k1bob`Psucwqv?<ajeeS~wac99mcfdraenvLM~;149CD}7em3L187?tS4g95d7=180:??jj40813=1csg;2j7?4n0c3>3=#90n1=494}R14>4g620;1=><ke53962>?92Y3<7?le;39564cm=;1>:67a:Q03?7dm3;1=><ke53962>?m2n:nh4?:082V3b28k:64?5120ga17=:>2<i6x[a183>4<62>lp_8k51`39=4<6;;nn8<4=795f?!7>>3297[?6e;0xq=g=923n7>4}%;0>4?<j8hn6=4=4;::>2`|@8397)oi:0`f?_7a28q::7s+18a95f4<,;91=oh4$4f95f6<#<<1<7*66;77?k?22;:07&;::18'=3<2<2d297>4;*70>5<#1?0>86`65;38?.35290/5;4:4:l:1?4<3"?:6=4+97860>h>=3907&;?:18'=3<2<2d297:4;*6e>5<#1?0>86`65;78?.2c290/5;4:4:l:1?0<3">h6=4+97860>h>=3=07&:m:18'=3<2<2d29764;*6b>5<#1?0>86`65;;8?.2>290/5;4:4:l:1?g<3">36=4+97860>h>=3h07&:8:18'=3<2<2d297m4;*65>5<#1?0>86`65;f8?.22290/5;4:4:l:1?c<3">?6=4+97860>h>=3l07&:=:18'=3<2<2d297??;:)75?6=,0<1995a94825>=,<90;6)79:468j<3=9;10'>h50;&:2?333g3>6<=4;*1f>5<#1?0>86`65;37?>-4l3:1(485559m=0<6=21 ?n4?:%;5>02<f0?1=;54+2`94?">>3??7c7::058?.5f290/5;4:4:l:1?7?32!857>5$84911=i1<0:565$5b83>!?12<>0b4;51`98/0d=83.2:7;;;o;6>4d<3"?j6=4+97860>h>=3;h76%:9;29 <0===1e584>d:9(1=<72-3=68:4n8795`=<#<=1<7*66;77?k?228l07&:j:18'=3<2<2d297<>;:)77?6=,0<1995a94816>=,;10;6)79:468j<3=::10n<7m:182>5<7s-km6<7:;I3:=>N61;1d5?4?::a5<g=83;1<7>t$`d937=O9030D<7=;n52>5<<ukh:6=4m:183!ga28n0D<76;I3:6>h0k3;0(;<5679l=c<722ej?7>5;nc1>5<<g0i1<75`18394?=h1k0;66a6e;29?lg32900c??50;9le=<722e=?7>5;|`a4?6=:381>vF>939'ec<6k>1b:94?::m51?6=3k;2?7>52;294~"fn3;n7E?69:J2=7=n?:0;66a60;29?xd6k10;6=4?:1yK5<4<,hl1m:5Ca682!ge20>0qp}94;296~X1<27:5>483:p20<72;qU:8521819=5=zuk;=n7>52;294~"fn3=i7E?69:J2=7=n?:0;66a60;29?xd6>j0;6?4?:1y'ec<0j2B:545G1808m25=831d5=4?::a53?=83>1<7>t$`d92<=O9030D<7=;%5b>7=n:90;66g=2;29?l3a2900c4750;9~f400290?6=4?{%ce>3?<@8327E?62:&4e?4<a;:1<75f2383>>o2n3:17b76:188yg71i3:187>50z&bb?003A;256F>939'3d<53`8;6=44i2494?=n=o0;66a69;29?xdcl3:1>7>50z&bb?1e3A;256F>939j36<722e2<7>5;|`ga?6=;3:1<v*nf;:7?M7>12B:5?5+7`823>">?3;i?6g84;29?l122900c4>50;9~fg?=83?1<7>t$`d92==O9030D<7=;%5b>7=n:90;66g=2;29?l512900e8h50;9l=<<722winl4?:483>5}#io0=46F>989K5<4<,>k1>6g=0;29?l452900e>850;9j1c<722e257>5;|`af?6==3:1<v*nf;4;?M7>12B:5?5+7`81?l472900e?<50;9j73<722c>j7>5;n;:>5<<ukhh6=4::183!ga2?20D<76;I3:6>"0i380e?>50;9j67<722c8:7>5;h7e>5<<g031<75rbc194?3=83:p(lh5699K5<?<@8397)9n:39j65<722c9>7>5;h15>5<<a<l1<75`9883>>{ej=0;684?:1y'ec<102B:545G1808 2g=:2c9<7>5;h01>5<<a:<1<75f5g83>>i>13:17plm5;291?6=8r.jj787;I3:=>N61;1/;l4=;h03>5<<a;81<75f3783>>o2n3:17b76:188ygd1290>6=4?{%ce>3><@8327E?62:&4e?4<a;:1<75f2383>>o4>3:17d;i:188k<?=831vno950;794?6|,hl1:55G18;8L4?53-=j6?5f2183>>o5:3:17d=9:188m0`=831d544?::af=<72<0;6=u+ag85<>N6101C=4<4$6c96>o583:17d<=:188m60=831b9k4?::m:=?6=3thh?7>55;294~"fn32>7E?69:J2=7=#?h0:n6*67;3b6>o0<3:17d9::188m20=831b;:4?::m:4?6=3thh>7>55;294~"fn32>7E?69:J2=7=#?h0:46*67;3b6>o0<3:17d9::188m20=831b;:4?::m:4?6=3thh=7>55;294~"fn32>7E?69:J2=7=#?h0:86*67;3b`>o0<3:17d9::188m20=831b;:4?::m:4?6=3thh<7>55;294~"fn32>7E?69:J2=7=#?h0:=6*67;3b`>o0<3:17d9::188m20=831b;:4?::m:4?6=3thij7>55;294~"fn32>7E?69:J2=7=#?h0m7)78:0`7?l132900e:;50;9j33<722c<;7>5;n;3>5<<ukhn6=4::183!ga21?0D<76;I3:6>"0i3o0(4951c68m22=831b;84?::k42?6=3`=<6=44o8294?=zjji1<7;50;2x d`=0<1C=474H0;1?!1f2m1/5:4>b49j31<722c<97>5;h55>5<<a>=1<75`9183>>{ekk0;684?:1y'ec<?=2B:545G1808 2g=j2.2;7?m5:k40?6=3`=>6=44i6494?=n?>0;66a60;29?xddi3:197>50z&bb?>23A;256F>939'3d<f3-3<6<l9;h57>5<<a>?1<75f7783>>o0?3:17b7?:188yge>290>6=4?{%ce>=3<@8327E?62:&4e??<,0=1=o84i6694?=n?<0;66g86;29?l102900c4>50;9~ff>=83?1<7>t$`d9<0=O9030D<7=;%5b>==#1>0:n:5f7583>>o0=3:17d99:188m21=831d5=4?::ag2<72<0;6=u+ag8;1>N6101C=4<4$6c93>">?3;i;6g84;29?l122900e:850;9j32<722e2<7>5;|``2?6==3:1<v*nf;:6?M7>12B:5?5+7`85?!?028h37d9;:188m23=831b;;4?::k43?6=3f3;6=44}ca6>5<2290;w)oi:978L4?>3A;2>6*8a;78 <1=9k20e::50;9j30<722c<:7>5;h54>5<<g0:1<75rbb694?3=83:p(lh5849K5<?<@8397)9n:59j31<722c<97>5;h55>5<<a>=1<75`9183>>{ejm0;684?:1y'ec<?=2B:545G1808 2g=;2c<87>5;h56>5<<a><1<75f7683>>i>83:17plk3;291?6=8r.jj76:;I3:=>N61;1/;l4>b:k40?6=3`=>6=44i6494?=n?>0;66a60;29?xdc:3:197>50z&bb?>23A;256F>939'3d<602c<87>5;h56>5<<a><1<75f7683>>i>83:17plk1;291?6=8r.jj76:;I3:=>N61;1/;l4>4:k40?6=3`=>6=44i6494?=n?>0;66a60;29?xdc83:197>50z&bb?>23A;256F>939'3d<692c<87>5;h56>5<<a><1<75f7683>>i>83:17pllf;291?6=8r.jj76:;I3:=>N61;1/;l4i;h57>5<<a>?1<75f7783>>o0?3:17b7?:188ygeb290>6=4?{%ce>=3<@8327E?62:&4e?c<a>>1<75f7483>>o0>3:17d98:188k<6=831vnim50;794?6|,hl1485G18;8L4?53-=j6i5f7583>>o0=3:17d99:188m21=831d5=4?::a`g<72<0;6=u+ag8;1>N6101C=4<4$6c9f>o0<3:17d9::188m20=831b;:4?::m:4?6=3thom7>55;294~"fn32>7E?69:J2=7=#?h0j7d9;:188m23=831b;;4?::k43?6=3f3;6=44}cf:>5<2290;w)oi:978L4?>3A;2>6*8a;;8m22=831b;84?::k42?6=3`=<6=44o8294?=zjm21<7;50;2x d`=0<1C=474H0;1?!1f211b;94?::k41?6=3`==6=44i6594?=h190;66smd683>0<729q/mk475:J2=<=O9080(:o57:k40?6=3`=>6=44i6494?=n?>0;66a60;29?xdc>3:197>50z&bb?>23A;256F>939'3d<13`=?6=44i6794?=n??0;66g87;29?j?72900qoj::186>5<7s-km65;4H0;:?M7>:2.<m7;4i6694?=n?<0;66g86;29?l102900c4>50;9~fa2=83?1<7>t$`d9<0=O9030D<7=;%5b>1=n?=0;66g85;29?l112900e:950;9l=5<722wioi4?:483>5}#io0396F>989K5<4<,>k1?6g84;29?l122900e:850;9j32<722e2<7>5;|`f1?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;i56g84;29?l122900e:850;9j32<722e2<7>5;|`f2?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;i56g84;29?l122900e:850;9j32<722e2<7>5;|`e7?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;j;6g84;29?l122900e:850;9j32<722e2<7>5;|`e0?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;j;6g84;29?l122900e:850;9j32<722e2<7>5;|`e1?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;j46g84;29?l122900e:850;9j32<722e2<7>5;|`e2?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;j46g84;29?l122900e:850;9j32<722e2<7>5;|`e3?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;j56g84;29?l122900e:850;9j32<722e2<7>5;|`e<?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;j56g84;29?l122900e:850;9j32<722e2<7>5;|`e=?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;jm6g84;29?l122900e:850;9j32<722e2<7>5;|`ee?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;jm6g84;29?l122900e:850;9j32<722e2<7>5;|`ef?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;jn6g84;29?l122900e:850;9j32<722e2<7>5;|`eg?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;jn6g84;29?l122900e:850;9j32<722e2<7>5;|`e`?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;jo6g84;29?l122900e:850;9j32<722e2<7>5;|`ea?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;jo6g84;29?l122900e:850;9j32<722e2<7>5;|`eb?6==3:1<v*nf;:6?M7>12B:5?5+7`82f>">?3;ji6g84;29?l122900e:850;9j32<722e2<7>5;|`245<72<0;6=u+ag8;1>N6101C=4<4$6c95g=#1>0:mh5f7583>>o0=3:17d99:188m21=831d5=4?::a557=83?1<7>t$`d9<0=O9030D<7=;%5b>4d<,0=1=lh4i6694?=n?<0;66g86;29?l102900c4>50;9~f465290>6=4?{%ce>=3<@8327E?62:&4e?7e3-3<6<oi;h57>5<<a>?1<75f7783>>o0?3:17b7?:188yg77;3:197>50z&bb?>23A;256F>939'3d<6j2.2;7?m0:k40?6=3`=>6=44i6494?=n?>0;66a60;29?xd68=0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>b19j31<722c<97>5;h55>5<<a>=1<75`9183>>{em>0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>b`9j31<722c<97>5;h55>5<<a>=1<75`9183>>{em10;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>b`9j31<722c<97>5;h55>5<<a>=1<75`9183>>{em00;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>bc9j31<722c<97>5;h55>5<<a>=1<75`9183>>{emh0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>bc9j31<722c<97>5;h55>5<<a>=1<75`9183>>{emk0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>a29j31<722c<97>5;h55>5<<a>=1<75`9183>>{emj0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>a29j31<722c<97>5;h55>5<<a>=1<75`9183>>{emm0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>a59j31<722c<97>5;h55>5<<a>=1<75`9183>>{eml0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>a59j31<722c<97>5;h55>5<<a>=1<75`9183>>{emo0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>a49j31<722c<97>5;h55>5<<a>=1<75`9183>>{en90;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>a49j31<722c<97>5;h55>5<<a>=1<75`9183>>{en80;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>a79j31<722c<97>5;h55>5<<a>=1<75`9183>>{en;0;684?:1y'ec<?=2B:545G1808 2g=9k1/5:4>a79j31<722c<97>5;h55>5<<a>=1<75`9183>>{e99<1<7=50;2x d`=0=1C=474H0;1?!1f2890(4951c38m22=831b;84?::m:4?6=3th:<84?:283>5}#io0386F>989K5<4<,>k1==5+9682f4=n?=0;66g85;29?j?72900qo??7;297?6=8r.jj76;;I3:=>N61;1/;l4>a:&:3?7e:2c<87>5;h56>5<<g0:1<75rb01f>5<3290;w)oi:9;8L4?>3A;2>6g84;29?l122900e4j50;9l=5<722wi=>m50;694?6|,hl1455G18;8L4?53`=?6=44i6794?=n1m0;66a60;29?xd6;k0;694?:1y'ec<?02B:545G1808m22=831b;84?::k:`?6=3f3;6=44}c33f?6==3:1<v*nf;:6?M7>12B:5?5+7`8`?l132900e:;50;9j33<722c<;7>5;n;3>5<<uk;;o7>55;294~"fn32>7E?69:J2=7=#?h0=<6g84;29?l122900e:850;9j32<722e2<7>5;|`24a<72<0;6=u+ag8;1>N6101C=4<4$6c950=n?=0;66g85;29?l112900e:950;9l=5<722wi==k50;794?6|,hl1485G18;8L4?53-=j6<<4i6694?=n?<0;66g86;29?l102900c4>50;9~f47529096=4?{%ce>2d<@8327E?62:k47?6=3f3;6=44}c33b?6=;3:1<v*nf;:7?M7>12B:5?5+7`824>o0<3:17d9::188k<6=831vn<?>:186>5<7s-km65;4H0;:?M7>:2.<m7?m;h57>5<<a>?1<75f7783>>o0?3:17b7?:188yg7683:1?7>50z&bb?>33A;256F>939'3d<6i2.2;7?m2:k40?6=3`=>6=44o8294?=zj89o6=4;:183!ga2?30D<76;I3:6>"0i380e?>50;9j67<722c>j7>5;n;:>5<<uk;9=7>53;294~"fn3;246F>989K5<4<a;>1<75f7d83>>i>83:17pl>1d83>1<729q/mk477:J2=<=O9080e?:50;9j24<722c2h7>5;n5e>5<<uk;997>53;294~"fn3;246F>989K5<4<a;>1<75f7d83>>i>83:17pl>2383>1<729q/mk477:J2=<=O9080e?:50;9j24<722c2h7>5;n5e>5<<uk;957>53;294~"fn3;246F>989K5<4<a;>1<75f7d83>>i>83:17pl>2783>1<729q/mk477:J2=<=O9080e?:50;9j24<722c2h7>5;n5e>5<<uk;9h7>53;294~"fn3;246F>989K5<4<a;>1<75f7d83>>i>83:17pl>2`83>1<729q/mk477:J2=<=O9080e?:50;9j24<722c2h7>5;n5e>5<<uk;8=7>53;294~"fn3;246F>989K5<4<a;>1<75f7d83>>i>83:17pl>2d83>1<729q/mk477:J2=<=O9080e?:50;9j24<722c2h7>5;n5e>5<<uk;887>53;294~"fn3;246F>989K5<4<a;>1<75f7d83>>i>83:17pl>2183>7<729q/mk473:J2=<=O9080(:o5129j31<722e2<7>5;|`261<72;0;6=u+ag8;7>N6101C=4<4$6c956=n?=0;66a60;29?xd6:10;6?4?:1y'ec<?;2B:545G1808 2g=9:1b;94?::m:4?6=3th:>n4?:383>5}#io03?6F>989K5<4<,>k1=>5f7583>>i>83:17pl>3183>7<729q/mk473:J2=<=O9080(:o5129j31<722e2<7>5;|`276<72;0;6=u+ag8;7>N6101C=4<4$6c956=n?=0;66a60;29?xd69o0;684?:1y'ec<1j2B:545G1808 2g=:2c9<7>5;h01>5<<a<l1<75f9`83>>i>13:17pl>2283>0<729q/mk49b:J2=<=O9080(:o52:k14?6=3`896=44i4d94?=n1h0;66a69;29?xd6:>0;684?:1y'ec<1j2B:545G1808 2g=:2c9<7>5;h01>5<<a<l1<75f9`83>>i>13:17pl>2c83>0<729q/mk49b:J2=<=O9080(:o52:k14?6=3`896=44i4d94?=n1h0;66a69;29?xd6:o0;684?:1y'ec<1j2B:545G1808 2g=:2c9<7>5;h01>5<<a<l1<75f9`83>>i>13:17pl>3383>0<729q/mk49b:J2=<=O9080(:o52:k14?6=3`896=44i4d94?=n1h0;66a69;29?xd6=00;684?:1y'ec<?=2B:545G1808 2g=l2c<87>5;h56>5<<a><1<75f7683>>i>83:17pl>5683>6<729q/mk474:J2=<=O9080(:o51`9'=2<6j:1b;94?::k41?6=3f3;6=44}c36f?6=:3:1<v*nf;5a?M7>12B:5?5f7283>>i>83:17pl>5983>0<729q/mk475:J2=<=O9080(:o5e:k40?6=3`=>6=44i6494?=n?>0;66a60;29?xd6=h0;684?:1y'ec<1j2B:545G1808 2g=:2c9<7>5;h01>5<<a<l1<75f9`83>>i>13:17pl>5183>1<729q/mk49a:J2=<=O9080(:o52:k14?6=3`?m6=44i8c94?=h100;66sm14394?2=83:p(lh56`9K5<?<@8397)9n:39j65<722c>j7>5;h;b>5<<g031<75rb071>5<3290;w)oi:7c8L4?>3A;2>6*8a;08m76=831b9k4?::k:e?6=3f326=44}c367?6=<3:1<v*nf;4b?M7>12B:5?5+7`81?l472900e8h50;9j=d<722e257>5;|`211<72=0;6=u+ag85e>N6101C=4<4$6c96>o583:17d;i:188m<g=831d544?::a503=83>1<7>t$`d92d=O9030D<7=;%5b>7=n:90;66g:f;29?l?f2900c4750;9~f431290?6=4?{%ce>3g<@8327E?62:&4e?4<a;:1<75f5g83>>o>i3:17b76:188yg7103:1;7>50z&bb?>13A;256F>939'3d<6k2c<87>5;h56>5<<a><1<75f7683>>o003:17d96:188k<6=831vn<m>:183>5<7s-km6l94H`78Hd1=<r.jh78j;%cf>3`<,hi1:i5+a`85g>{z{<<1<7<t^448940?2>20q~;::181[3234l:64>4}r70>5<5sW?870ki:828yv352909wS;=;<gg><6<uz?:6=4={_72?8ce20:0q~;?:181[3734o264>4}r6e>5<5sW>m70k8:828yv2c2909wS:k;<337??73ty?o7>52z\7g>;68802<6s|4c83>7}Y<k16jk460:p0d<72;qU8l52fe8:4>{t<00;6?uQ489>bg<>82wx854?:3y]0==:n002<6s|4683>7}Y<>16j:460:p03<72;qU8;52f48:4>{t<<0;6?uQ449>b6<>82wx894?:3y]01=:m<02<6s|4383>7}Y<;16j?460:p04<72;qU8<52f18:4>{t<90;6?uQ419>a`<>82wx?k4?:3y]7c=:mj02<6s|3d83>7}Y;l16il460:p7a<72;qU?i52e98:4>{t;j0;6?uQ3b9>552=191v>l50;0xZ6d<58:964>4}r1b>5<5sW9j70??0;;3?xu413:1>vP<9:?ea??73ty>o7>52z\6g>;ak33;7p}:b;296~X2j27mm77?;|q6e?6=:rT>m63i8;;3?xu213:1>vP:9:?e2??73ty>47>52z\6<>;a<33;7p}:7;296~X2?27n:77?;|q77?6==rT??63>668:=>;e03?m70?:6;7e?87203=<7p}>8683>4b|V:201o>5649>531=:916=;75219>f=<5827i;7<?;<`5>76<5k?1>=52b5814>;e;38;70ll:3289gd=:916nl4=0:?a=?4734;8h7<?;<306?4734;9j7<?;<31f?4734;9;7<?;<317?4734;:j7<?;<362?4734;>97<?;<360?4734;>?7<?;<366?4734;>=7<?;<364?4734;>m7<?;|q;g?6=lr7:5o462:?222<5:27::44=2:?27a<5:27:??4=2:?26c<5:27:>o4=2:?262<5:27:>>4=2:?25c<5:27:=h4=4:?264<5<27:9l4:f:p0`<72>q6=4o5709]0`=:9;o1:<5213c924=:9;<1:<52130924=:98o1:<5rs0;3>5<5s4;=m7<?;<`2>4?63ty:4k4?:5y>``<0=27:<:485:?255<0=27i=77i;|qa6?6=:r7i<78;;<`2>35<uz;3:7>52z?22d<2n27::o460:p5=?=838p1<8n:248940d20:0q~?7a;297~;68>0<863>11840>;6=h0256s|19a94?4|58<26474=c39e1=z{82o6=4={<30`??>34;=4796;|q22c<72=q6ni460:?f2?1234o>6:;4=032>23<uz;<:7>53z?`0??734l?6:;4=g1930=z{8=<6=4<{<a6><6<5o<1;852f4841>{t9>21<7=t=b49=5=:n10<963i7;56?xu6?00;6>u2c68:4>;ai3=>70h6:678yv70i3:1?v3l8;;3?8`d2>?01kl5749~w41e2908w0m6:8289cc=?<16ji485:p52e=839p1no5919>556=?<16jk485:p52b=839p1nl5919>554=?<16==?5749~w41b2908w0ml:82894632>?01<><:678yv7083:1?v3me;;3?8c?2>?01h95749~w4162908w0li:8289`g=?<16i4485:p524=839p1n>5919>af<0=27nn79:;|q236<72:q6o<460:?fa?1234oo6:;4}r340?6=;r7h>77?;<d3>23<5ll1;85rs056>5<4s4i864>4=g0930=:n80<96s|19194?46s4io64>4=g0933=:n80<:63i0;55?8ca2><01hk5779>aa<0>27no799;<ga>20<5lk1;;52e8842>;b03==70k8:64894632><01<><:64894652><01<>>:64894672><01kh5779>b`<0>27mh799;<d`>20<5oh1;;52f`842>;a13==70h7:6489c1=??16j;486:?e1?1134l?6:84=g1933=:m?0<:63j5;55?xu60=0;6?u2d28:4>;6980<:6s|16d94?74s4h>6474=c691c=:km0<863k4;57?8b22>>01i85759>`2<0<27o479;;<f:>22<5mk1;952dc840>;ck3=?70mj:6689f`=?=16h=484:?g5?1334n96::4=e1931=:9?21;:5rs0:3>5<6;r7i:776;<`6>0`<5jn1;852d5841>;c=3=>70j9:6789a1=?<16h5485:?g=?1234nj6:;4=e`930=:lj0<963le;56?8ea2>?01i>5749>`4<0=27o>79:;<f0>23<58<36:84}r3;5?6=9:q6n:469:?a2?3a34io6:84=e6933=:l<0<:63k6;55?8b02><01i65779>`<<0>27om799;<fa>20<5mi1;;52cd842>;dn3==70j?:6489a7=??16h?486:?g7?1134;=479:;|q2<7<7289p1o65989>f2<2n27hh798;<f7>21<5m?1;:52d7843>;c?3=<70j7:6589a?=?>16hl487:?gf?1034nh6:94=bg932=:ko0<;63k0;54?8b62>=01i<5769>`6<0?27::5484:p53b=83>p1o75989>553=?=16==85759>55`=?=1v<8j:1868df20301o755g9>553=?<16==85749>55`=?<1v<6::187871i33270?9b;50?8bb2>>01<;m:618yv7?m3:1>v3>6886b>;6>102<6s|19:94?5|58<h6:=4=c39=`=:lm0<?6s|19`94?4|58<<68h4=c39e6=z{ml1<7lt=c:973=:j>08:63m6;15?8d22:<01o:5379>f6<4>27io7=9;<`a>60<5kk1?;52b8802>;cl33;7p}j4;29f~;e038970l8:3089g0=:;16n84=2:?a0?4534h86?<4=ca967=:jk09>63ma;01?8d>2;801ik5919~w`4=83;9w0lm:8;89gg==o16ni484:?`0?1334i>6::4=b4931=:k>0<863l8;57?8e>2>>01no5759>gg<0<27ho79;;<`f>22<5kl1;952c1840>;d93=?70m=:6689f5=?=1vh=50;318dd20301ol55g9>fa<0=27h879:;<a6>23<5j<1;852c6841>;d03=>70m6:6789fg=?<16oo485:?`g?1234hn6:;4=cd930=:k90<963l1;56?8e52>?01n=5749~w`6=83;9w0l<:8;89ge==o16ni486:?`0?1134i>6:84=b4933=:k>0<:63l8;55?8e>2><01no5779>gg<0>27ho799;<`f>20<5kl1;;52c1842>;d93==70m=:6489f5=??1vh?50;318d320301o=55g9>fa<0?27h8798;<a6>21<5j<1;:52c6843>;d03=<70m6:6589fg=?>16oo487:?`g?1034hn6:94=cd932=:k90<;63l1;54?8e52>=01n=5769~w46>290:=v3>078:4>;a93=<70ki:6589`b=?>16io487:?f=?1034o<6:94=020>21<58::6:94=gd932=:nm0<;63ib;54?8`>2>=01k95769>b0<0?27m?798;<g6>21<uz;;47>510y>553=1916j?487:?e4?1034on6:94=da932=:mh0<;63j8;54?877<3=<70??2;54?87783=<70hj:6589ce=?>16jl487:?e<?1034l=6:94=g6932=:m?0<;6s|11c94?46s4;;;77?;<d1>22<5o;1;952f1840>;bn3=?70kj:6689`b=?=16in484:?ff?1334oj6::4=d;931=:m10<863j7;57?877<3=?70??3;57?877:3=?70??1;57?87783=?70hi:6689cc=?=16ji484:?eg?1334li6::4=gc931=:n00<863i8;57?8`02>>01k85759>b0<0<27m879;;<d0>22<5l<1;952e4840>{t9=l1<7<t=01g>0`<589n64>4}r37a?6=:r7:?n460:?27`<0<2wx=9j50;0x945e20:01<=j:678yv7393:1>v3>0c8:4>;6;j0<86s|15094?4|58:h64>4=01`>23<uz;??7>52z?24a<>827:?o484:p512=838p1<>j:828945e2>?0q~?;6;293~;69;02<63>338:e>;6:o02m63>2c8:e>;6:>02m63>228:e>;69o02m6s|12d94?4|58;:6:94=02e><6<uz;?97>52z?254<>827:=?483:p516=838p1<??:82894762>>0q~?;c;297~;6;l02h63>338:=>;6;:0<86s|15`94?2|589i64j4=01`><b<588m6474=013>22<uz;?m7>56z?24`<0?27:<i487:?24f<0?27:<o487:?26g<>127:>n484:p51?=83<p1<>j:648946c2><01<>l:648946e2><01<<8:8;8944?2>>0q~?;8;292~;68l0<963>0e841>;68j0<963>0c841>;6::02563>25840>{t9==1<78t=02f>22<58:o6::4=02`>22<58:i6::4=03e><?<588;6::4}r32<?6=:r7:=k4:f:?264<>82wx=<=50;1x94452;>01<<::368947b2>l0q~?>9;296~;6::0>j63>248:4>{t98>1<7=t=005>72<58826?:4=001>2`<uz;:m7>52z?262<2n27:>4460:p543=839p1<<n:368944c2;>01<<9:6d8yv76j3:1>v3>2c86b>;6:m02<6s|10494?5|588n6?:4=012>72<588j6:h4}r32g?6=:r7:>k4:f:?274<>82wx=<950;0x94532;>01<<j:6d8yv76l3:1>v3>3386b>;6;=02<6s|12794?5|588;64>4=03f><b<588:6:k4}r302?6=;r7:>9460:?267<>l27:>848e:p561=839p1<<7:828944120n01<<6:6g8yv7403:1?v3>2b8:4>;6:h02h63>2e84a>{t9:31<7=t=013><6<588n64j4=012>2c<uz;8m7>52z?276<>827:?948e:p50`=838p1<;8:668943>20:0q~?:d;296~;6=h09>63>568:4>{t9<i1<77t=075><g<58?>64o4=077><g<58?864o4=071><g<58?:64o4=073><g<58?j64o4=07a><6<uz;=<7>52z?215<>127:94484:p537=839p1<;>:8;894372<l01<;6:678yv71:3:1?v3>538:=>;6=80>j63>58842>{t9?91<7=t=070><?<58?968h4=07:>21<uz;=87>53z?211<>127:9>4:f:?21=<0<2wx=;;50;1x943220301<;;:4d8943?2>?0q~?:e;296~;6=102<63>56841>{t9?<1<7=t=075><?<58?>68h4=07;>20<utd8=:4?:0yK5<4<ug9:47>51zJ2=7=zf:;26=4>{I3:6>{i;8k1<7?tH0;1?xh49k0;6<uG1808yk56k3:1=vF>939~j67c290:wE?62:m74c=83;pD<7=;|l05c<728qC=4<4}o114?6=9rB:5?5rn202>5<6sA;2>6sa33094?7|@8397p`<2283>4}O9080qc==4;295~N61;1vb><::182M7>:2we??850;3xL4?53td8>:4?:0yK5<4<ug9947>51zJ2=7=zf:826=4>{I3:6>{i;;k1<7?tH0;1?xh4:k0;6<uG1808yk55k3:1=vF>939~j64c290:wE?62:m77c=83;pD<7=;|l06c<728qC=4<4}o104?6=9rB:5?5rn212>5<6sA;2>6sa32094?7|@8397p`<3283>4}O9080qc=<4;295~N61;1vb>=::182M7>:2we?>850;3xL4?53td8?:4?:0yK5<4<ug9847>51zJ2=7=zf:926=4={I:e?M>b3A;2>6Tn9;3x3a<zug98m7>51zJ2=7=zf:9i6=4>{I3:6>{i;:i1<7?tH9d8L=c<@8397Wo6:0y2=1<zR>:1=vo6:|m76b=83;pD5h4H9g8L4?53Sk=6<u?:|m76c=838pD<7=;|l07c<728qC=4<4}o174?6=9rB:5?5rn262>5<6sA;2>6sa35094?7|@8397p`<4283>4}O9080qc=;4;295~N61;1vb>:::182M7>:2we?9850;3xL4?53td88:4?:0yK5<4<ug9?47>51zJ2=7=zf:>26=4>{I3:6>{i;=k1<7?tH0;1?xh4<k0;6<uG1808yk53k3:1=vF>939~j62c290:wE?62:m71c=83;pD<7=;|l00c<728qC=4<4}o164?6=9rB:5?5rn272>5<6sA;2>6sa34094?7|@8397p`<5283>4}O9080qc=:4;295~N61;1vb>;::182M7>:2we?8850;3xL4?53td89:4?:0yK5<4<ug9>47>51zJ2=7=zf:?26=4>{I3:6>{i;<k1<7?tH0;1?xh4=k0;6<uG1808yk52k3:1=vF>939~j63c290:wE?62:m70c=83;pD<7=;|l01c<728qC=4<4}o154?6=9rB:5?5rn242>5<6sA;2>6sa37094?7|@8397p`<6283>4}O9080qc=94;295~N61;1vb>8::182M7>:2we?;850;3xL4?53td8::4?:0yK5<4<ug9=47>51zJ2=7=zf:<26=4>{I3:6>{i;?k1<7?tH0;1?xh4>k0;6<uG1808yk51k3:1=vF>939~j60c290:wE?62:m73c=83;pD<7=;|l02c<728qC=4<4}o144?6=9rB:5?5rn252>5<6sA;2>6sa36094?7|@8397p`<7283>4}O9080qc=84;295~N61;1vb>9::182M7>:2we?:850;3xL4?53td8;:4?:0yK5<4<ug9<47>51zJ2=7=zf:=26=4>{I3:6>{i;>k1<7?tH0;1?xh4?k0;6<uG1808yk50k3:1=vF>939~j61c290:wE?62:m72c=83;pD<7=;|l03c<728qC=4<4}o1;4?6=9rB:5?5rn2:2>5<6sA;2>6sa39094?7|@8397p`<8283>4}O9080qc=74;295~N61;1vb>6::182M7>:2we?5850;3xL4?53td84:4?:0yK5<4<ug9347>51zJ2=7=zf:226=4>{I3:6>{i;1k1<7?tH0;1?xh40k0;6<uG1808yk5?k3:1=vF>939~j6>c290:wE?62:m7=c=83;pD<7=;|l0<c<728qC=4<4}o1:4?6=9rB:5?5rn2;2>5<6sA;2>6sa38094?7|@8397p`<9283>4}O9080qc=64;295~N61;1vb>7::182M7>:2wvqpNOCz621?bf0h2mo=sO@Cy3yEFWstJK
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
`define ADDR_CTL_IFACE_CTL 3'h0
`define CTL_IFACE_CTL_START_OFFSET 0
`define CTL_IFACE_CTL_START 32'h00000001
`define CTL_IFACE_CTL_DONE_OFFSET 1
`define CTL_IFACE_CTL_DONE 32'h00000002
`define CTL_IFACE_CTL_OVF_OFFSET 2
`define CTL_IFACE_CTL_OVF 32'h00000004
`define ADDR_CTL_IFACE_TR_CNTR 3'h4
`define ADDR_DATA_SINK_FIFO_C2B_R0 4'h0
`define DATA_SINK_FIFO_C2B_R0_DATA_OFFSET 0
`define DATA_SINK_FIFO_C2B_R0_DATA 32'hffffffff
`define ADDR_DATA_SINK_FIFO_C2B_R1 4'h4
`define DATA_SINK_FIFO_C2B_R1_LAST_OFFSET 0
`define DATA_SINK_FIFO_C2B_R1_LAST 32'h00000001
`define ADDR_DATA_SINK_FIFO_C2B_CSR 4'h8
`define DATA_SINK_FIFO_C2B_CSR_FULL_OFFSET 16
`define DATA_SINK_FIFO_C2B_CSR_FULL 32'h00010000
`define DATA_SINK_FIFO_C2B_CSR_EMPTY_OFFSET 17
`define DATA_SINK_FIFO_C2B_CSR_EMPTY 32'h00020000
`define DATA_SINK_FIFO_C2B_CSR_USEDW_OFFSET 0
`define DATA_SINK_FIFO_C2B_CSR_USEDW 32'h000000ff
`define ADDR_DATA_SRC_B2C_R0 3'h0
`define DATA_SRC_B2C_R0_DATA_OFFSET 0
`define DATA_SRC_B2C_R0_DATA 32'hffffffff
`define ADDR_DATA_SRC_B2C_CSR 3'h4
`define DATA_SRC_B2C_CSR_FULL_OFFSET 16
`define DATA_SRC_B2C_CSR_FULL 32'h00010000
`define DATA_SRC_B2C_CSR_EMPTY_OFFSET 17
`define DATA_SRC_B2C_CSR_EMPTY 32'h00020000
`define DATA_SRC_B2C_CSR_USEDW_OFFSET 0
`define DATA_SRC_B2C_CSR_USEDW 32'h000000ff
`define ADDR_FMC150_FLGS_PULSE 5'h0
`define ADDR_FMC150_FLGS_IN 5'h4
`define FMC150_FLGS_IN_SPI_RW_OFFSET 0
`define FMC150_FLGS_IN_SPI_RW 32'h00000001
`define FMC150_FLGS_IN_EXT_CLK_OFFSET 1
`define FMC150_FLGS_IN_EXT_CLK 32'h00000002
`define ADDR_FMC150_ADDR 5'h8
`define ADDR_FMC150_DATA_IN 5'hc
`define ADDR_FMC150_CS 5'h10
`define FMC150_CS_CDCE72010_OFFSET 0
`define FMC150_CS_CDCE72010 32'h00000001
`define FMC150_CS_ADS62P49_OFFSET 1
`define FMC150_CS_ADS62P49 32'h00000002
`define FMC150_CS_DAC3283_OFFSET 2
`define FMC150_CS_DAC3283 32'h00000004
`define FMC150_CS_AMC7823_OFFSET 3
`define FMC150_CS_AMC7823 32'h00000008
`define ADDR_FMC150_ADC_DLY 5'h14
`define FMC150_ADC_DLY_STR_OFFSET 0
`define FMC150_ADC_DLY_STR 32'h0000001f
`define FMC150_ADC_DLY_CHA_OFFSET 8
`define FMC150_ADC_DLY_CHA 32'h00001f00
`define FMC150_ADC_DLY_CHB_OFFSET 16
`define FMC150_ADC_DLY_CHB 32'h001f0000
`define ADDR_FMC150_DATA_OUT 5'h18
`define ADDR_FMC150_FLGS_OUT 5'h1c
`define FMC150_FLGS_OUT_SPI_BUSY_OFFSET 0
`define FMC150_FLGS_OUT_SPI_BUSY 32'h00000001
`define FMC150_FLGS_OUT_PLL_STATUS_OFFSET 1
`define FMC150_FLGS_OUT_PLL_STATUS 32'h00000002
`define FMC150_FLGS_OUT_ADC_CLK_LOCKED_OFFSET 2
`define FMC150_FLGS_OUT_ADC_CLK_LOCKED 32'h00000004
`define FMC150_FLGS_OUT_FMC_PRST_OFFSET 3
`define FMC150_FLGS_OUT_FMC_PRST 32'h00000008
//
// Title : Software Wishbone master unit for testbenches
//
// File : wishbone_master_tb.v
// Author : Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
// Created : Tue Mar 23 12:19:36 2010
// Standard : Verilog 2001
//
// Default values of certain WB parameters.
// Bus clock period
`ifndef WB_CLOCK_PERIOD
`define WB_CLOCK_PERIOD 100
`define WB_RESET_DELAY (3*`WB_CLOCK_PERIOD)
`endif
// Widths of wishbone address/data/byte select
`ifndef WB_DATA_BUS_WIDTH
`define WB_DATA_BUS_WIDTH 32
`endif
`ifndef WB_ADDRESS_BUS_WIDTH
`define WB_ADDRESS_BUS_WIDTH 32
`endif
`define WB_BWSEL_WIDTH ((`WB_DATA_BUS_WIDTH + 7) / 8)
module WB_TEST_MASTER;
// these signals make the WB bus, which can be accessed from outside the module
reg [`WB_ADDRESS_BUS_WIDTH - 1 : 0] wb_addr = 0;
reg [`WB_DATA_BUS_WIDTH - 1 : 0] wb_data_o = 0;
reg [`WB_BWSEL_WIDTH - 1 : 0] wb_bwsel = 0;
wire [`WB_DATA_BUS_WIDTH -1 : 0] wb_data_i;
wire wb_ack;
reg wb_cyc = 0;
reg wb_stb = 0;
reg wb_we = 0;
reg wb_rst = 0;
reg wb_clk = 1;
reg wb_tb_verbose = 1;
reg wb_monitor_bus = 1;
time last_access_t = 0;
reg [`WB_DATA_BUS_WIDTH -1 : 0] dummy;
// ready signal. 1 indicates that WB_TEST unit is initialized and ready for commands
reg ready = 0;
// generate the WB bus clock
always #(`WB_CLOCK_PERIOD/2) wb_clk <= ~wb_clk;
// generate the reset and ready signals
initial begin
#(`WB_RESET_DELAY) wb_rst <= 1;
#(`WB_CLOCK_PERIOD*2) ready <= 1;
end
// enables/disables displaying information about each read/write operation.
task verbose;
input onoff;
begin
wb_tb_verbose = onoff;
end
endtask // wb_verbose
task monitor_bus;
input onoff;
begin
wb_monitor_bus = onoff;
end
endtask // monitor_bus
task rw_generic;
input [`WB_ADDRESS_BUS_WIDTH - 1 : 0] addr;
input [`WB_DATA_BUS_WIDTH - 1 : 0] data_i;
output [`WB_DATA_BUS_WIDTH - 1 : 0] data_o;
input rw;
input [3:0] size;
begin : rw_generic_main
if(wb_tb_verbose && rw)
$display("WB write %s: addr %x, data %x",
(size==1?"byte":((size==2)?"short":"int")),
addr, data_i);
if($time != last_access_t) begin
@(posedge wb_clk);
end
wb_stb<=1;
wb_cyc<=1;
wb_addr <= {2'b00, addr[31:2]};
wb_we <= rw;
if(rw) begin
case(size)
4: begin wb_data_o<=data_i; wb_bwsel <= 4'b1111; end
2: begin
if(addr[1]) begin
wb_data_o[31:16] = data_i[15:0];
wb_bwsel = 4'b1100;
end else begin
wb_data_o[15:0] = data_i[15:0];
wb_bwsel = 4'b0011;
end
end
1: begin
case(addr[1:0])
0: begin wb_data_o[31:24] = data_i[7:0]; wb_bwsel <= 4'b1000; end
1: begin wb_data_o[23:16] = data_i[7:0]; wb_bwsel <= 4'b0100; end
2: begin wb_data_o[15:8] = data_i[7:0]; wb_bwsel <= 4'b0010; end
3: begin wb_data_o[7:0] = data_i[7:0]; wb_bwsel <= 4'b0001; end
endcase // case(addr[1:0])
end
endcase // case(size)
end // if (rw)
#(`WB_CLOCK_PERIOD-1);
if(wb_ack == 0) begin
while(wb_ack == 0) begin @(posedge wb_clk); end
end
data_o = wb_data_i;
wb_cyc <= 0;
wb_we<=0;
wb_stb<=0;
if(wb_tb_verbose && !rw)
$display("WB read %s: addr %x, data %x",
(size==1?"byte":((size==2)?"short":"int")),
addr, wb_data_i);
last_access_t = $time;
end
endtask // rw_generic
task write8;
input [`WB_ADDRESS_BUS_WIDTH - 1 : 0] addr;
input [7 : 0] data_i;
begin
rw_generic(addr, data_i, dummy, 1, 1);
end
endtask // write8
task read8;
input [`WB_ADDRESS_BUS_WIDTH - 1 : 0] addr;
output [7 : 0] data_o;
begin : read8_body
reg [`WB_DATA_BUS_WIDTH - 1 : 0] rval;
rw_generic(addr, 0, rval, 0, 1);
data_o = rval[7:0];
end
endtask // write8
task write32;
input [`WB_ADDRESS_BUS_WIDTH - 1 : 0] addr;
input [31 : 0] data_i;
begin
rw_generic(addr, data_i, dummy, 1, 4);
end
endtask // write32
task read32;
input [`WB_ADDRESS_BUS_WIDTH - 1 : 0] addr;
output [31 : 0] data_o;
begin : read32_body
reg [`WB_DATA_BUS_WIDTH - 1 : 0] rval;
rw_generic(addr, 0, rval, 0, 4);
data_o = rval[31:0];
end
endtask // write32
// bus monitor
always@(posedge wb_clk) begin
if(wb_monitor_bus && wb_cyc && wb_stb && wb_ack)begin
if(wb_we) $display("ACK-Write: addr %x wdata %x bwsel %b", wb_addr, wb_data_o, wb_bwsel);
else $display("ACK-Read: addr %x rdata %x", wb_addr, wb_data_i);
end
end
endmodule
\ No newline at end of file
########################################
# This file was generated by hdlmake #
# http://ohwr.org/projects/hdl-make/ #
########################################
## variables #############################
PWD := $(shell pwd)
TOP_MODULE :=
FUSE_OUTPUT ?= isim_proj
XILINX_INI_PATH := /opt/Xilinx/13.4/ISE_DS/ISE/vhdl/hdp/lin64
VHPCOMP_FLAGS := -intstyle default -incremental -initfile xilinxsim.ini
ISIM_FLAGS :=
VLOGCOMP_FLAGS := -intstyle default -incremental -initfile xilinxsim.ini
VERILOG_SRC := ../../../ip_cores/general-cores/modules/wishbone/wb_onewire_master/sockit_owm.v \
../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_clgen.v \
../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_shift.v \
../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_top.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/generated/lm32_allprofiles.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_mc_arithmetic.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/jtag_cores.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_adder.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_addsub.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_dp_ram.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_logic_op.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_ram.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_shifter.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/platform/generic/lm32_multiplier.v \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/platform/generic/jtag_tap.v \
VERILOG_OBJ := work/sockit_owm/.sockit_owm_v \
work/spi_clgen/.spi_clgen_v \
work/spi_shift/.spi_shift_v \
work/spi_top/.spi_top_v \
work/lm32_allprofiles/.lm32_allprofiles_v \
work/lm32_mc_arithmetic/.lm32_mc_arithmetic_v \
work/jtag_cores/.jtag_cores_v \
work/lm32_adder/.lm32_adder_v \
work/lm32_addsub/.lm32_addsub_v \
work/lm32_dp_ram/.lm32_dp_ram_v \
work/lm32_logic_op/.lm32_logic_op_v \
work/lm32_ram/.lm32_ram_v \
work/lm32_shifter/.lm32_shifter_v \
work/lm32_multiplier/.lm32_multiplier_v \
work/jtag_tap/.jtag_tap_v \
VHDL_SRC := wb_dma_interface_tb.vhd \
../../../modules/custom_wishbone/custom_wishbone_pkg.vhd \
../../../modules/custom_common/custom_common_pkg.vhd \
../../../modules/custom_wishbone/wb_dma_interface/wb_dma_interface.vhd \
../../../modules/custom_wishbone/wb_dma_interface/xwb_dma_interface.vhd \
../../../modules/custom_common/reset_synch/reset_synch.vhd \
../../../ip_cores/general-cores/modules/common/gencores_pkg.vhd \
../../../ip_cores/general-cores/modules/common/gc_crc_gen.vhd \
../../../ip_cores/general-cores/modules/common/gc_moving_average.vhd \
../../../ip_cores/general-cores/modules/common/gc_extend_pulse.vhd \
../../../ip_cores/general-cores/modules/common/gc_delay_gen.vhd \
../../../ip_cores/general-cores/modules/common/gc_dual_pi_controller.vhd \
../../../ip_cores/general-cores/modules/common/gc_reset.vhd \
../../../ip_cores/general-cores/modules/common/gc_serial_dac.vhd \
../../../ip_cores/general-cores/modules/common/gc_sync_ffs.vhd \
../../../ip_cores/general-cores/modules/common/gc_arbitrated_mux.vhd \
../../../ip_cores/general-cores/modules/common/gc_pulse_synchronizer.vhd \
../../../ip_cores/general-cores/modules/common/gc_frequency_meter.vhd \
../../../ip_cores/general-cores/modules/common/gc_dual_clock_ram.vhd \
../../../ip_cores/general-cores/modules/common/gc_wfifo.vhd \
../../../ip_cores/general-cores/modules/genrams/genram_pkg.vhd \
../../../ip_cores/general-cores/modules/genrams/memory_loader_pkg.vhd \
../../../ip_cores/general-cores/modules/genrams/generic_shiftreg_fifo.vhd \
../../../ip_cores/general-cores/modules/wishbone/wishbone_pkg.vhd \
../../../ip_cores/general-cores/modules/genrams/xilinx/generic_dpram.vhd \
../../../ip_cores/general-cores/modules/genrams/xilinx/generic_dpram_sameclock.vhd \
../../../ip_cores/general-cores/modules/genrams/xilinx/generic_dpram_dualclock.vhd \
../../../ip_cores/general-cores/modules/genrams/xilinx/generic_spram.vhd \
../../../ip_cores/general-cores/modules/genrams/xilinx/spartan6/generic_async_fifo.vhd \
../../../ip_cores/general-cores/modules/genrams/xilinx/spartan6/generic_sync_fifo.vhd \
../../../ip_cores/general-cores/modules/genrams/xilinx/sim_stub/dummy.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_async_bridge/wb_async_bridge.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_async_bridge/xwb_async_bridge.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_onewire_master/wb_onewire_master.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_onewire_master/xwb_onewire_master.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/i2c_master_bit_ctrl.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/i2c_master_byte_ctrl.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/i2c_master_top.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/wb_i2c_master.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/xwb_i2c_master.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_bus_fanout/xwb_bus_fanout.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_dpram/xwb_dpram.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_gpio_port/wb_gpio_port.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_gpio_port/xwb_gpio_port.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_simple_timer/wb_tics.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_simple_timer/xwb_tics.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_uart/uart_async_rx.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_uart/uart_async_tx.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_uart/uart_baud_gen.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_uart/simple_uart_wb.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_uart/simple_uart_pkg.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_uart/wb_simple_uart.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_uart/xwb_simple_uart.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_vic/vic_prio_enc.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_vic/wb_slave_vic.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_vic/wb_vic.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_vic/xwb_vic.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_spi/wb_spi.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_spi/xwb_spi.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_crossbar/sdb_rom.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_crossbar/xwb_crossbar.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_crossbar/xwb_sdb_crossbar.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_lm32/generated/xwb_lm32.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_slave_adapter/wb_slave_adapter.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_xilinx_fpga_loader/wb_xilinx_fpga_loader.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_xilinx_fpga_loader/xwb_xilinx_fpga_loader.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_xilinx_fpga_loader/xloader_registers_pkg.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_xilinx_fpga_loader/xloader_wb.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_clock_crossing/xwb_clock_crossing.vhd \
../../../ip_cores/general-cores/modules/wishbone/wb_dma/xwb_dma.vhd \
../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_dpssram.vhd \
../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_eic.vhd \
../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_fifo_async.vhd \
../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_fifo_sync.vhd \
../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_pkg.vhd \
VHDL_OBJ := work/wb_dma_interface_tb/.wb_dma_interface_tb_vhd \
work/custom_wishbone_pkg/.custom_wishbone_pkg_vhd \
work/custom_common_pkg/.custom_common_pkg_vhd \
work/wb_dma_interface/.wb_dma_interface_vhd \
work/xwb_dma_interface/.xwb_dma_interface_vhd \
work/reset_synch/.reset_synch_vhd \
work/gencores_pkg/.gencores_pkg_vhd \
work/gc_crc_gen/.gc_crc_gen_vhd \
work/gc_moving_average/.gc_moving_average_vhd \
work/gc_extend_pulse/.gc_extend_pulse_vhd \
work/gc_delay_gen/.gc_delay_gen_vhd \
work/gc_dual_pi_controller/.gc_dual_pi_controller_vhd \
work/gc_reset/.gc_reset_vhd \
work/gc_serial_dac/.gc_serial_dac_vhd \
work/gc_sync_ffs/.gc_sync_ffs_vhd \
work/gc_arbitrated_mux/.gc_arbitrated_mux_vhd \
work/gc_pulse_synchronizer/.gc_pulse_synchronizer_vhd \
work/gc_frequency_meter/.gc_frequency_meter_vhd \
work/gc_dual_clock_ram/.gc_dual_clock_ram_vhd \
work/gc_wfifo/.gc_wfifo_vhd \
work/genram_pkg/.genram_pkg_vhd \
work/memory_loader_pkg/.memory_loader_pkg_vhd \
work/generic_shiftreg_fifo/.generic_shiftreg_fifo_vhd \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/generic_dpram/.generic_dpram_vhd \
work/generic_dpram_sameclock/.generic_dpram_sameclock_vhd \
work/generic_dpram_dualclock/.generic_dpram_dualclock_vhd \
work/generic_spram/.generic_spram_vhd \
work/generic_async_fifo/.generic_async_fifo_vhd \
work/generic_sync_fifo/.generic_sync_fifo_vhd \
fifo_generator_v6_1/dummy/.dummy_vhd \
work/wb_async_bridge/.wb_async_bridge_vhd \
work/xwb_async_bridge/.xwb_async_bridge_vhd \
work/wb_onewire_master/.wb_onewire_master_vhd \
work/xwb_onewire_master/.xwb_onewire_master_vhd \
work/i2c_master_bit_ctrl/.i2c_master_bit_ctrl_vhd \
work/i2c_master_byte_ctrl/.i2c_master_byte_ctrl_vhd \
work/i2c_master_top/.i2c_master_top_vhd \
work/wb_i2c_master/.wb_i2c_master_vhd \
work/xwb_i2c_master/.xwb_i2c_master_vhd \
work/xwb_bus_fanout/.xwb_bus_fanout_vhd \
work/xwb_dpram/.xwb_dpram_vhd \
work/wb_gpio_port/.wb_gpio_port_vhd \
work/xwb_gpio_port/.xwb_gpio_port_vhd \
work/wb_tics/.wb_tics_vhd \
work/xwb_tics/.xwb_tics_vhd \
work/uart_async_rx/.uart_async_rx_vhd \
work/uart_async_tx/.uart_async_tx_vhd \
work/uart_baud_gen/.uart_baud_gen_vhd \
work/simple_uart_wb/.simple_uart_wb_vhd \
work/simple_uart_pkg/.simple_uart_pkg_vhd \
work/wb_simple_uart/.wb_simple_uart_vhd \
work/xwb_simple_uart/.xwb_simple_uart_vhd \
work/vic_prio_enc/.vic_prio_enc_vhd \
work/wb_slave_vic/.wb_slave_vic_vhd \
work/wb_vic/.wb_vic_vhd \
work/xwb_vic/.xwb_vic_vhd \
work/wb_spi/.wb_spi_vhd \
work/xwb_spi/.xwb_spi_vhd \
work/sdb_rom/.sdb_rom_vhd \
work/xwb_crossbar/.xwb_crossbar_vhd \
work/xwb_sdb_crossbar/.xwb_sdb_crossbar_vhd \
work/xwb_lm32/.xwb_lm32_vhd \
work/wb_slave_adapter/.wb_slave_adapter_vhd \
work/wb_xilinx_fpga_loader/.wb_xilinx_fpga_loader_vhd \
work/xwb_xilinx_fpga_loader/.xwb_xilinx_fpga_loader_vhd \
work/xloader_registers_pkg/.xloader_registers_pkg_vhd \
work/xloader_wb/.xloader_wb_vhd \
work/xwb_clock_crossing/.xwb_clock_crossing_vhd \
work/xwb_dma/.xwb_dma_vhd \
work/wbgen2_dpssram/.wbgen2_dpssram_vhd \
work/wbgen2_eic/.wbgen2_eic_vhd \
work/wbgen2_fifo_async/.wbgen2_fifo_async_vhd \
work/wbgen2_fifo_sync/.wbgen2_fifo_sync_vhd \
work/wbgen2_pkg/.wbgen2_pkg_vhd \
LIBS := work fifo_generator_v6_1
LIB_IND := work/.work fifo_generator_v6_1/.fifo_generator_v6_1
## rules #################################
sim: xilinxsim.ini $(LIB_IND) $(VERILOG_OBJ) $(VHDL_OBJ)
$(VERILOG_OBJ): $(VHDL_OBJ)
$(VHDL_OBJ): $(LIB_IND) xilinxsim.ini
xilinxsim.ini: $(XILINX_INI_PATH)/xilinxsim.ini
cp $< .
fuse: ;
ifeq ($(TOP_MODULE),)
@echo "Environment variable TOP_MODULE not set!"
else
fuse work.$(TOP_MODULE) -intstyle ise -incremental -o $(FUSE_OUTPUT)
endif
clean:
rm -rf ./xilinxsim.ini $(LIBS) fuse.xmsgs fuse.log fuseRelaunch.cmd isim isim.log isim.wdb
.PHONY: clean
work/.work:
(mkdir work && touch work/.work && echo "work=work" >> xilinxsim.ini) || rm -rf work
fifo_generator_v6_1/.fifo_generator_v6_1:
(mkdir fifo_generator_v6_1 && touch fifo_generator_v6_1/.fifo_generator_v6_1 && echo "fifo_generator_v6_1=fifo_generator_v6_1" >> xilinxsim.ini) || rm -rf fifo_generator_v6_1
work/sockit_owm/.sockit_owm_v: ../../../ip_cores/general-cores/modules/wishbone/wb_onewire_master/sockit_owm.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_onewire_master $<
@mkdir -p $(dir $@) && touch $@
work/spi_clgen/.spi_clgen_v: ../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_clgen.v ../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_defines.v ../../../ip_cores/general-cores/modules/wishbone/wb_spi/timescale.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_spi $<
@mkdir -p $(dir $@) && touch $@
work/spi_shift/.spi_shift_v: ../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_shift.v ../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_defines.v ../../../ip_cores/general-cores/modules/wishbone/wb_spi/timescale.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_spi $<
@mkdir -p $(dir $@) && touch $@
work/spi_top/.spi_top_v: ../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_top.v ../../../ip_cores/general-cores/modules/wishbone/wb_spi/spi_defines.v ../../../ip_cores/general-cores/modules/wishbone/wb_spi/timescale.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_spi $<
@mkdir -p $(dir $@) && touch $@
work/lm32_allprofiles/.lm32_allprofiles_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/generated/lm32_allprofiles.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/generated $<
@mkdir -p $(dir $@) && touch $@
work/lm32_mc_arithmetic/.lm32_mc_arithmetic_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_mc_arithmetic.v ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_include.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src $<
@mkdir -p $(dir $@) && touch $@
work/jtag_cores/.jtag_cores_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/jtag_cores.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src $<
@mkdir -p $(dir $@) && touch $@
work/lm32_adder/.lm32_adder_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_adder.v ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_include.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src $<
@mkdir -p $(dir $@) && touch $@
work/lm32_addsub/.lm32_addsub_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_addsub.v ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_include.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src $<
@mkdir -p $(dir $@) && touch $@
work/lm32_dp_ram/.lm32_dp_ram_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_dp_ram.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src $<
@mkdir -p $(dir $@) && touch $@
work/lm32_logic_op/.lm32_logic_op_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_logic_op.v ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_include.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src $<
@mkdir -p $(dir $@) && touch $@
work/lm32_ram/.lm32_ram_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_ram.v ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_include.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src $<
@mkdir -p $(dir $@) && touch $@
work/lm32_shifter/.lm32_shifter_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_shifter.v ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src/lm32_include.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/src $<
@mkdir -p $(dir $@) && touch $@
work/lm32_multiplier/.lm32_multiplier_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/platform/generic/lm32_multiplier.v ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/platform/generic/../../src/lm32_include.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/platform/generic $<
@mkdir -p $(dir $@) && touch $@
work/jtag_tap/.jtag_tap_v: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/platform/generic/jtag_tap.v
vlogcomp -work work=./work $(VLOGCOMP_FLAGS) -i ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/platform/generic $<
@mkdir -p $(dir $@) && touch $@
work/wb_dma_interface_tb/.wb_dma_interface_tb_vhd: wb_dma_interface_tb.vhd work/wb_dma_interface_tb/.wb_dma_interface_tb
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_dma_interface_tb/.wb_dma_interface_tb: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/custom_wishbone_pkg/.custom_wishbone_pkg_vhd
work/custom_wishbone_pkg/.custom_wishbone_pkg_vhd: ../../../modules/custom_wishbone/custom_wishbone_pkg.vhd work/custom_wishbone_pkg/.custom_wishbone_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/custom_wishbone_pkg/.custom_wishbone_pkg: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/custom_common_pkg/.custom_common_pkg_vhd: ../../../modules/custom_common/custom_common_pkg.vhd work/custom_common_pkg/.custom_common_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/custom_common_pkg/.custom_common_pkg:
work/wb_dma_interface/.wb_dma_interface_vhd: ../../../modules/custom_wishbone/wb_dma_interface/wb_dma_interface.vhd work/wb_dma_interface/.wb_dma_interface
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_dma_interface/.wb_dma_interface: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/genram_pkg/.genram_pkg_vhd \
work/gencores_pkg/.gencores_pkg_vhd \
work/custom_wishbone_pkg/.custom_wishbone_pkg_vhd \
work/custom_common_pkg/.custom_common_pkg_vhd
work/xwb_dma_interface/.xwb_dma_interface_vhd: ../../../modules/custom_wishbone/wb_dma_interface/xwb_dma_interface.vhd work/xwb_dma_interface/.xwb_dma_interface
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_dma_interface/.xwb_dma_interface: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/custom_wishbone_pkg/.custom_wishbone_pkg_vhd
work/reset_synch/.reset_synch_vhd: ../../../modules/custom_common/reset_synch/reset_synch.vhd work/reset_synch/.reset_synch
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/reset_synch/.reset_synch:
work/gencores_pkg/.gencores_pkg_vhd: ../../../ip_cores/general-cores/modules/common/gencores_pkg.vhd work/gencores_pkg/.gencores_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gencores_pkg/.gencores_pkg: \
work/genram_pkg/.genram_pkg_vhd
work/gc_crc_gen/.gc_crc_gen_vhd: ../../../ip_cores/general-cores/modules/common/gc_crc_gen.vhd work/gc_crc_gen/.gc_crc_gen
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_crc_gen/.gc_crc_gen: \
work/gencores_pkg/.gencores_pkg_vhd
work/gc_moving_average/.gc_moving_average_vhd: ../../../ip_cores/general-cores/modules/common/gc_moving_average.vhd work/gc_moving_average/.gc_moving_average
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_moving_average/.gc_moving_average: \
work/gencores_pkg/.gencores_pkg_vhd
work/gc_extend_pulse/.gc_extend_pulse_vhd: ../../../ip_cores/general-cores/modules/common/gc_extend_pulse.vhd work/gc_extend_pulse/.gc_extend_pulse
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_extend_pulse/.gc_extend_pulse: \
work/gencores_pkg/.gencores_pkg_vhd
work/gc_delay_gen/.gc_delay_gen_vhd: ../../../ip_cores/general-cores/modules/common/gc_delay_gen.vhd work/gc_delay_gen/.gc_delay_gen
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_delay_gen/.gc_delay_gen: \
work/gencores_pkg/.gencores_pkg_vhd
work/gc_dual_pi_controller/.gc_dual_pi_controller_vhd: ../../../ip_cores/general-cores/modules/common/gc_dual_pi_controller.vhd work/gc_dual_pi_controller/.gc_dual_pi_controller
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_dual_pi_controller/.gc_dual_pi_controller: \
work/gencores_pkg/.gencores_pkg_vhd
work/gc_reset/.gc_reset_vhd: ../../../ip_cores/general-cores/modules/common/gc_reset.vhd work/gc_reset/.gc_reset
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_reset/.gc_reset:
work/gc_serial_dac/.gc_serial_dac_vhd: ../../../ip_cores/general-cores/modules/common/gc_serial_dac.vhd work/gc_serial_dac/.gc_serial_dac
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_serial_dac/.gc_serial_dac:
work/gc_sync_ffs/.gc_sync_ffs_vhd: ../../../ip_cores/general-cores/modules/common/gc_sync_ffs.vhd work/gc_sync_ffs/.gc_sync_ffs
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_sync_ffs/.gc_sync_ffs:
work/gc_arbitrated_mux/.gc_arbitrated_mux_vhd: ../../../ip_cores/general-cores/modules/common/gc_arbitrated_mux.vhd work/gc_arbitrated_mux/.gc_arbitrated_mux
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_arbitrated_mux/.gc_arbitrated_mux: \
work/genram_pkg/.genram_pkg_vhd \
work/gencores_pkg/.gencores_pkg_vhd
work/gc_pulse_synchronizer/.gc_pulse_synchronizer_vhd: ../../../ip_cores/general-cores/modules/common/gc_pulse_synchronizer.vhd work/gc_pulse_synchronizer/.gc_pulse_synchronizer
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_pulse_synchronizer/.gc_pulse_synchronizer: \
work/gencores_pkg/.gencores_pkg_vhd
work/gc_frequency_meter/.gc_frequency_meter_vhd: ../../../ip_cores/general-cores/modules/common/gc_frequency_meter.vhd work/gc_frequency_meter/.gc_frequency_meter
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_frequency_meter/.gc_frequency_meter: \
work/gencores_pkg/.gencores_pkg_vhd
work/gc_dual_clock_ram/.gc_dual_clock_ram_vhd: ../../../ip_cores/general-cores/modules/common/gc_dual_clock_ram.vhd work/gc_dual_clock_ram/.gc_dual_clock_ram
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_dual_clock_ram/.gc_dual_clock_ram:
work/gc_wfifo/.gc_wfifo_vhd: ../../../ip_cores/general-cores/modules/common/gc_wfifo.vhd work/gc_wfifo/.gc_wfifo
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/gc_wfifo/.gc_wfifo: \
work/gencores_pkg/.gencores_pkg_vhd
work/genram_pkg/.genram_pkg_vhd: ../../../ip_cores/general-cores/modules/genrams/genram_pkg.vhd work/genram_pkg/.genram_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/genram_pkg/.genram_pkg:
work/memory_loader_pkg/.memory_loader_pkg_vhd: ../../../ip_cores/general-cores/modules/genrams/memory_loader_pkg.vhd work/memory_loader_pkg/.memory_loader_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/memory_loader_pkg/.memory_loader_pkg: \
work/genram_pkg/.genram_pkg_vhd
work/generic_shiftreg_fifo/.generic_shiftreg_fifo_vhd: ../../../ip_cores/general-cores/modules/genrams/generic_shiftreg_fifo.vhd work/generic_shiftreg_fifo/.generic_shiftreg_fifo
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/generic_shiftreg_fifo/.generic_shiftreg_fifo: \
work/genram_pkg/.genram_pkg_vhd
work/wishbone_pkg/.wishbone_pkg_vhd: ../../../ip_cores/general-cores/modules/wishbone/wishbone_pkg.vhd work/wishbone_pkg/.wishbone_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wishbone_pkg/.wishbone_pkg: \
work/genram_pkg/.genram_pkg_vhd
work/generic_dpram/.generic_dpram_vhd: ../../../ip_cores/general-cores/modules/genrams/xilinx/generic_dpram.vhd work/generic_dpram/.generic_dpram
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/generic_dpram/.generic_dpram: \
work/genram_pkg/.genram_pkg_vhd \
work/memory_loader_pkg/.memory_loader_pkg_vhd
work/generic_dpram_sameclock/.generic_dpram_sameclock_vhd: ../../../ip_cores/general-cores/modules/genrams/xilinx/generic_dpram_sameclock.vhd work/generic_dpram_sameclock/.generic_dpram_sameclock
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/generic_dpram_sameclock/.generic_dpram_sameclock: \
work/genram_pkg/.genram_pkg_vhd \
work/memory_loader_pkg/.memory_loader_pkg_vhd
work/generic_dpram_dualclock/.generic_dpram_dualclock_vhd: ../../../ip_cores/general-cores/modules/genrams/xilinx/generic_dpram_dualclock.vhd work/generic_dpram_dualclock/.generic_dpram_dualclock
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/generic_dpram_dualclock/.generic_dpram_dualclock: \
work/genram_pkg/.genram_pkg_vhd \
work/memory_loader_pkg/.memory_loader_pkg_vhd
work/generic_spram/.generic_spram_vhd: ../../../ip_cores/general-cores/modules/genrams/xilinx/generic_spram.vhd work/generic_spram/.generic_spram
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/generic_spram/.generic_spram: \
work/genram_pkg/.genram_pkg_vhd
work/generic_async_fifo/.generic_async_fifo_vhd: ../../../ip_cores/general-cores/modules/genrams/xilinx/spartan6/generic_async_fifo.vhd work/generic_async_fifo/.generic_async_fifo
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/generic_async_fifo/.generic_async_fifo: \
work/genram_pkg/.genram_pkg_vhd
work/generic_sync_fifo/.generic_sync_fifo_vhd: ../../../ip_cores/general-cores/modules/genrams/xilinx/spartan6/generic_sync_fifo.vhd work/generic_sync_fifo/.generic_sync_fifo
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/generic_sync_fifo/.generic_sync_fifo: \
work/genram_pkg/.genram_pkg_vhd
fifo_generator_v6_1/dummy/.dummy_vhd: ../../../ip_cores/general-cores/modules/genrams/xilinx/sim_stub/dummy.vhd fifo_generator_v6_1/dummy/.dummy
vhpcomp $(VHPCOMP_FLAGS) -work fifo_generator_v6_1=./fifo_generator_v6_1 $<
@mkdir -p $(dir $@) && touch $@
fifo_generator_v6_1/dummy/.dummy:
work/wb_async_bridge/.wb_async_bridge_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_async_bridge/wb_async_bridge.vhd work/wb_async_bridge/.wb_async_bridge
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_async_bridge/.wb_async_bridge: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/gencores_pkg/.gencores_pkg_vhd
work/xwb_async_bridge/.xwb_async_bridge_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_async_bridge/xwb_async_bridge.vhd work/xwb_async_bridge/.xwb_async_bridge
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_async_bridge/.xwb_async_bridge: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/wb_onewire_master/.wb_onewire_master_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_onewire_master/wb_onewire_master.vhd work/wb_onewire_master/.wb_onewire_master
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_onewire_master/.wb_onewire_master: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/gencores_pkg/.gencores_pkg_vhd
work/xwb_onewire_master/.xwb_onewire_master_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_onewire_master/xwb_onewire_master.vhd work/xwb_onewire_master/.xwb_onewire_master
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_onewire_master/.xwb_onewire_master: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/i2c_master_bit_ctrl/.i2c_master_bit_ctrl_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/i2c_master_bit_ctrl.vhd work/i2c_master_bit_ctrl/.i2c_master_bit_ctrl
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/i2c_master_bit_ctrl/.i2c_master_bit_ctrl:
work/i2c_master_byte_ctrl/.i2c_master_byte_ctrl_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/i2c_master_byte_ctrl.vhd work/i2c_master_byte_ctrl/.i2c_master_byte_ctrl
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/i2c_master_byte_ctrl/.i2c_master_byte_ctrl:
work/i2c_master_top/.i2c_master_top_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/i2c_master_top.vhd work/i2c_master_top/.i2c_master_top
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/i2c_master_top/.i2c_master_top:
work/wb_i2c_master/.wb_i2c_master_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/wb_i2c_master.vhd work/wb_i2c_master/.wb_i2c_master
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_i2c_master/.wb_i2c_master: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_i2c_master/.xwb_i2c_master_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_i2c_master/xwb_i2c_master.vhd work/xwb_i2c_master/.xwb_i2c_master
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_i2c_master/.xwb_i2c_master: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_bus_fanout/.xwb_bus_fanout_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_bus_fanout/xwb_bus_fanout.vhd work/xwb_bus_fanout/.xwb_bus_fanout
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_bus_fanout/.xwb_bus_fanout: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_dpram/.xwb_dpram_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_dpram/xwb_dpram.vhd work/xwb_dpram/.xwb_dpram
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_dpram/.xwb_dpram: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/genram_pkg/.genram_pkg_vhd
work/wb_gpio_port/.wb_gpio_port_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_gpio_port/wb_gpio_port.vhd work/wb_gpio_port/.wb_gpio_port
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_gpio_port/.wb_gpio_port: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/gencores_pkg/.gencores_pkg_vhd
work/xwb_gpio_port/.xwb_gpio_port_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_gpio_port/xwb_gpio_port.vhd work/xwb_gpio_port/.xwb_gpio_port
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_gpio_port/.xwb_gpio_port: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/wb_tics/.wb_tics_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_simple_timer/wb_tics.vhd work/wb_tics/.wb_tics
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_tics/.wb_tics: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_tics/.xwb_tics_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_simple_timer/xwb_tics.vhd work/xwb_tics/.xwb_tics
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_tics/.xwb_tics: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/uart_async_rx/.uart_async_rx_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_uart/uart_async_rx.vhd work/uart_async_rx/.uart_async_rx
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/uart_async_rx/.uart_async_rx:
work/uart_async_tx/.uart_async_tx_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_uart/uart_async_tx.vhd work/uart_async_tx/.uart_async_tx
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/uart_async_tx/.uart_async_tx:
work/uart_baud_gen/.uart_baud_gen_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_uart/uart_baud_gen.vhd work/uart_baud_gen/.uart_baud_gen
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/uart_baud_gen/.uart_baud_gen:
work/simple_uart_wb/.simple_uart_wb_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_uart/simple_uart_wb.vhd work/simple_uart_wb/.simple_uart_wb
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/simple_uart_wb/.simple_uart_wb: \
work/simple_uart_pkg/.simple_uart_pkg_vhd
work/simple_uart_pkg/.simple_uart_pkg_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_uart/simple_uart_pkg.vhd work/simple_uart_pkg/.simple_uart_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/simple_uart_pkg/.simple_uart_pkg:
work/wb_simple_uart/.wb_simple_uart_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_uart/wb_simple_uart.vhd work/wb_simple_uart/.wb_simple_uart
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_simple_uart/.wb_simple_uart: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/genram_pkg/.genram_pkg_vhd \
work/simple_uart_pkg/.simple_uart_pkg_vhd
work/xwb_simple_uart/.xwb_simple_uart_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_uart/xwb_simple_uart.vhd work/xwb_simple_uart/.xwb_simple_uart
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_simple_uart/.xwb_simple_uart: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/vic_prio_enc/.vic_prio_enc_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_vic/vic_prio_enc.vhd work/vic_prio_enc/.vic_prio_enc
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/vic_prio_enc/.vic_prio_enc:
work/wb_slave_vic/.wb_slave_vic_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_vic/wb_slave_vic.vhd work/wb_slave_vic/.wb_slave_vic
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_slave_vic/.wb_slave_vic: \
work/wbgen2_pkg/.wbgen2_pkg_vhd
work/wb_vic/.wb_vic_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_vic/wb_vic.vhd work/wb_vic/.wb_vic
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_vic/.wb_vic: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_vic/.xwb_vic_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_vic/xwb_vic.vhd work/xwb_vic/.xwb_vic
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_vic/.xwb_vic: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/wb_spi/.wb_spi_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_spi/wb_spi.vhd work/wb_spi/.wb_spi
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_spi/.wb_spi: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_spi/.xwb_spi_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_spi/xwb_spi.vhd work/xwb_spi/.xwb_spi
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_spi/.xwb_spi: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/sdb_rom/.sdb_rom_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_crossbar/sdb_rom.vhd work/sdb_rom/.sdb_rom
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/sdb_rom/.sdb_rom: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_crossbar/.xwb_crossbar_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_crossbar/xwb_crossbar.vhd work/xwb_crossbar/.xwb_crossbar
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_crossbar/.xwb_crossbar: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_sdb_crossbar/.xwb_sdb_crossbar_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_crossbar/xwb_sdb_crossbar.vhd work/xwb_sdb_crossbar/.xwb_sdb_crossbar
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_sdb_crossbar/.xwb_sdb_crossbar: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xwb_lm32/.xwb_lm32_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_lm32/generated/xwb_lm32.vhd work/xwb_lm32/.xwb_lm32
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_lm32/.xwb_lm32: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/wb_slave_adapter/.wb_slave_adapter_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_slave_adapter/wb_slave_adapter.vhd work/wb_slave_adapter/.wb_slave_adapter
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_slave_adapter/.wb_slave_adapter: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/wb_xilinx_fpga_loader/.wb_xilinx_fpga_loader_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_xilinx_fpga_loader/wb_xilinx_fpga_loader.vhd work/wb_xilinx_fpga_loader/.wb_xilinx_fpga_loader
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wb_xilinx_fpga_loader/.wb_xilinx_fpga_loader: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/gencores_pkg/.gencores_pkg_vhd \
work/xloader_registers_pkg/.xloader_registers_pkg_vhd
work/xwb_xilinx_fpga_loader/.xwb_xilinx_fpga_loader_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_xilinx_fpga_loader/xwb_xilinx_fpga_loader.vhd work/xwb_xilinx_fpga_loader/.xwb_xilinx_fpga_loader
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_xilinx_fpga_loader/.xwb_xilinx_fpga_loader: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/xloader_registers_pkg/.xloader_registers_pkg_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_xilinx_fpga_loader/xloader_registers_pkg.vhd work/xloader_registers_pkg/.xloader_registers_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xloader_registers_pkg/.xloader_registers_pkg: \
work/wbgen2_pkg/.wbgen2_pkg_vhd
work/xloader_wb/.xloader_wb_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_xilinx_fpga_loader/xloader_wb.vhd work/xloader_wb/.xloader_wb
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xloader_wb/.xloader_wb: \
work/xloader_registers_pkg/.xloader_registers_pkg_vhd \
work/wbgen2_pkg/.wbgen2_pkg_vhd
work/xwb_clock_crossing/.xwb_clock_crossing_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_clock_crossing/xwb_clock_crossing.vhd work/xwb_clock_crossing/.xwb_clock_crossing
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_clock_crossing/.xwb_clock_crossing: \
work/wishbone_pkg/.wishbone_pkg_vhd \
work/gencores_pkg/.gencores_pkg_vhd
work/xwb_dma/.xwb_dma_vhd: ../../../ip_cores/general-cores/modules/wishbone/wb_dma/xwb_dma.vhd work/xwb_dma/.xwb_dma
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/xwb_dma/.xwb_dma: \
work/wishbone_pkg/.wishbone_pkg_vhd
work/wbgen2_dpssram/.wbgen2_dpssram_vhd: ../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_dpssram.vhd work/wbgen2_dpssram/.wbgen2_dpssram
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wbgen2_dpssram/.wbgen2_dpssram: \
work/wbgen2_pkg/.wbgen2_pkg_vhd
work/wbgen2_eic/.wbgen2_eic_vhd: ../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_eic.vhd work/wbgen2_eic/.wbgen2_eic
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wbgen2_eic/.wbgen2_eic: \
work/wbgen2_pkg/.wbgen2_pkg_vhd
work/wbgen2_fifo_async/.wbgen2_fifo_async_vhd: ../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_fifo_async.vhd work/wbgen2_fifo_async/.wbgen2_fifo_async
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wbgen2_fifo_async/.wbgen2_fifo_async: \
work/genram_pkg/.genram_pkg_vhd \
work/wbgen2_pkg/.wbgen2_pkg_vhd
work/wbgen2_fifo_sync/.wbgen2_fifo_sync_vhd: ../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_fifo_sync.vhd work/wbgen2_fifo_sync/.wbgen2_fifo_sync
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wbgen2_fifo_sync/.wbgen2_fifo_sync: \
work/wbgen2_pkg/.wbgen2_pkg_vhd
work/wbgen2_pkg/.wbgen2_pkg_vhd: ../../../ip_cores/general-cores/modules/wishbone/wbgen2/wbgen2_pkg.vhd work/wbgen2_pkg/.wbgen2_pkg
vhpcomp $(VHPCOMP_FLAGS) -work work=./work $<
@mkdir -p $(dir $@) && touch $@
work/wbgen2_pkg/.wbgen2_pkg:
action = "simulation"
target = "xilinx"
modules = {"local" : [ "../../.." ] };
files = ["wb_dma_interface_tb.vhd"]
Running: /opt/Xilinx/13.4/ISE_DS/ISE/bin/lin64/unwrapped/fuse work.wb_dma_interface_tb -intstyle ise -incremental -o isim_proj
ISim O.87xd (signature 0x8ddf5b5d)
Number of CPUs detected in this system: 4
Turning on mult-threading, number of parallel sub-compilation jobs: 8
Starting static elaboration
WARNING:HDLCompiler:746 - "../../../ip_cores/general-cores/modules/genrams/genram_pkg.vhd" Line 50: Range is empty (null range)
Completed static elaboration
Fuse Memory Usage: 100984 KB
Fuse CPU Usage: 1090 ms
Compiling package standard
Compiling package std_logic_1164
Compiling package numeric_std
Compiling package genram_pkg
Compiling package wishbone_pkg
FATAL_ERROR:Simulator:CompilerAssert.h:40:1.45 - Internal Compiler Error in file ../src/VhdlDecl.cpp at line 3154 Process will terminate. For technical support on this issue, please open a WebCase with this project attached at http://www.xilinx.com/support.
<?xml version="1.0" encoding="UTF-8"?>
<!-- IMPORTANT: This is an internal file that has been generated
by the Xilinx ISE software. Any direct editing or
changes made to this file may result in unpredictable
behavior or data corruption. It is strongly advised that
users do not edit the contents of this file. -->
<messages>
<msg type="warning" file="HDLCompiler" num="746" delta="unknown" >"../../../ip_cores/general-cores/modules/genrams/genram_pkg.vhd" Line 50: Range is empty (null range)
</msg>
<msg type="fatal" file="Simulator" num="0" delta="unknown" srcfile="/build/xfndry10/O.87xd/env/Jobs/Simulator/Compiler/common/src/CompilerAssert.h" srcline="40" srcrcs="1.45" >Internal Compiler Error in file <arg fmt="%s" index="1">../src/VhdlDecl.cpp</arg> at line <arg fmt="%d" index="2">3154</arg>
</msg>
</messages>
"work.wb_dma_interface_tb" -intstyle "ise" -incremental -o "isim_proj"
/**********************************************************************/
/* ____ ____ */
/* / /\/ / */
/* /___/ \ / */
/* \ \ \/ */
/* \ \ Copyright (c) 2003-2009 Xilinx, Inc. */
/* / / All Right Reserved. */
/* /---/ /\ */
/* \ \ / \ */
/* \___\/\___\ */
/***********************************************************************/
/* This file is designed for use with ISim build 0x8ddf5b5d */
#define XSI_HIDE_SYMBOL_SPEC true
#include "xsi.h"
#include <memory.h>
#ifdef __GNUC__
#include <stdlib.h>
#else
#include <malloc.h>
#define alloca _alloca
#endif
extern char *IEEE_P_2592010699;
int work_p_3157354128_sub_1165966991973796083_2599174331(char *t1, int t2)
{
char t4[8];
int t0;
char *t5;
int t6;
int t7;
int t8;
unsigned char t9;
LAB0: t5 = (t4 + 4U);
*((int *)t5) = t2;
t6 = 1;
t7 = 64;
LAB2: if (t6 <= t7)
goto LAB3;
LAB5: t0 = 63;
LAB1: return t0;
LAB3: t8 = xsi_vhdl_pow(2, t6);
t9 = (t8 >= t2);
if (t9 != 0)
goto LAB6;
LAB8:
LAB7:
LAB4: if (t6 == t7)
goto LAB5;
LAB10: t8 = (t6 + 1);
t6 = t8;
goto LAB2;
LAB6: t0 = t6;
goto LAB1;
LAB9: goto LAB7;
LAB11:;
}
char *work_p_3157354128_sub_15107438780999777091_2599174331(char *t1, char *t2, unsigned char t3, int t4)
{
char t5[128];
char t6[16];
char t10[16];
char *t0;
int t7;
int t8;
unsigned int t9;
int t11;
char *t12;
char *t13;
int t14;
unsigned int t15;
char *t16;
char *t17;
char *t18;
char *t19;
char *t20;
char *t21;
char *t22;
char *t23;
int t24;
int t25;
int t26;
char *t27;
char *t28;
int t29;
char *t30;
int t31;
int t32;
char *t33;
int t34;
unsigned int t35;
unsigned int t36;
char *t37;
LAB0: t7 = (t4 - 1);
t8 = (0 - t7);
t9 = (t8 * -1);
t9 = (t9 + 1);
t9 = (t9 * 1U);
t11 = (t4 - 1);
t12 = (t10 + 0U);
t13 = (t12 + 0U);
*((int *)t13) = t11;
t13 = (t12 + 4U);
*((int *)t13) = 0;
t13 = (t12 + 8U);
*((int *)t13) = -1;
t14 = (0 - t11);
t15 = (t14 * -1);
t15 = (t15 + 1);
t13 = (t12 + 12U);
*((unsigned int *)t13) = t15;
t13 = (t5 + 4U);
t16 = ((IEEE_P_2592010699) + 4000);
t17 = (t13 + 88U);
*((char **)t17) = t16;
t18 = (char *)alloca(t9);
t19 = (t13 + 56U);
*((char **)t19) = t18;
xsi_type_set_default_value(t16, t18, t10);
t20 = (t13 + 64U);
*((char **)t20) = t10;
t21 = (t13 + 80U);
*((unsigned int *)t21) = t9;
t22 = (t6 + 4U);
*((unsigned char *)t22) = t3;
t23 = (t6 + 5U);
*((int *)t23) = t4;
t24 = (t4 - 1);
t25 = 0;
t26 = t24;
LAB2: if (t25 <= t26)
goto LAB3;
LAB5: t12 = (t13 + 56U);
t16 = *((char **)t12);
t12 = (t10 + 12U);
t9 = *((unsigned int *)t12);
t9 = (t9 * 1U);
t0 = xsi_get_transient_memory(t9);
memcpy(t0, t16, t9);
t17 = (t10 + 0U);
t7 = *((int *)t17);
t19 = (t10 + 4U);
t8 = *((int *)t19);
t20 = (t10 + 8U);
t11 = *((int *)t20);
t21 = (t2 + 0U);
t27 = (t21 + 0U);
*((int *)t27) = t7;
t27 = (t21 + 4U);
*((int *)t27) = t8;
t27 = (t21 + 8U);
*((int *)t27) = t11;
t14 = (t8 - t7);
t15 = (t14 * t11);
t15 = (t15 + 1);
t27 = (t21 + 12U);
*((unsigned int *)t27) = t15;
LAB1: return t0;
LAB3: t27 = (t13 + 56U);
t28 = *((char **)t27);
t27 = (t10 + 0U);
t29 = *((int *)t27);
t30 = (t10 + 8U);
t31 = *((int *)t30);
t32 = (t25 - t29);
t15 = (t32 * t31);
t33 = (t10 + 4U);
t34 = *((int *)t33);
xsi_vhdl_check_range_of_index(t29, t34, t31, t25);
t35 = (1U * t15);
t36 = (0 + t35);
t37 = (t28 + t36);
*((unsigned char *)t37) = t3;
LAB4: if (t25 == t26)
goto LAB5;
LAB6: t7 = (t25 + 1);
t25 = t7;
goto LAB2;
LAB7:;
}
extern void work_p_3157354128_init()
{
static char *se[] = {(void *)work_p_3157354128_sub_1165966991973796083_2599174331,(void *)work_p_3157354128_sub_15107438780999777091_2599174331};
xsi_register_didat("work_p_3157354128", "isim/isim_proj.sim/work/p_3157354128.didat");
xsi_register_subprogram_executes(se);
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
make
vsim -L XilinxCoreLib -L secureip -L unisim work.main -voptargs="+acc"
radix -hexadecimal
do wave.do
set StdArithNoWarnings 1
set NumericStdNoWarnings 1
run 100us
wave zoomfull
\ No newline at end of file
onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate /main/clk_sys
add wave -noupdate /main/DUT/U_CPU/dwb_o
add wave -noupdate /main/DUT/U_CPU/dwb_i
add wave -noupdate /main/DUT/U_Intercon/granted
add wave -noupdate /main/DUT/U_CPU/gen_profile_medium/U_Wrapped_LM32/D_STB_O
add wave -noupdate /main/DUT/U_CPU/gen_profile_medium/U_Wrapped_LM32/D_ACK_I
add wave -noupdate /main/DUT/U_CPU/data_was_busy
add wave -noupdate /main/DUT/U_CPU/data_addr_reg
add wave -noupdate /main/DUT/U_CPU/data_remaining
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {{Cursor 1} {2672526 ps} 0}
configure wave -namecolwidth 350
configure wave -valuecolwidth 100
configure wave -justifyvalue left
configure wave -signalnamewidth 1
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
configure wave -gridoffset 0
configure wave -gridperiod 1
configure wave -griddelta 40
configure wave -timeline 0
configure wave -timelineunits ns
update
WaveRestoreZoom {2262366 ps} {3082686 ps}
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.wishbone_pkg.all;
use work.custom_wishbone_pkg.all;
entity wb_dma_interface_tb is
end wb_dma_interface_tb;
architecture sim of wb_dma_interface_tb is
-- 100.00 MHz clock
constant c_data_clk_period : time := 10.00 ns;
-- 200.00 MHz clock
constant c_dma_clk_period : time := 5.00 ns;
constant c_sim_time : time := 10000.00 ns;
signal g_end_simulation : boolean := false; -- Set to true to halt the simulation
signal arst_n_i : std_logic;
signal dma_clk_i : std_logic := '0';
signal data_clk_i : std_logic := '0';
signal dma_slave_i : t_wishbone_slave_in;
signal dma_slave_o : t_wishbone_slave_out;
signal data_i : std_logic_vector(c_wishbone_data_width-1 downto 0);
signal data_valid_i : std_logic;
signal data_ready_o : std_logic;
signal capture_ctl_i : std_logic_vector(c_wishbone_data_width-1 downto 0);
signal dma_complete_o : std_logic;
signal dma_ovf_o : std_logic;
begin -- sim
p_data_clk_gen : process
begin
while g_end_simulation = false loop
wait for c_data_clk_period/2;
data_clk_i <= not data_clk_i;
wait for c_data_clk_period/2;
data_clk_i <= not data_clk_i;
end loop;
wait; -- simulation stops here
end process;
p_dma_clk_gen : process
begin
while g_end_simulation = false loop
wait for c_dma_clk_period/2;
dma_clk_i <= not dma_clk_i;
wait for c_dma_clk_period/2;
dma_clk_i <= not dma_clk_i;
end loop;
wait; -- simulation stops here
end process;
p_main_simulation : process
begin
wait for c_sim_time;
g_end_simulation <= true;
wait;
end process;
cmp_dut : xwb_dma_interface
port map(
-- Asynchronous Reset signal
arst_n_i => arst_n_i,
-- Write Domain Clock
dma_clk_i => dma_clk_i,
--dma_valid_o : out std_logic;
--dma_data_o : out std_logic_vector(C_NBITS_DATA_INPUT-1 downto 0);
--dma_be_o : out std_logic_vector(C_NBITS_DATA_INPUT/8 - 1 downto 0);
--dma_last_o : out std_logic;
--dma_ready_i : in std_logic;
-- Slave Data Flow port
dma_slave_i => dma_slave_i,
dma_slave_o => dma_slave_o,
-- Slave Data Input Port
--data_slave_i : in t_wishbone_slave_in;
--data_slave_o : out t_wishbone_slave_out;
data_clk_i => data_clk_i,
data_i => data_i,
data_valid_i => data_valid_i,
data_ready_o => data_ready_o,
-- Slave control port. use wbgen2 tool or not if it is simple.
--control_slave_i : in t_wishbone_slave_in;
--control_slave_o : out t_wishbone_slave_out;
capture_ctl_i => capture_ctl_i,
dma_complete_o => dma_complete_o,
dma_ovf_o => dma_ovf_o
-- Debug Signals
--dma_debug_clk_o : out std_logic;
--dma_debug_data_o : out std_logic_vector(255 downto 0);
--dma_debug_trigger_o : out std_logic_vector(15 downto 0)
);
end sim;
-- Default lib mapping for Simulator
std=$XILINX/vhdl/hdp/lin64/std
ieee=$XILINX/vhdl/hdp/lin64/ieee
ieee_proposed=$XILINX/vhdl/hdp/lin64/ieee_proposed
vl=$XILINX/vhdl/hdp/lin64/vl
synopsys=$XILINX/vhdl/hdp/lin64/synopsys
simprim=$XILINX/vhdl/hdp/lin64/simprim
unisim=$XILINX/vhdl/hdp/lin64/unisim
unimacro=$XILINX/vhdl/hdp/lin64/unimacro
aim=$XILINX/vhdl/hdp/lin64/aim
cpld=$XILINX/vhdl/hdp/lin64/cpld
pls=$XILINX/vhdl/hdp/lin64/pls
xilinxcorelib=$XILINX/vhdl/hdp/lin64/xilinxcorelib
aim_ver=$XILINX/verilog/hdp/lin64/aim_ver
cpld_ver=$XILINX/verilog/hdp/lin64/cpld_ver
simprims_ver=$XILINX/verilog/hdp/lin64/simprims_ver
unisims_ver=$XILINX/verilog/hdp/lin64/unisims_ver
uni9000_ver=$XILINX/verilog/hdp/lin64/uni9000_ver
unimacro_ver=$XILINX/verilog/hdp/lin64/unimacro_ver
xilinxcorelib_ver=$XILINX/verilog/hdp/lin64/xilinxcorelib_ver
secureip=$XILINX/verilog/hdp/lin64/xip/secureip
work=work
fifo_generator_v6_1=fifo_generator_v6_1
files = [ "dbe_demo_top.vhd", "sys_pll.vhd", "clk_gen.vhd", "dbe_demo_top.ucf" ];
modules = { "local" : ["../../.." ] };
library UNISIM;
use UNISIM.vcomponents.all;
library ieee;
use ieee.std_logic_1164.all;
entity clk_gen is
port(
sys_clk_p_i : in std_logic;
sys_clk_n_i : in std_logic;
sys_clk_o : out std_logic
);
end clk_gen;
architecture syn of clk_gen is
-- Internal clock signal
signal s_sys_clk : std_logic;
begin
-- IBUFGDS: Differential Global Clock Input Buffer
-- Virtex-6
-- Xilinx HDL Language Template, version 13.4
cpm_ibufgds_clk_gen : IBUFGDS
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 => s_sys_clk, -- Clock buffer output
I => sys_clk_p_i, -- Diff_p clock buffer input (connect directly to top-level port)
IB => sys_clk_n_i -- Diff_n clock buffer input (connect directly to top-level port)
);
-- BUFG: Global Clock Buffer
-- Virtex-6
-- Xilinx HDL Language Template, version 13.4
cmp_bufg_clk_gen : BUFG
port map (
O => sys_clk_o, -- 1-bit output: Clock buffer output
I => s_sys_clk -- 1-bit input: Clock buffer input
);
end syn;
NET "buttons_i[0]" LOC = D22;
NET "buttons_i[1]" LOC = C22;
NET "buttons_i[2]" LOC = L21;
NET "buttons_i[3]" LOC = L20;
NET "buttons_i[4]" LOC = C18;
NET "buttons_i[5]" LOC = B18;
NET "buttons_i[6]" LOC = K22;
NET "buttons_i[7]" LOC = K21;
NET "leds_o[0]" LOC = AC22;
NET "leds_o[1]" LOC = AC24;
NET "leds_o[2]" LOC = AE22;
NET "leds_o[3]" LOC = AE23;
NET "leds_o[4]" LOC = AB23;
NET "leds_o[5]" LOC = AG23;
NET "leds_o[6]" LOC = AE24;
NET "leds_o[7]" LOC = AD24;
NET "buttons_i[7]" IOSTANDARD = LVCMOS25;
NET "buttons_i[6]" IOSTANDARD = LVCMOS25;
NET "buttons_i[5]" IOSTANDARD = LVCMOS25;
NET "buttons_i[4]" IOSTANDARD = LVCMOS25;
NET "buttons_i[3]" IOSTANDARD = LVCMOS25;
NET "buttons_i[2]" IOSTANDARD = LVCMOS25;
NET "buttons_i[1]" IOSTANDARD = LVCMOS25;
NET "buttons_i[0]" IOSTANDARD = LVCMOS25;
NET "leds_o[7]" IOSTANDARD = LVCMOS25;
NET "leds_o[7]" DRIVE = 12;
NET "leds_o[7]" SLEW = SLOW;
NET "leds_o[6]" IOSTANDARD = LVCMOS25;
NET "leds_o[6]" DRIVE = 12;
NET "leds_o[6]" SLEW = SLOW;
NET "leds_o[5]" IOSTANDARD = LVCMOS25;
NET "leds_o[5]" DRIVE = 12;
NET "leds_o[5]" SLEW = SLOW;
NET "leds_o[4]" IOSTANDARD = LVCMOS25;
NET "leds_o[4]" DRIVE = 12;
NET "leds_o[4]" SLEW = SLOW;
NET "leds_o[3]" IOSTANDARD = LVCMOS25;
NET "leds_o[3]" DRIVE = 12;
NET "leds_o[3]" SLEW = SLOW;
NET "leds_o[2]" IOSTANDARD = LVCMOS25;
NET "leds_o[2]" DRIVE = 12;
NET "leds_o[2]" SLEW = SLOW;
NET "leds_o[1]" IOSTANDARD = LVCMOS25;
NET "leds_o[1]" DRIVE = 12;
NET "leds_o[1]" SLEW = SLOW;
NET "leds_o[0]" IOSTANDARD = LVCMOS25;
NET "leds_o[0]" DRIVE = 12;
NET "leds_o[0]" SLEW = SLOW;
NET "sys_clk_p_i" IOSTANDARD = LVDS_25;
NET "sys_clk_n_i" IOSTANDARD = LVDS_25;
# PlanAhead Generated physical constraints
NET "sys_clk_n_i" LOC = H9;
NET "sys_clk_p_i" LOC = J9;
-- Example Design based on genral-cores top example design
-- from OHWR repositories http://www.ohwr.org/projects/general-cores
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.wishbone_pkg.all;
use work.gencores_pkg.all;
library UNISIM;
use UNISIM.vcomponents.all;
entity dbe_bpm_top is
port(
-----------------------------------------
-- Clocking pins
-----------------------------------------
--clk100_i : in std_logic;
sys_clk_p_i : in std_logic;
sys_clk_n_i : in std_logic;
-----------------------------------------
-- Button pins
-----------------------------------------
buttons_i : in std_logic_vector(7 downto 0);
-----------------------------------------
-- User LEDs
-----------------------------------------
leds_o : out std_logic_vector(7 downto 0)
);
end dbe_bpm_top;
architecture rtl of dbe_bpm_top is
-- Simple GPIO interface device
constant c_xwb_gpio32_sdb : t_sdb_device := (
abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"00",
wbd_endian => c_sdb_endian_big,
wbd_width => x"7", -- 8/16/32-bit port granularity
sdb_component => (
addr_first => x"0000000000000000",
addr_last => x"00000000000000FF", -- Max of 256 pins. Max of 8 32-bit registers
product => (
vendor_id => x"0000000000000651", -- GSI
device_id => x"35aa6b95",
version => x"00000001",
date => x"20120305",
name => "GSI_GPIO_32 ")));
-- Simple IRQ manager interface device
constant c_xwb_irqmngr_sdb : t_sdb_device := (
abi_class => x"0000", -- undocumented device
abi_ver_major => x"01",
abi_ver_minor => x"00",
wbd_endian => c_sdb_endian_big,
wbd_width => x"7", -- 8/16/32-bit port granularity
sdb_component => (
addr_first => x"0000000000000000",
addr_last => x"0000000000000007", -- Two 4 byte registers
product => (
vendor_id => x"1000000000001215", -- LNLS
device_id => x"15ff65e1",
version => x"00000001",
date => x"20120903", -- YY/MM/DD ??
name => "LNLS_IRQMNGR ")));
-- Top crossbar layout
constant c_slaves : natural := 5; -- LED, Button, Dual-port memory, DMA control port
constant c_masters : natural := 4; -- LM32 master. Data + Instruction, DMA read+write master
constant c_dpram_size : natural := 16384; -- in 32-bit words (64KB)
-- GPIO num pins
constant c_leds_num_pins : natural := 8;
constant c_buttons_num_pins : natural := 8;
-- Counter width. It willl count up to 2^27 clock cycles
--constant c_counter_width : natural := 27;
-- WB SDB (Self describing bus) layout
constant c_layout : t_sdb_record_array(c_slaves-1 downto 0) :=
(0 => f_sdb_embed_device(f_xwb_dpram(c_dpram_size), x"00000000"), -- 64KB RAM
1 => f_sdb_embed_device(f_xwb_dpram(c_dpram_size), x"10000000"), -- Second port to the same memory
2 => f_sdb_embed_device(c_xwb_dma_sdb, x"20000400") -- DMA control port
3 => f_sdb_embed_device(c_xwb_gpio32_sdb, x"20000500"), -- GPIO LED
4 => f_sdb_embed_device(c_xwb_gpio32_sdb, x"20000600"), -- GPIO Button
--4 => f_sdb_embed_device(c_xwb_irqmngr_sdb, x"00100600") -- IRQ_MNGR
);
-- Self Describing Bus ROM Address. It is addressed as slave as well.
constant c_sdb_address : t_wishbone_address := x"20000000";
-- Crossbar master/slave arrays
signal cbar_slave_i : t_wishbone_slave_in_array (c_masters-1 downto 0);
signal cbar_slave_o : t_wishbone_slave_out_array(c_masters-1 downto 0);
signal cbar_master_i : t_wishbone_master_in_array(c_slaves-1 downto 0);
signal cbar_master_o : t_wishbone_master_out_array(c_slaves-1 downto 0);
-- LM32 signals
signal clk_sys : std_logic;
signal lm32_interrupt : std_logic_vector(31 downto 0);
signal lm32_rstn : std_logic;
-- Global clock and reset signals
signal locked : std_logic;
signal clk_sys_rstn : std_logic;
-- Only one clock domain
signal reset_clks : std_logic_vector(0 downto 0);
signal reset_rstn : std_logic_vector(0 downto 0);
-- Global Clock Single ended
signal sys_clk_gen : std_logic;
-- GPIO LED signals
signal gpio_slave_led_o : t_wishbone_slave_out;
signal gpio_slave_led_i : t_wishbone_slave_in;
signal s_leds : std_logic_vector(c_leds_num_pins-1 downto 0);
-- signal leds_gpio_dummy_in : std_logic_vector(c_leds_num_pins-1 downto 0);
-- GPIO Button signals
signal gpio_slave_button_o : t_wishbone_slave_out;
signal gpio_slave_button_i : t_wishbone_slave_in;
-- IRQ manager signals
--signal gpio_slave_irqmngr_o : t_wishbone_slave_out;
--signal gpio_slave_irqmngr_i : t_wishbone_slave_in;
-- LEDS, button and irq manager signals
--signal r_leds : std_logic_vector(7 downto 0);
--signal r_reset : std_logic;
-- Counter signal
--signal s_counter : unsigned(c_counter_width-1 downto 0);
-- 100MHz period or 1 second
--constant s_counter_full : integer := 100000000;
-- Chipscope signals
signal clk_25mhz : std_logic;
signal CONTROL : std_logic_vector(35 downto 0);
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);
---------------------------
-- Components --
---------------------------
-- Clock generation
component clk_gen is
port(
sys_clk_p_i : in std_logic;
sys_clk_n_i : in std_logic;
sys_clk_o : out std_logic
);
end component;
-- Xilinx Megafunction
component sys_pll is
port(
rst_i : in std_logic := '0';
clk_i : in std_logic := '0';
clk0_o : out std_logic;
clk1_o : out std_logic;
locked_o : out std_logic
);
end component;
-- Xilinx Chipscope Controller
component chipscope_icon
port (
CONTROL0 : inout std_logic_vector(35 downto 0)
);
end component;
-- Xilinx Chipscope Logic Analyser
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;
begin
-- Clock generation
cmp_clk_gen : clk_gen
port map (
sys_clk_p_i => sys_clk_p_i,
sys_clk_n_i => sys_clk_n_i,
sys_clk_o => sys_clk_gen
);
-- Obtain core locking!
cmp_sys_pll_inst : sys_pll
port map (
rst_i => '0',
clk_i => sys_clk_gen,
clk0_o => clk_sys, -- 100MHz locked clock
clk1_o => clk_25mhz, -- 25MHz locked clock
locked_o => locked -- '1' when the PLL has locked
);
-- Reset synchronization. Hold reset line until few locked cycles hava passed
cmp_reset : gc_reset
port map(
free_clk_i => sys_clk_gen,
locked_i => locked,
clks_i => reset_clks,
rstn_o => reset_rstn
);
reset_clks(0) <= clk_sys;
clk_sys_rstn <= reset_rstn(0);
-- The top-most Wishbone B.4 crossbar
cmp_interconnect : xwb_sdb_crossbar
generic map(
g_num_masters => c_masters,
g_num_slaves => c_slaves,
g_registered => true,
g_wraparound => false, -- Should be true for nested buses
g_layout => c_layout,
g_sdb_addr => c_sdb_address
)
port map(
clk_sys_i => clk_sys,
rst_n_i => clk_sys_rstn,
-- Master connections (INTERCON is a slave)
slave_i => cbar_slave_i,
slave_o => cbar_slave_o,
-- Slave connections (INTERCON is a master)
master_i => cbar_master_i,
master_o => cbar_master_o
);
-- The LM32 is master 0+1
lm32_rstn <= clk_sys_rstn; -- and not r_reset;
cmp_lm32 : xwb_lm32
generic map(
g_profile => "medium_icache_debug"
) -- Including JTAG and I-cache (no divide)
port map(
clk_sys_i => clk_sys,
rst_n_i => lm32_rstn,
irq_i => lm32_interrupt,
dwb_o => cbar_slave_i(0), -- Data bus
dwb_i => cbar_slave_o(0),
iwb_o => cbar_slave_i(1), -- Instruction bus
iwb_i => cbar_slave_o(1)
);
-- Interrupts 31 downto 1 disabled for now.
-- Interrupt '0' is DMA completion.
lm32_interrupt(31 downto 1) <= (others => '0');
-- A DMA controller is master 2+3, slave 2, and interrupt 0
cmp_dma : xwb_dma
port map(
clk_i => clk_sys,
rst_n_i => clk_sys_rstn,
slave_i => cbar_master_o(2),
slave_o => cbar_master_i(2),
r_master_i => cbar_slave_o(2),
r_master_o => cbar_slave_i(2),
w_master_i => cbar_slave_o(3),
w_master_o => cbar_slave_i(3),
interrupt_o => lm32_interrupt(0)
);
-- Slave 0+1 is the RAM. Load a input file containing a simple led blink program!
cmp_ram : xwb_dpram
generic map(
g_size => c_dpram_size, -- must agree with sw/target/lm32/ram.ld:LENGTH / 4
g_init_file => "../../top/ml_605/dbe_bpm/sw/main.ram",
g_must_have_init_file => true,
g_slave1_interface_mode => PIPELINED,
g_slave2_interface_mode => PIPELINED,
g_slave1_granularity => BYTE,
g_slave2_granularity => BYTE
)
port map(
clk_sys_i => clk_sys,
rst_n_i => clk_sys_rstn,
-- First port connected to the crossbar
slave1_i => cbar_master_o(0),
slave1_o => cbar_master_i(0),
-- Second port connected to the crossbar
slave2_i => cbar_master_o(1),
slave2_o => cbar_master_i(1)
--slave2_i => cc_dummy_slave_in, -- CYC always low
--slave2_o => open
);
-- Slave 3 is the example LED driver
cmp_leds : xwb_gpio_port
generic map(
--g_interface_mode => CLASSIC;
g_address_granularity => BYTE,
g_num_pins => c_leds_num_pins,
g_with_builtin_tristates => false
)
port map(
clk_sys_i => clk_sys,
rst_n_i => clk_sys_rstn,
-- Wishbone
slave_i => cbar_master_o(3),
slave_o => cbar_master_i(3),
desc_o => open, -- Not implemented
--gpio_b : inout std_logic_vector(g_num_pins-1 downto 0);
gpio_out_o => s_leds,
--gpio_out_o => open,
gpio_in_i => s_leds,
gpio_oen_o => open
);
--leds_o <= x"55";
leds_o <= s_leds;
--p_test_leds : process (clk_sys)
--begin
-- if rising_edge(clk_sys) then
-- if clk_sys_rstn = '0' then
-- s_counter <= (others => '0');
-- s_leds <= x"55";
-- else
-- if (s_counter = s_counter_full-1) then
-- s_counter <= (others => '0');
-- s_leds <= s_leds(c_leds_num_pins-2 downto 0) & s_leds(c_leds_num_pins-1);
-- else
-- s_counter <= s_counter + 1;
-- end if;
-- end if;
-- end if;
--end process;
-- Slave 1 is the example LED driver
--gpio_slave_led_i <= cbar_master_o(1);
--cbar_master_i(1) <= gpio_slave_led_o;
--leds_o <= not r_leds;
-- There is a tool called 'wbgen2' which can autogenerate a Wishbone
-- interface and C header file, but this is a simple example.
--gpio : process(clk_sys)
--begin
-- if rising_edge(clk_sys) then
-- It is vitally important that for each occurance of
-- (cyc and stb and not stall) there is (ack or rty or err)
-- sometime later on the bus.
--
-- This is an easy solution for a device that never stalls:
-- gpio_slave_led_o.ack <= gpio_slave_led_i.cyc and gpio_slave_led_i.stb;
-- Detect a write to the register byte
-- if gpio_slave_led_i.cyc = '1' and gpio_slave_led_i.stb = '1' and
-- gpio_slave_led_i.we = '1' and gpio_slave_led_i.sel(0) = '1' then
-- Register 0x0 = LEDs, 0x4 = CPU reset
-- if gpio_slave_led_i.adr(2) = '0' then
-- r_leds <= gpio_slave_led_i.dat(7 downto 0);
-- else
-- r_reset <= gpio_slave_led_i.dat(0);
-- end if;
-- end if;
-- Read to the register byte
-- if gpio_slave_led_i.adr(2) = '0' then
-- gpio_slave_led_o.dat(31 downto 8) <= (others => '0');
-- gpio_slave_led_o.dat(7 downto 0) <= r_leds;
-- else
-- gpio_slave_led_o.dat(31 downto 2) <= (others => '0');
-- gpio_slave_led_o.dat(0) <= r_reset;
-- end if;
--end if;
--end process;
--gpio_slave_led_o.int <= '0';
--gpio_slave_led_o.err <= '0';
--gpio_slave_led_o.rty <= '0';
--gpio_slave_led_o.stall <= '0'; -- This simple example is always ready
-- Slave 4 is the example Button driver
cmp_buttons : xwb_gpio_port
generic map(
--g_interface_mode => CLASSIC;
g_address_granularity => BYTE;
g_num_pins => c_buttons_num_pins,
g_with_builtin_tristates => false
)
port map(
clk_sys_i => clk_sys,
rst_n_i => clk_sys_rstn,
-- Wishbone
slave_i => cbar_master_o(4),
slave_o => cbar_master_i(4),
desc_o => open, -- Not implemented
--gpio_b : inout std_logic_vector(g_num_pins-1 downto 0);
gpio_out_o => open,
gpio_in_i => buttons_i,
gpio_oen_o => open
);
-- Xilinx Chipscope
cmp_chipscope_icon_1 : chipscope_icon
port map (
CONTROL0 => CONTROL
);
cmp_chipscope_ila_1 : chipscope_ila
port map (
CONTROL => CONTROL,
CLK => clk_25mhz,
TRIG0 => TRIG0,
TRIG1 => TRIG1,
TRIG2 => TRIG2,
TRIG3 => TRIG3
);
-- DMA Write Master output
TRIG0 <= cbar_slave_i(3).dat(31 downto 0);
-- DMA Read Master input
TRIG1 <= cbar_slave_o(2).dat(31 downto 0);
-- Global reset
TRIG2(0) <= clk_sys_rstn;
TRIG2(31 downto 1) <= (others => '0');
TRIG3(31 downto 0) <= (others => '0');
end rtl;
PLATFORM = lm32
OBJS_WRC = main.o gpio.o dma.o target/lm32/crt0.o
CROSS_COMPILE ?= /opt/gcc-lm32/bin/lm32-elf-
CFLAGS_PLATFORM = -mmultiply-enabled -mbarrel-shift-enabled -I.
LDFLAGS_PLATFORM = -mmultiply-enabled -mbarrel-shift-enabled -nostdlib -T target/lm32/ram.ld
CC=$(CROSS_COMPILE)gcc
OBJCOPY=$(CROSS_COMPILE)objcopy
OBJDUMP=$(CROSS_COMPILE)objdump
CFLAGS= $(CFLAGS_PLATFORM) -ffunction-sections -fdata-sections -Os -Iinclude $(PTPD_CFLAGS) -Iptp-noposix/PTPWRd
LDFLAGS= $(LDFLAGS_PLATFORM) -ffunction-sections -fdata-sections -Os -Iinclude
SIZE = $(CROSS_COMPILE)size
OBJS=$(OBJS_PLATFORM) $(OBJS_WRC) $(OBJS_PTPD) $(OBJS_PTPD_FREE)
OUTPUT=main
all: $(OBJS)
$(SIZE) -t $(OBJS)
${CC} -o $(OUTPUT).elf $(OBJS) $(LDFLAGS)
${OBJCOPY} -O binary $(OUTPUT).elf $(OUTPUT).bin
${OBJDUMP} -d $(OUTPUT).elf > $(OUTPUT)_disasm.S
./genraminit $(OUTPUT).bin 0 > $(OUTPUT).ram
clean:
rm -f $(OBJS) $(OUTPUT).elf $(OUTPUT).bin $(OUTPUT).ram $(OUTPUT)_disasm.S
%.o: %.c
${CC} $(CFLAGS) $(PTPD_CFLAGS) $(INCLUDE_DIR) $(LIB_DIR) -c $^ -o $@
#ifndef __BOARD_H
#define __BOARD_H
/* Automate the address peripheral discover */
#define BASE_DMA_ADDR 0x20000400
#define BASE_LEDS_ADDR 0x20000500
#define BASE_BUTTONS_ADDR 0x20000600
static inline int delay(int x)
{
while(x--) asm volatile("nop");
}
#endif
#include "dma.h"
/* DMA user interface definition */
static inline int read_is_addr(dma_t dma)
{
return dma->RD_ADDR;
}
static inline void write_is_addr(dma_t dma, int addr)
{
dma->WR_ADDR = (uint32_t) addr;
}
static inline int read_strd(dma_t dma)
{
return dma->RD_STRD;
}
static inline void write_strd(dma_t dma, int strd)
{
dma->WR_STRD = (uint32_t) strd;
}
static inline int read_tr_count(dma_t dma)
{
return dma->TR_COUNT;
}
#endif
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc < 3) return -1;
FILE *f = fopen(argv[1],"rb");
if(!f) return -1;
unsigned char x[4];
int i=0;
int n = atoi(argv[2]);
while(!feof(f)){
fread(x,1,4,f);
printf("write %x %02X%02X%02X%02X\n", i++, x[0],x[1],x[2],x[3]);
}
for(;i<n;){
printf("write %x %02X%02X%02X%02X\n", i++, 0,0,0,0);
}
fclose(f);
return 0;
}
#include "gpio.h"
/* GPIO user interface definition */
static inline void gpio_out(gpio_t gpio, int pin, int val)
{
if(val)
gpio->SODR = (1<<pin);
else
gpio->CODR = (1<<pin);
}
static inline void gpio_dir(gpio_t gpio, int pin, int val)
{
if(val)
gpio->DDR |= (1<<pin);
else
gpio->DDR &= ~(1<<pin);
}
static inline int gpio_in(gpio_t gpio, int pin)
{
return gpio->PSR & (1<<pin) ? 1 : 0;
}
#ifndef __BOARD_H
#define __BOARD_H
/* Automate the address peripheral discover */
#define BASE_DMA_ADDR 0x20000400
#define BASE_LEDS_ADDR 0x20000500
#define BASE_BUTTONS_ADDR 0x20000600
static inline int delay(int x)
{
while(x--) asm volatile("nop");
}
#endif
#ifndef __DMA_H
#define __DMA_H
#include "inttypes.h"
#include "board.h"
/*
This structure must conform to what it is specified in the
FPGA software-acessible registers. See general-cores/cores/wishbone/wb_dma.vhd
*/
struct DMA_WB
{
uint32_t RD_ADDR; /* Read issue address register */
uint32_t WR_ADDR; /* Write issue address register */
uint32_t RD_STRD; /* Read stride */
uint32_t WR_STRD; /* Write stride */
uint32_t TR_COUNT /* Transfer count */
};
typedef volatile struct DMA_WB * dma_t;
/* DMA user interface */
static inline int read_is_addr(dma_t dma);
static inline void write_is_addr(dma_t dma, int addr);
static inline int read_strd(dma_t dma);
static inline void write_strd(dma_t dma, int strd);
static inline int read_tr_count(dma_t dma);
#endif
#ifndef __GPIO_H
#define __GPIO_H
#include "inttypes.h"
#include "board.h"
/*
This structure must conform to what it is specified in the
FPGA software-acessible registers. See general-cores/cores/wishbone/wb_gpio_port.vhd
*/
struct GPIO_WB
{
uint32_t CODR; /* Clear output register */
uint32_t SODR; /* Set output register */
uint32_t DDR; /* Data direction register (1 means out) */
uint32_t PSR; /* Pin state register */
};
typedef volatile struct GPIO_WB * gpio_t;
//static volatile struct GPIO_WB *__gpio = (volatile struct GPIO_WB *) BASE_GPIO;
/* GPIO user interface */
static inline void gpio_out(gpio_t gpio, int pin, int val);
static inline void gpio_dir(gpio_t gpio, int pin, int val);
static inline int gpio_in(gpio_t gpio, int pin);
#endif
#ifndef __WRAPPED_INTTYPES_H
#define __WRAPPED_INTTYPES_H
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef signed long long uint64_t;
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef signed long long int64_t;
#endif
#include "gpio.h"
#include "dma.h"
/* Each loop iteration takes 4 cycles.
* It runs at 100MHz.
* Sleep 0.2 second.
*/
#define LED_DELAY (100000000/4/5)
//#define LED_DELAY 100000000
/* Placeholder for IRQ vector */
void _irq_entry(void){}
int main(void)
{
int i, j;
gpio_t leds = (volatile struct GPIO_WB *) BASE_LEDS_ADDR;
gpio_t buttons = (volatile struct GPIO_WB *) BASE_BUTTONS_ADDR;
dma_t buttons = (volatile struct DMA_WB *) BASE_DMA_ADDR;
while (1) {
/* Rotate the LEDs */
for (i = 0; i < 8; ++i) {
// Set led at position i
gpio_out(leds, i, 1);
/* Each loop iteration takes 4 cycles.
* It runs at 100MHz.
* Sleep 0.2 second.
*/
delay(LED_DELAY);
// Clear led at position i
gpio_out(leds, i, 0);
}
/* Rotate the LEDs */
}
return 0;
}
/****************************************************************************
**
** Name: crt0ram.S
**
** Description:
** Implements boot-code that calls LatticeDDInit (that calls main())
** Implements exception handlers (actually, redirectors)
**
** $Revision: $
**
** Disclaimer:
**
** This source code is intended as a design reference which
** illustrates how these types of functions can be implemented. It
** is the user's responsibility to verify their design for
** consistency and functionality through the use of formal
** verification methods. Lattice Semiconductor provides no warranty
** regarding the use or functionality of this code.
**
** --------------------------------------------------------------------
**
** Lattice Semiconductor Corporation
** 5555 NE Moore Court
** Hillsboro, OR 97214
** U.S.A
**
** TEL: 1-800-Lattice (USA and Canada)
** (503)268-8001 (other locations)
**
** web: http://www.latticesemi.com
** email: techsupport@latticesemi.com
**
** --------------------------------------------------------------------------
**
** Change History (Latest changes on top)
**
** Ver Date Description
** --------------------------------------------------------------------------
** 3.8 Apr-15-2011 Added __MICO_USER_<handler>_HANDLER__ preprocessor to
** allow customers to implement their own handlers for:
** DATA_ABORT, INST_ABORT
**
** 3.1 Jun-18-2008 Added __MICO_NO_INTERRUPTS__ preprocessor
** option to exclude invoking MicoISRHandler
** to reduce code-size in apps that don't use
** interrupts
**
** 3.0 Mar-25-2008 Added Header
**
**---------------------------------------------------------------------------
*****************************************************************************/
/*
* LatticeMico32 C startup code.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/* From include/sys/signal.h */
#define SIGINT 2 /* interrupt */
#define SIGTRAP 5 /* trace trap */
#define SIGFPE 8 /* arithmetic exception */
#define SIGSEGV 11 /* segmentation violation */
//#define MICO32_FULL_CONTEXT_SAVE_RESTORE
/* Exception handlers - Must be 32 bytes long. */
.section .boot, "ax", @progbits
.global _start
_start:
.global _reset_handler
.type _reset_handler, @function
_reset_handler:
xor r0, r0, r0
wcsr IE, r0
wcsr IM, r0
mvhi r1, hi(_reset_handler)
ori r1, r1, lo(_reset_handler)
wcsr EBA, r1
calli _crt0
nop
.size _reset_handler, .-_reset_handler
.extern _irq_entry
.org 0xc0
.global _interrupt_handler
.type _interrupt_handler, @function
_interrupt_handler:
sw (sp+0), ra
calli _save_all
mvi r1, SIGINT
#ifndef __MICO_NO_INTERRUPTS__
calli _irq_entry
#else
wcsr IE, r0
#endif
bi _restore_all_and_return
nop
nop
nop
.org 0x100
.global _crt0
.type _crt0, @function
_crt0:
/* Clear r0 */
xor r0, r0, r0
/* Setup stack and global pointer */
mvhi sp, hi(_fstack)
ori sp, sp, lo(_fstack)
mvhi gp, hi(_gp)
ori gp, gp, lo(_gp)
mvhi r1, hi(_fbss)
ori r1, r1, lo(_fbss)
mvi r2, 0
mvhi r3, hi(_ebss)
ori r3, r3, lo(_ebss)
sub r3, r3, r1
calli memset
mvi r1, 0
mvi r2, 0
mvi r3, 0
calli main
loopf:
bi loopf
.global _save_all
.type _save_all, @function
_save_all:
#ifdef MICO32_FULL_CONTEXT_SAVE_RESTORE
addi sp, sp, -128
#else
addi sp, sp, -60
#endif
sw (sp+4), r1
sw (sp+8), r2
sw (sp+12), r3
sw (sp+16), r4
sw (sp+20), r5
sw (sp+24), r6
sw (sp+28), r7
sw (sp+32), r8
sw (sp+36), r9
sw (sp+40), r10
#ifdef MICO32_FULL_CONTEXT_SAVE_RESTORE
sw (sp+44), r11
sw (sp+48), r12
sw (sp+52), r13
sw (sp+56), r14
sw (sp+60), r15
sw (sp+64), r16
sw (sp+68), r17
sw (sp+72), r18
sw (sp+76), r19
sw (sp+80), r20
sw (sp+84), r21
sw (sp+88), r22
sw (sp+92), r23
sw (sp+96), r24
sw (sp+100), r25
sw (sp+104), r26
sw (sp+108), r27
sw (sp+120), ea
sw (sp+124), ba
/* ra and sp need special handling, as they have been modified */
lw r1, (sp+128)
sw (sp+116), r1
mv r1, sp
addi r1, r1, 128
sw (sp+112), r1
#else
sw (sp+52), ea
sw (sp+56), ba
/* ra and sp need special handling, as they have been modified */
lw r1, (sp+60)
sw (sp+48), r1
mv r1, sp
addi r1, r1, 60
sw (sp+44), r1
#endif
// xor r1, r1, r1
// wcsr ie, r1
ret
.size _save_all, .-_save_all
.global _restore_all_and_return
.type _restore_all_and_return, @function
/* Restore all registers and return from exception */
_restore_all_and_return:
// addi r1, r0, 2
// wcsr ie, r1
lw r1, (sp+4)
lw r2, (sp+8)
lw r3, (sp+12)
lw r4, (sp+16)
lw r5, (sp+20)
lw r6, (sp+24)
lw r7, (sp+28)
lw r8, (sp+32)
lw r9, (sp+36)
lw r10, (sp+40)
#ifdef MICO32_FULL_CONTEXT_SAVE_RESTORE
lw r11, (sp+44)
lw r12, (sp+48)
lw r13, (sp+52)
lw r14, (sp+56)
lw r15, (sp+60)
lw r16, (sp+64)
lw r17, (sp+68)
lw r18, (sp+72)
lw r19, (sp+76)
lw r20, (sp+80)
lw r21, (sp+84)
lw r22, (sp+88)
lw r23, (sp+92)
lw r24, (sp+96)
lw r25, (sp+100)
lw r26, (sp+104)
lw r27, (sp+108)
lw ra, (sp+116)
lw ea, (sp+120)
lw ba, (sp+124)
/* Stack pointer must be restored last, in case it has been updated */
lw sp, (sp+112)
#else
lw ra, (sp+48)
lw ea, (sp+52)
lw ba, (sp+56)
/* Stack pointer must be restored last, in case it has been updated */
lw sp, (sp+44)
#endif
nop
eret
.size _restore_all_and_return, .-_restore_all_and_return
#include "irq.h"
void disable_irq()
{
unsigned int ie, im;
unsigned int Mask = ~1;
/* disable peripheral interrupts in case they were enabled */
asm volatile ("rcsr %0,ie":"=r"(ie));
ie &= (~0x1);
asm volatile ("wcsr ie, %0"::"r"(ie));
/* disable mask-bit in im */
asm volatile ("rcsr %0, im":"=r"(im));
im &= Mask;
asm volatile ("wcsr im, %0"::"r"(im));
}
void enable_irq()
{
unsigned int ie, im;
unsigned int Mask = 1;
/* disable peripheral interrupts in-case they were enabled*/
asm volatile ("rcsr %0,ie":"=r"(ie));
ie &= (~0x1);
asm volatile ("wcsr ie, %0"::"r"(ie));
/* enable mask-bit in im */
asm volatile ("rcsr %0, im":"=r"(im));
im |= Mask;
asm volatile ("wcsr im, %0"::"r"(im));
ie |= 0x1;
asm volatile ("wcsr ie, %0"::"r"(ie));
}
/*
* Simulator Link script for Lattice Mico32.
* Contributed by Jon Beniston <jon@beniston.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
OUTPUT_FORMAT("elf32-lm32")
ENTRY(_start)
/*INPUT() */
GROUP(-lgcc -lc)
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 0x10000
}
SECTIONS
{
.boot : { *(.boot) } > ram
/* Code */
.text :
{
. = ALIGN(4);
_ftext = .;
_ftext_rom = LOADADDR(.text);
*(.text .stub .text.* .gnu.linkonce.t.*)
*(.gnu.warning)
KEEP (*(.init))
KEEP (*(.fini))
/* Constructors and destructors */
KEEP (*crtbegin*.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
KEEP (*crtbegin*.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
KEEP (*(.jcr))
_etext = .;
} > ram =0
/* Exception handlers */
.eh_frame_hdr : { *(.eh_frame_hdr) } > ram
.eh_frame : { KEEP (*(.eh_frame)) } > ram
.gcc_except_table : { *(.gcc_except_table) *(.gcc_except_table.*) } > ram
/* Read-only data */
.rodata :
{
. = ALIGN(4);
_frodata = .;
_frodata_rom = LOADADDR(.rodata);
*(.rodata .rodata.* .gnu.linkonce.r.*)
*(.rodata1)
_erodata = .;
} > ram
/* Data */
.data :
{
. = ALIGN(4);
_fdata = .;
_fdata_rom = LOADADDR(.data);
*(.data .data.* .gnu.linkonce.d.*)
*(.data1)
SORT(CONSTRUCTORS)
_gp = ALIGN(16) + 0x7ff0;
*(.sdata .sdata.* .gnu.linkonce.s.*)
_edata = .;
} > ram
/* BSS */
.bss :
{
. = ALIGN(4);
_fbss = .;
*(.dynsbss)
*(.sbss .sbss.* .gnu.linkonce.sb.*)
*(.scommon)
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(4);
_ebss = .;
_end = .;
PROVIDE (end = .);
} > ram
/* First location in stack is highest address in RAM */
PROVIDE(_fstack = ORIGIN(ram) + LENGTH(ram) - 4);
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}
-- MMCM_BASE : In order to incorporate this function into the design,
-- VHDL : the following instance declaration needs to be placed
-- instance : in the body of the design code. The instance name
-- declaration : (MMCM_BASE_inst) and/or the port declarations after the
-- code : "=>" declaration maybe changed to properly reference and
-- : connect this function to the design. All inputs and outputs
-- : must be connected.
-- Library : In addition to adding the instance declaration, a use
-- declaration : statement for the UNISIM.vcomponents library needs to be
-- for : added before the entity declaration. This library
-- Xilinx : contains the component declarations for all Xilinx
-- primitives : primitives and points to the models that will be used
-- : for simulation.
-- Copy the following two statements and paste them before the
-- Entity declaration, unless they already exist.
library UNISIM;
use UNISIM.vcomponents.all;
library ieee;
use ieee.std_logic_1164.all;
entity sys_pll is
generic(
-- 200 MHz input clock
g_clkin_period : real := 5.000;
g_clkbout_mult_f : real := 5.000;
-- 100 MHz output clock
g_clk0_divide_f : real := 10.000;
-- 25 MHz output clock
g_clk1_divide : integer := 40;
);
port(
rst_i : in std_logic := '0';
clk_i : in std_logic := '0';
clk0_o : out std_logic;
clk1_o : out std_logic;
locked_o : out std_logic
);
end sys_pll;
architecture syn of sys_pll is
signal s_mmcm_fbin : std_logic;
signal s_mmcm_fbout : std_logic;
signal s_clk0 : std_logic;
signal s_clk1 : std_logic;
begin
-- MMCM_BASE: Base Mixed Mode Clock Manager
-- Virtex-6
-- Xilinx HDL Language Template, version 13.4
-- Clock PLL
cmp_mmcm : MMCM_ADV
generic map(
BANDWIDTH => "OPTIMIZED",
CLKOUT4_CASCADE => FALSE,
CLOCK_HOLD => FALSE,
COMPENSATION => "ZHOLD",
STARTUP_WAIT => FALSE,
DIVCLK_DIVIDE => 1,
CLKFBOUT_MULT_F => g_clkbout_mult_f,
CLKFBOUT_PHASE => 0.000,
CLKFBOUT_USE_FINE_PS => FALSE,
CLKOUT0_DIVIDE_F => g_clk0_divide_f,
CLKOUT0_PHASE => 0.000,
CLKOUT0_DUTY_CYCLE => 0.500,
CLKOUT0_USE_FINE_PS => FALSE,
CLKOUT1_DIVIDE => g_clk1_divide,
CLKOUT1_PHASE => 0.000,
CLKOUT1_DUTY_CYCLE => 0.500,
CLKOUT1_USE_FINE_PS => FALSE,
CLKIN1_PERIOD => g_clkin_period,
REF_JITTER1 => 0.010
)
port map(
-- Output clocks
CLKFBOUT => s_mmcm_fbout,
CLKFBOUTB => open,
CLKOUT0 => s_clk0,
CLKOUT0B => open,
CLKOUT1 => s_clk1,
CLKOUT1B => open,
CLKOUT2 => open,
CLKOUT2B => open,
CLKOUT3 => open,
CLKOUT3B => open,
CLKOUT4 => open,
CLKOUT5 => open,
CLKOUT6 => open,
-- Input clock control
CLKFBIN => s_mmcm_fbin,
CLKIN1 => clk_i,
CLKIN2 => '0',
-- Tied to always select the primary input clock
CLKINSEL => '1',
-- Ports for dynamic reconfiguration
DADDR => (others => '0'),
DCLK => '0',
DEN => '0',
DI => (others => '0'),
DO => open,
DRDY => open,
DWE => '0',
-- Ports for dynamic phase shift
PSCLK => '0',
PSEN => '0',
PSINCDEC => '0',
PSDONE => open,
-- Other control and status signals
LOCKED => locked_o,
CLKINSTOPPED => open,
CLKFBSTOPPED => open,
PWRDWN => '0',
RST => rst_i
);
-- Global clock buffers for "cmp_mmcm" instance
cmp_clkf_bufg : BUFG
port map(
O => s_mmcm_fbin,
I => s_mmcm_fbout
);
cmp_clkout0_buf : BUFG
port map(
O => clk0_o,
I => s_clk0
);
cmp_clkout1_buf : BUFG
port map(
O => clk1_o,
I => s_clk1
);
end syn;
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