OpenCores
URL https://opencores.org/ocsvn/pc_fpga_com/pc_fpga_com/trunk

Subversion Repositories pc_fpga_com

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/comp_11b_equal.xco
0,0 → 1,59
##############################################################
#
# Xilinx Core Generator version K.39
# Date: Thu Feb 04 10:01:48 2010
#
##############################################################
#
# This file contains the customisation parameters for a
# Xilinx CORE Generator IP GUI. It is strongly recommended
# that you do not manually alter this file as it may cause
# unexpected and unsupported behavior.
#
##############################################################
#
# BEGIN Project Options
SET addpads = False
SET asysymbol = False
SET busformat = BusFormatAngleBracketNotRipped
SET createndf = False
SET designentry = VHDL
SET device = xc3s200
SET devicefamily = spartan3
SET flowvendor = Other
SET formalverification = False
SET foundationsym = False
SET implementationfiletype = Ngc
SET package = ft256
SET removerpms = False
SET simulationfiles = Structural
SET speedgrade = -4
SET verilogsim = False
SET vhdlsim = True
# END Project Options
# BEGIN Select
SELECT Comparator family Xilinx,_Inc. 9.0
# END Select
# BEGIN Parameters
CSET aclr=false
CSET ainitval=0
CSET aset=false
CSET ce=false
CSET cepriority=Sync_Overrides_CE
CSET component_name=comp_11b_equal
CSET constantbport=false
CSET constantbportvalue=0000000000000000
CSET datatype=Unsigned
CSET nonregisteredoutput=false
CSET operation=eq
CSET pipelinestages=0
CSET radix=2
CSET registeredoutput=true
CSET sclr=false
CSET sset=false
CSET syncctrlpriority=Reset_Overrides_Set
CSET width=11
# END Parameters
GENERATE
# CRC: 40267d7f
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/PACKET_RECEIVER_FSM.vhd
0,0 → 1,238
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 03:48:34 02/07/2010
-- Design Name:
-- Module Name: PACKET_RECEIVER_FSM - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity PACKET_RECEIVER_FSM is
Port (
rst : in STD_LOGIC;
clk : in STD_LOGIC;
-- Signals from EMAC
rx_sof: in STD_LOGIC; -- active low input
rx_eof: in STD_LOGIC; -- active low input
-- Signals to Counter and Comparator
sel_comp_Bval: out STD_LOGIC;
comp_Bval: out STD_LOGIC_VECTOR(10 downto 0);
rst_count : out STD_LOGIC;
en_count : out STD_LOGIC;
-- Signal from Comparator
comp_eq: in STD_LOGIC;
-- Signals to Length Register
wren_MSbyte: out STD_LOGIC;
wren_LSbyte: out STD_LOGIC;
-- Signal to user interface
valid_out_usr_data: out STD_LOGIC);
end PACKET_RECEIVER_FSM;
 
architecture Behavioral of PACKET_RECEIVER_FSM is
 
TYPE state is (rst_state,
idle_state,
detect_n_store_usr_length_MSbyte_state,
store_usr_length_LSbyte_state,
checksum_gap_state,
receive_usr_data_state);
signal current_st,next_st: state;
 
constant udp_length_match_cycle : std_logic_vector(10 downto 0):="00000100100"; -- UDP length MSbyte - 2
constant udp_checksum_skip : std_logic_vector(10 downto 0):="00000000001";
constant gnd_vec : std_logic_vector(10 downto 0):="00000000000";
begin
 
process(current_st,rx_sof,rx_eof,comp_eq)
begin
case current_st is
 
 
when rst_state =>
 
sel_comp_Bval<='0';
comp_Bval<=gnd_vec;
rst_count<='1';
en_count<='0';
wren_MSbyte<='0';
wren_LSbyte<='0';
valid_out_usr_data<='0';
next_st<=idle_state;
 
when idle_state =>
if rx_sof='0' then -- rx_sof is active low
sel_comp_Bval<='0';
comp_Bval<=udp_length_match_cycle;
rst_count<='1';
en_count<='0';
wren_MSbyte<='0';
wren_LSbyte<='0';
valid_out_usr_data<='0';
next_st<=detect_n_store_usr_length_MSbyte_state;
else
sel_comp_Bval<='0';
comp_Bval<=gnd_vec;
rst_count<='0';
en_count<='0';
wren_MSbyte<='0';
wren_LSbyte<='0';
valid_out_usr_data<='0';
next_st<=idle_state;
end if;
when detect_n_store_usr_length_MSbyte_state =>
if comp_eq='1' then -- comp_eq is active high
sel_comp_Bval<='0';
comp_Bval<=udp_checksum_skip; -- Just to skip the UDP checksum field
rst_count<='1';
en_count<='0';
wren_MSbyte<='1';
wren_LSbyte<='0';
valid_out_usr_data<='0';
next_st<=store_usr_length_LSbyte_state;
else
sel_comp_Bval<='0';
comp_Bval<=udp_length_match_cycle;
rst_count<='0';
en_count<='1';
wren_MSbyte<='0';
wren_LSbyte<='0';
valid_out_usr_data<='0';
next_st<=detect_n_store_usr_length_MSbyte_state;
end if;
when store_usr_length_LSbyte_state =>
sel_comp_Bval<='0';
comp_Bval<=udp_checksum_skip; -- Just to skip the UDP checksum field
rst_count<='0';
en_count<='1';
wren_MSbyte<='0';
wren_LSbyte<='1';
valid_out_usr_data<='0';
next_st<=checksum_gap_state;
when checksum_gap_state =>
if comp_eq='1' then -- comp_eq is active high
sel_comp_Bval<='1';
comp_Bval<=gnd_vec;
rst_count<='1';
en_count<='0';
wren_MSbyte<='0';
wren_LSbyte<='0';
valid_out_usr_data<='0';
next_st<=receive_usr_data_state;
else
sel_comp_Bval<='0';
comp_Bval<=udp_checksum_skip;
rst_count<='0';
en_count<='1';
wren_MSbyte<='0';
wren_LSbyte<='0';
valid_out_usr_data<='0';
next_st<=checksum_gap_state;
end if;
when receive_usr_data_state =>
if (comp_eq='1' or rx_eof='0') then -- comp_eq is active high rx_eof is active-low
sel_comp_Bval<='0';
comp_Bval<=udp_length_match_cycle;
rst_count<='1';
en_count<='0';
wren_MSbyte<='0';
wren_LSbyte<='0';
valid_out_usr_data<='1';
next_st<=idle_state;
else
sel_comp_Bval<='1';
comp_Bval<=gnd_vec;
rst_count<='0';
en_count<='1';
wren_MSbyte<='0';
wren_LSbyte<='0';
valid_out_usr_data<='1';
next_st<=receive_usr_data_state;
end if;
end case;
end process;
 
 
 
 
process(clk)
begin
if (rst='1') then
current_st<= rst_state;
elsif (clk'event and clk='1') then
current_st <= next_st;
end if;
end process;
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/REG_8b_wren.vhd
0,0 → 1,56
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 14:40:03 02/07/2010
-- Design Name:
-- Module Name: REG_8b_wren - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity REG_8b_wren is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
wren : in STD_LOGIC;
input_val : in STD_LOGIC_VECTOR (7 downto 0);
output_val : inout STD_LOGIC_VECTOR(7 downto 0));
end REG_8b_wren;
 
architecture Behavioral of REG_8b_wren is
 
begin
 
process(clk)
begin
if rst='1' then
output_val<="00000000";
else
if clk'event and clk='1' then
if wren='1' then
output_val<=input_val;
end if;
end if;
end if;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/COUNTER_6B_LUT_FIFO_MODE.vhd
0,0 → 1,63
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 02:30:12 11/30/2009
-- Design Name:
-- Module Name: COUNTER_6B_LUT_FIFO_MODE - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity COUNTER_6B_LUT_FIFO_MODE is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
funct_sel : in STD_LOGIC; -- 0 for lut addressing, 1 for fifo addressing
count_en : in STD_LOGIC;
value_O : inout STD_LOGIC_VECTOR (5 downto 0));
end COUNTER_6B_LUT_FIFO_MODE;
 
architecture Behavioral of COUNTER_6B_LUT_FIFO_MODE is
 
begin
 
process(clk)
begin
if rst='1' then
if funct_sel='0' then
value_O<=(others=>'0');
else
value_O<="100111";
end if;
else
if clk'event and clk='1' then
if count_en='1' then
value_O<=value_O+"000001";
else
value_O<=value_O;
end if;
end if;
end if;
end process;
 
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/COUNTER_11B_EN_RECEIV.vhd
0,0 → 1,58
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 16:16:57 11/30/2009
-- Design Name:
-- Module Name: COUNTER_11B_EN_RECEIV - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity COUNTER_11B_EN_RECEIV is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
count_en : in STD_LOGIC;
value_O : inout STD_LOGIC_VECTOR (10 downto 0));
end COUNTER_11B_EN_RECEIV;
 
architecture Behavioral of COUNTER_11B_EN_RECEIV is
 
begin
 
process(clk)
begin
if rst='1' then
value_O<="00000000000";
else
if clk'event and clk='1' then
if count_en='1' then
value_O<=value_O+"00000000001";
else
value_O<=value_O;
end if;
end if;
end if;
end process;
 
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/dist_mem_64x8.xco
0,0 → 1,63
##############################################################
#
# Xilinx Core Generator version K.39
# Date: Mon May 09 12:16:57 2011
#
##############################################################
#
# This file contains the customisation parameters for a
# Xilinx CORE Generator IP GUI. It is strongly recommended
# that you do not manually alter this file as it may cause
# unexpected and unsupported behavior.
#
##############################################################
#
# BEGIN Project Options
SET addpads = False
SET asysymbol = False
SET busformat = BusFormatAngleBracketNotRipped
SET createndf = False
SET designentry = VHDL
SET device = xc3s200
SET devicefamily = spartan3
SET flowvendor = Other
SET formalverification = False
SET foundationsym = False
SET implementationfiletype = Ngc
SET package = pq208
SET removerpms = False
SET simulationfiles = Structural
SET speedgrade = -4
SET verilogsim = False
SET vhdlsim = True
# END Project Options
# BEGIN Select
SELECT Distributed_Memory_Generator family Xilinx,_Inc. 3.4
# END Select
# BEGIN Parameters
CSET ce_overrides=ce_overrides_sync_controls
CSET coefficient_file="C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/ipv4_lut.coe"
CSET common_output_ce=false
CSET common_output_clk=false
CSET component_name=dist_mem_64x8
CSET data_width=8
CSET default_data=0
CSET default_data_radix=16
CSET depth=64
CSET dual_port_address=non_registered
CSET dual_port_output_clock_enable=false
CSET input_clock_enable=false
CSET input_options=non_registered
CSET memory_type=single_port_ram
CSET output_options=registered
CSET pipeline_stages=0
CSET qualify_we_with_i_ce=false
CSET reset_qdpo=false
CSET reset_qspo=false
CSET single_port_output_clock_enable=false
CSET sync_reset_qdpo=false
CSET sync_reset_qspo=false
# END Parameters
GENERATE
# CRC: cfec1b72
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/comp_6b_equal.ngc
0,0 → 1,3
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.4e
$6fx5d=#Zl|bdaa:!3-522):'?%8#?/$0937>7)8j18?>?fu062(2b3?0BB][[:`>6>58b3?0BB][[:c>6>58531:?74>?929AQ7><J\YTECH@1:A60>E='YBoS]|`jdaww*RomVLn`~kasugjjZEhX{ehi~}`r.ALV@ABFVNndia/uos+Ze`'jef|R8m_dsvei(iof;97NFJCJ]OMFCI[LU_U]K6;BMNILRSMM;?7NA]E^EFJ@TF\@EESD@IO69@V@GSMM;0H?5ID09D7>AIL;1B<?5F139J67=N;01BBDZ\T@VF2>JHIMOO;6B@GHABH1=K]]9?7A[[4b9Neoiu^lxxeb`l;LkmkwPbzzcdb>5A1118J4743G;9?6@>329M514<F;90B?8=;O11?K253G?97C8=;O51?K>53G3m7CLPBTQSMKYWZFZX;6@JTVMQO4=H:2E@=6^;;QCQPd=WAGUIY^GKXc9SMKYE]ZDJAH?4Q79PKPTDM=1_U]K9c:W3+bciWz~yynzzrd]okbod&noeScaaphrfhlhbl'kTi|{nl^llp`wrieUi"dQn_ds\j`Ye'noeSb{{ptv\v`a)g|~{yyQ}ef-e`*ir|yS<7m;T2,c`hX{}x~oy{}e^nlcle)oldTbb`iqgomkcc&hUn}xoc_omwatsfdVh%eRoPep]maZd(aVxiRmnrs{\tistWe#bzt^cm`+oXoh~nSog{/ukfvZabfR;V"dQ{idp,hjiwW}cgi~U?]/k\pljb'f8=5o5Z0.efjZusz|iykPlnejg+abfVddb}gemkmaa(fWl{~maQaougrqdjXj'cTmRk~_og\f*oX}zoTol|}y^roqvYk}}y%`xzPaof-mZaf|lUiey!{idp\c`h\9T$bSygjr.nlkuYsaeoxW=S!i^vjh`)h=:3i7X> gdl\wqtrk}yiRb`gha-c`hXffd{e}kciogg*dYby|kgSca{epwbhZd)aVkTi|Qae^`,mZstmVij~wPpmwp[iss{'f~xRoad/k\cdrbWkc#ygjr^efj^7Z&`Ueh| lnms[qokmzQ;Q#gPthnf+j>71k1^<"ijn^qwvpes}{oT`bifc/efjZhhfyc{iagaee,b[`wrieUecyk~u`n\f+oXiVozSckPb.k\qvcXkhxyuR~cur]oqqu)d|~Tmcj!i^ebp`Yea}%eh|PgdlX5X(nW}cn~"b`oq]wmictS9W%eRzfld-l=0353\:$kh`PsupvgqsumVfdkdm!gdl\jjhwayogeckk.`]fupgkWgei|{nl^`-mZgXmxUeiRl tdos[wct}e~j7X]JR^COMDUd3\YN^RXFSH@OA6=QKJ30ZDKX_U[SA4b<P@FBBU#WDC"3*4&T\\H+<#?/ARAJM3=_[]FBN:5WSU]DJAd<PVID^HQFNGM5?]beW@nm7Ujg_QpjiScu{`ee==5Wdl]Neoiu^lxxeb`>0:ZgiZKnffx]i}foo68e-6.<2k#=$:4a)0*0>g/; >0m%:&4:c+1,2<i5:586o31?68e949<2k7?3:4a=6=2>g;=3:586o35?48eZcvWk<0mRij_c48eZasWk<0mRbj_c48eZjsWk<0mR`j_c68efju<2kxiy:4b)2*0>d/9 >0n%<&4:`+7,2<j!>"86l'5(68f969<2h7=3:4b=0=0>d;;7>0n1:16:`?1?69<2h793=>;b]`khvfzlU}5R># Ykomk~'KFXN,Jkaescwkw&68';%<>Qfp208g`5<keao7nabp^4a[`wrie8=7nabp^4a[`wrie&hSnabp`pf[s?X8%DDBH"AOOG2f2=dgdzT:oQjqtco(fYdgdzj~hQy9^2/fYoizUzmRij_c?3(fYoizUzmR`j_c?3(fYoizUzmRb{_c?3(fYoizUjhz20-a\lduXiVmSo3?,b]kevYfWl{Tn0>#c^fbpdYsqyo6=!mPsxl`[utng{cu0?#c^jbwZudd{7; nQgar]reZasWk7; nQxievk93*dWakxS|oPep]a94*dWakxSlQce^`>4)eXi`dbxRxnl<2/gjkwggoexR`nmd?`khvX>kUn}xoc,b]smucX{}kli~3?,b]kevYdm4:'oRfns^c`hw;7$jUxucmPeocah`;7$jUcm~Q|sdv>4)eX`hyT}lQce^`>4)eX`hyTmRij_c?3(fYeWjeeyoat<2/gZnf{VkT`yQm=1.`[mgtWhUeiRl20-a\fZpfd|o6<=>?0123456789:; p<=;bmntZ0eWl{~maQl_bmntdtbW3T<Rv|t^3;?`bnn;dlh55agb`vmib03xkTi|Qm7:sb[bcXj>1zmRi{_c58udYkmVh<7|oPlu]a3>wfWgoTn95|cmp7?vub|tJK|5j4@Aza>C<328qXj79<:38277d3>j0:4:6>{o6;>4=i<00?7):9:508yVb=?:096<==b54`>4>0081X=4484;29564e<?i1=5971:Qg>22=83;8>o:9c;3;3=7<l?l1<7?51zQe>25=:3;8>o:9c;3;3=7<~]9=6=4>:0827~Ua2>91>7?<2c65g?7??1;0(9?51`9U02<5s|;o6<5z1d83?x"4:390n;h50;g97?c|@:l0V44={586>x"4?3<m7):::7a8m1`=83.887;:;o10>5=<a=o1<7*<4;76?k542810e9j50;&00?323g986?54i5a94?"4<3?>7c=<:298m1d=83.887;:;o10>1=<a=k1<7*<4;76?k542<10e;:50;&00?0f3g986=54i7194?"4<3<j7c=<:098m34=83.8878n;o10>7=<a?;1<7*<4;4b?k542:10e;>50;&00?0f3g986954i4d94?"4<3<j7c=<:498k23=831b:h4?::`74?6=93:1<vF<f:&03?273f9:6=44}c30>5<6290;wE=i;%14>45<g881<75rb983>4c=>3;8wE=i;[;90~2==3>197s+36846>"d2>:0(h481:&1`?573`=i6=44o4594?=n=m0;66a86;29?l0c2900c8l50;9l1<<722e>m7>5;h6e>5<#;=0>96`<3;28?l2b290/?94:5:l07?7<3`>o6=4+35861>h4;3807d:l:18'71<2=2d8?7=4;h6a>5<#;=0>96`<3;68?l2f290/?94:5:l07?3<3`<?6=4+3585e>h4;3:07d8<:18'71<1i2d8?7?4;h41>5<#;=0=m6`<3;08?l06290/?949a:l07?5<3`<;6=4+3585e>h4;3>07d;i:18'71<1i2d8?7;4;n7;>5<<g>k1<75`7483>>o1m3:17b96:188m2e=831b9h4?::m43?6=3f?h6=44o6:94?=e<=0;6<4?:1y'72<6;2B??6F<f:m26?6=3th847>53;294~"4?3;:7E:<;I1e?!7?281bm7>5;h33>5<<g:?1<75rb2;94?3=83:p(>951b9K06=O;o1/=548;h37>5<<a8?1<75f1783>>o6?3:17b<i:188yg5f290>6=4?{%14>4e<@=90D>h4$0:93>o6<3:17d?::188m40=831b=:4?::m1b?6=3th8n7>55;294~"4?3;h7E:<;I1e?!7?2>1b=94?::k21?6=3`;=6=44i0594?=h:o0;66sm3b83>1<729q/?:4>b:J77>N4n2.:4784i0694?=n9<0;66g>6;29?j4a2900q~;7:18`[1f3W?i7S;n;_74?[3d3W=<7S99;_5:?[1?3W?27S;7;<67>44<uz<n6=4={_4f?85?2h1v:;50;0xZ23<5:21?85rs4494?4|V=l01>75159~w02=838pR9k4=2;953=z{<91<7<t^5f896g=9=1v8<50;0xZ1e<5:k1=;5rs4394?4|V=h01>l5159~w06=838pR9o4=2`953=z{?h1<7<t^76896?=9<1v;750;0xZ35<5:31=:5rs7:94?4|V?801>o5149~w31=838pR;?4=2c952=z{?<1<7<t^72896d=9<1v;;50;0xZ0`<5:h1=:5rs2f94?4|5:21==523b81b>{t;00;6?u23881b>;4k3;?7p}<a;296~;4i38m70=l:078yv5e2909w0=m:3d896e=9?1vq~;9:181[2a34218k5+3d810>{t==0;6?uQ4d9><?2b3-9n6?84}r70>5<5sW>o70654e9'7`<5?2wx9?4?:3y]0f=:03>h7)=j:3:8yv362909wS:m;<:90g=#;l0956s|5183>7}Y<h1647:n;%1f>7g<uz<i6=4={_47?8>=>=1/?h4=b:p2<<72;qU:>528;40?!5b2;i0q~87:181[053421:?5+3d82b>{t>>0;6?uQ609><?063-9n6?>4}r45>5<5sW<;7065619'7`<592wx:84?:3y]1c=:03?m7)=j:308yv0b2909wS8j;<:92`=#;l09?6s|7483>7}Y?<16479:;%1f>73<utd=o7>52zJ0b>{i>m0;6?uG3g9~j3c=838pD>h4}o4e>5<5sA9m7p`80;296~N4n2we;<4?:3yK7c=zf>81<7<tH2d8yk142909wE=i;|l40?6=:rB8j6sa7483>7}O;o1vb:850;0xL6`<ug=<6=4={I1e?xh003:1>vF<f:m3<<72;qC?k5rn4;94?7|@:l0qc87:182M5a3td=57>51zJ0b>{i>h0;6<uG3g9~j3d=83;pD>h4}|~DEE|0m08<lmn545~DED|8tJK\vsO@
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/OVERRIDE_LUT_CONTROL.vhd
0,0 → 1,108
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 15:09:25 11/30/2009
-- Design Name:
-- Module Name: OVERRIDE_LUT_CONTROL - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity OVERRIDE_LUT_CONTROL is
Port ( clk : in STD_LOGIC;
input_addr : in STD_LOGIC_VECTOR (5 downto 0);
sel_total_length_MSBs : out STD_LOGIC;
sel_total_length_LSBs : out STD_LOGIC;
sel_header_checksum_MSBs : out STD_LOGIC;
sel_header_checksum_LSBs : out STD_LOGIC;
sel_length_MSBs : out STD_LOGIC;
sel_length_LSBs : out STD_LOGIC
);
end OVERRIDE_LUT_CONTROL;
 
architecture Behavioral of OVERRIDE_LUT_CONTROL is
 
component comp_6b_equal is
port (
qa_eq_b : out STD_LOGIC;
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 5 downto 0 );
b : in STD_LOGIC_VECTOR ( 5 downto 0 )
);
end component;
 
constant total_length_addr1 : std_logic_vector(5 downto 0):="010000";
constant total_length_addr2 : std_logic_vector(5 downto 0):="010001";
 
constant header_checksum_addr1 : std_logic_vector(5 downto 0):="011000";
constant header_checksum_addr2 : std_logic_vector(5 downto 0):="011001";
 
constant length_addr1 : std_logic_vector(5 downto 0):="100110";
constant length_addr2 : std_logic_vector(5 downto 0):="100111";
 
 
signal sel_header_checksum_MSBs_tmp : std_logic;
signal sel_total_length_MSBs_tmp : std_logic;
signal sel_length_MSBs_tmp : std_logic;
 
begin
 
TARGET_TOTAL_LENGTH_1 : comp_6b_equal port map (sel_total_length_MSBs_tmp,clk,input_addr,total_length_addr1);
 
process(clk)
begin
if clk'event and clk='1' then
sel_total_length_LSBs<=sel_total_length_MSBs_tmp;
end if;
end process;
sel_total_length_MSBs<=sel_total_length_MSBs_tmp;
 
--TARGET_TOTAL_LENGTH_2 : comp_6b_equal port map (sel_total_length_LSBs,clk,input_addr,total_length_addr2);
 
TARGET_HEADER_CHECKSUM_1 : comp_6b_equal port map (sel_header_checksum_MSBs_tmp,clk,input_addr,header_checksum_addr1);
process(clk)
begin
if clk'event and clk='1' then
sel_header_checksum_LSBs<=sel_header_checksum_MSBs_tmp;
end if;
end process;
 
sel_header_checksum_MSBs<=sel_header_checksum_MSBs_tmp;
 
 
 
--TARGET_HEADER_CHECKSUM_2 : comp_6b_equal port map (sel_header_checksum_LSBs,clk,input_addr,header_checksum_addr2);
 
TARGET_LENGTH_1 : comp_6b_equal port map (sel_length_MSBs_tmp,clk,input_addr,length_addr1);
 
process(clk)
begin
if clk'event and clk='1' then
sel_length_LSBs<=sel_length_MSBs_tmp;
end if;
end process;
 
sel_length_MSBs<=sel_length_MSBs_tmp;
--TARGET_LENGTH_2 : comp_6b_equal port map (sel_length_LSBs,clk,input_addr,length_addr2);
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/wraddr_lut_mem.vhd
0,0 → 1,346
--------------------------------------------------------------------------------
-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved.
--------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version: K.39
-- \ \ Application: netgen
-- / / Filename: wraddr_lut_mem.vhd
-- /___/ /\ Timestamp: Mon May 09 14:17:18 2011
-- \ \ / \
-- \___\/\___\
--
-- Command : -intstyle ise -w -sim -ofmt vhdl "C:\VERIFICATION PLATFORM\UDP_IP_FLEX\COREGEN\tmp\_cg\wraddr_lut_mem.ngc" "C:\VERIFICATION PLATFORM\UDP_IP_FLEX\COREGEN\tmp\_cg\wraddr_lut_mem.vhd"
-- Device : 3s200pq208-4
-- Input file : C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/tmp/_cg/wraddr_lut_mem.ngc
-- Output file : C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/tmp/_cg/wraddr_lut_mem.vhd
-- # of Entities : 1
-- Design Name : wraddr_lut_mem
-- Xilinx : C:\Xilinx\10.1\ISE
--
-- Purpose:
-- This VHDL netlist is a verification model and uses simulation
-- primitives which may not represent the true implementation of the
-- device, however the netlist is functionally correct and should not
-- be modified. This file cannot be synthesized and should only be used
-- with supported simulation tools.
--
-- Reference:
-- Development System Reference Guide, Chapter 23
-- Synthesis and Simulation Design Guide, Chapter 6
--
--------------------------------------------------------------------------------
 
 
-- synthesis translate_off
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
use UNISIM.VPKG.ALL;
 
entity wraddr_lut_mem is
port (
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 5 downto 0 );
qspo : out STD_LOGIC_VECTOR ( 5 downto 0 )
);
end wraddr_lut_mem;
 
architecture STRUCTURE of wraddr_lut_mem is
signal N0 : STD_LOGIC;
signal N1 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000311 : STD_LOGIC;
signal BU2_N35 : STD_LOGIC;
signal BU2_N34 : STD_LOGIC;
signal BU2_N33 : STD_LOGIC;
signal BU2_N32 : STD_LOGIC;
signal BU2_N31 : STD_LOGIC;
signal BU2_N30 : STD_LOGIC;
signal BU2_N29 : STD_LOGIC;
signal BU2_N28 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000031 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f51 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00002_22 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00001_21 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f5_20 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00005_18 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00004_17 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000021_16 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000011_15 : STD_LOGIC;
signal BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f6_14 : STD_LOGIC;
signal a_2 : STD_LOGIC_VECTOR ( 5 downto 0 );
signal qspo_3 : STD_LOGIC_VECTOR ( 5 downto 0 );
signal BU2_qdpo : STD_LOGIC_VECTOR ( 0 downto 0 );
begin
a_2(5) <= a(5);
a_2(4) <= a(4);
a_2(3) <= a(3);
a_2(2) <= a(2);
a_2(1) <= a(1);
a_2(0) <= a(0);
qspo(5) <= qspo_3(5);
qspo(4) <= qspo_3(4);
qspo(3) <= qspo_3(3);
qspo(2) <= qspo_3(2);
qspo(1) <= qspo_3(1);
qspo(0) <= qspo_3(0);
VCC_0 : VCC
port map (
P => N1
);
GND_1 : GND
port map (
G => N0
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000311_f5 : MUXF5
port map (
I0 => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000311,
I1 => BU2_qdpo(0),
S => a_2(5),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000031
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00003111 : LUT4
generic map(
INIT => X"101C"
)
port map (
I0 => a_2(4),
I1 => a_2(1),
I2 => a_2(2),
I3 => a_2(3),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000311
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000011_G : LUT4
generic map(
INIT => X"0B3D"
)
port map (
I0 => a_2(1),
I1 => a_2(4),
I2 => a_2(5),
I3 => a_2(3),
O => BU2_N35
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000011_F : LUT4
generic map(
INIT => X"5351"
)
port map (
I0 => a_2(5),
I1 => a_2(1),
I2 => a_2(4),
I3 => a_2(3),
O => BU2_N34
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000011 : MUXF5
port map (
I0 => BU2_N34,
I1 => BU2_N35,
S => a_2(2),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000011_15
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00004_G : LUT4
generic map(
INIT => X"0B2C"
)
port map (
I0 => a_2(1),
I1 => a_2(4),
I2 => a_2(5),
I3 => a_2(3),
O => BU2_N33
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00004_F : LUT3
generic map(
INIT => X"26"
)
port map (
I0 => a_2(4),
I1 => a_2(5),
I2 => a_2(1),
O => BU2_N32
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00004 : MUXF5
port map (
I0 => BU2_N32,
I1 => BU2_N33,
S => a_2(2),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00004_17
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00005_G : LUT4
generic map(
INIT => X"1656"
)
port map (
I0 => a_2(5),
I1 => a_2(3),
I2 => a_2(4),
I3 => a_2(1),
O => BU2_N31
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00005_F : LUT4
generic map(
INIT => X"1528"
)
port map (
I0 => a_2(5),
I1 => a_2(3),
I2 => a_2(1),
I3 => a_2(4),
O => BU2_N30
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00005 : MUXF5
port map (
I0 => BU2_N30,
I1 => BU2_N31,
S => a_2(2),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00005_18
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000021_G : LUT4
generic map(
INIT => X"1656"
)
port map (
I0 => a_2(5),
I1 => a_2(3),
I2 => a_2(4),
I3 => a_2(2),
O => BU2_N29
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000021_F : LUT4
generic map(
INIT => X"1653"
)
port map (
I0 => a_2(5),
I1 => a_2(2),
I2 => a_2(4),
I3 => a_2(3),
O => BU2_N28
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000021 : MUXF5
port map (
I0 => BU2_N28,
I1 => BU2_N29,
S => a_2(1),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000021_16
);
BU2_U0_gen_rom_rom_inst_qspo_int_3 : FDS
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000031,
S => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00004_17,
Q => qspo_3(3)
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f6 : MUXF6
port map (
I0 => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f51,
I1 => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f5_20,
S => a_2(5),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f6_14
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f5_0 : MUXF5
port map (
I0 => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00002_22,
I1 => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00001_21,
S => a_2(4),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f51
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00003 : LUT3
generic map(
INIT => X"F8"
)
port map (
I0 => a_2(3),
I1 => a_2(2),
I2 => a_2(0),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00002_22
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00002 : LUT4
generic map(
INIT => X"9DDF"
)
port map (
I0 => a_2(3),
I1 => a_2(0),
I2 => a_2(2),
I3 => a_2(1),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00001_21
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f5 : MUXF5
port map (
I0 => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000,
I1 => BU2_qdpo(0),
S => a_2(4),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f5_20
);
BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00001 : LUT4
generic map(
INIT => X"544E"
)
port map (
I0 => a_2(3),
I1 => a_2(0),
I2 => a_2(2),
I3 => a_2(1),
O => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000
);
BU2_U0_gen_rom_rom_inst_qspo_int_5 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00005_18,
Q => qspo_3(5)
);
BU2_U0_gen_rom_rom_inst_qspo_int_4 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom00004_17,
Q => qspo_3(4)
);
BU2_U0_gen_rom_rom_inst_qspo_int_2 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000021_16,
Q => qspo_3(2)
);
BU2_U0_gen_rom_rom_inst_qspo_int_1 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000011_15,
Q => qspo_3(1)
);
BU2_U0_gen_rom_rom_inst_qspo_int_0 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000_f6_14,
Q => qspo_3(0)
);
BU2_XST_GND : GND
port map (
G => BU2_qdpo(0)
);
 
end STRUCTURE;
 
-- synthesis translate_on
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/IPV4_PACKET_TRANSMITTER.vhd
0,0 → 1,478
-----------------------------------------------------------------------------------------
-- Copyright (C) 2010 Nikolaos Ch. Alachiotis --
-- --
-- Engineer: Nikolaos Ch. Alachiotis --
-- --
-- Contact: alachiot@cs.tum.edu --
-- n.alachiotis@gmail.com --
-- --
-- Create Date: 14:45:39 11/27/2009 --
-- Module Name: IPV4_PACKET_TRANSMITTER --
-- Target Devices: Virtex 5 FPGAs --
-- Tool versions: ISE 10.1 --
-- Description: This component can be used to send IPv4 Ethernet Packets. --
-- Additional Comments: The look-up table contains the header fields of the IP packet, --
-- so please keep in mind that you have to reinitialize this LUT. --
-- --
-----------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity IPV4_PACKET_TRANSMITTER is
Port ( rst : in STD_LOGIC;
clk_125MHz : in STD_LOGIC;
transmit_start_enable : in STD_LOGIC;
transmit_data_length : in STD_LOGIC_VECTOR (15 downto 0);
usr_data_trans_phase_on : out STD_LOGIC;
transmit_data_input_bus : in STD_LOGIC_VECTOR (7 downto 0);
start_of_frame_O : out STD_LOGIC;
end_of_frame_O : out STD_LOGIC;
source_ready : out STD_LOGIC;
transmit_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0);
 
flex_wren: in STD_LOGIC;
flex_wraddr: in STD_LOGIC_VECTOR(5 downto 0);
flex_wrdata: in STD_LOGIC_VECTOR(7 downto 0);
flex_checksum_baseval: in std_logic_vector(15 downto 0)
);
end IPV4_PACKET_TRANSMITTER;
 
architecture Behavioral of IPV4_PACKET_TRANSMITTER is
 
 
-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------
-- IPv4 PACKET STRUCTURE : --
-- Size | Description | Transmission Order | Position --
-- -----------------------------------------------------------------------------------------------------------
-- 6 bytes | Destin MAC Address (PC) | 0 1 2 3 4 5 | LUT --
-- | X-X-X-X-X-X | | --
-- | | | --
-- 6 bytes | Source MAC Address (FPGA) | 6 7 8 9 10 11 | LUT --
-- | 11111111-11111111-11111111-11111111-... | | --
-- 2 bytes | Ethernet Type * | 12 13 | LUT --
-- | (fixed to 00001000-00000000 :=> | | --
-- | Internet Protocol, Version 4 (IPv4)) | | --
-- -- Start of IPv4 Packet ** - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- | --
-- 1 byte | 4 MSBs = Version , 4 LSBs = Header Length | 14 | LUT --
-- | 0100 0101 | | --
-- 1 byte | Differentiated Services | 15 | LUT --
-- | 00000000 | | --
-- 2 bytes | Total Length | 16 17 | REG --
-- | 00000000-00100100 (base: 20 + 8 + datalength)| | --
-- 2 bytes | Identification | 18 19 | LUT --
-- | 00000000-00000000 | | --
-- 2 bytes | 3 MSBs = Flags , 13 LSBs = Fragment Offset | 20 21 | LUT --
-- | 010 - 0000000000000 | | --
-- 1 byte | Time to Live | 22 | LUT --
-- | 01000000 | | --
-- 1 byte | Protocol | 23 | LUT --
-- | 00010001 | | --
-- 2 bytes | Header Checksum | 24 25 | REG --
-- | 10110111 01111101 (base value) | | --
-- 4 bytes | Source IP Address | 26 27 28 29 | LUT --
-- | X-X-X-X - FPGA | | --
-- 4 bytes | Destin IP Address | 30 31 32 33 | LUT --
-- | X-X-X-X - PC | | --
-- -- Start of UDP Packet *** - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- | --
-- 2 bytes | Source Port | 34 35 | LUT --
-- | X-X | | --
-- 2 bytes | Destination Port | 36 37 | LUT --
-- | X-X | | --
-- 2 bytes | Length | 38 39 | REG --
-- | 00000000 - 00010000 (8 + # data bytes) | | --
-- 2 bytes | Checksum | 40 41 | LUT --
-- | 00000000 - 00000000 | | --
-- X bytes | Data | 42 .. X | from input --
-- | | | --
-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------
 
-- * More details about the Ethernet Type value you can find here:
-- http://en.wikipedia.org/wiki/Ethertype
 
-- ** More details about the Internet Protocol, Version 4 (IPv4) you can find here:
-- http://en.wikipedia.org/wiki/IPv4
 
-- *** More details about the Internet Protocol, Version 4 (IPv4) you can find here:
-- http://en.wikipedia.org/wiki/User_Datagram_Protocol
-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------
 
 
 
--------------------------------------------------------------------------------------
-- COMPONENT DECLARATION
--------------------------------------------------------------------------------------
 
component REG_16B_WREN is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
wren : in STD_LOGIC;
input : in STD_LOGIC_VECTOR (15 downto 0);
output : out STD_LOGIC_VECTOR (15 downto 0));
end component;
 
component IPV4_LUT_INDEXER is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
transmit_enable : in STD_LOGIC;
LUT_index : out STD_LOGIC_VECTOR (5 downto 0));
end component;
 
--component dist_mem_64x8 is
-- port (
-- clk : in STD_LOGIC := 'X';
-- a : in STD_LOGIC_VECTOR ( 5 downto 0 );
-- qspo : out STD_LOGIC_VECTOR ( 7 downto 0 )
-- );
--end component;
 
component dist_mem_64x8 is
port (
clk : in STD_LOGIC := 'X';
we : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 5 downto 0 );
d : in STD_LOGIC_VECTOR ( 7 downto 0 );
qspo : out STD_LOGIC_VECTOR ( 7 downto 0 )
);
end component;
 
component OVERRIDE_LUT_CONTROL is
Port ( clk : in STD_LOGIC;
input_addr : in STD_LOGIC_VECTOR (5 downto 0);
sel_total_length_MSBs : out STD_LOGIC;
sel_total_length_LSBs : out STD_LOGIC;
sel_header_checksum_MSBs : out STD_LOGIC;
sel_header_checksum_LSBs : out STD_LOGIC;
sel_length_MSBs : out STD_LOGIC;
sel_length_LSBs : out STD_LOGIC
);
end component;
 
component TARGET_EOF is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
start : in STD_LOGIC;
total_length_from_reg : in STD_LOGIC_VECTOR(15 downto 0);
eof_O : out STD_LOGIC);
end component;
 
component ENABLE_USER_DATA_TRANSMISSION is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
start_usr_data_trans : in STD_LOGIC;
stop_usr_data_trans : in STD_LOGIC;
usr_data_sel : out STD_LOGIC);
end component;
 
component ALLOW_ZERO_UDP_CHECKSUM is
Port ( clk : in STD_LOGIC;
input : in STD_LOGIC;
output_to_readen : out STD_LOGIC;
output_to_datasel : out STD_LOGIC);
end component;
 
 
--------------------------------------------------------------------------------------
-- SIGNAL DECLARATION
--------------------------------------------------------------------------------------
 
signal transmit_start_enable_tmp,
sel_total_length_MSBs,
sel_total_length_LSBs,
sel_header_checksum_MSBs,
sel_header_checksum_LSBs,
sel_length_MSBs,
sel_length_LSBs,
lut_out_sel,
source_ready_previous_value,
end_of_frame_O_tmp,
transmit_start_enable_reg,
usr_data_sel_sig,
start_usr_data_read,
start_usr_data_trans : STD_LOGIC;
 
signal LUT_addr,
LUT_addr_dual,
sel_rd,
sel_wr: STD_LOGIC_VECTOR(5 downto 0);
 
signal transmit_data_input_bus_tmp,
transmit_data_output_bus_tmp,
sel_total_length_MSBs_vec,
sel_total_length_LSBs_vec,
sel_header_checksum_MSBs_vec,
sel_header_checksum_LSBs_vec,
sel_length_MSBs_vec,
sel_length_LSBs_vec,
lut_out_sel_vec,
transmit_data_output_bus_no_usr_data,
usr_data_not_sel_vec,
usr_data_sel_vec : STD_LOGIC_VECTOR(7 downto 0);
 
signal transmit_data_length_tmp,
data_length_regout,
tmp_total_length,
tmp_header_checksum,
tmp_header_checksum_baseval,
tmp_length : STD_LOGIC_VECTOR(15 downto 0);
 
begin
 
transmit_start_enable_tmp<=transmit_start_enable;
 
transmit_data_length_tmp<=transmit_data_length;
 
transmit_data_input_bus_tmp<=transmit_data_input_bus;
 
----------------------------------------------------------------------------------------------------
-- start_of_frame_O signal
----------------------------------------------------------------------------------------------------
-- Description: start_of_frame_O is active low
-- We connect it to the delayed for one clock cycle transmit_start_enable input signal
-- through a NOT gate since transmit_start_enable is active high.
 
process(clk_125MHz)
begin
if clk_125MHz'event and clk_125MHz='1' then
transmit_start_enable_reg<=transmit_start_enable_tmp; -- Delay transmit_start_enable one cycle.
end if;
end process;
 
start_of_frame_O<=not transmit_start_enable_reg;
 
----------------------------------------------------------------------------------------------------
-- end_of_frame_O signal
----------------------------------------------------------------------------------------------------
-- Description: end_of_frame_O is active low
-- The TARGET_EOF module targets the last byte of the packet that is being transmitted
-- based on a counter that counts the number of transmitted bytes and a comparator that
-- detects the last byte which is the <tmp_total_length>th byte.
 
TARGET_EOF_port_map: TARGET_EOF port map
(
rst =>rst,
clk =>clk_125MHz,
start =>transmit_start_enable_reg,
total_length_from_reg =>tmp_total_length,
eof_O =>end_of_frame_O_tmp
);
--* The counter in TARGET_EOF starts from -X, where X is the number of bytes transmitted before the
-- IPv4 packet. (MAC addresses + Ethernet Type)
end_of_frame_O<=end_of_frame_O_tmp;
 
----------------------------------------------------------------------------------------------------
-- source_ready signal
----------------------------------------------------------------------------------------------------
-- Description: source_ready is active low
-- This signal is idle(high). (based on rst and end_of_frame_O_tmp).
-- This signal is active(low). (based on transmit_start_enable and end_of_frame_O_tmp).
 
process(clk_125MHz)
begin
if rst='1' then
source_ready<='1';
source_ready_previous_value<='1';
else
if clk_125MHz'event and clk_125MHz='1' then
if (transmit_start_enable_tmp='1' and source_ready_previous_value='1') then
source_ready<='0';
source_ready_previous_value<='0';
else
if (end_of_frame_O_tmp='0' and source_ready_previous_value='0') then
source_ready<='1';
source_ready_previous_value<='1';
end if;
end if;
end if;
end if;
end process;
 
----------------------------------------------------------------------------------------------------
-- transmit_data_output_bus
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- Component Name: REG_16B_WREN
-- Instance Name: NUMBER_OR_DATA_IN_BYTES_REGISTER
-- Description: Register that holds the number of bytes of input data
-- that will be transmitted in the packet.
----------------------------------------------------------------------------------------------------
NUMBER_OR_DATA_IN_BYTES_REGISTER : REG_16B_WREN port map
(
rst =>rst,
clk =>clk_125MHz,
wren =>transmit_start_enable_tmp, -- The transmit_start_enable input signal can be used as wren.
input =>transmit_data_length_tmp,
output =>data_length_regout
);
----------------------------------------------------------------------------------------------------
 
tmp_total_length<="0000000000011100" + data_length_regout;
 
 
tmp_header_checksum_baseval<=flex_checksum_baseval;
--tmp_header_checksum_baseval<="1011011101111101"; -- CHANGE VALUE! : You have to change this value!
tmp_header_checksum<=tmp_header_checksum_baseval - data_length_regout;
 
tmp_length<="0000000000001000" + data_length_regout;
 
----------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------
-- Component Name: IPV4_LUT_INDEXER
-- Instance Name: IPV4_LUT_INDEXER_port_map
-- Description: When transmit_enable is high for one cycle IPV4_LUT_INDEXER generates the
-- addresses to the LUT that contains the header section of the IP packet.
----------------------------------------------------------------------------------------------------
IPV4_LUT_INDEXER_port_map : IPV4_LUT_INDEXER port map
(
rst =>rst,
clk =>clk_125MHz,
transmit_enable =>transmit_start_enable_tmp,
LUT_index =>LUT_addr
);
----------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------
-- Component Name: dist_mem_64x8
-- Instance Name: LUT_MEM
-- Description: LUT that contains the header section.
----------------------------------------------------------------------------------------------------
LUT_addr_dual <= (LUT_addr and sel_rd) or (flex_wraddr and sel_wr);
 
sel_rd <= (others=> not flex_wren);
sel_wr <= (others=> flex_wren);
 
LUT_MEM : dist_mem_64x8 port map
(
--clk =>clk_125MHz,
--a =>LUT_addr_dual,
--qspo =>transmit_data_output_bus_tmp
 
clk =>clk_125MHz,
we =>flex_wren,
a => LUT_addr_dual,
d => flex_wrdata,
qspo =>transmit_data_output_bus_tmp
);
 
 
 
 
 
----------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------
-- Component Name: OVERRIDE_LUT_CONTROL
-- Instance Name: OVERRIDE_LUT_CONTROL_port_map
-- Description: Decides whether the output byte will come from the LUT or not.
----------------------------------------------------------------------------------------------------
OVERRIDE_LUT_CONTROL_port_map : OVERRIDE_LUT_CONTROL port map
(
clk =>clk_125MHz,
input_addr =>LUT_addr,
sel_total_length_MSBs =>sel_total_length_MSBs,
sel_total_length_LSBs =>sel_total_length_LSBs,
sel_header_checksum_MSBs =>sel_header_checksum_MSBs,
sel_header_checksum_LSBs =>sel_header_checksum_LSBs,
sel_length_MSBs =>sel_length_MSBs,
sel_length_LSBs =>sel_length_LSBs
);
----------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------
-- MUX 7 to 1
sel_total_length_MSBs_vec<=(others=>sel_total_length_MSBs);
sel_total_length_LSBs_vec<=(others=>sel_total_length_LSBs);
sel_header_checksum_MSBs_vec<=(others=>sel_header_checksum_MSBs);
sel_header_checksum_LSBs_vec<=(others=>sel_header_checksum_LSBs);
sel_length_MSBs_vec<=(others=>sel_length_MSBs);
sel_length_LSBs_vec<=(others=>sel_length_LSBs);
lut_out_sel_vec <= (others=>lut_out_sel);
lut_out_sel<=(not sel_total_length_MSBs) and (not sel_total_length_LSBs) and
(not sel_header_checksum_MSBs) and (not sel_header_checksum_LSBs) and
(not sel_length_MSBs) and (not sel_length_LSBs);
 
-- MUX output
transmit_data_output_bus_no_usr_data<= (transmit_data_output_bus_tmp and lut_out_sel_vec) or
(tmp_total_length(15 downto 8) and sel_total_length_MSBs_vec) or
(tmp_total_length(7 downto 0) and sel_total_length_LSBs_vec) or
(tmp_header_checksum(15 downto 8) and sel_header_checksum_MSBs_vec) or
(tmp_header_checksum(7 downto 0) and sel_header_checksum_LSBs_vec) or
(tmp_length(15 downto 8) and sel_length_MSBs_vec) or
(tmp_length(7 downto 0) and sel_length_LSBs_vec);
----------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------
-- Component Name: ALLOW_ZERO_UDP_CHECKSUM
-- Instance Name: ALLOW_ZERO_UDP_CHECKSUM_port_map
-- Description: Delays the user data transmition phase in order to transmit two bytes with zero
-- first.
----------------------------------------------------------------------------------------------------
ALLOW_ZERO_UDP_CHECKSUM_port_map: ALLOW_ZERO_UDP_CHECKSUM port map
(
clk =>clk_125MHz,
input =>sel_length_LSBs,
output_to_readen =>start_usr_data_read,
output_to_datasel =>start_usr_data_trans
);
----------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------
-- Component Name: ENABLE_USER_DATA_TRANSMISSION
-- Instance Name: ENABLE_USER_DATA_READ_port_map
-- Description: Sets usr_data_trans_phase_on signal one cycle before the transmittion of the
-- first user byte.
----------------------------------------------------------------------------------------------------
ENABLE_USER_DATA_READ_port_map: ENABLE_USER_DATA_TRANSMISSION port map
( rst =>rst,
clk =>clk_125MHz,
start_usr_data_trans =>start_usr_data_read,
stop_usr_data_trans =>end_of_frame_O_tmp,
usr_data_sel =>usr_data_trans_phase_on
);
----------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------
-- Component Name: ENABLE_USER_DATA_TRANSMISSION
-- Instance Name: ENABLE_USER_DATA_TRANSMISSION_port_map
-- Description: Sets usr_data_sel_sig signal to select user data for transmittion.
----------------------------------------------------------------------------------------------------
ENABLE_USER_DATA_TRANSMISSION_port_map: ENABLE_USER_DATA_TRANSMISSION port map
( rst =>rst,
clk =>clk_125MHz,
start_usr_data_trans =>start_usr_data_trans,
stop_usr_data_trans =>end_of_frame_O_tmp,
usr_data_sel =>usr_data_sel_sig
);
----------------------------------------------------------------------------------------------------
 
----------------------------------------------------------------------------------------------------
-- MUX 2 to 1
usr_data_not_sel_vec<=(others=>not usr_data_sel_sig);
usr_data_sel_vec<=(others=>usr_data_sel_sig);
 
-- MUX output
transmit_data_output_bus<=(transmit_data_output_bus_no_usr_data and usr_data_not_sel_vec) or
(transmit_data_input_bus and usr_data_sel_vec);
----------------------------------------------------------------------------------------------------
 
end Behavioral;
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/CONFIG_CONTROL.vhd
0,0 → 1,215
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 14:28:06 01/11/2011
-- Design Name:
-- Module Name: CONFIG_CONTROL - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity CONFIG_CONTROL is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
config_en : in STD_LOGIC;
nxt_sof : in STD_LOGIC;
wren : out STD_LOGIC;
addr : out STD_LOGIC_VECTOR (5 downto 0);
ulock_en : in STD_LOGIC;
wren_checksum_1 : out STD_LOGIC;
wren_checksum_2 : out STD_LOGIC;
locked : out STD_LOGIC
);
end CONFIG_CONTROL;
 
architecture Behavioral of CONFIG_CONTROL is
 
TYPE state is (rst_state,
idle_state,
pre_config_state,
config_state,
lock_state
);
signal current_st,next_st: state;
 
signal rst_count, en_count, stop_s, wren_checksum_1_t: std_logic;
signal counter: std_logic_vector(5 downto 0);
 
 
 
 
component wraddr_lut_mem is
port (
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 5 downto 0 );
qspo : out STD_LOGIC_VECTOR ( 5 downto 0 )
);
end component;
 
begin
 
process(clk)
begin
if (rst='1') then
current_st<= rst_state;
elsif (clk'event and clk='1') then
current_st <= next_st;
end if;
end process;
 
 
process(current_st,config_en,nxt_sof,ulock_en,stop_s)
begin
case current_st is
 
when rst_state =>
 
rst_count <='1';
en_count <='0';
wren <='0';
locked<='0';
next_st<=idle_state;
when idle_state =>
 
rst_count <='0';
en_count <='0';
 
wren <='0';
locked<='0';
if config_en='1' then
next_st <= pre_config_state;
else
next_st <= idle_state;
end if;
 
when pre_config_state =>
 
rst_count <='0';
en_count <='0';
wren <='0';
locked<='0';
if nxt_sof='0' then
en_count <='1';
next_st <= config_state;
else
en_count <='0';
next_st <= pre_config_state;
end if;
 
 
when config_state =>
 
rst_count <='0';
en_count <='1';
wren <='1';
locked<='0';
if stop_s='1' then
next_st <= lock_state;
else
next_st <= config_state;
end if;
when lock_state =>
 
rst_count <='1';
en_count <='0';
wren <='0';
locked<='1';
if ulock_en='1' then
next_st <= rst_state;
else
next_st <= lock_state;
end if;
 
end case;
end process;
 
process(clk)
begin
if rst_count='1' then
counter <= "000000";
else
if clk'event and clk='1' then
if en_count='1' then
counter <= counter + "000001";
end if;
end if;
end if;
end process;
 
process(clk)
begin
if clk'event and clk='1' then
if counter = "100101" then
stop_s <='1';
else
stop_s <='0';
end if;
end if;
end process;
 
process(clk)
begin
if clk'event and clk='1' then
if counter = "010111" then
wren_checksum_1_t <='1';
else
wren_checksum_1_t <='0';
end if;
end if;
end process;
 
wren_checksum_1 <= wren_checksum_1_t;
 
process(clk)
begin
if clk'event and clk='1' then
wren_checksum_2 <= wren_checksum_1_t;
end if;
end process;
 
 
 
wraddrlutmem: wraddr_lut_mem Port Map
(
clk => clk,
a=> counter,
qspo=> addr);
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/ALLOW_ZERO_UDP_CHECKSUM.vhd
0,0 → 1,60
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 14:46:33 12/04/2009
-- Design Name:
-- Module Name: ALLOW_ZERO_UDP_CHECKSUM - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity ALLOW_ZERO_UDP_CHECKSUM is
Port ( clk : in STD_LOGIC;
input : in STD_LOGIC;
output_to_readen : out STD_LOGIC;
output_to_datasel : out STD_LOGIC);
end ALLOW_ZERO_UDP_CHECKSUM;
 
architecture Behavioral of ALLOW_ZERO_UDP_CHECKSUM is
 
signal input_reg : std_logic;
 
begin
 
process(clk)
begin
if clk'event and clk='1' then
input_reg<=input;
end if;
end process;
 
output_to_readen<=input_reg;
 
process(clk)
begin
if clk'event and clk='1' then
output_to_datasel<=input_reg;
end if;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/COUNTER_11B_EN_TRANS.vhd
0,0 → 1,58
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 16:16:57 11/30/2009
-- Design Name:
-- Module Name: COUNTER_11B_EN_TRANS - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity COUNTER_11B_EN_TRANS is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
count_en : in STD_LOGIC;
value_O : inout STD_LOGIC_VECTOR (10 downto 0));
end COUNTER_11B_EN_TRANS;
 
architecture Behavioral of COUNTER_11B_EN_TRANS is
 
begin
 
process(clk)
begin
if rst='1' then
value_O<="11111110110";
else
if clk'event and clk='1' then
if count_en='1' then
value_O<=value_O+"00000000001";
else
value_O<=value_O;
end if;
end if;
end if;
end process;
 
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/comp_6b_equal.vhd
0,0 → 1,161
--------------------------------------------------------------------------------
-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved.
--------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version: K.39
-- \ \ Application: netgen
-- / / Filename: comp_6b_equal.vhd
-- /___/ /\ Timestamp: Thu Feb 04 11:02:26 2010
-- \ \ / \
-- \___\/\___\
--
-- Command : -intstyle ise -w -sim -ofmt vhdl C:\PHd_Projects\The_Felsenstein_CoProcessor\COREGEN_Design\tmp\_cg\comp_6b_equal.ngc C:\PHd_Projects\The_Felsenstein_CoProcessor\COREGEN_Design\tmp\_cg\comp_6b_equal.vhd
-- Device : 3s200ft256-4
-- Input file : C:/PHd_Projects/The_Felsenstein_CoProcessor/COREGEN_Design/tmp/_cg/comp_6b_equal.ngc
-- Output file : C:/PHd_Projects/The_Felsenstein_CoProcessor/COREGEN_Design/tmp/_cg/comp_6b_equal.vhd
-- # of Entities : 1
-- Design Name : comp_6b_equal
-- Xilinx : C:\Xilinx\10.1\ISE
--
-- Purpose:
-- This VHDL netlist is a verification model and uses simulation
-- primitives which may not represent the true implementation of the
-- device, however the netlist is functionally correct and should not
-- be modified. This file cannot be synthesized and should only be used
-- with supported simulation tools.
--
-- Reference:
-- Development System Reference Guide, Chapter 23
-- Synthesis and Simulation Design Guide, Chapter 6
--
--------------------------------------------------------------------------------
 
 
-- synthesis translate_off
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
use UNISIM.VPKG.ALL;
 
entity comp_6b_equal is
port (
qa_eq_b : out STD_LOGIC;
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 5 downto 0 );
b : in STD_LOGIC_VECTOR ( 5 downto 0 )
);
end comp_6b_equal;
 
architecture STRUCTURE of comp_6b_equal is
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o80_18 : STD_LOGIC;
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o53_17 : STD_LOGIC;
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o26_16 : STD_LOGIC;
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result : STD_LOGIC;
signal BU2_a_ge_b : STD_LOGIC;
signal NLW_VCC_P_UNCONNECTED : STD_LOGIC;
signal NLW_GND_G_UNCONNECTED : STD_LOGIC;
signal a_2 : STD_LOGIC_VECTOR ( 5 downto 0 );
signal b_3 : STD_LOGIC_VECTOR ( 5 downto 0 );
begin
a_2(5) <= a(5);
a_2(4) <= a(4);
a_2(3) <= a(3);
a_2(2) <= a(2);
a_2(1) <= a(1);
a_2(0) <= a(0);
b_3(5) <= b(5);
b_3(4) <= b(4);
b_3(3) <= b(3);
b_3(2) <= b(2);
b_3(1) <= b(1);
b_3(0) <= b(0);
VCC_0 : VCC
port map (
P => NLW_VCC_P_UNCONNECTED
);
GND_1 : GND
port map (
G => NLW_GND_G_UNCONNECTED
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o95 :
LUT3
generic map(
INIT => X"80"
)
port map (
I0 =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o26_16
,
I1 =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o53_17
,
I2 =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o80_18
,
O => BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o80 :
LUT4
generic map(
INIT => X"9009"
)
port map (
I0 => a_2(1),
I1 => b_3(1),
I2 => a_2(0),
I3 => b_3(0),
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o80_18
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o53 :
LUT4
generic map(
INIT => X"9009"
)
port map (
I0 => a_2(3),
I1 => b_3(3),
I2 => a_2(2),
I3 => b_3(2),
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o53_17
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o26 :
LUT4
generic map(
INIT => X"9009"
)
port map (
I0 => a_2(5),
I1 => b_3(5),
I2 => a_2(4),
I3 => b_3(4),
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o26_16
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_gen_output_reg_output_reg_fd_output_1 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result,
Q => qa_eq_b
);
BU2_XST_GND : GND
port map (
G => BU2_a_ge_b
);
 
end STRUCTURE;
 
-- synthesis translate_on
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/wraddr_lut_mem.xco
0,0 → 1,63
##############################################################
#
# Xilinx Core Generator version K.39
# Date: Mon May 09 12:17:18 2011
#
##############################################################
#
# This file contains the customisation parameters for a
# Xilinx CORE Generator IP GUI. It is strongly recommended
# that you do not manually alter this file as it may cause
# unexpected and unsupported behavior.
#
##############################################################
#
# BEGIN Project Options
SET addpads = False
SET asysymbol = False
SET busformat = BusFormatAngleBracketNotRipped
SET createndf = False
SET designentry = VHDL
SET device = xc3s200
SET devicefamily = spartan3
SET flowvendor = Other
SET formalverification = False
SET foundationsym = False
SET implementationfiletype = Ngc
SET package = pq208
SET removerpms = False
SET simulationfiles = Structural
SET speedgrade = -4
SET verilogsim = False
SET vhdlsim = True
# END Project Options
# BEGIN Select
SELECT Distributed_Memory_Generator family Xilinx,_Inc. 3.4
# END Select
# BEGIN Parameters
CSET ce_overrides=ce_overrides_sync_controls
CSET coefficient_file="C:/VERIFICATION PLATFORM/UDP_IP_FLEX/THE_FELSENSTEIN_COPROCESSOR/wraddr_lut.coe"
CSET common_output_ce=false
CSET common_output_clk=false
CSET component_name=wraddr_lut_mem
CSET data_width=6
CSET default_data=0
CSET default_data_radix=16
CSET depth=64
CSET dual_port_address=non_registered
CSET dual_port_output_clock_enable=false
CSET input_clock_enable=false
CSET input_options=non_registered
CSET memory_type=rom
CSET output_options=registered
CSET pipeline_stages=0
CSET qualify_we_with_i_ce=false
CSET reset_qdpo=false
CSET reset_qspo=false
CSET single_port_output_clock_enable=false
CSET sync_reset_qdpo=false
CSET sync_reset_qspo=false
# END Parameters
GENERATE
# CRC: 5b35cec9
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/comp_11b_equal.ngc
0,0 → 1,3
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.4e
$`ax5d=#Zl|bdaa:!3-522):'?%8#?/$0936>6>;2;%<<>4108JJUSS2h6:<7>111925?OIX\^1n1??:1<`?6u589l>88"4595BC0331:;<95601;0?GS502H^_RGAFN38G03<K3%[DiQ_rnhfgqu(\aoTJhb|eoqwalhXKfZycnk|snp,GJTBOLDTHh}fgo-wiu)Xkn%hc`~P10`\atsfd'dlc<<4CIG@OZJNKLDXIRZVPD08GL?<KFGFEYZJD068GJTBWNOEI_O[INL\MK@H?2IYILZJD09G6>BN:2LO=6I<;FLG6>O7:2C:>6G=2:K0=>OIA]Y_MYK9;MMB@@B03EELENOC4:NVP62<D\^?96CZXB[`?Hgmg{\n~~g`nb9Nmkiu^lxxeb`<;O226>H6;2D:<>5A1018J4443G;8?6@>429M505<F8<87C?83:L2<6=I9080B?=4N320?K46;2D9>>5A2218J7253G987C=92:L76>H2:2D=>6@82:L;6>H>n2DISO[\PHL\TWIW[>1EIYY@RJ38K7=HC81[86^NRUc8TLHXJ\YBHUl4PHL\FPUIIDO:7\?4S79PKPTDM=1_U]K9c:W3+bciWz~yynzzrd]okbod&noeScaaphrfhlhbl'kTi|{nl^llp`wrieUi"dQn_ds\j`Ye'noeSb{{ptv\v`a)g|~{yyQ}ef-e`*ir|yS<o=;T2,c`hX{}x~oy{}e^nlcle)oldTbb`iqgomkcc&hUn}xoc_omwatsfdVh%eRoPep]maZd(aVxiRmnrs{\tistWe#bzt^cm`+oXoh~nSog{/ukfvZabfR;V"dQ{idp,hjiwW}cgi~U?]/k\pljb'hyrbnQ`<0<b4>S7'noeS~z}ubvvv`Ykgnch"jka_ommtlvbd`dnh#oPepwbhZhh|l{~maQm.h]b[`wXflUi#dQzsd]`ewt~Wyf~Rbztr,oqqYffm$bSjo{e^`jp*rnm{UlicU>]/k\plcu'eed|RzfldqX4X(nW}cgi"bzt^m?4;g73\:$kh`PsupvgqsumVfdkdm!gdl\jjhwayogeckk.`]fupgkWgei|{nl^`-mZgXmxUeiRl i^wpaZefz{sT|a{|_mwww+jr|Vkeh#gPg`vf[gos'}cn~RijnZ3^*lYsalx$`ba_ukoav]7U'cTxdbj/mww[j:66hk0Y=!heo]ppwsd||xnSaahib,dakYiggzb|hbfndf-eZcv}hfTbbzjqtco[g(nWhUn}R`j_c-j[pubWjky~tQltq\hprt&eSl`k.h]deqcXj`~$xdk}_fgm_4[)aV~bi!conr\pljb{R:V"dQ{img,hprXgV:Tmcj?012265gf3\:$kh`PsupvgqsumVfdkdm!gdl\jjhwayogeckk.`]fupgkWgei|{nl^`-mZgXmxUeiRl i^wpaZefz{sT|a{|_mwww+jr|Vkeh#gPg`vf[gos'}cn~RijnZ3^*lYsalx$`ba_ukoav]7U'cTxdbj/mww[jY7Whdo<=>?124b=>S7'noeS~z}ubvvv`Ykgnch"jka_ommtlvbd`dnh#oPepwbhZhh|l{~maQm.h]b[`wXflUi#dQzsd]`ewt~Wyf~Rbztr,oqqYffm$bSjo{e^`jp*rnm{UlicU>]/k\plcu'eed|RzfldqX4X(nW}cgi"bzt^m\4Zgil9:;<?8n9:W3+bciWz~yynzzrd]okbod&noeScaaphrfhlhbl'kTi|{nl^llp`wrieUi"dQn_ds\j`Ye'`U~hQlaspz[ujr{Vf~x~ cuu]bja(nWnkiRlft.vjawY`mgQ:Q#gPthgq+iihxV~b`h}T0\,j[qokm&f~xRaP0^cm`5678<9j56[?/fgm[vru}j~~~hQcofk`*bciWgee|d~jlhlf`+gXmxj`R``tdsveiYe&`UjShPnd]a+lYr{lUhm|v_qnvwZjr|z$gyyQnne,j[bgsmVhbx"zfes]dak]6U'cTxdk}/mmltZrndlyP<P f_ukoa*jr|VeT<Road1234<5f?2_;#jka_rvqqfrrzlUgcjgl.fgm[kiix`zn`d`jd/c\atsfdVddxhzam]a*lYfWl{TbhQm/h]vw`Ydi{xrS}bzs^nvpv(k}}Ujbi f_fcwaZdn|&~biQheoY2Y+oX|`oy#aa`p^vjh`u\8T$bSygce.nvpZiX9Vkeh=>?0``8Q5)`mgUxx{lttpf[ii`aj$licQaoorjt`jnfln%mRk~u`n\jjrby|kgSo f_`]fuZhbWk%bSx}j_bcqv|Ywd|yT`xz|.mww[dhc&`UlmykPbhv,plcuWnoeW<S!i^vjaw)kgfzTxdbjsZ2^*lYsaeo$`xzPo^3\ekb789:T_Z>l1:W3+bciWz~yynzzrd]okbod&noeScaaphrfhlhbl'kTi|{nl^llp`wrieUi"dQn_ds\j`Ye'`U~hQlaspz[ujr{Vf~x~ cuu]bja(nWnkiRlft.vjawY`mgQ:Q#gPthgq+iihxV~b`h}T0\,j[qokm&e{xRmnrs{\pljb&hdoSb|!c`pq}ZkrpzQ;Q#gPmtz`5>S7'noeS~z}ubvvv`Ykgnch"jka_ommtlvbd`dnh#oPepwbhZhh|l{~maQm.h]b[`wXflUi#dQzsd]`ewt~Wyf~Rbztr,oqqYffm$bSjo{e^`jp*rnm{UlicU>]/k\plcu'eed|RzfldqX4X(nW}cgi"at^abvwX|`fn"l`k_np-gdtuqVg~t~U>]/k\ip~2:2_;#jka_rvqqfrrzlUgcjgl.fgm[kiix`zn`d`jd/c\atsfdVddxhzam]a*lYfWl{TbhQm/ugntZtb{|fm6[\ES]BHLGTk2_XI_QYIRKAH@5<^JI27[GJW^VZT@7c3QCGECV"XE@#4+7'[]_I,= > @Q@ML0<PZ^GEO94XRV\CKB03QY_S[MLb:Z\GJTBW@DMC;5Wdc]J`c=_laU[~dcYesqjkk773QnfS@oeosTfvvohf8:0TicPMhllvScu{`ee86o'0(68e-7.=2k#==';;`*1-1=f :#?7l&;)59b,0/33h"=%95n(6+7?d.?!=1j$4';;`>3:2=f48:1<3;4a=33:1=f484?7l2=>59b86833h6?295n<4<7?d:16=1j0:0;;`>;:1=f404=7lQjq^`5?dY`mVh=7lQht^`5?dYkmVh=7lQct^`5?dYimVh?7lmcr59bw`r33k";%95m(0+6?g.68 >0n%<&4:`+7,2<j!>"86l'5(68f-0.<2h#;$:4b):*0>d/1 >0n1>17:`?55<76<1i0<>14:`?5;2<j58586l33?68f929<2h793:4b=4=0>d;?7>0n1614:`?=;563jUhc`~nrd]u=Z6+(Qcgecv/CNPF$Bcim{kc.>0/3-46Ynx:80oh=4cmif?fijxV;:nRk~u`n13>eheyU:=oQjqtco(fYdgdzj~hQy9^2/JJHB$GEEI<ln;bmntZ76jVozylb#c^aliugumV|2S="tc^jbwZwfWnoTn0>#c^jbwZwfWgoTn0>#c^jbwZwfWe~Tn0>#c^jbwZgtm}7; nQgar]b[brXj4:'oRfns^c\atYe59&hSio{a^vzt`;6$jUxucmPpsklvlr~58&hSeo|_raov86+kVbjRn_fv\f86+kV}bhyf210.`[mgtWxkTi|Qm=0.`[mgtWhUgiRl20-a\elhn|V|j`0>#cnoskkci|Vdjah3lolr\54dXmxj`!mPphrf[vrfoly6<!mPh`q\g`;7$jUcm~Qncmp>4)eX{pdhSh`nbmg>4)eX`hyT~k{=1.`[mgtWxkT`hQm=1.`[mgtWhUliRl20-a\fZehfz~jby3?,b]kevYfWe~Tn0>#c^jbwZgXflUi1="l_c]ueisb59:;<=>?012345678%w9?6m`mq]25gYby|kgSnQlolrbv`Yq1V:Tt~zP199f`l`5fnn37cilbtko`2=viVozSo94q`]daZd03xkTkyQm7:sb[icXj>1zmRb{_c58udYimVh?7~mcr59pw`rzHIzn56NOxe8E>1<6sZ;96l<53;306g21k3;3;>?tn7195>h1<3>0(;?55b9~W46=i;086<==b54`>4>0;81X=i4n3;29564e<?i1=59<1:Q24?g4290:??l;6b82<2553m3n6=4>:0yP57<f:391=><m47a95=1492|_854?:082>75|[881m?4<:011f10d282<?<5+5c82a>P1:38py?<51:w17?6<u->86;5m9d83>4>=;3;3wE;6;[`96~2==3w/8446e:&54??e3`<<6=4+44845>h3<3:07d8i:18'00<092d?87?4;h4f>5<#<<0<=6`;4;08?l0c290/88481:l70?5<3`<h6=4+44845>h3<3>07d8m:18'00<092d?87;4;h4b>5<#<<0<=6`;4;48?l0>290/88481:l70?1<3`<36=4+44845>h3<3207d89:18'00<092d?8774;h46>5<#<<0<=6`;4;c8?l>1290/88460:l70?6<3`2n6=4+448:4>h3<3;07d6k:18'00<>82d?87<4;h:`>5<#<<02<6`;4;18?l>e290/88460:l70?2<3`2j6=4+448:4>h3<3?07d66:18'00<>82d?8784;h:;>5<#<<02<6`;4;58?l>0290/88460:l70?><3`2>6=4+448:4>h3<3307d6;:18'00<>82d?87o4;nc7>5<<a0n1<75m5`83>4<729qC945+4886e>i3:3:17pl>7;295?6=8rB>56*;9;34?j712900qoo50;0;>f<5;rB>56Tm:5y7>0<32<0v(975a09'a??a3-;:6l>4$2g904=nih0;66a8c;29?l>52900cl;50;9j=f<722e3<7>5;n5f>5<<g>l1<75f6683>!222>;0b9:50:9j2c<72->>6:?4n5695>=n>l0;6):::638j12=:21b:i4?:%66>27<f=>1?65f6b83>!222>;0b9:54:9j2g<72->>6:?4n5691>=n>h0;6):::638j12=>21b:44?:%66>27<f=>1;65f6983>!222>;0b9:58:9j23<72->>6:?4n569=>=n><0;6):::638j12=i21b4;4?:%66><6<f=>1<65f8d83>!2220:0b9:51:9j<a<72->>64>4n5696>=n0j0;6):::828j12=;21b4o4?:%66><6<f=>1865f8`83>!2220:0b9:55:9j<<<72->>64>4n5692>=n010;6):::828j12=?21b4:4?:%66><6<f=>1465f8483>!2220:0b9:59:9j<1<72->>64>4n569e>=h?m0;66an9;29?jg32900e4j50;9le=<722cjn7>5;h:0>5<<gh<1<75`8083>>if?3:17o;j:182>5<7s->26<94H4f8L0?<g8<1<75rb4d94?7=83:p(9755`9K1a=O=01d8?4?::a0d<72:0;6=u+48821>N2l2B>56*>c;38mf<722c:?7>5;n65>5<<uk?=6=4;:183!2>2;;0D8j4H4;8mc<722c:87>5;h64>5<<g=:1<75rb4794?2=83:p(975209K1a=O=01bj7>5;h37>5<<a==1<75`4183>>{e==0;684?:1y'0<<582B>h6F:9:&2g?1<a821<75f1883>>o6i3:17d?m:188k16=831vn8=50;694?6|,=31=k5G5e9K1<=#9j097d?7:188m4?=831b=l4?::m74?6=3th><7>55;294~"3138;7E;k;I7:?!7d201b=54?::k2=?6=3`;j6=44i0`94?=h<90;66sm5083>0<729q/844=0:J6`>N212.:o774i0:94?=n900;66g>a;29?l7e2900c9>50;9~f04=83?1<7>t$5;965=O=m1C945+1b8:?l7?2900e<750;9j5d<722c:n7>5;n63>5<<uk>n6=4::183!2>2;:0D8j4H4;8 4e=12c:47>5;h3:>5<<a8k1<75f1c83>>i383:17pl;f;291?6=8r.?57<?;I7g?M3>3-;h655f1983>>o613:17d?n:188m4d=831d8=4?::p3a<72lqUm45Q819]3c=Y?j1U4<5Qa79]e0=Yi11Um:5Q7d9]3a=:=l0::63:6;37?83228>0q~7k:181[?c34>j6n5rs`694?4|Vh>019o5479~w24=838pR;94=4695==z{>h1<7<t^7d8905=901v:o50;0xZ3c<5<>1=l5rs6;94?4|V?n019k51`9~w2>=838pR;m4=5g95==z{>=1<7<t^7`8904=9h1v:850;0xZ3g<5<81=55rs6794?4|V?3018?51`9~w22=838pR;64=4395==z{>91<7<t^748906=9h1v:>50;0xZ33<5<:1=55rs8394?4|V1<018:5189~w<g=838pR5k4=4195==z{031<7<t^9f8902=9k1v4650;0xZ=e<5=o1=o5rs8594?4|V1h019k5189~w<0=838pR5o4=4095g=z{0?1<7<t^9;8904=901v4:50;0xZ=><5<;1=o5rs8194?4|V1=018?5189~w<4=838pR5;4=4295g=z{1l1<7<t^968906=901v?;50;0x90`=<;169;4i;|q63?6=:r7?m7?<;<76>16<uz>o6=4={<75>11<5<918=5rs5`94?4|5<<18=52548e?xu3k3:1>v3:5;64?82a2=:0q~<;:1818332=:018=51`9~w06=838p18>5419>0c<602wx9<4?:3y>14<3827?j7?6;|q66?6=:r7>>7:?;<6e>4g<uz>n6=4={<6f>16<5=l1=o5r}r51>5<5sW<<70o5669'1=<482wx;o4?:3y]2c=:i3<m7);7:248yv1f2909wS8j;<c92`=#=10846s|7883>7}Y>m16m78k;%7;>6?<uz=36=4={_4`?8g=>j1/954<a:p32<72;qU:o52a;4a?!3?2:h0q~99:181[0f34k1:l5+5980g>{t?<0;6?uQ689>e?0>3-?36>j4}r57>5<5sW<370o5699'1=<5>2wx;>4?:3y]23=:i3<=7);7:358yv172909wS8:;<c920=#=10946s|9083>7}Y0?16m769;%7;>7?<uz3j6=4={_:f?8g=0l1/954=a:p=<<72;qU4i52a;:g?!3?2;h0q~77:181[>d34k14n5+5981g>{t1>0;6?uQ8c9>e?>e3-?36?j4}r;5>5<5sW2j70o58`9'1=<5m2wx584?:3y]<<=:i3227);7:3d8yv?32909wS67;<c9<==#=108=6s|9283>7}Y0>16m768;%7;>64<uz396=4={_:6?8g=0<1/954<3:p<c<72;qU4952a;:7?!3?2:>0q~7k:181[?c34k15i5+59801>{ti=0;6?uQa59>e?g33-?36>94}|lba?6=:rB>56saag83>7}O=01vbo>50;0xL0?<ugh:6=4={I7:?xhe:3:1>vF:9:mf6<72;qC945rnc694?4|@<30qcl::181M3>3tdi:7>52zJ6=>{ij>0;6?uG589~jg>=838pD874}o`:>5<5sA?27p`ma;296~N212weno4?:3yK1<=zfki1<7<tH4;8ykdc2909wE;6;|laa?6=:rB>56sabg83>7}O=01vbn>50;0xL0?<ugi:6=4={I7:?xhd:3:1>vF:9:mg6<72;qC945rnb694?4|@<30qcm::181M3>3td3n7>51zJ6=>{ii=0;6<uG589~jd3=83;pD874}oc5>5<6sA?27p`n7;295~N212wem54?:0yK1<=zfh31<7?tH4;8ykgf290:wE;6;|lbf?6=9rB>56saab83>4}O=01vblj50;3xL0?<utwvLMMte887<445<j;vLMLt0|BCT~{GH
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/TARGET_EOF.vhd
0,0 → 1,106
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 16:22:56 11/30/2009
-- Design Name:
-- Module Name: TARGET_EOF - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity TARGET_EOF is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
start : in STD_LOGIC;
total_length_from_reg : in STD_LOGIC_VECTOR(15 downto 0);
eof_O : out STD_LOGIC);
end TARGET_EOF;
 
architecture Behavioral of TARGET_EOF is
 
signal count_end : std_logic:='0';
signal count_en_sig : std_logic:='0';
signal rst_counter : std_logic:='0';
 
component COUNTER_11B_EN_TRANS is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
count_en : in STD_LOGIC;
value_O : inout STD_LOGIC_VECTOR (10 downto 0));
end component;
 
signal value_O_tmp : std_logic_vector(10 downto 0);
 
component comp_11b_equal is
port (
qa_eq_b : out STD_LOGIC;
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 10 downto 0 );
b : in STD_LOGIC_VECTOR ( 10 downto 0 )
);
end component;
 
signal last_byte,last_byte_reg_in,last_byte_reg_out : std_logic;
 
begin
 
process(clk)
begin
if (rst='1' or count_end='1') then
count_en_sig<='0';
rst_counter<='1';
else
rst_counter<='0';
if clk'event and clk='1' then
if (start='1' and count_en_sig='0') then
count_en_sig<='1';
end if;
end if;
end if;
end process;
 
 
COUNT_TRANFERED_BYTES : COUNTER_11B_EN_TRANS port map
( rst =>rst_counter,
clk =>clk,
count_en => count_en_sig,
value_O =>value_O_tmp
);
 
COMP_TO_TARGET_LAST_BYTE : comp_11b_equal port map
(
qa_eq_b =>last_byte_reg_in,
clk =>clk,
a =>value_O_tmp,
b =>total_length_from_reg(10 downto 0)
);
 
process(clk)
begin
if clk'event and clk='1' then
last_byte_reg_out<=last_byte_reg_in;
end if;
end process;
eof_O<=not last_byte_reg_out;
count_end<=last_byte_reg_out;
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/MATCH_CMD.vhd
0,0 → 1,111
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 11:01:28 01/18/2011
-- Design Name:
-- Module Name: MATCH_CMD - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity MATCH_CMD is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
sof : in STD_LOGIC;
vld_i : in STD_LOGIC;
val_i : in STD_LOGIC_VECTOR (7 downto 0);
cmd_to_match : in STD_LOGIC_VECTOR(7 downto 0);
cmd_match : out STD_LOGIC);
end MATCH_CMD;
 
architecture Behavioral of MATCH_CMD is
 
TYPE state is (rst_state,
idle_state,
header_state
);
signal current_st,next_st: state;
 
signal allow_match, match_s: std_logic;
signal allow_match_v, val_i_to_match: std_logic_vector(7 downto 0);
 
begin
 
process(clk)
begin
if (rst='1') then
current_st<= rst_state;
elsif (clk'event and clk='1') then
current_st <= next_st;
end if;
end process;
 
process(current_st,sof,vld_i)
begin
case current_st is
 
when rst_state =>
 
allow_match<='0';
next_st<=idle_state;
when idle_state =>
 
allow_match<='0';
if sof='0' then
next_st <= header_state;
else
next_st <= idle_state;
end if;
 
when header_state =>
if vld_i='1' then
allow_match<='1';
next_st <= rst_state;
else
allow_match<='0';
next_st <= header_state;
end if;
 
end case;
end process;
 
allow_match_v <=(others=>allow_match);
val_i_to_match <= val_i and allow_match_v;
 
process(clk)
begin
if clk'event and clk='1' then
if val_i_to_match = cmd_to_match then
cmd_match <='1';
else
cmd_match <='0';
end if;
end if;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/dist_mem_64x8.ngc
0,0 → 1,3
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.4e
$0314g<,[o}e~g`n;"2*413&;$>"9 > %384==789:;<=>7;1234467811;<=??012;?5679=:;<55?0427456?39:3<=>?09934=6389:87< ?c:1p656wy;:3!9?44d95>LHW]]0j084?>0382?OIX\^1h}|n<483:47<>3CE\XZ5sqpb80<76813i665IORVP?b;?3:5=<57:NWWTPR=lye7;7>1139;>JSSX\^1}i~`<683:44<03E^X][[:pqsk91=87;:754@UURVP?uwg5=1<3<4A108E44<I;80M><4A518FP4?3K_XSD@IO09@03=D2&\N^DHFC@VJKK&WDH^MC_C UER\MUYADLR$OB\JGDL,phv(Wjm$hd}{_lgn[320'dlc<<4CIG@OZJNKLDXIRZVPD;8GJKJA]^NH<:4CNPF[BCIM[K_EB@PIODL3>EUMH^NH<5K2:G76>@C92M87J@K2:K36>O6:2C956GAIUQWEQC13EEJHHJ8;MMDMFGK<2F^X?:4LTV0g>Kfbfx]i}fooa8Ilhhz_oydaa2:L36>H6=2D9==>:;O02443<F;;;>85A20201>H599>>7C<>0478J777><1E><>85:L155>23G8:<4;4N33240=I:8;:96@=1006?K469:?0B??=649M6440=2D9=8<:;O02163<F;;>885A20761>H59<<>7C<>5678J7720<1E><;6f:LA[GSTX@DT\_A_S69MAQQHZB=0BBCJRFG2?J4<GB;0\95_ASVb?UOIWK_XEIVm;QKM[GSTFHGN=6_7;SCN77^6[?1XCX\LE59W]UC5k2_;#jka_rr\vdk){yxjaRgasu-SmucUIDU:S@|nm^pbi44c3\:$kh`Psq]qeh(tx{kfSd`|t.Rjt`TFEV;TAob_scn554c3\:$kh`Psq]qeh(tx{kfSd`|t.Rjt`TFEV;TAob_scn544c3\:$kh`Psq]qeh(tx{kfSd`|t.Rjt`TFEV;TAob_scn574c3\:$kh`Psq]qeh(tx{kfSd`|t.Rjt`TFEV;TAob_scn564c3\:$kh`Psq]qeh(tx{kfSd`|t.Rjt`TFEV;TAob_scn514c3\:$kh`Psq]qeh(tx{kfSd`|t.Rjt`TFEV;TAob_scn504c3\:$kh`Psq]qeh(tx{kfSd`|t.Rjt`TFEV;TAob_scn534d3\:$kh`Psq]qeh(tx{kfSd`|t.Rjt`TFEV;TAob_scn67e<]9%licQ|p^pbi+uwzhgTec}{/QksaWGJW8UF~lcPr`o06f=R8&mnbR}_scn*vvuidUbb~z PhrfVDKX9VGym`Q}al61g>S7'noeS~~Pr`o-wutfeVcey!_iqgQEHY6WDxjaR|nm40`?P6(oldT}Q}al,ptwgjW`dxx"^fpdPBIZ7XE{kfSob63a8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YJzhgT~lc82b9V4*abfVy{Sob.rrqehYnfz~$\d~jR@O\5ZKuidUym`6=c:W3+bciWzzT~lc!sqpbiZoi{}%[e}k]AL]2[HtfeVxja4<9;T2,c`hX{yUym` |pscn[lht|&Zb|h\NM^3\J465>2_;#jka_rr\vdk){yxjaRgasu-SmucUIDU:SC?=279V4*abfVy{Sob.rrqehYnfz~$\d~jR@O\5ZH6<;<0Y=!heo]ptZtfe'y{~lcPioqw+Uowm[KFS<QA1705?P6(oldT}Q}al,ptwgjW`dxx"^fpdPBIZ7XF82996[?/fgm[vvXzhg%}|nm^kmwq)WayoYM@Q>_O012>S7'noeS~~Pr`o-wutfeVcey!_iqgQEHY6WG8;>;5Z0.efjZuwW{kf"~~}al]jjvr(X`zn^LCP1^L1670<]9%licQ|p^pbi+uwzhgTec}{/QksaWGJW8UE>9<9;T2,c`hX{yUym` |pscn[lht|&Zb|h\NM^3\J705>2_;#jka_rr\vdk){yxjaRgasu-SmucUIDU:SC<7279V4*abfVy{Sob.rrqehYnfz~$\d~jR@O\5ZH48;<0Y=!heo]ptZtfe'y{~lcPioqw+Uowm[KFS<QA3306?P6(oldT}Q}al,ptwgjW`dxx"^fpdPBIZ7XF=8>7X> gdl\wuYuid$x|ob_hlpp*VnxlXJAR?PN706?P6(oldT}Q}al,ptwgjW`dxx"^fpdPBIZ7XF19:7X> gdl\wuYuid$x|ob_hlpp*VnxlXJAR?Pioqw[IVJWD_S=<==;T2,c`hX{yUym` |pscn[lht|&Zb|h\NM^3\mkusWEZFS@[W10306>S7'noeS~~Pr`o-wutfeVcey!_iqgQEHY6W`dxxRB_M^OV\776;;1^<"ijn^qs[wgj&zzym`Qfnrv,TlvbZHGT=Rgasu]OTHYJ]Q9:=><4U1-dakYtxVxja#}r`o\mkus'Yc{i_OB_0]jjvrXDYGTAXV;1011?P6(oldT}Q}al,ptwgjW`dxx"^fpdPBIZ7XagySA^B_LW[1474:2_;#jka_rr\vdk){yxjaRgasu-SmucUIDU:Sd`|t^NSIZKRP?;:??5Z0.efjZuwW{kf"~~}al]jjvr(X`zn^LCP1^kmwqYKXDUFYU9>13f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Yv{yeTeczP03f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Yv{yeTeczP13f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Yv{yeTeczP23f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Yv{yeTeczP33f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Yv{yeTeczP43f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Yv{yeTeczP53f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Yv{yeTeczP63f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Yv{yeTeczP73f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YtxfUbby2?>3f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YtxfUbby2>>3f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YtxfUbby2=>3f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YtxfUbby2<>3f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YtxfUbby2;>3f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YtxfUbby2:>3f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YtxfUbby29>3f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4YtxfUbby28>3f8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Ypz`~nSnz}l3g8Q5)`mgUx|R|nm/qsvdkXagy#]geSCN[4Ypz`~nSnz}l007?P6(oldT}Q}al,ptwgjW`dxx"|pn]jjq:76;>0Y=!heo]ptZtfe'y{~lcPioqw+tuwgVcex1?1259V4*abfVy{Sob.rrqehYnfz~$}~~`_hlw8785<2_;#jka_rr\vdk){yxjaRgasu-rwuiXag~7?3<;;T2,c`hX{yUym` |pscn[lht|&{x|bQfnu>7:72<]9%licQ|p^pbi+uwzhgTec}{/pqskZoi|5?5>95Z0.efjZuwW{kf"~~}al]jjvr(yzzdSd`{<7<10>S7'noeS~~Pr`o-wutfeVcey!~sqm\mkr;?7k0Y^K]_@NJEVe<]ZOYS[G\ICNF7>PDK01]EHYPTXRF0>QDDB80[H?k;YKOMK^*PMH+<#?/SUWA$5(6(HYHED84XRVOMG1<PZ^TKCJm;Y]@KWCXAGLD:6Vkb^Kgb>^c`VZye`Xjrrklj46<PmgTAld`rWgqwlii991Sh`QBiomqR`ttafd?7l&?)59b,4/33h"9%95n(2+7?d.3!=1j$8';;`>3:1=f484?7l2=>59b86833h6?2;5n<483:1=f4<487nbd4:f+4,2<l!;"86j'2(68`-5.<2n#8$:4d)7*0>b/> >0h%9&4:f?4;2<l5;586j32?68`959<2n783:4d=7=0>b;>7<0h1950?68`919l2nbyQbel]50}>512nbyQbel]50}>+l`yS`kb_fgm[s5X<%DDBH"AOOG2af=caz~TahcP65z;(aot|VgnaRijn^t0[1*|kVbjRkpn]`hn;7$jUcm~Qllj?2(fYoizUzh}aPcd?3(fYoizUo1<"l_icp[vvh59&hSknd^ojb87+kVbjR|pn?2(fYpam~c15"l_sgd[dYcW`d{yy}20-a\lduXl7: nQiqgomkcX{}kli~3?,b]kevYvlyeT~~z20-a\v`aXlyxjSd`uu?3(fYv}hfbjtQxe<2/gZu~fjUnbllce<3/gZbbx}b6:9"l_icp[avui4:'oRfns^sptjYtzz~6<!mPh`q\uavhWzxxx0>#c^s`aZlhagoo1="l_lgn[qwm4;'oRfns^k\g`;7$jUcm~Qkpn?3(fYjmdUbbdzPfhnf9aot|VgnaR8;x9,nmc*dWmommxb{_ecwe86+kVbjR}r`?3(fYoizUz}aPcd?3(fYflmxT{dj{h<4/gZnf{V{o|b3?,b]kevYv{yeT~~z20-11>bn{}Ufi`Q94y:\`lusWdofSjka_w1\0Z~t|V;886jfsu]nahY`mgU}?R:# Ykomk~'KFXN,Jkaescwkw&68';%<>Qfp248`ui/8 <0h}a'1(48`ui/: <0h}a'3(48`ui/< <0h}a'5(48`ui/> <0h}a'7(:8`ui;?3:5;6jr`*3-2=cx{k#=$94dqpb,7/03mzym%=&7:fsvd.3!>1o|o'5(;8`utf4<0;255jdhd1jbb33`Uhi55agb`vmib03xn{c%>&7:sgtj.6!>1zh}a'2(58uavh :#<7|jo)6*3>wcxf">%:5~dqm+2,1<ymzd$:'8;pfsk96912{o|b28:1<4?tbwgVin46kpn]`hn><ymzdS}{9:sgtjYtzz~<7|}o)2*3>wtxf":%:5~sqm+6,1<yzzd$>'8;pqsk-2.?2{x|b&:)69rwui/> =0}~~`(6+4?tuwg5:5;6|pn>2:2=v{ye7>394qrrl86803xy{c1:17:sptj:26>1z}a36?;8uvvh4>0;2:5~sqm?3;1<yzzdSnk7;pqskZtt|01z}aPssqw2>uwg!:":6}o)3*2>uwg!8":6}o)1*2>uwg!>":6}o)7*2>uwg!<":6}o)5*<>uwg5=1<394sqpb,5/03zzym%?&7:qsvd.5!>1x|o'3(58wutf =#<7~~}a)7*=>uwzh6>6=0=;vg~DEv6m91KLu?k:G87>4}T:80oo775120ggdb=9mh89v`n6;38jd1=<2.j87o?;|Q2b?bd200:??jlae82`g523Z8i6ik50;306aefl3;on>;4S0d9``<72899hnok:0fa73=ck>0;6<4>{R02>ae=13;8>imnd;3gf63<~]?=6=4>:0801~U593nh644>33f`ea<6lk9>7)7k:3a8Rd3=:r9j7?4u2294>{#=80j7om8:182<?5=9hqC5o5U1c80f<683;86p*:7;a4?!g42jh0elj50;&67?d43g?96=54i`a94?"2;3h87c;=:098mdd=83.>?7l<;o71>7=<ahk1<7*:3;`0?k352:10el750;&67?d43g?96954i`:94?"2;3h87c;=:498mgb=83.>?7m:;o71>5=<aki1<7*:3;a6?k352810eol50;&67?e23g?96?54icc94?"2;3i>7c;=:298mg?=83.>?7m:;o71>1=<ak21<7*:3;a6?k352<10eo950;&67?e23g?96;54ic494?"2;3i>7c;=:698mg3=831dj94?:%70>ce<f<81<65`f283>!342oi0b8<51:9lb7<72-?86km4n4096>=hn80;6);<:ga8j04=;21dj=4?:%70>ce<f<81865`eg83>!342oi0b8<55:9la`<72-?86km4n4092>=hmm0;6);<:ga8j04=?21b=<?50;9a=f<7280;6=uG9c9'12<>k2e><7>5;|`12?6=93:1<vF6b:&63?413f8>6=44}c3b>5<3<3886>=tH8`8^4d=99q:=7k5c;33>45=l3;?6<<515825?742881o7??:d8g>x"2?3ij7)?j:b:8 76=k01/8o4;f:mg7?6=,<91h95a5383?>ic:3:1(8=5d59m17<632eo=7>5$419`1=i=;0976ak0;29 05=l=1e9?4<;:m`b?6=,<91h95a5387?>idm3:1(8=5d59m17<232ehh7>5$419`1=i=;0=76alc;29 05=l=1e9?48;:k24c<72-?86<??;o71>5=<a8:n6=4+528255=i=;0:76g>0e83>!3428;;7c;=:398m46d290/9>4>119m17<432c:<o4?:%70>4773g?96954i02b>5<#=:0:==5a5386?>o6890;66gif;29?lgc290/9>4m3:l66?6<3`kh6=4+528a7>h2:3;07dom:18'16<e;2d>>7<4;hcb>5<#=:0i?6`:2;18?lg>290/9>4m3:l66?2<3`k36=4+528a7>h2:3?07dlk:18'16<d=2d>>7>4;h``>5<#=:0h96`:2;38?lde290/9>4l5:l66?4<3`hj6=4+528`1>h2:3907dl6:18'16<d=2d>>7:4;h`;>5<#=:0h96`:2;78?ld0290/9>4l5:l66?0<3`h=6=4+528`1>h2:3=07dkl:188mg3=831dj94?:%70>ce<f<81<65`f283>!342oi0b8<51:9lb7<72-?86km4n4096>=hn80;6);<:ga8j04=;21dj=4?:%70>ce<f<81865`eg83>!342oi0b8<55:9la`<72-?86km4n4092>=hmm0;6);<:ga8j04=?21bil4?::kf=?6=3`oi6=44iec94?"2;3ni7c;=:198ma?=83.>?7jm;o71>4=<am21<7*:3;fa?k352;10ei950;&67?be3g?96>54ie494?"2;3ni7c;=:598ma3=83.>?7jm;o71>0=<g8:36=4+52824<=i=;0;76a>0683>!3428:27c;=:098k461290/9>4>089m17<532e:<84?:%70>46>3g?96>54o027>5<#=:0:<45a5387?>i68:0;6);<:02:?k352<10c<>=:18'16<6801e9?49;:m244<72-?86<>6;o71>2=<a8;:6=44ief94?=hm?0;6);<:d:8j04=821di84?:%70>`><f<81=65`e583>!342l20b8<52:9la6<72-?86h64n4097>=hm;0;6);<:d:8j04=<21di<4?:%70>`><f<81965`e183>!342l20b8<56:9l`c<72-?86h64n4093>=nnl0;66ln2;295?6=8r.>;7<9;Ic2?M?e3f8>6=44}c5;>5<3290;w);8:3g8Ld7<@0h0(?o5229j62<722c947>5;h0:>5<<g=o1<75rb6;94?2=83:p(8952d9Ke4=O1k1/>l4=3:k13?6=3`836=44i3;94?=h<l0;66sm7`83>1<729q/9:4=e:Jb5>N>j2.9m7<<;h04>5<<a;21<75f2883>>i3m3:17pl8b;290?6=8r.>;7<j;Ic2?M?e3-8j6?=4i3594?=n:10;66g=9;29?j2b2900qo9l:187>5<7s-?<6?k4H`38L<d<,;k1>>5f2683>>o503:17d<6:188k1c=831vn:j50;694?6|,<=1>h5Ga09K=g=#:h09?6g=7;29?l4?2900e?750;9l0`<722wi;h4?:583>5}#=>09i6Fn1:J:f>"5i3887d<8:188m7>=831b>44?::m7a?6=3th<j7>54;294~"2?38n7Eo>;I;a?!4f2;90e?950;9j6=<722c957>5;n6f>5<<uk?m6=46:183!302<?0Dl?4H8`8 7g=:2c:97>5;h35>5<<a8=1<75f1983>>o613:17d<=:188m<c=831b5k4?::m7a?6=3th>h7>59;294~"2?3?>7Eo>;I;a?!4f2;1b=84?::k22?6=3`;<6=44i0:94?=n900;66g=2;29?l?b2900e4h50;9l0`<722wi9n4?:883>5}#=>0>96Fn1:J:f>"5i3<0e<;50;9j53<722c:;7>5;h3;>5<<a831<75f2383>>o>m3:17d7i:188k1c=831vn8k50;;94?6|,<=1985Ga09K=g=#:h097d?::188m40=831b=:4?::k2<?6=3`;26=44i3094?=n1l0;66g6f;29?j2b2900qo;n:18:>5<7s-?<68;4H`38L<d<,;k186g>5;29?l712900e<950;9j5=<722c:57>5;h01>5<<a0o1<75f9g83>>i3m3:17pl:9;29=?6=8r.>;7;:;Ic2?M?e3-8j6?5f1483>>o6>3:17d?8:188m4>=831b=44?::k16?6=3`3n6=44i8d94?=h<l0;66sm5c83><<729q/9:4:5:Jb5>N>j2.9m7<4i0794?=n9?0;66g>7;29?l7?2900e<750;9j67<722c2i7>5;h;e>5<<g=o1<75rb7494??=83:p(895549Ke4=O1k1/>l4=;h36>5<<a8<1<75f1683>>o603:17d?6:188m74=831b5h4?::k:b?6=3f>n6=44}c46>5<>290;w);8:478Ld7<@0h0(?o53:k21?6=3`;=6=44i0594?=n910;66g>9;29?l452900e4k50;9j=c<722e?i7>5;|`53?6=13:1<v*:7;76?Mg63A3i7)<n:69j50<722c::7>5;h34>5<<a821<75f1883>>o5:3:17d7j:188m<`=831d8h4?::a26<7200;6=u+56861>Nf92B2n6*=a;78m43=831b=;4?::k23?6=3`;36=44i0;94?=n:;0;66g6e;29?l?a2900c9k50;9~f34=8331<7>t$45910=Oi81C5o5+2`81?l722900e<850;9j52<722c:47>5;h3:>5<<a;81<75f9d83>>o>n3:17b:j:188yg0329026=4?{%74>03<@h;0D4l4$3c96>o6=3:17d?9:188m41=831b=54?::k2=?6=3`896=44i8g94?=n1o0;66a;e;29?xd193:157>50z&63?323Ak:7E7m;%0b>7=n9<0;66g>6;29?l702900e<650;9j5<<722c9>7>5;h;f>5<<a0l1<75`4d83>>{e>90;644?:1y'12<2=2Bj=6F6b:&1e?4<a8?1<75f1783>>o6?3:17d?7:188m4?=831b>?4?::k:a?6=3`3m6=44o5g94?=zj<21<7750;2x 01==<1Cm<5G9c9'6d<?3`;>6=44i0494?=n9>0;66g>8;29?l7>2900e?<50;9j=`<722c2j7>5;n6f>5<<uk3:6=4<:183!302;n0Dl?4H8`8 7g=n2c9;7>5;h0;>5<<g=o1<75rb9594?5=83:p(895259Ke4=O1k1/>l4>;h3`>5<<a;81<75`5583>>{e0?0;6>4?:1y'12<5<2Bj=6F6b:&1e?7<a8i1<75f2383>>i2<3:17pl75;297?6=8r.>;7<;;Ic2?M?e3-8j6<5f1b83>>o5:3:17b;;:188yg>329086=4?{%74>72<@h;0D4l4$3c95>o6k3:17d<=:188k02=831vn5=50;194?6|,<=1>95Ga09K=g=#:h0:7d?l:188m74=831d994?::a<7<72:0;6=u+56810>Nf92B2n6*=a;38m4e=831b>?4?::m60?6=3th3=7>53;294~"2?38?7Eo>;I;a?!4f281b=n4?::k16?6=3f??6=44}c:3>5<4290;w);8:368Ld7<@0h0(?o51:k2g?6=3`896=44o4694?=zj0:1<7=50;2x 01=:m1Cm<5G9c9'6d<e3`8<6=44i3:94?=h<l0;66s|b483>4?|Vk?018h59d9>1a<>m27>o77j;<7f><c<5<k15h52588:a>;2j33n7089:8g8933=1l16::46e:?57??b34<964k4=769=`=:>802i6390;;f?83?20o015951b9><3<6k27397?l;<:7>4e<5191=n528382g>;?93;h706?:0a8yv7693:1?vP>109>=4<50272<7<7;|qf3?6=90qU==64^024?[77>2T:<85Q1168Z4643W;;>6P>009]`6=Yl;1Uh<5Qd19]gc=Ykl1Uoi5Qcb9]a3=Ym<1Ui95Qe29]a7=Ym81Ui=5Qdg9>e7<5=2wx544?:3y]b1=:0>0>86s|9983>7}Yn:164;4:4:p=2<72;qUj?5284860>{t1?0;6?uQf09><1<2<2wx584?:3y]b5=:0:0>86s|9583>7}Ymo164?4:4:p=6<72;qUih5280860>{t1;0;6?uQee9><5<2<2wxn94?:cy]ea=:?109;6389;04?81f2;=01:l5269>3f<5?27<h7<8;<5f>71<5>l1>:5290813>;>838<7p}m2;2954}Yij169k4>9:?6`?7>34?h6<74=4g95<=:=h0:563:9;3:?83e28301;85189>20<6127=;7?6;<40>4?<5?81=4526582=>;193;2708?:0;890>=901vo?50;32[ge34?m6<64=4f95==:=j0:463:e;3;?83f28201875199>1g<6027=:7?7;<46>4><5?=1=5526282<>;1:3;3708;:0:8937=9116:=4>8:?6<?7?3tyi<7>510y]ed=:=o0:;63:d;34?83d28=018k5169>1d<6?27>57?8;<7a>41<5?<1=:5264823>;1?3;<708<:058934=9>16:94>7:?55?7034<;6<94=4:952=z{hl1<7?>{_c:?83a28<018j5179>1f<6>27>i7?9;<7b>40<5<31=;525c822>;1>3;=708::048931=9?16:>4>6:?56?7134<?6<84=73953=:>90::63:8;35?xufm3:1=<uQa99>1c<6=27>h7?:;<7`>43<5<o1=8525`821>;213;>70;m:078930=9<16:84>5:?53?7234<86<;4=70950=:>=0:96391;36?80728?01865149~wf0=839pRoj4=4d967=:=l09>6s|c583>6}Yjj169i4=2:?6g?453tyh?7>53z\af>;2i38970;m:308yve52908wSln;<7:>74<5?=1>?5rsb394?5|Vk301;85239>20<5:2wxo=4?:2y]f==:>:09>6394;01?xuen3:1?vPm7:?56?4534<:6?<4}r`f>5<4sWh=708?:30890>=:;1v;j50;0x92>=:116954;e:p30<72;q6;54=9:?54?2b3ty347>52z?4<?2b342;6?<4}r55>5<5s4=26?64=7390`=z{>=1<7<t=6;96<=:>;0?i6s|8883>7}:?00?i6371;01?xu103:1>v38a;0;?8042=o0q~86:18181f2;301;:54d9~w=g=838p1:o54d9><7<5:2wx:l4?:3y>3g<5027=97:j;|q5f?6=:r7<n7<6;<45>1c<uz2i6=4={<5a>1c<5191>?5rs7a94?4|5>i1>5526687a>{t>l0;6?u27b81=>;213>n7p}7c;296~;0k3>n706;:308yv0a2909w09k:3:890g=<l1v:>50;0x92b=:0169o4;e:p<a<72;q6;i4;e:?;1?453ty<=7>52z?4a?4?34?h69k4}r51>5<5s4=n6?74=4f90`=z{1o1<7<t=6g90`=:0?09>6s|7283>7}:?o09463:e;6f?xu0<3:1>v38f;0:?83a2=o0q~6i:18181a2=o01595239~w<7=833p18h59g9>1a<>n27>577i;<7a><`<5?<15k52638:b>;1<33m708?:8d89<7=<l1v4>50;;x90e=1o169h46f:?6e??a34<>64h4=759=c=:>:02j6391;;e?83?20l014>54d9~yv56290:>v3=6;06?87f2mk01<o5d89>5d<c027:m7j8;<3b>a0<58k1h8521`824c=:9h0:<h521`824a=:9h0:<n521`824g=:9h0:<l521`8fe>;6i3lm70?n:d`894g=99:01<o5eb9~w64=83>p14m5519>5d<cl27:m7hj;<3b>`?<uzh?6=4={_cg?87f2hn0(4o5329~wg4=838pRlm4=0c9ef=#1h0886s|b083>7}Yik16=l4nb:&:e?523tyi<7>52z\be>;6i3kj7)7n:248yvga2909wSo6;<3b>d?<,0k1?:5rs`g94?4|Vh201<o5a99'=d<402wxo;4?:3y]fa=:9h0ih6*6a;1:?xud<3:1>vPmc:?2e?dd3-3j6>o4}ra0>5<5sWhi70?n:c`8 <g=;k1vn<50;0xZgg<58k1nl5+9`80g>{tk80;6?uQb89>5d<e12.2m7=k;|q`4?6=:rTi463>a;`;?!?f2:o0q~li:181[d034;j6o94$8c97c=z{ko1<7<t^c4894g=j?1/5l4;0:pf0<72;qUn8521`8a1>">i3>:7p}>1083>7}Y98;01<o51038 <g=<;1vkj50;0xZc2<58k1j95+9`877>{tnk0;6?uQf29>5d<a;2.2m7:;;|qee?6=:rTm>63>a;d1?!?f2=?0q~h6:181[`634;j6k?4$8c903=z{o21<7<t^g2894g=n91/5l4;7:pb2<72;qUik521`8fb>">i3>37p}i6;296~Xbm27:m7kj;%;b>1?<uzl>6=4={_gg?87f2ln0(4o54`9~yk7>93:1=vF6b:m5<4=83;pD4l4}o3:7?6=:rB2n6sa18694?4|@0h0qc?65;296~N>j2we=4850;0xL<d<ug;2;7>52zJ:f>{i9021<7<tH8`8yk7>13:1>vF6b:m5<g=838pD4l4}o3:f?6=:rB2n6sa18a94?4|@0h0qc?6d;296~N>j2we=4k50;0xL<d<ug;2j7>52zJ:f>{i9h:1<7<tH8`8yk7f93:1>vF6b:m5d4=838pD4l4}o3b7?6=:rB2n6F;d:m5d2=838pD4l4H5f8yk7f=3:1>vF6b:J7`>{i9h<1<7<tH8`8L1b<ug;j;7>52zJ:f>N3l2we=l650;0xL<d<@=n0qc?n9;296~N>j2B?h6sa1`c94?4|@0h0D9j4}o354?6=9rB2n6sa16594?7|@0h0qc?88;295~N>j2we=:750;3xL<d<ug;<m7>51zJ:f>{i9>h1<7?tH8`8yk70k3:1=vF6b:m52b=83;pD4l4}o34a?6=9rB2n6sa16d94?7|@0h0qc?70;295~N>j2we=5?50;3xL<d<ug;3>7>51zJ:f>{i9191<7?tH8`8yk7?<3:1=vF6b:m5=3=83;pD4l4}o3;2?6=9rB2n6sa19594?7|@0h0qc?78;295~N>j2we=5750;3xL<d<ug;3m7>51zJ:f>{i91h1<7?tH8`8yk7?k3:1=vF6b:m5=b=83;pD4l4}o3;a?6=9rB2n6sa19d94?7|@0h0qc?60;295~N>j2wvqpNOCz3f4?b1?l334pNOBz2~DEV|uIJ
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/REG_16B_WREN.vhd
0,0 → 1,56
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 21:15:16 11/27/2009
-- Design Name:
-- Module Name: REG_16B_WREN - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description: 16bit wide Register with write enable option.
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity REG_16B_WREN is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
wren : in STD_LOGIC;
input : in STD_LOGIC_VECTOR (15 downto 0);
output : out STD_LOGIC_VECTOR (15 downto 0));
end REG_16B_WREN;
 
architecture Behavioral of REG_16B_WREN is
 
begin
 
process(clk)
begin
if rst='1' then
output<="0000000000000000";
else
if clk'event and clk='1' then
if wren='1' then
output<=input;
end if;
end if;
end if;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/IPV4_LUT_INDEXER.vhd
0,0 → 1,110
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 22:11:55 11/27/2009
-- Design Name:
-- Module Name: IPV4_LUT_INDEXER - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity IPV4_LUT_INDEXER is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
transmit_enable : in STD_LOGIC;
LUT_index : out STD_LOGIC_VECTOR (5 downto 0));
end IPV4_LUT_INDEXER;
 
architecture Behavioral of IPV4_LUT_INDEXER is
 
component dist_mem_64x8 is
port (
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 5 downto 0 );
qspo : out STD_LOGIC_VECTOR ( 7 downto 0 )
);
end component;
 
component COUNTER_6B_LUT_FIFO_MODE is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
funct_sel : in STD_LOGIC; -- 0 for lut addressing, 1 for fifo addressing -- only LUT support is used
count_en : in STD_LOGIC;
value_O : inout STD_LOGIC_VECTOR (5 downto 0));
end component;
 
component comp_6b_equal is
port (
qa_eq_b : out STD_LOGIC;
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 5 downto 0 );
b : in STD_LOGIC_VECTOR ( 5 downto 0 )
);
end component;
 
signal count_en_sig , count_end , rst_counter: std_logic :='0';
signal count_val: std_logic_Vector(5 downto 0):=(others=>'0');
signal count_en_sig_comb : std_logic;
constant lut_upper_address :std_logic_vector(5 downto 0):="100110"; -- position 38
 
begin
 
process(clk)
begin
if (rst='1' or count_end='1') then
count_en_sig<='0';
rst_counter<='1';
else
rst_counter<='0';
if clk'event and clk='1' then
if (transmit_enable='1' and count_en_sig='0') then
count_en_sig<='1';
end if;
end if;
end if;
end process;
 
LUT_END_CHECK : comp_6b_equal port map (
qa_eq_b =>count_end,
clk =>clk,
a =>count_val,
b =>lut_upper_address
 
);
 
count_en_sig_comb <=count_en_sig or transmit_enable;
 
 
 
LUT_INDEXER_MODULE : COUNTER_6B_LUT_FIFO_MODE port map (
rst => rst_counter,
clk => clk,
funct_sel =>'0', -- for now only one function is supported
count_en =>count_en_sig_comb,
value_O =>count_val
);
 
LUT_index<=count_val;
 
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/comp_6b_equal.xco
0,0 → 1,59
##############################################################
#
# Xilinx Core Generator version K.39
# Date: Thu Feb 04 10:02:26 2010
#
##############################################################
#
# This file contains the customisation parameters for a
# Xilinx CORE Generator IP GUI. It is strongly recommended
# that you do not manually alter this file as it may cause
# unexpected and unsupported behavior.
#
##############################################################
#
# BEGIN Project Options
SET addpads = False
SET asysymbol = False
SET busformat = BusFormatAngleBracketNotRipped
SET createndf = False
SET designentry = VHDL
SET device = xc3s200
SET devicefamily = spartan3
SET flowvendor = Other
SET formalverification = False
SET foundationsym = False
SET implementationfiletype = Ngc
SET package = ft256
SET removerpms = False
SET simulationfiles = Structural
SET speedgrade = -4
SET verilogsim = False
SET vhdlsim = True
# END Project Options
# BEGIN Select
SELECT Comparator family Xilinx,_Inc. 9.0
# END Select
# BEGIN Parameters
CSET aclr=false
CSET ainitval=0
CSET aset=false
CSET ce=false
CSET cepriority=Sync_Overrides_CE
CSET component_name=comp_6b_equal
CSET constantbport=false
CSET constantbportvalue=0000000000000000
CSET datatype=Unsigned
CSET nonregisteredoutput=false
CSET operation=eq
CSET pipelinestages=0
CSET radix=2
CSET registeredoutput=true
CSET sclr=false
CSET sset=false
CSET syncctrlpriority=Reset_Overrides_Set
CSET width=6
# END Parameters
GENERATE
# CRC: dc354663
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/ENABLE_USER_DATA_TRANSMISSION.vhd
0,0 → 1,64
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 12:05:48 12/04/2009
-- Design Name:
-- Module Name: ENABLE_USER_DATA_TRANSMISSION - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity ENABLE_USER_DATA_TRANSMISSION is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
start_usr_data_trans : in STD_LOGIC;
stop_usr_data_trans : in STD_LOGIC;
usr_data_sel : out STD_LOGIC);
end ENABLE_USER_DATA_TRANSMISSION;
 
architecture Behavioral of ENABLE_USER_DATA_TRANSMISSION is
 
signal usr_data_sel_prev : std_logic :='0';
 
begin
 
process(clk)
begin
if rst='1' then
usr_data_sel<='0';
usr_data_sel_prev<='0';
else
if clk'event and clk='1' then
if (start_usr_data_trans='1' and usr_data_sel_prev='0') then
usr_data_sel<='1';
usr_data_sel_prev<='1';
end if;
if (stop_usr_data_trans='0' and usr_data_sel_prev='1') then -- stop_usr_data_trans is active low
usr_data_sel<='0';
usr_data_sel_prev<='0';
end if;
end if;
end if;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/UDP_IP_Core.vhd
0,0 → 1,188
-----------------------------------------------------------------------------------------
-- Copyright (C) 2010 Nikolaos Ch. Alachiotis --
-- --
-- Engineer: Nikolaos Ch. Alachiotis --
-- --
-- Contact: n.alachiotis@gmail.com --
-- --
-- Create Date: 04/03/2011 --
-- Module Name: UDP_IP_Core --
-- Target Devices: Virtex 5 FPGAs --
-- Tool versions: ISE 10.1 --
-- Description: This component can be used to transmit and receive UDP/IP --
-- Ethernet Packets (IPv4). --
-- Additional Comments: The core has been area-optimized and is suitable for direct --
-- PC-FPGA communication at Gigabit speed. --
-- --
-----------------------------------------------------------------------------------------
 
 
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity UDP_IP_Core is
Port ( rst : in STD_LOGIC; -- active-high
clk_125MHz : in STD_LOGIC;
-- Transmit signals
transmit_start_enable : in STD_LOGIC;
transmit_data_length : in STD_LOGIC_VECTOR (15 downto 0);
usr_data_trans_phase_on : out STD_LOGIC;
transmit_data_input_bus : in STD_LOGIC_VECTOR (7 downto 0);
start_of_frame_O : out STD_LOGIC;
end_of_frame_O : out STD_LOGIC;
source_ready : out STD_LOGIC;
transmit_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0);
--Receive Signals
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
input_bus : in STD_LOGIC_VECTOR(7 downto 0);
valid_out_usr_data : out STD_LOGIC;
usr_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0);
locked : out STD_LOGIC
);
end UDP_IP_Core;
 
architecture Behavioral of UDP_IP_Core is
 
component IPV4_PACKET_TRANSMITTER is
Port ( rst : in STD_LOGIC;
clk_125MHz : in STD_LOGIC;
transmit_start_enable : in STD_LOGIC;
transmit_data_length : in STD_LOGIC_VECTOR (15 downto 0);
usr_data_trans_phase_on : out STD_LOGIC;
transmit_data_input_bus : in STD_LOGIC_VECTOR (7 downto 0);
start_of_frame_O : out STD_LOGIC;
end_of_frame_O : out STD_LOGIC;
source_ready : out STD_LOGIC;
transmit_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0);
 
flex_wren: in STD_LOGIC;
flex_wraddr: in STD_LOGIC_VECTOR(5 downto 0);
flex_wrdata: in STD_LOGIC_VECTOR(7 downto 0);
flex_checksum_baseval: in std_logic_vector(15 downto 0)
);
end component;
 
component IPv4_PACKET_RECEIVER is
Port ( rst : in STD_LOGIC;
clk_125Mhz : in STD_LOGIC;
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
input_bus : in STD_LOGIC_VECTOR(7 downto 0);
valid_out_usr_data : out STD_LOGIC;
usr_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0));
end component;
 
component FLEX_CONTROL is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
r_sof : in STD_LOGIC;
r_usrvld : in STD_LOGIC;
r_data : in STD_LOGIC_VECTOR (7 downto 0);
r_usrdata: in STD_LOGIC_VECTOR (7 downto 0);
r_eof : in STD_LOGIC;
l_wren : out STD_LOGIC;
l_addr : out STD_LOGIC_VECTOR (5 downto 0);
l_data : out STD_LOGIC_VECTOR (7 downto 0);
checksum_baseval : out STD_LOGIC_VECTOR(15 downto 0);
locked : out STD_LOGIC
);
end component;
 
signal valid_out_usr_data_t : STD_LOGIC;
signal usr_data_output_bus_t : STD_LOGIC_VECTOR (7 downto 0);
 
signal flex_wren: STD_LOGIC;
signal flex_wraddr: STD_LOGIC_VECTOR(5 downto 0);
signal flex_wrdata: STD_LOGIC_VECTOR(7 downto 0);
signal flex_checksum_baseval: std_logic_vector(15 downto 0);
 
signal core_rst: std_logic;
 
component MATCH_CMD is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
sof : in STD_LOGIC;
vld_i : in STD_LOGIC;
val_i : in STD_LOGIC_VECTOR (7 downto 0);
cmd_to_match : in STD_LOGIC_VECTOR(7 downto 0);
cmd_match : out STD_LOGIC);
end component;
 
begin
 
MATCH_RST_CODE: MATCH_CMD Port Map
( rst => rst,
clk => clk_125MHz,
sof => rx_sof,
vld_i => valid_out_usr_data_t,
val_i => usr_data_output_bus_t,
cmd_to_match => "11111111",
cmd_match => core_rst
);
 
IPV4_PACKET_TRANSMITTER_port_map: IPV4_PACKET_TRANSMITTER
Port Map
( rst => core_rst,
clk_125MHz => clk_125MHz,
transmit_start_enable => transmit_start_enable,
transmit_data_length => transmit_data_length,
usr_data_trans_phase_on => usr_data_trans_phase_on,
transmit_data_input_bus => transmit_data_input_bus,
start_of_frame_O => start_of_frame_O,
end_of_frame_O => end_of_frame_O,
source_ready => source_ready,
transmit_data_output_bus => transmit_data_output_bus,
flex_wren => flex_wren,
flex_wraddr => flex_wraddr,
flex_wrdata => flex_wrdata,
flex_checksum_baseval => flex_checksum_baseval
);
 
 
IPv4_PACKET_RECEIVER_port_map: IPv4_PACKET_RECEIVER
Port Map
( rst => core_rst,
clk_125Mhz => clk_125Mhz,
rx_sof => rx_sof,
rx_eof => rx_eof,
input_bus => input_bus,
valid_out_usr_data => valid_out_usr_data_t,
usr_data_output_bus => usr_data_output_bus_t
);
valid_out_usr_data <= valid_out_usr_data_t;
usr_data_output_bus <= usr_data_output_bus_t;
FLEX_CONTROL_port_map: FLEX_CONTROL
Port Map
( rst => core_rst,
clk => clk_125Mhz,
r_sof => rx_sof,
r_usrvld => valid_out_usr_data_t,
r_data => input_bus,
r_usrdata => usr_data_output_bus_t,
r_eof => rx_eof,
l_wren => flex_wren,
l_addr => flex_wraddr,
l_data => flex_wrdata,
checksum_baseval => flex_checksum_baseval,
locked => locked
);
 
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/comp_11b_equal.vhd
0,0 → 1,249
--------------------------------------------------------------------------------
-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved.
--------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version: K.39
-- \ \ Application: netgen
-- / / Filename: comp_11b_equal.vhd
-- /___/ /\ Timestamp: Thu Feb 04 11:01:48 2010
-- \ \ / \
-- \___\/\___\
--
-- Command : -intstyle ise -w -sim -ofmt vhdl C:\PHd_Projects\The_Felsenstein_CoProcessor\COREGEN_Design\tmp\_cg\comp_11b_equal.ngc C:\PHd_Projects\The_Felsenstein_CoProcessor\COREGEN_Design\tmp\_cg\comp_11b_equal.vhd
-- Device : 3s200ft256-4
-- Input file : C:/PHd_Projects/The_Felsenstein_CoProcessor/COREGEN_Design/tmp/_cg/comp_11b_equal.ngc
-- Output file : C:/PHd_Projects/The_Felsenstein_CoProcessor/COREGEN_Design/tmp/_cg/comp_11b_equal.vhd
-- # of Entities : 1
-- Design Name : comp_11b_equal
-- Xilinx : C:\Xilinx\10.1\ISE
--
-- Purpose:
-- This VHDL netlist is a verification model and uses simulation
-- primitives which may not represent the true implementation of the
-- device, however the netlist is functionally correct and should not
-- be modified. This file cannot be synthesized and should only be used
-- with supported simulation tools.
--
-- Reference:
-- Development System Reference Guide, Chapter 23
-- Synthesis and Simulation Design Guide, Chapter 6
--
--------------------------------------------------------------------------------
 
 
-- synthesis translate_off
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
use UNISIM.VPKG.ALL;
 
entity comp_11b_equal is
port (
qa_eq_b : out STD_LOGIC;
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 10 downto 0 );
b : in STD_LOGIC_VECTOR ( 10 downto 0 )
);
end comp_11b_equal;
 
architecture STRUCTURE of comp_11b_equal is
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and0000120_34 : STD_LOGIC;
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000093_33 : STD_LOGIC;
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000053_32 : STD_LOGIC;
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000026_31 : STD_LOGIC;
signal BU2_N01 : STD_LOGIC;
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result : STD_LOGIC;
signal BU2_N1 : STD_LOGIC;
signal BU2_a_ge_b : STD_LOGIC;
signal NLW_VCC_P_UNCONNECTED : STD_LOGIC;
signal NLW_GND_G_UNCONNECTED : STD_LOGIC;
signal a_2 : STD_LOGIC_VECTOR ( 10 downto 0 );
signal b_3 : STD_LOGIC_VECTOR ( 10 downto 0 );
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o : STD_LOGIC_VECTOR ( 1 downto 0 );
signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_async_o : STD_LOGIC_VECTOR ( 1 downto 1 );
begin
a_2(10) <= a(10);
a_2(9) <= a(9);
a_2(8) <= a(8);
a_2(7) <= a(7);
a_2(6) <= a(6);
a_2(5) <= a(5);
a_2(4) <= a(4);
a_2(3) <= a(3);
a_2(2) <= a(2);
a_2(1) <= a(1);
a_2(0) <= a(0);
b_3(10) <= b(10);
b_3(9) <= b(9);
b_3(8) <= b(8);
b_3(7) <= b(7);
b_3(6) <= b(6);
b_3(5) <= b(5);
b_3(4) <= b(4);
b_3(3) <= b(3);
b_3(2) <= b(2);
b_3(1) <= b(1);
b_3(0) <= b(0);
VCC_0 : VCC
port map (
P => NLW_VCC_P_UNCONNECTED
);
GND_1 : GND
port map (
G => NLW_GND_G_UNCONNECTED
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and0000136 :
LUT4
generic map(
INIT => X"8000"
)
port map (
I0 =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000026_31
,
I1 =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000053_32
,
I2 =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000093_33
,
I3 =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and0000120_34
,
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o(0)
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and0000120 :
LUT4
generic map(
INIT => X"9009"
)
port map (
I0 => a_2(6),
I1 => b_3(6),
I2 => a_2(7),
I3 => b_3(7),
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and0000120_34
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000093 :
LUT4
generic map(
INIT => X"9009"
)
port map (
I0 => a_2(4),
I1 => b_3(4),
I2 => a_2(5),
I3 => b_3(5),
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000093_33
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000053 :
LUT4
generic map(
INIT => X"9009"
)
port map (
I0 => a_2(2),
I1 => b_3(2),
I2 => a_2(3),
I3 => b_3(3),
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000053_32
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000026 :
LUT4
generic map(
INIT => X"9009"
)
port map (
I0 => a_2(0),
I1 => b_3(0),
I2 => a_2(1),
I3 => b_3(1),
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_0_and000026_31
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_1_and0000 :
LUT3
generic map(
INIT => X"09"
)
port map (
I0 => b_3(9),
I1 => a_2(9),
I2 => BU2_N01,
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o(1)
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o_1_and0000_SW0 :
LUT4
generic map(
INIT => X"6FF6"
)
port map (
I0 => a_2(10),
I1 => b_3(10),
I2 => a_2(8),
I3 => b_3(8),
O => BU2_N01
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_opt_carry_tile_and_or_carry_muxs_0_i_mux :
MUXCY
port map (
CI =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_async_o(1)
,
DI => BU2_a_ge_b,
S =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o(0)
,
O => BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_opt_carry_tile_and_or_carry_muxs_1_i_mux :
MUXCY
port map (
CI => BU2_N1,
DI => BU2_a_ge_b,
S =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_lut_o(1)
,
O =>
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_async_o(1)
 
);
BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_gen_output_reg_output_reg_fd_output_1 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result,
Q => qa_eq_b
);
BU2_XST_VCC : VCC
port map (
P => BU2_N1
);
BU2_XST_GND : GND
port map (
G => BU2_a_ge_b
);
 
end STRUCTURE;
 
-- synthesis translate_on
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/dist_mem_64x8.vhd
0,0 → 1,527
--------------------------------------------------------------------------------
-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved.
--------------------------------------------------------------------------------
-- ____ ____
-- / /\/ /
-- /___/ \ / Vendor: Xilinx
-- \ \ \/ Version: K.39
-- \ \ Application: netgen
-- / / Filename: dist_mem_64x8.vhd
-- /___/ /\ Timestamp: Mon May 09 14:16:57 2011
-- \ \ / \
-- \___\/\___\
--
-- Command : -intstyle ise -w -sim -ofmt vhdl "C:\VERIFICATION PLATFORM\UDP_IP_FLEX\COREGEN\tmp\_cg\dist_mem_64x8.ngc" "C:\VERIFICATION PLATFORM\UDP_IP_FLEX\COREGEN\tmp\_cg\dist_mem_64x8.vhd"
-- Device : 3s200pq208-4
-- Input file : C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/tmp/_cg/dist_mem_64x8.ngc
-- Output file : C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/tmp/_cg/dist_mem_64x8.vhd
-- # of Entities : 1
-- Design Name : dist_mem_64x8
-- Xilinx : C:\Xilinx\10.1\ISE
--
-- Purpose:
-- This VHDL netlist is a verification model and uses simulation
-- primitives which may not represent the true implementation of the
-- device, however the netlist is functionally correct and should not
-- be modified. This file cannot be synthesized and should only be used
-- with supported simulation tools.
--
-- Reference:
-- Development System Reference Guide, Chapter 23
-- Synthesis and Simulation Design Guide, Chapter 6
--
--------------------------------------------------------------------------------
 
 
-- synthesis translate_off
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
use UNISIM.VPKG.ALL;
 
entity dist_mem_64x8 is
port (
clk : in STD_LOGIC := 'X';
we : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 5 downto 0 );
d : in STD_LOGIC_VECTOR ( 7 downto 0 );
qspo : out STD_LOGIC_VECTOR ( 7 downto 0 )
);
end dist_mem_64x8;
 
architecture STRUCTURE of dist_mem_64x8 is
signal N0 : STD_LOGIC;
signal N1 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N32 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N30 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N28 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N26 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N24 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N22 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N20 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N18 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N16 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N14 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N12 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N10 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N8 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N6 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N4 : STD_LOGIC;
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N2 : STD_LOGIC;
signal a_2 : STD_LOGIC_VECTOR ( 5 downto 0 );
signal d_3 : STD_LOGIC_VECTOR ( 7 downto 0 );
signal qspo_4 : STD_LOGIC_VECTOR ( 7 downto 0 );
signal BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int : STD_LOGIC_VECTOR ( 7 downto 0 );
signal BU2_qdpo : STD_LOGIC_VECTOR ( 0 downto 0 );
begin
a_2(5) <= a(5);
a_2(4) <= a(4);
a_2(3) <= a(3);
a_2(2) <= a(2);
a_2(1) <= a(1);
a_2(0) <= a(0);
d_3(7) <= d(7);
d_3(6) <= d(6);
d_3(5) <= d(5);
d_3(4) <= d(4);
d_3(3) <= d(3);
d_3(2) <= d(2);
d_3(1) <= d(1);
d_3(0) <= d(0);
qspo(7) <= qspo_4(7);
qspo(6) <= qspo_4(6);
qspo(5) <= qspo_4(5);
qspo(4) <= qspo_4(4);
qspo(3) <= qspo_4(3);
qspo(2) <= qspo_4(2);
qspo(1) <= qspo_4(1);
qspo(0) <= qspo_4(0);
VCC_0 : VCC
port map (
P => N1
);
GND_1 : GND
port map (
G => N0
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl : LUT2
generic map(
INIT => X"4"
)
port map (
I0 => a_2(5),
I1 => we,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_qspo_int_0 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(0),
Q => qspo_4(0)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_qspo_int_1 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(1),
Q => qspo_4(1)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_qspo_int_2 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(2),
Q => qspo_4(2)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_qspo_int_3 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(3),
Q => qspo_4(3)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_qspo_int_4 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(4),
Q => qspo_4(4)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_qspo_int_5 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(5),
Q => qspo_4(5)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_qspo_int_6 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(6),
Q => qspo_4(6)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_qspo_int_7 : FD
generic map(
INIT => '0'
)
port map (
C => clk,
D => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(7),
Q => qspo_4(7)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1 : LUT2
generic map(
INIT => X"8"
)
port map (
I0 => a_2(5),
I1 => we,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram1 : RAM32X1S
generic map(
INIT => X"00804000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(0),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N2
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram2 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(0),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N4
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram3 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(1),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N6
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram6 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(2),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N12
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram4 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(1),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N8
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram5 : RAM32X1S
generic map(
INIT => X"00014000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(2),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N10
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram9 : RAM32X1S
generic map(
INIT => X"00800000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(4),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N18
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram7 : RAM32X1S
generic map(
INIT => X"00001000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(3),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N14
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram8 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(3),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N16
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram12 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(5),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N24
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram10 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(4),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N20
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram11 : RAM32X1S
generic map(
INIT => X"00010000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(5),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N22
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram15 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(7),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N30
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram13 : RAM32X1S
generic map(
INIT => X"00504000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(6),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl_50,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N26
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram14 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(6),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N28
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_Mram_ram16 : RAM32X1S
generic map(
INIT => X"00000000"
)
port map (
A0 => a_2(0),
A1 => a_2(1),
A2 => a_2(2),
A3 => a_2(3),
A4 => a_2(4),
D => d_3(7),
WCLK => clk,
WE => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_write_ctrl1_49,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N32
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_inst_LPM_MUX711 : LUT3
generic map(
INIT => X"E4"
)
port map (
I0 => a_2(5),
I1 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N30,
I2 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N32,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(7)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_inst_LPM_MUX611 : LUT3
generic map(
INIT => X"E4"
)
port map (
I0 => a_2(5),
I1 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N26,
I2 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N28,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(6)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_inst_LPM_MUX511 : LUT3
generic map(
INIT => X"E4"
)
port map (
I0 => a_2(5),
I1 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N22,
I2 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N24,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(5)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_inst_LPM_MUX411 : LUT3
generic map(
INIT => X"E4"
)
port map (
I0 => a_2(5),
I1 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N18,
I2 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N20,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(4)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_inst_LPM_MUX311 : LUT3
generic map(
INIT => X"E4"
)
port map (
I0 => a_2(5),
I1 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N14,
I2 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N16,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(3)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_inst_LPM_MUX211 : LUT3
generic map(
INIT => X"E4"
)
port map (
I0 => a_2(5),
I1 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N10,
I2 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N12,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(2)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_inst_LPM_MUX111 : LUT3
generic map(
INIT => X"E4"
)
port map (
I0 => a_2(5),
I1 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N6,
I2 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N8,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(1)
);
BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_inst_LPM_MUX11 : LUT3
generic map(
INIT => X"E4"
)
port map (
I0 => a_2(5),
I1 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N2,
I2 => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_N4,
O => BU2_U0_gen_sp_ram_spram_inst_PipeRAM_1_spo_int(0)
);
BU2_XST_GND : GND
port map (
G => BU2_qdpo(0)
);
 
end STRUCTURE;
 
-- synthesis translate_on
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/wraddr_lut_mem.ngc
0,0 → 1,3
XILINX-XDB 0.1 STUB 0.1 ASCII
XILINX-XDM V1.4e
$e6x5d=#Zl|bdaa:!3-522):'?%8#?/$0930>6E:J>0<O=K3:3-41=688I?7<;=8592205338<>:?5=6b90w767xx8;4 :;;41651=2<=On7;4FNQWW>d:2294n7;4FNQWW>a:2294:=685IORVP?bwzh6>6=0>1:49MKVR\3y{~l2::1<25>0=G\^[YY4kpn>6>586:2<1CXZ_UU8r`ui;=3:5=?59:NWWTPR=yzzd084?>0382?IR\Y__6~~`<483:1=>LML87O[=8:@VWZOINF;0O994C;-UAWOAAJK_EB@/PMCWBJTJ'\N[SD^PFMG[+FIUMNOE#yc/^ad+rtflmxT`xzPmdo-jbi6:2ICINEPLHAFJVCX\PZN56M@MLKWP@B6<2ID^HQHEOGQEQOHFVCEJB94CSGBP@B63M80J5<4FE18BAU63N90KCJ=;H21?L753@897D=6;HLJPVRF\L<0@BOKEE58HJANKHF?7A[[359OQQ223D_SJ8;4MTZE2f=JiceyZh||inl`?Hoig{\n~~g`n39M47=I9<1E><>;5:L155323G8:<;;4N33330=I:8:396@=11;6?K46:1?0B??:049M6436=2D9=8<:;O02163<F;;>885A20767>H50:1E>4=4N220?K56;2D8>>5A3218J6243G9>j6@M_CWPTLHXX[E[_:5AEUULVN7<G;1DG<5_4:RBVQg<X@DTNX]FDY`8TLHXJ\YEM@K>;P38W3=TG\XHI95[YQG1<>S7'noeSab.smn[lht|&Gyc`Q|pn]jjqYugd:;<=<6;T2,c`hXzfg%~bcPioqw+HtheVy{cRgat^pli567888j7X> gdl\vjk)zfgTec}{/LpliZuwgVcexR|`m1234475k2_;#jka_smn*wijW`dxx"C}ol]ptjYnf}Uyc`>?0132[C4d3\:$kh`Prno-vjkXagy#@|`m^qskZoi|Vxda=>?003\C7?<]9%licQ}ol,qkhYnfz~$Aab_rrl[lhsW{ef<=>?23c8Q5)`mgUyc` }ol]jjvr(E{efS~~`_hlw[wij89:;><<l;T2,c`hXzfg%~bcPioqw+HtheVy{cRgat^pli5678;;TJ?m4U1-dakYugd$yc`Qfnrv,IwijWzzdSd`{_smn4567:8UL>45Z0.efjZthe'xdaRgasu-NvjkX{yeTeczPrno34564:h1^<"ijn^pli+theVcey!Brno\wuiXag~T~bc?012057d<]9%licQ}ol,qkhYnfz~$Aab_rrl[lhsW{ef<=>?3031g>S7'noeSab.smn[lht|&Gyc`Q|pn]jjqYugd:;<==>100f?P6(oldT~bc!rno\mkus'DxdaR}o^kmpZthe9:;<>?>_g71=>S7'noeSab.smn[lht|&Gyc`Q|pn]jjqYugd:;<=:=b:W3+bciW{ef"ab_hlpp*KugdUx|bQfnu]qkh6789>TJ?l4U1-dakYugd$yc`Qfnrv,IwijWzzdSd`{_smn4567<VM956[?/fgm[wij&{efSd`|t.OqkhYtxfUbbyQ}ol234535j2_;#jka_smn*wijW`dxx"C}ol]ptjYnf}Uyc`>?017\B7d<]9%licQ}ol,qkhYnfz~$Aab_rrl[lhsW{ef<=>?5^E1f>S7'noeSab.smn[lht|&Gyc`Q|pn]jjqYugd:;<=Qi53a8Q5)`mgUyc` }ol]jjvr(E{efS~~`_hlw[wij89:;Sk;>2e9V4*abfVxda#|`m^kmwq)JzfgT}aPiov\vjk789:Tj8Q?2c9V4*abfVxda#|`m^kmwq)JzfgT}aPiov\vjk789:Tj;?j;T2,c`hXzfg%~bcPioqw+tuwgVcexR>>e:W3+bciW{ef"ab_hlpp*wtxfUbbyQ>1d9V4*abfVxda#|`m^kmwq)v{yeTeczP20g8Q5)`mgUyc` }ol]jjvr(yzzdSd`{_23f?P6(oldT~bc!rno\mkus'xy{cRgat^62a>S7'noeSab.smn[lht|&{x|bQfnu]6e>STM[UJ@DO\c:WPAWYQAZCI@H=4VBA:?SOB_V^R\H?k;YKOMK^*PMH+<#?/SUWA$5(6(HYHED84XRVOMG1<PZ^TKCJm;Y]@KWCXAGLD:6Vkb^Kgb>^c`VZye`Xjrrklj46<PmgTAld`rWgqwlii991Sh`QBiomqR`ttafd?7l&?)59b,4/33h"9%95n(2+7?d.3!=1j$8';;`>3:1=f484?7l2=>59b86833h6?2;5n<483:1=f4<487nbd4:f+4,2<l!;"86j'2(68`-5.<2n#8$:4d)7*2>b;=3:5?95kirv\i`kXoldTz>Q;,!Zjhlh(JEYI-Ijndpbpjt'99$:"==Piq15?avh 9#=7i~`(0+5?avh ;#=7i~`(2+5?avh =#=7i~`(4+;?avh4<0;2:5kpsc+4,1<lyxj$<'8;erqe-4.?2n{~l&<)69gtwg/< =0h}|n(4+:?avui5?1<364eeke6kac<2cToh64nfaaqljc?2{o|b&?)69r`ui/9 =0}i~`(3+4?tbwg!9";6kpn*7-2=vlye#9$94qerl858>3xn{c1;50?58uavhWjo37|jo^aoo==vlyeT~~z6;pfskZuu{}=0}~~`(1+4?tuwg!;";6|pn*1-2=v{ye#?$94qrrl,1/03xy{c%;&7:sptj:76>1z}a31?58uvvh4;4<7|}o=1=3>wtxf6?245~sqm?1?69?2{x|b2:>69rwuiXkl20}~~`_sqw=>wtxfUx~~z9;rrl,5/13zzd$<'9;rrl,7/13zzd$>'9;rrl,1/13zzd$8'7;rrl80<76>1x|o'0(58wutf 8#<7~~}a)0*3>uwzh"8%:5|psc+0,1<{yxj$8'6;rrqe93=8780{hk4wscg`wYk}}Ufi`<n;vpb`atXd|~Tahc#dhqw[hcjWnoeS{=P4-LLJ@*IGGO:ih5xr`fgvZjr|Vgna!jfsu]nahY`mgU}?R:#{b]kevYvlyeToae20-a\lduXkea6=!mPh`q\uavhWjo6<!mPh`q\`86+kVbjR}o<2/gZtbimUfek3>,b]kevYv{ye6=!mPwhfwl80+kVxnkRoPd^kmtprt59&hSeo|_vg>4)eXx`zn`d`j_rvbc`u:8%iTdl}Pqerl[wus59&hSkh_erqeZoix|~6<!mPqtcomcXl7; nQ|yoa\akgedl7: nQkeqvk932+kVbjRjr`?3(fYoizUz}aPssqw95*dWakxS|jo^qqwq;7$jUzohQeohlf`86+kVgnaRzvpd?3(fYoizUbSnk20-a\lduXlye6<!mPmdo\mkosWocgi0y}aefq[issWdof"`gi,b]gacgrd}Uomyo20-a\lduX{yxj1="l_icp[tuwgVin1="l_`fgvZqnl}b6:!mPh`q\uavh59&hSeo|_pqskZtt|4:'q?84wscg`wYk}}Ufi`Qkirv\i`kXoldTz>Q;_yqw[4{GHy;896NOx0;9B?2=9rY:h7o=:58277bdim0:ho9;{o5`>4=i?m0?7)9n:648yV7e2h8187?<2eab`?7cj>>0_?75a583>455ljko6<jm759P5g<f<3:1=><kc`f95ad0=2no<7>51;3xW4b=i;0?6<==dbcg>4be?=1}X8<50;395?43sZ;o6l<54;306aefl3;on::4$6796d=Q?k09wx<i:09v75<73t.?h7o4be294?b=;3lpD:=4Z0596~b=9:0v(8=5d19'3<<>;2c3?7>5$5d9<<=i<l0;76g72;29 1`=001e8h4>;:k;5?6=,=l1445a4d81?>o?83:1(9h5889m0`<432c<j7>5$5d9<<=i<l0?76g8e;29 1`=001e8h4:;:k;f?6=3fh=6=4+4g8ag>h3m3:07bl::18'0c<ek2d?i7?4;n`7>5<#<o0io6`;e;08?jd4290/8k4mc:l7a?5<3fh96=4+4g8ag>h3m3>07bl>:18'0c<ek2d?i7;4;c57>5<6290;wE9<;%70>22<g=i1<75rb3194?7=83:pD:=4$41966=h:;0;66sm1783>6g=9k09>vF83:X23?77s8;1==4k:d827?`=9=0:>7?;:03956<6:3n1i7??:g8~ 05=l:1/=l4k1:&2g?b53->369l4o8;94?"3n33j7c:j:198k<>=83.?j77n;o6f>4=<g0=1<7*;f;;b?k2b2;10c4850;&7b??f3g>n6>54o8794?"3n33j7c:j:598k<2=83.?j77n;o6f>0=<ajn1<7*;f;af?k2b2910enm50;&7b?eb3g>n6<54ib`94?"3n3in7c:j:398mfg=83.?j7mj;o6f>6=<aj31<7*;f;af?k2b2=10en650;&7b?eb3g>n6854ib294?=njo0;66g73;29 1`=001e8h4?;:k;6?6=,=l1445a4d82?>o?93:1(9h5889m0`<532c3<7>5$5d9<<=i<l0876g8f;29 1`=001e8h4;;:k4a?6=,=l1445a4d86?>o>93:1(9h5939m0`<732c2<7>5$5d9=7=i<l0:76g7f;29 1`=1;1e8h4=;:k;a?6=,=l15?5a4d80?>o?l3:1(9h5939m0`<332c3o7>5$5d9=7=i<l0>76gm0;29?l>e2900co850;&7b?dd3g>n6=54oc794?"3n3hh7c:j:098kg2=83.?j7ll;o6f>7=<gk91<7*;f;``?k2b2:10co<50;&7b?dd3g>n6954oc394?"3n3hh7c:j:498mdc=831bmi4?::kbb?6=3`k;6=4+4g8b5>h3m3:07d7i:18'0c<f92d?i7?4;h;f>5<#<o0j=6`;e;08?l?c290/8k4n1:l7a?5<3`3h6=4+4g8b5>h3m3>07d7m:18'0c<f92d?i7;4;na5>5<#<o0h;6`;e;28?je2290/8k4l7:l7a?7<3fi?6=4+4g8`3>h3m3807bm<:18'0c<d?2d?i7=4;na1>5<#<o0h;6`;e;68?je6290/8k4l7:l7a?3<3`im6=44i`194?=hih0;6):i:`a8j1c=821dm44?:%6e>de<f=o1=65`a983>!2a2hi0b9k52:9le2<72->m6lm4n5g97>=hi?0;6):i:`a8j1c=<21dm84?:%6e>de<f=o1965fbd83>>d003:1=7>50z&67?443A=<7E9<;n01>5<<uk<h6=4<:183!342;:0D:94H618 7>=92c:47>5;h3f>5<<g<:1<75rb7f94?5=83:p(8=5219K32=O?:1/>54>;h3;>5<<a8o1<75`5183>>{e>l0;6>4?:1y'16<582B<;6F83:&1<?7<a821<75f1d83>>i283:17pl80;297?6=8r.>?7<?;I54?M143-836<5f1983>>o6m3:17b;?:188yg1629086=4?{%70>76<@>=0D:=4$3:95>o603:17d?j:188k06=831vn8;50;794?6|,<91>n5G769K36=#:10h7d<;:188m73=831b>;4?::k13?6=3f>j6=44}c4;>5<3290;w);<:3f8L21<@>90e?:50;9j60<722c>=7>5;n6b>5<<uk?26=4::183!342;i0D:94H618 7>=9<1b>94?::k11?6=3`8=6=44i3594?=h<h0;66sm5e83>1<729q/9>4=b:J43>N0;2.947?i;h07>5<<a;?1<75f2783>>i3i3:17pl9a;290?6=8r.>?7<k;I54?M143`8?6=44i3794?=n=80;66a;a;29?xd1j3:187>50z&67?4b3A=<7E9<;h07>5<<a;?1<75f5083>>i3i3:17pl9f;290?6=8r.>?7<>;I54?M143-836<5f1983>>o6m3:17d;>:188k06=831vn8o50;694?6|,<91>i5G769K36=n:=0;66g=5;29?l362900c9o50;9~f0d=83?1<7>t$4196f=O?>1C;>5+2984?l432900e?;50;9j63<722c9;7>5;n6b>5<<uk?h6=4::183!342;i0D:94H618 7>=02c987>5;h06>5<<a;<1<75f2683>>i3i3:17pl95;290?6=8r.>?7<k;I54?M143`8?6=44i3794?=n=80;66a;a;29?xd1>3:197>50z&67?4d3A=<7E9<;%0;>3=n:=0;66g=5;29?l412900e?950;9l0d<722wi::4?:483>5}#=:09o6F87:J47>"50320e?:50;9j60<722c9:7>5;h04>5<<g=k1<75rb7094?2=83:p(8=52e9K32=O?:1b>94?::k11?6=3`?:6=44o5c94?=zj?91<7:50;2x 05=:k1C;:5G729'6=<>3`8?6=44i3794?=n:?0;66a;a;29?xd1<3:197>50z&67?4d3A=<7E9<;%0;>7=n:=0;66g=5;29?l412900e?950;9l0d<722wi9;4?:583>5}#=:09h6F87:J47>o5<3:17d<::188m07=831d8l4?::a12<72<0;6=u+5281g>N0?2B<?6*=8;`8m72=831b>84?::k12?6=3`8<6=44o5c94?=zj<21<7;50;2x 05=:j1C;:5G729'6=<43`8?6=44i3794?=n:?0;66g=7;29?j2f2900qo8?:186>5<7s-?86?m4H658L25<,;2196g=4;29?l422900e?850;9j62<722e?m7>5;|`55?6=<3:1<v*:3;0g?M103A=87d<;:188m73=831b9<4?::m7e?6=3ty3n7>57z\;f>;1k3;3708k:0:893c=9116;=4>8:?45?7?34<m6<64}rca>5<6=rTh:6Pl5:\`0>Xd;2Th>6Pl1:\:=>X>02T2;6P66:\:1>X><2Tjm6Pn9:\b<>Xf?2Tj:6Pn5:?4<?4534<36?;4=73960=z{kn1<7<t^c48927==91vol50;0xZg3<5>:19=5rscc94?4|Vk>01;h5519~wg?=838pRo=4=7g915=z{k21<7<t^c0893b==91vo950;0xZg7<5?i19=5rs9c94?d|V1901;l5509>1g<5<27>o7<;;<45>72<5?=1>95262811>;1<38=70;8:36890>=:?16:<4:1:p<=<72jqU4?5269865>;1i3?:70;m:34890e=:?16:;4=7:?53?4134<86?:4=76960=:=>09:63:8;06?8072;>0q~68:18`[>634?>6?:4=4;961=:=m09863:b;04?83d2;?01;85249>22<5=27=87<8;<74>71<5<21>:5261813>{t0?0;6luQ819>10<5>27>57<9;<7g>73<5<h1>8525b813>;1=3?:708=:438900==816:=4=6:p<0<72kqU;k5254813>;2138<70;n:438930=:?16::4=7:?57?4134<?6?:4=45960=:=10986390;06?xu?<3:18vP8e:?61?4234?26?;4=4f963=z{?h1<7<t=7a95`=:>k0?m6s|5783>7}:>m0:i63:6;6b?xu2i3:1>v39e;3f?83f2=k0q~8=:18081728o01;h5509>27<3i2wx:84?:3y>34<6m27=97:n;|q60?6=:r7>97:n;<4;>72<uz<36=4={<4;>1g<5?h1>85rs4794?4|5<318l526`811>{t=00;6?u25e87e>;1i38?7p}99;296~;1i3>j708m:368yv3b2909w08i:0g8937=<h1v9>50;0x90g=:=169o4;a:p04<72;q69l4=5:?6g?2f3ty?>7>52z?51?4334<=69o4}r60>5<5s4<>6?;4=7590d=z{=>1<7<t=70961=:>:0?m6s|4483>7}:>;0996394;6b?xu3>3:1>v3:6;07?8302=k0q~:8:1818312;?018654`9~w0`=838p1;>54`9>24<5<2wv>?50;3;8442;801<85909>53<>827::76i;<35>=c<58<14i52178;g>;6>3k;70?9:8d8940=1l16=;46d:?22??d34;=64l4=049ga=:9?0ho63>6;aa?8712jk01<85c89>53<d027::7oj;<35>g`<58<1mk52178`4>;6>3h;7p}<2;291~;0<3>h70?9:bd8940=i:16=;4me:?22?gc3ty3m7>52z\;7>;6>3287)9=:218yv>?2909wS6=;<35>=4<,>81?95rs9594?4|V1;01<85809'37<4=2wx4;4?:3y]<5=:9?03<6*82;15?xu?=3:1>vP8f:?22?1a3-=96>94}r:7>5<5sW=n70?9:6g8 24=;11v5l50;0xZ=d<58<14o5+7380=>{tjm0;6?uQb79>53<e>2.<>7=n;|qaf?6=:rTi963>6;`6?!152:h0q~ln:181[d334;=6o:4$6097f=z{k31<7<t^c18940=j:1/;?4<d:pf=<72;qUn?52178a6>"0:39n7p}m7;296~Xe927::7l>;%51>6`<utd:<?4?:0yK36=zf8:86=4>{I50?xh68=0;6?uG729~j4622909wE9<;|l243<72;qC;>5rn024>5<5sA=87p`>0983>7}O?:1vb<>6:181M143td:<l4?:3yK36=zf8:i6=4={I50?xh68j0;6?uG729~j46c2909wE9<;|l24`<72;qC;>5rn02e>5<5sA=87p`>1183>7}O?:1vbh?50;3xL25<ugon6=4>{I50?xhbn3:1=vF83:mb5<728qC;>5rng394?7|@>90qch=:182M143tdm?7>51zJ47>{in=0;6<uG729~jc3=83;pD:=4}od5>5<6sA=87p`i7;295~N0;2wej54?:0yK36=zfo31<7?tH618yk`f290:wE9<;|lef?6=9rB<?6safb83>4}O?:1vbkj50;3xL25<ugln6=4>{I50?xhan3:1=vF83:m556=83;pD:=4}o335?6=9rB<?6sr}|BCG~74=3oho4>>cgCDG}7uIJ[wpNO
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/IPv4_PACKET_RECEIVER.vhd
0,0 → 1,182
-----------------------------------------------------------------------------------------
-- Copyright (C) 2010 Nikolaos Ch. Alachiotis --
-- --
-- Engineer: Nikolaos Ch. Alachiotis --
-- --
-- Contact: alachiot@cs.tum.edu --
-- n.alachiotis@gmail.com --
-- --
-- Create Date: 14:32:06 02/07/2010 --
-- Module Name: IPv4_PACKET_RECEIVER --
-- Target Devices: Virtex 5 FPGAs --
-- Tool versions: ISE 10.1 --
-- Description: This component can be used to receive IPv4 Ethernet Packets. --
-- Additional Comments: --
-- --
-- The receiver does not operate properly for data section of 1 or 2 bytes only. --
-- --
-----------------------------------------------------------------------------------------
 
 
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity IPv4_PACKET_RECEIVER is
Port ( rst : in STD_LOGIC;
clk_125Mhz : in STD_LOGIC;
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
input_bus : in STD_LOGIC_VECTOR(7 downto 0);
valid_out_usr_data : out STD_LOGIC;
usr_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0));
end IPv4_PACKET_RECEIVER;
 
architecture Behavioral of IPv4_PACKET_RECEIVER is
 
component PACKET_RECEIVER_FSM is
Port (
rst : in STD_LOGIC;
clk : in STD_LOGIC;
-- Signals from EMAC
rx_sof: in STD_LOGIC; -- active low input
rx_eof: in STD_LOGIC; -- active low input
-- Signals to Counter and Comparator
sel_comp_Bval: out STD_LOGIC;
comp_Bval: out STD_LOGIC_VECTOR(10 downto 0);
rst_count : out STD_LOGIC;
en_count : out STD_LOGIC;
-- Signal from Comparator
comp_eq: in STD_LOGIC;
-- Signals to Length Register
wren_MSbyte: out STD_LOGIC;
wren_LSbyte: out STD_LOGIC;
-- Signal to user interface
valid_out_usr_data : out STD_LOGIC);
end component;
 
component REG_8b_wren is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
wren : in STD_LOGIC;
input_val : in STD_LOGIC_VECTOR (7 downto 0);
output_val : inout STD_LOGIC_VECTOR(7 downto 0));
end component;
 
component COUNTER_11B_EN_RECEIV is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
count_en : in STD_LOGIC;
value_O : inout STD_LOGIC_VECTOR (10 downto 0));
end component;
 
component comp_11b_equal is
port (
qa_eq_b : out STD_LOGIC;
clk : in STD_LOGIC := 'X';
a : in STD_LOGIC_VECTOR ( 10 downto 0 );
b : in STD_LOGIC_VECTOR ( 10 downto 0 )
);
end component;
 
signal sel_comp_Bval,
rst_count,
en_count,
comp_eq,
wren_MSbyte,
wren_LSbyte: STD_LOGIC;
signal MSbyte_reg_val_out,
LSbyte_reg_val_out : STD_LOGIC_VECTOR(7 downto 0);
signal counter_val,
match_val,
comp_Bval,
comp_sel_val_vec,
comp_n_sel_val_vec,
length_val: STD_LOGIC_VECTOR(10 downto 0);
 
constant length_offest : STD_LOGIC_VECTOR(7 downto 0):="00001010";
-- This value is formed as 2 (1 clock the latency of comparator and 1 clock fro changing the FSM state) + 8 (number of bytes of UDP header section)
 
begin
 
usr_data_output_bus<=input_bus;
 
PACKET_RECEIVER_FSM_port_map: PACKET_RECEIVER_FSM Port Map
(
rst => rst,
clk => clk_125MHz,
 
rx_sof => rx_sof,
rx_eof => rx_eof,
sel_comp_Bval => sel_comp_Bval,
comp_Bval => comp_Bval,
rst_count => rst_count,
en_count => en_count,
comp_eq => comp_eq,
 
wren_MSbyte => wren_MSbyte,
wren_LSbyte => wren_LSbyte,
 
valid_out_usr_data => valid_out_usr_data
);
 
MSbyte_REG: REG_8b_wren Port Map
(
rst => rst,
clk => clk_125MHz,
wren => wren_MSbyte,
input_val => input_bus,
output_val =>MSbyte_reg_val_out
);
 
LSbyte_REG: REG_8b_wren Port Map
(
rst => rst,
clk => clk_125MHz,
wren => wren_LSbyte,
input_val => input_bus,
output_val =>LSbyte_reg_val_out
);
COUNTER_11B_EN_port_map: COUNTER_11B_EN_RECEIV Port Map
(
rst => rst_count,
clk => clk_125MHz,
count_en => en_count,
value_O => counter_val
);
 
Comp_11b_equal_port_map: Comp_11b_equal Port Map
(
qa_eq_b => comp_eq,
clk => clk_125MHz,
a => counter_val,
b => match_val
);
length_val(7 downto 0)<= LSbyte_reg_val_out-length_offest;
length_val(10 downto 8)<= MSbyte_reg_val_out (2 downto 0);
comp_sel_val_vec<=(others=> sel_comp_Bval);
comp_n_sel_val_vec<= (others=> not sel_comp_Bval);
 
match_val<= (comp_sel_val_vec and length_val) or (comp_n_sel_val_vec and comp_Bval);
 
end Behavioral;
 
/pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Spartan3/FLEX_CONTROL.vhd
0,0 → 1,138
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 15:06:05 01/12/2011
-- Design Name:
-- Module Name: FLEX_CONTROL - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity FLEX_CONTROL is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
r_sof : in STD_LOGIC;
r_usrvld : in STD_LOGIC;
r_data : in STD_LOGIC_VECTOR (7 downto 0);
r_usrdata: in STD_LOGIC_VECTOR (7 downto 0);
r_eof : in STD_LOGIC;
l_wren : out STD_LOGIC;
l_addr : out STD_LOGIC_VECTOR (5 downto 0);
l_data : out STD_LOGIC_VECTOR (7 downto 0);
checksum_baseval : out STD_LOGIC_VECTOR(15 downto 0);
locked : out STD_LOGIC
);
end FLEX_CONTROL;
 
architecture Behavioral of FLEX_CONTROL is
 
component MATCH_CMD_CODE is
Port ( clk : in STD_LOGIC;
vld : in STD_LOGIC;
data_in : in STD_LOGIC_VECTOR(7 downto 0);
eof : in STD_LOGIC;
cmd_code : in STD_LOGIC_VECTOR (7 downto 0);
sig_out : out STD_LOGIC);
end component;
 
component MATCH_CMD is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
sof : in STD_LOGIC;
vld_i : in STD_LOGIC;
val_i : in STD_LOGIC_VECTOR (7 downto 0);
cmd_to_match : in STD_LOGIC_VECTOR(7 downto 0);
cmd_match : out STD_LOGIC);
end component;
 
signal config_en, ulock_en, wren_checksum_1, wren_checksum_2,local_rst: std_logic;
 
component CONFIG_CONTROL is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
config_en : in STD_LOGIC;
nxt_sof : in STD_LOGIC;
wren : out STD_LOGIC;
addr : out STD_LOGIC_VECTOR (5 downto 0);
ulock_en : in STD_LOGIC;
wren_checksum_1 : out STD_LOGIC;
wren_checksum_2 : out STD_LOGIC;
locked : out STD_LOGIC
);
end component;
 
signal checksum_baseval_t: std_logic_vector(15 downto 0);
 
begin
 
MATCH_RST_CODE: MATCH_CMD Port Map
( rst => rst,
clk => clk,
sof => r_sof,
vld_i => r_usrvld,
val_i => r_usrdata,
cmd_to_match => "00001111",
cmd_match => config_en
);
 
ulock_en <= '0';
 
CONFIG_CONTROL_FSM: CONFIG_CONTROL Port Map
( rst => rst,
clk => clk,
config_en => config_en,
nxt_sof => r_sof,
wren => l_wren,
addr => l_addr,
ulock_en => ulock_en,
wren_checksum_1 => wren_checksum_1,
wren_checksum_2 => wren_checksum_2,
locked => locked
);
 
process(clk)
begin
if rst = '1' then
checksum_baseval_t <= (others=>'0');
else
if clk'event and clk='1' then
if wren_checksum_1='1' then
checksum_baseval_t(15 downto 8) <= r_data;
end if;
if wren_checksum_2='1' then
checksum_baseval_t(7 downto 0) <= r_data;
end if;
end if;
end if;
end process;
 
checksum_baseval <= checksum_baseval_t;
 
process(clk)
begin
if clk'event and clk='1' then
l_data <= r_data;
end if;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/SOFTWARE/fpga_com.h
0,0 → 1,65
/*
* Copyright (C) 2011 Simon A. Berger
*
* This program is free software; you may redistribute it and/or modify its
* under the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program 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 General Public License
* for more details.
*/
 
#include <arpa/inet.h>
#include <stdint.h>
 
#ifdef __cplusplus
extern "C" {
#endif
const static int FPC_CODE_CHAR = 1;
const static int FPC_CODE_SHORT = 2;
const static int FPC_CODE_INT = 3;
const static int FPC_CODE_LONG = 5;
const static int FPC_CODE_FLOAT = 4;
const static int FPC_CODE_DOUBLE = 6;
 
typedef struct {
/* local and remote socket addresses */
struct sockaddr_in l_sockaddr;
struct sockaddr_in d_sockaddr;
/* my socket */
int s;
size_t mtu;
} fpga_con_t;
 
 
void fpga_con_init( fpga_con_t *con, const void *daddr, int lport, int dport );
ssize_t fpga_con_send( fpga_con_t *con, const void *buf, size_t len );
void fpga_con_send_init_packet( fpga_con_t *con );
ssize_t fpga_con_block_recv( fpga_con_t *con, void *dbuf, size_t dsize );
 
 
 
int fpga_con_send_charv( fpga_con_t *con, char *buf, size_t n );
int fpga_con_send_shortv( fpga_con_t *con, int16_t *buf, size_t n );
int fpga_con_send_intv( fpga_con_t *con, int32_t *buf, size_t n );
int fpga_con_send_longv( fpga_con_t *con, int64_t *buf, size_t n );
int fpga_con_send_floatv( fpga_con_t *con, float *buf, size_t n );
int fpga_con_send_doublev( fpga_con_t *con, double *buf, size_t n );
 
 
void fpga_con_rpack_char( fpga_con_t *con, int size );
void fpga_con_rpack_short( fpga_con_t *con, int size );
void fpga_con_rpack_int( fpga_con_t *con, int size );
void fpga_con_rpack_long( fpga_con_t *con, int size );
void fpga_con_rpack_float( fpga_con_t *con, int size );
void fpga_con_rpack_double( fpga_con_t *con, int size );
 
#ifdef __cplusplus
}
#endif
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/SOFTWARE/background_reader.cpp
0,0 → 1,551
/*
* Copyright (C) 2011 Simon A. Berger
*
* This program is free software; you may redistribute it and/or modify its
* under the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program 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 General Public License
* for more details.
*/
 
#include <cstdio>
#include <csignal>
#include <sys/socket.h>
#include <boost/thread/locks.hpp>
#include <endian.h>
 
#include "background_reader.h"
#include "fpga_com.h"
 
static void handler( int signal ) {
//printf( "signal: %d\n", signal );
}
 
background_reader::background_reader(int s, size_t size)
: m_stop(false),
m_socket(s),
m_max_size(size),
m_pq_mem(0),
m_pq_max_mem(0),
m_pq_max_depth(0),
N_THREADS(1),
m_run_barrier(N_THREADS + 1),
m_threads_joined(false)
//m_native_handle(0)
{
 
}
 
background_reader::~background_reader()
{
if( !m_threads_joined ) {
printf( "WARNING: background_reader::~background_reader(): threads not joined!\n" );
}
}
 
 
void background_reader::start() {
/// m_thread.reset( new boost::thread( boost::bind(&background_reader::run, this)));
printf( "starting %zd background reader threads\n", N_THREADS );
//boost::barrier run_barrier( N_THREADS + 1 );
while( m_thread_group.size() < N_THREADS ) {
m_thread_group.create_thread(boost::bind(&background_reader::run, this ));
}
m_run_barrier.wait();
}
 
void background_reader::run()
{
// BIG-UGLY-KLUDGE-WARNING!
// we have to install a signal handler, in order to disable the auto-restart behaviour of the recv call...
// This is necessary to make the recv call interuptable (= return -1 on interrupt). Otherwise the
// bg threads would either wait forever, or we would need at least two syscalls per recv (any solution that involves select).
//
// the 'handler' does nothing, as we are only interested in interrupting the recv...
 
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
 
sigaction( SIGUSR1, &sa, 0 );
 
//m_native_handle = pthread_self();
{
lock_guard_t lock( m_nh_mtx );
m_native_handles.push_back( pthread_self() );
}
const size_t MTU = 64 * 1024;
 
std::vector<char>bufs(MTU);
char *buf = bufs.data();
 
//run_barrier->wait();
//run_barrier = 0;
m_run_barrier.wait();
while ( !m_stop ) {
ssize_t s = recv( m_socket, buf, MTU, 0 );
// if( s < 1024 && s != -1 ) {
// printf( "recved term packet %p\n", (void*)pthread_self() );
// }
//printf( "recv: %zd\n", s );
if ( s == -1 && errno == EINTR ) {
printf( "interrupted\n" );
} else {
lock_guard_t lock( m_pq_mtx );
m_pq.push_back(std::string(buf, buf+s));
m_pq_mem += s;
m_pq_max_mem = std::max( m_pq_mem, m_pq_max_mem );
m_pq_max_depth = std::max( m_pq.size(), m_pq_max_depth );
}
// printf( "notify\n" );
m_can_read_condition.notify_one();
}
printf( "background reader thread exit\n" );
}
 
ssize_t background_reader::block_recv(void* buf, size_t size)
{
boost::unique_lock<mutex_t> lock( m_pq_mtx );
 
while ( ! m_pq.size() > 0 && !m_stop ) {
// printf( "cond_wait\n" );
m_can_read_condition.wait(lock);
}
 
if( m_pq.size() == 0 ) {
return -1;
}
std::string &pbuf = m_pq.front();
 
m_pq_mem -= pbuf.size();
ssize_t s = std::min( size, pbuf.size() );
std::copy( pbuf.begin(), pbuf.end(), (char *)buf );
m_pq.pop_front();
 
return s;
}
 
 
ssize_t background_reader::poll()
{
lock_guard_t lock( m_pq_mtx );
if( m_pq.size() > 0 ) {
return m_pq.front().size();
} else {
return -1;
}
}
 
 
void background_reader::interrupt() {
//boost::thread::native_handle_type h = m_thread->native_handle();
// pthread_kill( m_native_handle, SIGUSR1 );
lock_guard_t lock( m_nh_mtx );
for( std::vector<pthread_t>::iterator it = m_native_handles.begin(); it != m_native_handles.end(); ++it ) {
pthread_kill( *it, SIGUSR1 );
}
}
 
void background_reader::join() {
// m_thread->join();
m_thread_group.join_all();
 
printf( "pq max size (bytes): %zd\n", m_pq_max_mem );
printf( "pq max depth (#packets): %zd\n", m_pq_max_depth );
m_threads_joined = true;
}
 
ssize_t background_reader::purge()
{
lock_guard_t lock( m_pq_mtx );
ssize_t s = m_pq.size();
m_pq.clear();
 
return s;
}
 
 
 
// int mainx() {
// fpga_con_t fc;
//
// fpga_con_init( &fc, "131.159.28.113", 12340, 12350 );
//
//
//
// background_reader bgr( fc.s, 1024 * 1024 * 10 );
//
// bgr.start();
//
// char buf[1024];
// memset( buf, 0, 1024 );
//
//
// const size_t rbuf_size = 10 * 1024;
// char rbuf[rbuf_size];
//
// printf( "sleep\n" );
// // usleep( 2000000 );
// printf( "close\n" );
// //close( fc.s );
//
// //bgr.stop();
// //bgr.interrupt();
// //getchar();
//
// // bgr.join();
//
// printf( "joined\n" );
// size_t n = 0;
// for ( int i = 0; i < 10; i++ ) {
// fpga_con_send( &fc, buf, 1024 );
// printf( "sent\n" );
//
//
//
// while (true) {
// size_t s = bgr.block_recv( rbuf, rbuf_size );
// n++;
// // printf( "recv: %zd\n", s );
// if ( s < 1024 ) {
// break;
// }
// }
//
// printf( "recved: %zd\n", n );
// }
//
// bgr.stop();
// bgr.interrupt();
// bgr.join();
// printf( "bg reader joined. exit.\n" );
// }
 
 
 
static inline background_reader &get_bgr( fpga_bgr_t *cbgr ) {
assert( cbgr != 0 );
assert( cbgr->bgr_cpp != 0 );
return *(static_cast<background_reader*>(cbgr->bgr_cpp));
}
 
void fpga_bgr_init( fpga_bgr_t *cbgr, int socket, size_t size ) {
memset( cbgr, 0, sizeof( fpga_bgr_t ));
background_reader *bgr = new background_reader(socket, size);
cbgr->bgr_cpp = bgr;
}
 
void fpga_bgr_delete( fpga_bgr_t *cbgr ) {
 
background_reader *bgr = static_cast<background_reader*>(cbgr->bgr_cpp);
delete bgr;
}
 
void fpga_bgr_start( fpga_bgr_t *cbgr) {
background_reader &bgr = get_bgr(cbgr);
bgr.start();
}
ssize_t fpga_bgr_block_recv( fpga_bgr_t *cbgr, void *buf, size_t size ) {
background_reader &bgr = get_bgr(cbgr);
return bgr.block_recv(buf, size);
}
ssize_t fpga_bgr_poll( fpga_bgr_t *cbgr ) {
background_reader &bgr = get_bgr(cbgr);
return bgr.poll();
}
void fpga_bgr_stop_interrupt_join( fpga_bgr_t *cbgr) {
background_reader &bgr = get_bgr(cbgr);
bgr.stop();
bgr.interrupt();
bgr.join();
}
 
 
// template <typename T>
// inline static T swap_endian( T &v ) {
//
// T vo = v;
// uint8_t *vb = (uint8_t*) &vo;
//
// for( size_t i = 0; i < sizeof(T) / 2; i++ ) {
// std::swap(vb[i], vb[sizeof(T) - i - 1]);
//
// }
// return vo;
// }
 
 
template<typename T,size_t N>
struct swap_endian {
inline T operator()( T &v ) {
T vo = v;
uint8_t *vb = (uint8_t*) &vo;
for( size_t i = 0; i < sizeof(T) / 2; i++ ) {
std::swap(vb[i], vb[sizeof(T) - i - 1]);
}
return vo;
}
};
 
 
template<typename T>
struct swap_endian<T,2> {
inline T operator()( T &v ) {
uint16_t t = __bswap_16(*((uint16_t*)&v));
T* r = (T*)&t; // we don't want to dereference a type-punned pointer, do we?
return *r;
}
};
 
 
template<typename T>
struct swap_endian<T,4> {
inline T operator()( T &v ) {
uint32_t t = __bswap_32(*((uint32_t*)&v));
T* r = (T*)&t;
return *r;
}
};
 
template<typename T>
struct swap_endian<T,8> {
inline T operator()( T &v ) {
uint64_t t = __bswap_64(*((uint64_t*)&v));
T* r = (T*)&t;
return *r;
}
};
 
 
 
 
 
template<typename T>
struct swappy_au {
const static size_t N = sizeof(T);
swap_endian<T,N> swap;
inline void operator()( void * dest, void * src, size_t n ) {
std::copy( (char *)src, ((char *)src) + n * N, (char *)dest );
//std::memcpy( dest, src, n * N );
T * ptr = (T *)dest;
T * end = ptr + n;
// do the endian swapping in place in the aligned buffer
while( ptr < end ) {
*ptr = swap( *ptr );
ptr++;
}
}
 
};
 
template<typename T>
struct swappy_aa {
const static size_t N = sizeof(T);
swap_endian<T,N> swap;
inline void operator()( void * dest, void * src, size_t n ) {
T * sptr = (T *)src;
T * ptr = (T *)dest;
T * end = ptr + n;
// copy and swap on the fly, assuming that both buffers are aligned
while( ptr < end ) {
*ptr = swap( *sptr );
ptr++;
sptr++;
}
}
 
};
 
 
template<typename T>
struct xerox_plain {
const static size_t N = sizeof(T);
inline void operator()( void * dest, void * src, size_t n ) {
std::copy( (char*)src, ((char*)src) + n * N, (char*)dest ); // using char* here to prevent std;:copy form making any assumptions about th alignment of src/dest
//std::copy( (T*)src, ((T*)src) + n, (T*)dest );
}
};
 
 
// template <typename T>
// inline T passthrough( T &v ) {
//
// return v;
// }
//
 
template <typename T,class CopyF>
static bool fpga_bgr_recv_genv( fpga_bgr_t *cbgr, T *buf, size_t n, char ht ) {
background_reader &bgr = get_bgr(cbgr);
T *buf_end = buf + n;
T *ptr = buf;
const size_t MPU = 9000;
uint8_t rbuf[MPU];
CopyF xerox;
while( ptr < buf_end ) {
ssize_t raw_size = bgr.block_recv(rbuf, MPU);
// printf( "ptr: %p %zd %d %d %d %d\n", ptr, size, rbuf[0], rbuf[1], rbuf[2], rbuf[3] );
assert( raw_size > 1 );
if( rbuf[0] != ht ) {
printf( "drop wrong packet type: %d %d\n", rbuf[0], ht );
}
ssize_t size = raw_size - 1;
uint8_t *rptr = rbuf + 1;
ssize_t ne = size / sizeof(T);
ssize_t left = buf_end - buf;
ssize_t to_copy = std::min( ne, left );
xerox( ptr, rptr, to_copy );
ptr += to_copy;
}
return true;
}
 
int fpga_bgr_recv_charv( fpga_bgr_t *bgr, char *buf, size_t n ) {
return fpga_bgr_recv_genv<char,xerox_plain<char> >( bgr, buf, n, FPC_CODE_CHAR );
}
 
int fpga_bgr_recv_shortv( fpga_bgr_t *bgr, int16_t *buf, size_t n ) {
return fpga_bgr_recv_genv<int16_t,swappy_au<int16_t> >( bgr, buf, n, FPC_CODE_SHORT );
}
int fpga_bgr_recv_intv( fpga_bgr_t *bgr, int32_t *buf, size_t n ) {
return fpga_bgr_recv_genv<int32_t,swappy_au<int32_t> >( bgr, buf, n, FPC_CODE_INT );
}
 
int fpga_bgr_recv_longv( fpga_bgr_t *bgr, int64_t *buf, size_t n ) {
return fpga_bgr_recv_genv<int64_t,swappy_au<int64_t> >( bgr, buf, n, FPC_CODE_LONG );
}
 
int fpga_bgr_recv_floatv( fpga_bgr_t *bgr, float *buf, size_t n ) {
return fpga_bgr_recv_genv<float,swappy_au<float> >( bgr, buf, n, FPC_CODE_FLOAT );
}
 
int fpga_bgr_recv_doublev( fpga_bgr_t *bgr, double *buf, size_t n ) {
//return fpga_bgr_recv_genv<double,xerox_plain<double,8> >( bgr, buf, n );
return fpga_bgr_recv_genv<double,swappy_au<double> >( bgr, buf, n, FPC_CODE_DOUBLE );
}
 
#if 0
 
 
int main() {
fpga_con_t fc;
 
fpga_con_init( &fc, "131.159.28.113", 12340, 12350 );
 
fpga_bgr_t bgr;
 
fpga_bgr_init( &bgr, fc.s, 1024 * 1024 * 10 );
fpga_bgr_start( &bgr );
char buf[1024];
memset( buf, 0, 1024 );
int ibuf[1000];
std::fill( ibuf, ibuf + 1000, 666 );
const size_t rbuf_size = 10 * 1024;
char rbuf[rbuf_size];
 
// printf( "sleep\n" );
// usleep( 2000000 );
// printf( "close\n" );
//close( fc.s );
 
//bgr.stop();
//bgr.interrupt();
//getchar();
 
// bgr.join();
 
// printf( "joined\n" );
size_t n = 0;
for ( int i = 0; i < 1; i++ ) {
//fpga_con_send( &fc, buf, 1024 );
fpga_con_send_intv( &fc, ibuf, 1000 );
printf( "sent\n" );
 
double iv[1000];
bool succ = fpga_bgr_recv_doublev( &bgr, iv, 1000 );
for( int i = 0; i < 1000; i++ ) {
printf( "%.2f ", iv[i] );
if( i % 20 == 19 ) {
printf( "\n" );
}
}
printf( "\n" );
 
printf( "recved: %d\n", succ );
}
fpga_bgr_stop_interrupt_join( &bgr );
printf( "bg reader joined. exit.\n" );
fpga_bgr_delete( &bgr );
}
#endif
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/SOFTWARE/background_reader.h
0,0 → 1,115
/*
* Copyright (C) 2011 Simon A. Berger
*
* This program is free software; you may redistribute it and/or modify its
* under the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program 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 General Public License
* for more details.
*/
 
 
#ifndef BACKGROUND_READER_H
#define BACKGROUND_READER_H
 
 
#ifdef __cplusplus
 
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/barrier.hpp>
#include <boost/scoped_ptr.hpp>
 
#include <deque>
#include <vector>
 
#include <pthread.h>
#include <stdint.h>
// the all singing, all dancing background reader, written in shiny new c++
 
class background_reader
{
typedef boost::mutex mutex_t;
//typedef boost::unique_lock<mutex_t> unique_lock_t;
typedef boost::lock_guard<mutex_t> lock_guard_t;
boost::condition_variable m_can_read_condition;
boost::mutex m_pq_mtx;
//boost::scoped_ptr<boost::thread> m_thread;
boost::thread_group m_thread_group;
volatile bool m_stop; // FIXME: use atomic var
int m_socket;
size_t m_max_size;
std::deque<std::string> m_pq;
size_t m_pq_mem;
size_t m_pq_max_mem;
size_t m_pq_max_depth;
//pthread_t m_native_handle;
boost::mutex m_nh_mtx;
std::vector<pthread_t> m_native_handles;
const size_t N_THREADS;
boost::barrier m_run_barrier;
bool m_threads_joined;
void run();
public:
background_reader( int s, size_t size );
virtual ~background_reader();
void start();
void interrupt();
void stop() { m_stop = true; __sync_synchronize(); } // try to make sure that the new value of m_stop is visible to all bg threads before interrupt is called.
void join();
ssize_t block_recv( void* buf, size_t size );
ssize_t poll();
ssize_t purge();
 
 
};
#endif
 
// the boring old ansi c interface
 
#ifdef __cplusplus
extern "C" {
#endif
 
typedef struct fpga_bgr_s {
void *bgr_cpp;
} fpga_bgr_t;
 
 
void fpga_bgr_init( fpga_bgr_t *bgr, int socket, size_t size );
void fpga_bgr_delete( fpga_bgr_t *bgr );
 
void fpga_bgr_start( fpga_bgr_t *bgr);
ssize_t fpga_bgr_block_recv( fpga_bgr_t *bgr, void *buf, size_t size );
ssize_t fpga_bgr_poll();
void fpga_bgr_stop_interrupt_join( fpga_bgr_t *bgr);
 
// high level functions
int fpga_bgr_recv_charv( fpga_bgr_t *bgr, char *buf, size_t n );
int fpga_bgr_recv_shortv( fpga_bgr_t *bgr, int16_t *buf, size_t n );
int fpga_bgr_recv_intv( fpga_bgr_t *bgr, int32_t *buf, size_t n );
int fpga_bgr_recv_longv( fpga_bgr_t *bgr, int64_t *buf, size_t n );
int fpga_bgr_recv_floatv( fpga_bgr_t *bgr, float *buf, size_t n );
int fpga_bgr_recv_doublev( fpga_bgr_t *bgr, double *buf, size_t n );
 
#ifdef __cplusplus
}
#endif
 
 
 
#endif // BACKGROUND_READER_H
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/SOFTWARE/build.sh
0,0 → 1,2
gcc -std=c99 -Wall -O2 -c fpga_com.c
g++ -Wall -O2 -o testcase1 testcase1.cpp background_reader.cpp fpga_com.o -lboost_thread
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/SOFTWARE/fpga_com.c
0,0 → 1,370
/*
* Copyright (C) 2011 Simon A. Berger
*
* This program is free software; you may redistribute it and/or modify its
* under the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program 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 General Public License
* for more details.
*/
 
 
#include <stdio.h>
 
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
 
#include "fpga_com.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
const size_t MAX_MTU = 64 * 1024;
 
static void die_perror( const char *call ) {
perror( call );
exit(-1);
}
 
 
void fpga_con_init( fpga_con_t *con, const void *daddr, int lport, int dport ) {
 
/*set up local socket address*/
memset( &con->l_sockaddr, 0, sizeof( con->l_sockaddr ));
con->l_sockaddr.sin_family = AF_INET;
con->l_sockaddr.sin_addr.s_addr = INADDR_ANY;
con->l_sockaddr.sin_port = htons(lport);
/*setup dest socket address*/
memset( &con->d_sockaddr, 0, sizeof( con->d_sockaddr ));
con->d_sockaddr.sin_family = AF_INET;
con->d_sockaddr.sin_addr.s_addr = inet_addr( daddr );
con->d_sockaddr.sin_port = htons(dport);
/* create my socket*/
con->s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if( con->s < 0 ) {
die_perror( "socket" );
}
/* bind it to local socket*/
int r = bind( con->s, (struct sockaddr *)&con->l_sockaddr, sizeof(con->l_sockaddr));
if( r < 0 ) {
die_perror( "bind" );
}
con->mtu = 1500;
}
 
size_t fpga_con_get_mtu( fpga_con_t *con ) {
return con->mtu;
}
 
void fpga_con_set_mtu( fpga_con_t *con, size_t mtu ) {
if( mtu > MAX_MTU ) {
printf( "fpga_con_set_mtu: mtu > MAX_MTU\n" );
exit(-1);
}
con->mtu = mtu;
}
 
 
ssize_t fpga_con_send( fpga_con_t *con, const void *buf, size_t len ) {
ssize_t rsend = sendto( con->s, buf, len, 0, (struct sockaddr*)&con->d_sockaddr, sizeof(con->d_sockaddr));
if( rsend < 0 ) {
die_perror( "sendto" );
}
return rsend;
}
 
 
/* send lut initialization packet sequence: rst, conf, empty*/
void fpga_con_send_init_packet( fpga_con_t *con ) {
uint8_t buf[4];
buf[0] = 255;
fpga_con_send( con, buf, 1);
buf[0] = 15;
fpga_con_send( con, buf, 1);
fpga_con_send( con, buf, 0);
}
 
/*blocking receive: this call will block until a packet is received*/
ssize_t fpga_con_block_recv( fpga_con_t *con, void *dbuf, size_t dsize ) {
ssize_t rrecv = recv( con->s, dbuf, dsize, 0 );
if( rrecv < 0 ) {
die_perror( "recv" );
}
return rrecv;
}
 
 
static __inline size_t mymin( size_t a, size_t b ) {
return a < b ? a : b;
}
 
//const static size_t MTU = 1500;
const static size_t PH_SIZE = 1;
 
 
// static __inline size_t pack( uint8_t *buf, uint8_t ht, size_t buf_size, void *src, size_t src_size ) {
// assert( src_size + PH_SIZR <= buf_size );
//
// buf[0] = ht;
// memcpy( buf + PH_SIZE, src, src_size );
//
// return src_size + PH_SIZE;
// }
 
// TODO; check how large the impact of doing the byte swappin on unaligned values really is
// there is no simple way around it (like in the receiving direction).
static __inline void swappy_16( void *dest, void *src, size_t n ) {
uint16_t *idest = (uint16_t*)dest;
uint16_t *isrc = (uint16_t*)src;
for( size_t i = 0; i < n / 2; i++ ) {
idest[i] = __bswap_16(isrc[i]);
}
}
 
static __inline void swappy_32( void *dest, void *src, size_t n ) {
uint32_t *idest = (uint32_t*)dest;
uint32_t *isrc = (uint32_t*)src;
for( size_t i = 0; i < n / 4; i++ ) {
idest[i] = __bswap_32(isrc[i]);
}
}
 
 
static __inline void swappy_64( void *dest, void *src, size_t n ) {
uint64_t *idest = (uint64_t*)dest;
uint64_t *isrc = (uint64_t*)src;
for( size_t i = 0; i < n / 8; i++ ) {
idest[i] = __bswap_64(isrc[i]);
}
}
 
#define BS_NONE (0)
#define BS_16 (1)
#define BS_32 (2)
#define BS_64 (3)
 
static __inline size_t pack_and_send( fpga_con_t *con, uint8_t *buf, size_t buf_size, uint8_t ht, void *src, size_t src_size, int swap ) {
const size_t pack_size = src_size + PH_SIZE;
assert( pack_size <= buf_size );
buf[0] = ht;
switch( swap ) {
case BS_NONE:
memcpy( buf + PH_SIZE, src, src_size );
break;
case BS_16:
swappy_16( buf + PH_SIZE, src, src_size );
break;
case BS_32:
swappy_32( buf + PH_SIZE, src, src_size );
break;
case BS_64:
swappy_64( buf + PH_SIZE, src, src_size );
break;
default:
assert(0);
}
fpga_con_send( con, buf, pack_size );
return src_size + PH_SIZE;
}
 
 
 
 
int fpga_con_send_charv( fpga_con_t *con, char *buf, size_t n ) {
const size_t blocksize = (con->mtu - PH_SIZE);
uint8_t sb[MAX_MTU];
size_t sent = 0;
while( sent < n ) {
const size_t to_copy = mymin( blocksize, n - sent );
pack_and_send( con, sb, con->mtu, FPC_CODE_CHAR, (void*) &buf[sent], to_copy, BS_NONE );
sent += to_copy;
}
return 1;
}
 
int fpga_con_send_shortv( fpga_con_t *con, int16_t *buf, size_t n ) {
const size_t TSIZE = sizeof( short );
const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE;
uint8_t sb[MAX_MTU];
size_t sent = 0;
while( sent < n ) {
const size_t to_copy = mymin( blocksize, n - sent );
//fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE );
pack_and_send( con, sb, con->mtu, FPC_CODE_SHORT, (void*) &buf[sent], to_copy * TSIZE, BS_16 );
sent += to_copy;
}
return 1;
}
int fpga_con_send_intv( fpga_con_t *con, int32_t *buf, size_t n ) {
const size_t TSIZE = sizeof( int );
const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE;
uint8_t sb[MAX_MTU];
size_t sent = 0;
while( sent < n ) {
const size_t to_copy = mymin( blocksize, n - sent );
// fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE );
pack_and_send( con, sb, con->mtu, FPC_CODE_INT, (void*) &buf[sent], to_copy * TSIZE, BS_32 );
sent += to_copy;
}
return 1;
}
 
 
int fpga_con_send_longv( fpga_con_t *con, int64_t *buf, size_t n ) {
const size_t TSIZE = sizeof( int64_t );
const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE;
uint8_t sb[MAX_MTU];
size_t sent = 0;
while( sent < n ) {
const size_t to_copy = mymin( blocksize, n - sent );
// fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE );
pack_and_send( con, sb, con->mtu, FPC_CODE_LONG, (void*) &buf[sent], to_copy * TSIZE, BS_64 );
sent += to_copy;
}
return 1;
}
 
int fpga_con_send_floatv( fpga_con_t *con, float *buf, size_t n ) {
const size_t TSIZE = sizeof( int );
const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE;
uint8_t sb[MAX_MTU];
size_t sent = 0;
while( sent < n ) {
const size_t to_copy = mymin( blocksize, n - sent );
// fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE );
pack_and_send( con, sb, con->mtu, FPC_CODE_FLOAT, (void*) &buf[sent], to_copy * TSIZE, BS_32 );
sent += to_copy;
}
return 1;
}
 
int fpga_con_send_doublev( fpga_con_t *con, double *buf, size_t n ) {
const size_t TSIZE = sizeof( double );
const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE;
uint8_t sb[MAX_MTU];
size_t sent = 0;
while( sent < n ) {
const size_t to_copy = mymin( blocksize, n - sent );
// fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE );
pack_and_send( con, sb, con->mtu, FPC_CODE_DOUBLE, (void*) &buf[sent], to_copy * TSIZE, BS_64 );
sent += to_copy;
}
return 1;
}
 
static void fpga_con_rpack( fpga_con_t *con, int code, int size ) {
char buf[3] = { 120, 0, 0 };
buf[0] += code;
assert( size > 0 && size < 0xffff );
unsigned short ssize = size;
swappy_16( &buf[1], &ssize, 2);
fpga_con_send(con, buf, 3);
}
 
void fpga_con_rpack_char( fpga_con_t *con, int size ) {
fpga_con_rpack( con, FPC_CODE_CHAR, size );
}
void fpga_con_rpack_short( fpga_con_t *con, int size ) {
fpga_con_rpack( con, FPC_CODE_SHORT, size );
}
void fpga_con_rpack_int( fpga_con_t *con, int size ) {
fpga_con_rpack( con, FPC_CODE_INT, size);
}
void fpga_con_rpack_long( fpga_con_t *con, int size ) {
fpga_con_rpack( con, FPC_CODE_LONG, size);
}
 
void fpga_con_rpack_float( fpga_con_t *con, int size ) {
fpga_con_rpack( con, FPC_CODE_FLOAT, size );
}
void fpga_con_rpack_double( fpga_con_t *con, int size ) {
fpga_con_rpack( con, FPC_CODE_DOUBLE, size );
}
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/SOFTWARE/testcase1.cpp
0,0 → 1,195
/*
* Copyright (C) 2011 Simon A. Berger
*
* This program is free software; you may redistribute it and/or modify its
* under the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program 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 General Public License
* for more details.
*/
 
#include <stdio.h>
 
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <cmath>
#include <iostream>
#include "fpga_com.h"
#include "background_reader.h"
 
int main() {
 
fpga_con_t fc;
fpga_con_init( &fc, "192.168.1.1", 21844, 21845 );
fpga_bgr_t bgr;
 
fpga_bgr_init( &bgr, fc.s, 1024 * 1024 * 10 );
fpga_bgr_start( &bgr );
fpga_con_send_init_packet( &fc );
bool do_char = !false;
bool do_short = !false;
bool do_int = true;
bool do_long = true;
bool do_float = true;
bool do_double = true;
const int N = 127;
if(do_char)
{
char test[N];
for( int i = 0; i < N; i++ ) {
test[i] = i;// + 'a';
}
 
fpga_con_send_charv( &fc, test, N);
char rec[N];
fpga_con_rpack_char(&fc,N);
fpga_bgr_recv_charv(&bgr, rec, N );
 
printf( "recv char: \n" );
for( int i = 0; i < N; i++ ) {
printf( " recv: %d %d\n", test[i], rec[i] );
}
}
if(do_short)
{
short test[N];
for( int i = 0; i < N; i++ ) {
test[i] = i;
}
 
fpga_con_send_shortv( &fc, test, N);
short rec[N];
fpga_con_rpack_short(&fc,N);
fpga_bgr_recv_shortv(&bgr, rec, N );
 
printf( "recv short: \n" );
for( int i = 0; i < N; i++ ) {
printf( " recv: %d %d\n", test[i], rec[i] );
 
}
}
if( do_int )
{
int test[N];
for( int i = 0; i < N; i++ ) {
test[i] = i;
}
 
fpga_con_send_intv( &fc, test, N);
int rec[N];
fpga_con_rpack_int(&fc,N);
fpga_bgr_recv_intv(&bgr, rec, N );
 
printf( "recv int: \n" );
for( int i = 0; i < N; i++ ) {
printf( " recv: %d %d\n", test[i], rec[i] );
}
}
if( do_long )
{
int64_t test[N];
for( int i = 0; i < N; i++ ) {
test[i] = i * int64_t(1024) * 1024 * 1024;
}
 
fpga_con_send_longv( &fc, test, N);
int64_t rec[N];
fpga_con_rpack_long(&fc,N);
fpga_bgr_recv_longv(&bgr, rec, N );
 
printf( "recv long: \n" );
for( int i = 0; i < N; i++ ) {
std::cout << " recv " << test[i] << " " << rec[i] << std::endl;
}
}
if( do_float )
{
float test[N];
for( int i = 0; i < N; i++ ) {
test[i] = i * 100000;
}
 
fpga_con_send_floatv( &fc, test, N);
float rec[N];
fpga_con_rpack_float(&fc,N);
fpga_bgr_recv_floatv(&bgr, rec, N );
 
printf( "recv float: \n" );
for( int i = 0; i < N; i++ ) {
printf( " recv: %f %f\n", test[i], rec[i] );
}
}
if(do_double)
{
double test[N];
for( int i = 0; i < N; i++ ) {
test[i] = i * 1000000;
}
 
fpga_con_send_doublev( &fc, test, N);
double rec[N];
fpga_con_rpack_double(&fc,N);
fpga_bgr_recv_doublev(&bgr, rec, N );
 
printf( "recv double: \n" );
for( int i = 0; i < N; i++ ) {
printf( " recv: %f %f\n", test[i], rec[i] );
}
}
fpga_bgr_stop_interrupt_join(&bgr);
fpga_bgr_delete(&bgr);
}
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/SOFTWARE/README
0,0 → 1,11
Use the build script (build.sh) to compile the simple test program (testcase1.cpp).
In this test case we send an array of 10 floats, after which the program waits
for a reply consisting of 10 float from the FPGA. The software interface depends
on a working installation of the boost libraries (www.boost.org) and a resonable
c++ compiler and STL implementation.
 
The example also serves as the official documentation for the software interface,
as far as the initilization of the fpga_con_t and fpga_bgr_t objects is concerned.
 
Visit https://github.com/sim82/c_tools/tree/master/fpga_com for the latest version
of this library.
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/HARDWARE/MATCH_CMD.vhd
0,0 → 1,111
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 11:01:28 01/18/2011
-- Design Name:
-- Module Name: MATCH_CMD - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity MATCH_CMD is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
sof : in STD_LOGIC;
vld_i : in STD_LOGIC;
val_i : in STD_LOGIC_VECTOR (7 downto 0);
cmd_to_match : in STD_LOGIC_VECTOR(7 downto 0);
cmd_match : out STD_LOGIC);
end MATCH_CMD;
 
architecture Behavioral of MATCH_CMD is
 
TYPE state is (rst_state,
idle_state,
header_state
);
signal current_st,next_st: state;
 
signal allow_match, match_s: std_logic;
signal allow_match_v, val_i_to_match: std_logic_vector(7 downto 0);
 
begin
 
process(clk)
begin
if (rst='1') then
current_st<= rst_state;
elsif (clk'event and clk='1') then
current_st <= next_st;
end if;
end process;
 
process(current_st,sof,vld_i)
begin
case current_st is
 
when rst_state =>
 
allow_match<='0';
next_st<=idle_state;
when idle_state =>
 
allow_match<='0';
if sof='0' then
next_st <= header_state;
else
next_st <= idle_state;
end if;
 
when header_state =>
if vld_i='1' then
allow_match<='1';
next_st <= rst_state;
else
allow_match<='0';
next_st <= header_state;
end if;
 
end case;
end process;
 
allow_match_v <=(others=>allow_match);
val_i_to_match <= val_i and allow_match_v;
 
process(clk)
begin
if clk'event and clk='1' then
if val_i_to_match = cmd_to_match then
cmd_match <='1';
else
cmd_match <='0';
end if;
end if;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/HARDWARE/FSM_SEL_HEADER.vhd
0,0 → 1,98
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 12:59:05 05/03/2011
-- Design Name:
-- Module Name: FSM_SEL_HEADER - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity FSM_SEL_HEADER is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
usr_phase_en : in STD_LOGIC;
sel : out STD_LOGIC);
end FSM_SEL_HEADER;
 
architecture Behavioral of FSM_SEL_HEADER is
 
TYPE state is (rst_state,
idle_state,
header_state,
data_state
);
signal current_st,next_st: state;
 
begin
 
process(clk)
begin
if (rst='1') then
current_st<= rst_state;
elsif (clk'event and clk='1') then
current_st <= next_st;
end if;
end process;
 
process(current_st,usr_phase_en)
begin
case current_st is
 
when rst_state =>
 
sel<='0';
next_st<=idle_state;
when idle_state =>
 
sel<='0';
if usr_phase_en='1' then
next_st <= header_state;
else
next_st <= idle_state;
end if;
 
when header_state =>
 
sel<='1';
next_st <= data_state;
when data_state =>
 
sel<='0';
if usr_phase_en='1' then
next_st <= data_state;
else
next_st <= rst_state;
end if;
 
end case;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/HARDWARE/PC_COM.vhd
0,0 → 1,283
-----------------------------------------------------------------------------------------
-- Copyright (C) 2010 Nikolaos Ch. Alachiotis --
-- --
-- Engineer: Nikolaos Ch. Alachiotis --
-- --
-- Contact: n.alachiotis@gmail.com --
-- --
-- Create Date: 04/03/2011 --
-- Project Name: PC-FPGA Communication Platform --
-- Module Name: PC_COM --
-- Target Devices: Virtex 5 FPGAs --
-- --
-----------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity PC_COM is
Port (
rst : in STD_LOGIC; -- active high
clk : in STD_LOGIC; -- emac clk
UDP_IP_Core_locked : out STD_LOGIC;
-- FPGA to PC
FPGA2PC_transmission_enable : in STD_LOGIC;
FPGA2PC_transmission_type : in STD_LOGIC_VECTOR(2 downto 0);
FPGA2PC_transmission_length : in STD_LOGIC_VECTOR(15 downto 0);
FPGA2PC_transmission_read_address : out STD_LOGIC_VECTOR(31 downto 0);
FPGA2PC_transmission_bus8 : in STD_LOGIC_VECTOR (7 downto 0);
FPGA2PC_transmission_bus16 : in STD_LOGIC_VECTOR (15 downto 0);
FPGA2PC_transmission_bus32 : in STD_LOGIC_VECTOR (31 downto 0);
FPGA2PC_transmission_bus64 : in STD_LOGIC_VECTOR (63 downto 0);
FPGA2PC_transmission_over : out STD_LOGIC;
-- PC to FPGA
PC2FPGA_tranmission_start_of_data : out STD_LOGIC;
PC2FPGA_tranmission_end_of_data : out STD_LOGIC;
PC2FPGA_tranmission_valid_data : out STD_LOGIC;
PC2FPGA_transmission_type : out STD_LOGIC_VECTOR(2 downto 0);
PC2FPGA_transmission_bus8 : out STD_LOGIC_VECTOR(7 downto 0);
PC2FPGA_transmission_bus16 : out STD_LOGIC_VECTOR(15 downto 0);
PC2FPGA_transmission_bus32 : out STD_LOGIC_VECTOR(31 downto 0);
PC2FPGA_transmission_bus64 : out STD_LOGIC_VECTOR(63 downto 0);
-- TX INTERFACE
tx_sof : out STD_LOGIC;
tx_eof : out STD_LOGIC;
tx_src_rdy : out STD_LOGIC;
tx_dst_rdy : in STD_LOGIC;
tx_data : out STD_LOGIC_VECTOR(7 downto 0);
-- RX INTERFACE
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
rx_src_rdy : in STD_LOGIC;
rx_dst_rdy : out STD_LOGIC;
rx_data : in STD_LOGIC_VECTOR(7 downto 0)
);
end PC_COM;
 
architecture Behavioral of PC_COM is
 
component UDP_IP_Core is
Port ( rst : in STD_LOGIC;
clk_125MHz : in STD_LOGIC;
-- Transmit signals
transmit_start_enable : in STD_LOGIC;
transmit_data_length : in STD_LOGIC_VECTOR (15 downto 0);
usr_data_trans_phase_on : out STD_LOGIC;
transmit_data_input_bus : in STD_LOGIC_VECTOR (7 downto 0);
start_of_frame_O : out STD_LOGIC;
end_of_frame_O : out STD_LOGIC;
source_ready : out STD_LOGIC;
transmit_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0);
--Receive Signals
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
input_bus : in STD_LOGIC_VECTOR(7 downto 0);
valid_out_usr_data : out STD_LOGIC;
usr_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0);
locked : out STD_LOGIC
);
end component;
 
component PC2FPGA is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
locked : in STD_LOGIC;
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
vld_i : in STD_LOGIC;
val_i : in STD_LOGIC_VECTOR(7 downto 0);
sod_o : out STD_LOGIC;
eod_o : out STD_LOGIC;
type_o : out STD_LOGIC_VECTOR(2 downto 0); -- 000: no transmission
-- 001: receiving characters
-- 010: receiving short integers
-- 011: receiving integers
-- 100: receiving floats
-- 101: receiving doubles
vld_o : out STD_LOGIC;
 
val_o_char : out STD_LOGIC_VECTOR(7 downto 0);
val_o_short : out STD_LOGIC_VECTOR(15 downto 0);
val_o_int_float : out STD_LOGIC_VECTOR(31 downto 0);
val_o_long_double : out STD_LOGIC_VECTOR(63 downto 0)
);
end component;
 
component FPGA2PC is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
locked : in STD_LOGIC;
trans_en : in STD_LOGIC;
d_type : in STD_LOGIC_VECTOR (2 downto 0);
d_len : in STD_LOGIC_VECTOR (15 downto 0);
rd_addr : out STD_LOGIC_VECTOR (31 downto 0);
data_in_8 : in STD_LOGIC_VECTOR (7 downto 0); -- type 001
data_in_16 : in STD_LOGIC_VECTOR (15 downto 0); -- type 010
data_in_32 : in STD_LOGIC_VECTOR (31 downto 0); -- type 011 or 100
data_in_64 : in STD_LOGIC_VECTOR (63 downto 0); -- type 101
start_trans : out STD_LOGIC;
trans_length : out STD_LOGIC_VECTOR(15 downto 0);
usr_data_phase_on : in STD_LOGIC;
usr_data_to_trasmit : out STD_LOGIC_VECTOR(7 downto 0);
tx_eof_in: in STD_LOGIC;
trans_ov : out STD_LOGIC);
end component;
 
component MATCH_CMD is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
sof : in STD_LOGIC;
vld_i : in STD_LOGIC;
val_i : in STD_LOGIC_VECTOR (7 downto 0);
cmd_to_match : in STD_LOGIC_VECTOR(7 downto 0);
cmd_match : out STD_LOGIC);
end component;
 
signal locked: std_logic;
signal vld_in_usr_data: std_logic;
signal val_in_usr_data,val_in_usr_data_reg: std_logic_vector(7 downto 0);
signal loc_st_trans: std_logic;
signal loc_le_trans: std_logic_vector(15 downto 0);
signal usr_out_type_t: std_logic_vector(1 downto 0);
signal usr_o_data_en: std_logic;
signal usr_o_data, usr_o_data_reg1: std_logic_Vector(7 downto 0);
signal test_en: std_logic;
signal tx_eof_t, sel_op: std_logic;
signal selected_data, sel_def, sel_stat, status_next: std_logic_vector(7 downto 0);
signal selected_length: std_logic_Vector(15 downto 0);
signal selected_start,status_enable_r, status_enable_t: std_logic;
signal start_transmission, rreq_en, loc_trans_en, rreq_en_reg: std_logic;
signal transmission_data, cmd_to_match_rreq, val_in_usr_data_reg_2: std_logic_Vector(7 downto 0);
signal transmission_length, tmplength: std_logic_vector(15 downto 0);
signal loc_trans_type: std_logic_Vector(2 downto 0);
signal loc_trans_length: std_logic_vector(15 downto 0);
 
begin
 
cmd_to_match_rreq(7 downto 3) <= val_in_usr_data(7 downto 3);
cmd_to_match_rreq(2 downto 0) <= "000";
 
MATCH_RREQ_CODE: MATCH_CMD Port Map
( rst => rst,
clk => clk,
sof => rx_sof,
vld_i => vld_in_usr_data,
val_i => cmd_to_match_rreq,
cmd_to_match => "01111000",
cmd_match => rreq_en
);
 
process(clk)
begin
if clk'event and clk='1' then
val_in_usr_data_reg <= val_in_usr_data;
val_in_usr_data_reg_2 <= val_in_usr_data_reg;
rreq_en_reg <= rreq_en;
end if;
end process;
 
tmplength(15 downto 8) <= val_in_usr_data_reg;
tmplength(7 downto 0) <= val_in_usr_data;
 
loc_trans_en <= FPGA2PC_transmission_enable or rreq_en_reg;
loc_trans_length <= FPGA2PC_transmission_length or tmplength;
loc_trans_type <= FPGA2PC_transmission_type or val_in_usr_data_reg_2(2 downto 0);
 
 
UDP_IP_CORE_INST: UDP_IP_Core Port Map
(
rst => rst,
clk_125MHz => clk,
transmit_start_enable => start_transmission,
transmit_data_length => transmission_length,
usr_data_trans_phase_on => usr_o_data_en,
transmit_data_input_bus => transmission_data,
start_of_frame_O => tx_sof,
end_of_frame_O => tx_eof_t,
source_ready => tx_src_rdy,
transmit_data_output_bus =>tx_data,
rx_sof => rx_sof,
rx_eof => rx_eof,
input_bus => rx_data,
valid_out_usr_data => vld_in_usr_data,
usr_data_output_bus => val_in_usr_data,
locked => locked
);
 
tx_eof <=tx_eof_t;
 
UDP_IP_Core_locked <= locked;
 
rx_dst_rdy <= tx_dst_rdy;
 
PC2FPGA_C: PC2FPGA Port Map
(
rst => rst,
clk => clk,
locked => locked,
rx_sof => rx_sof,
rx_eof => rx_eof,
vld_i => vld_in_usr_data,
val_i => val_in_usr_data,
sod_o => PC2FPGA_tranmission_start_of_data,
eod_o => PC2FPGA_tranmission_end_of_data,
type_o => PC2FPGA_transmission_type,
vld_o => PC2FPGA_tranmission_valid_data,
val_o_char => PC2FPGA_transmission_bus8,
val_o_short => PC2FPGA_transmission_bus16,
val_o_int_float => PC2FPGA_transmission_bus32,
val_o_long_double => PC2FPGA_transmission_bus64
);
 
FPGA2PC_C: FPGA2PC Port Map
(
rst => rst,
clk => clk,
locked => locked,
trans_en => loc_trans_en,
d_type => loc_trans_type,
d_len => loc_trans_length,
rd_addr => FPGA2PC_transmission_read_address,
data_in_8 => FPGA2PC_transmission_bus8,
data_in_16 => FPGA2PC_transmission_bus16,
data_in_32 => FPGA2PC_transmission_bus32,
data_in_64 => FPGA2PC_transmission_bus64,
start_trans => start_transmission,
trans_length => transmission_length,
usr_data_phase_on => usr_o_data_en,
usr_data_to_trasmit => transmission_data,
tx_eof_in => tx_eof_t,
trans_ov => FPGA2PC_transmission_over
);
 
end Behavioral;
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/HARDWARE/FPGA2PC.vhd
0,0 → 1,235
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 11:19:53 05/03/2011
-- Design Name:
-- Module Name: FPGA2PC - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity FPGA2PC is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
locked : in STD_LOGIC;
trans_en : in STD_LOGIC;
d_type : in STD_LOGIC_VECTOR (2 downto 0);
d_len : in STD_LOGIC_VECTOR (15 downto 0);
rd_addr : out STD_LOGIC_VECTOR (31 downto 0);
data_in_8 : in STD_LOGIC_VECTOR (7 downto 0); -- type 001
data_in_16 : in STD_LOGIC_VECTOR (15 downto 0); -- type 010
data_in_32 : in STD_LOGIC_VECTOR (31 downto 0); -- type 011 or 100
data_in_64 : in STD_LOGIC_VECTOR (63 downto 0); -- type 101
start_trans : out STD_LOGIC;
trans_length : out STD_LOGIC_VECTOR(15 downto 0);
usr_data_phase_on : in STD_LOGIC;
usr_data_to_trasmit : out STD_LOGIC_VECTOR(7 downto 0);
tx_eof_in: in STD_LOGIC;
trans_ov : out STD_LOGIC);
end FPGA2PC;
 
architecture Behavioral of FPGA2PC is
 
component D_TYPE_LEN_CNTRL is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
locked : in STD_LOGIC;
trans_en : in STD_LOGIC;
d_type : in STD_LOGIC_VECTOR (2 downto 0);
d_len : in STD_LOGIC_VECTOR (15 downto 0);
d_type_byte : out STD_LOGIC_VECTOR (7 downto 0);
d_length_out : out STD_LOGIC_VECTOR (15 downto 0));
end component;
 
component FSM_SEL_HEADER is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
usr_phase_en : in STD_LOGIC;
sel : out STD_LOGIC);
end component;
 
signal header_byte, usr_data_to_trasmit_t, usr_data_to_trasmit_tt, sel_char_v, sel_rest_v, selected_usr_data_to_transmit: std_logic_vector(7 downto 0);
signal packet_size: std_logic_Vector(15 downto 0);
signal rst_count, en_count, start_trans_tmp,
sel_header, rst_addrgen, en_addrgen,
en_addrgen_t, sel_char, sel_rest : std_logic;
signal counter, counter_r, d_type_loc: std_logic_Vector(2 downto 0);
signal rdaddr_t: std_logic_vector(31 downto 0);
 
component DATA_OUT_MUX is
Port ( status : in STD_LOGIC_VECTOR (2 downto 0);
addr : in STD_LOGIC_VECTOR (2 downto 0);
usr_d_on: in STD_LOGIC;
data_8 : in STD_LOGIC_VECTOR (7 downto 0);
data_16 : in STD_LOGIC_VECTOR (15 downto 0);
data_32 : in STD_LOGIC_VECTOR (31 downto 0);
data_64 : in STD_LOGIC_VECTOR (63 downto 0);
data_out : out STD_LOGIC_VECTOR (7 downto 0));
end component;
 
signal select_header_v, select_data_v : std_logic_Vector(7 downto 0);
 
begin
 
start_trans_tmp <= trans_en and locked;
 
process(clk)
begin
if clk'event and clk='1' then
usr_data_to_trasmit_tt <= usr_data_to_trasmit_t;
start_trans <= start_trans_tmp;
counter_r <= counter;
end if;
end process;
 
D_TYPE_LEN_CNTRL_C: D_TYPE_LEN_CNTRL Port Map
( rst => rst,
clk => clk,
locked => locked,
trans_en => trans_en,
d_type => d_type,
d_len => d_len,
d_type_byte => header_byte,
d_length_out => packet_size
);
 
trans_length <= packet_size;
 
en_count <= usr_data_phase_on;
 
rst_count <= rst or start_trans_tmp;
 
process(clk)
begin
if rst_count='1' then
counter <= "000";
else
if clk'event and clk='1' then
if en_count='1' then
counter <= counter + "001";
end if;
end if;
end if;
end process;
 
 
process(clk)
begin
if clk'event and clk='1' then
if header_byte(2 downto 0)="001" then -- char
en_addrgen_t <= usr_data_phase_on;
elsif header_byte(2 downto 0)="010" then -- short
if usr_data_phase_on='1' then
if counter="000" or counter="010" or counter="100" or counter="110" then
en_addrgen_t <= '1';
else
en_addrgen_t <= '0';
end if;
else
en_addrgen_t <= '0';
end if;
elsif header_byte(2 downto 0)="011" or header_byte(2 downto 0)="100" then -- int/float
if usr_data_phase_on='1' then
if counter="010" or counter="110" then
en_addrgen_t <= '1';
else
en_addrgen_t <= '0';
end if;
else
en_addrgen_t <= '0';
end if;
else -- d_type="00": double
if usr_data_phase_on='1' then
if counter="110" then
en_addrgen_t <= '1';
else
en_addrgen_t <= '0';
end if;
else
en_addrgen_t <= '0';
end if;
end if;
end if;
end process;
 
sel_char <= (not header_byte(2)) and (not header_byte(1)) and (header_byte(0));
sel_rest <= not sel_char;
 
sel_char_v <= (others=> sel_char);
sel_rest_v <= (others=> sel_rest);
 
 
en_addrgen <= (sel_char and usr_data_phase_on) or (sel_rest and en_addrgen_t);
 
rst_addrgen <= rst or start_trans_tmp;
 
process(clk)
begin
if rst_addrgen='1' then
rdaddr_t <= (others=>'0');
else
if clk'event and clk='1' then
if en_addrgen='1' then
rdaddr_t <= rdaddr_t + "00000000000000000000000000000001";
end if;
end if;
end if;
end process;
 
rd_addr<=rdaddr_t;
 
 
FSM_SEL_HEADER_C: FSM_SEL_HEADER Port Map
( rst => rst,
clk => clk,
usr_phase_en => usr_data_phase_on,
sel => sel_header
);
 
select_header_v <= (others=> sel_header);
select_data_v <= (others=> not sel_header);
 
 
DATA_OUT_MUX_C: DATA_OUT_MUX Port Map
( status => header_byte(2 downto 0),
addr => counter_r,
usr_d_on => usr_data_phase_on,
data_8 => data_in_8,
data_16 => data_in_16,
data_32 => data_in_32,
data_64 => data_in_64,
data_out => usr_data_to_trasmit_t
);
 
usr_data_to_trasmit <= (select_header_v and header_byte) or (select_data_v and usr_data_to_trasmit_tt);
 
trans_ov <= not tx_eof_in;
 
end Behavioral;
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/HARDWARE/PC2FPGA.vhd
0,0 → 1,317
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 13:29:11 03/02/2011
-- Design Name:
-- Module Name: PC2FPGA - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity PC2FPGA is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
locked : in STD_LOGIC;
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
vld_i : in STD_LOGIC;
val_i : in STD_LOGIC_VECTOR(7 downto 0);
sod_o : out STD_LOGIC;
eod_o : out STD_LOGIC;
type_o : out STD_LOGIC_VECTOR(2 downto 0); -- 000: no transmission
-- 001: receiving characters
-- 010: receiving short integers
-- 011: receiving integers
-- 100: receiving floats
-- 101: receiving doubles
vld_o : out STD_LOGIC;
 
val_o_char : out STD_LOGIC_VECTOR(7 downto 0);
val_o_short : out STD_LOGIC_VECTOR(15 downto 0);
val_o_int_float : out STD_LOGIC_VECTOR(31 downto 0);
val_o_long_double : out STD_LOGIC_VECTOR(63 downto 0)
);
end PC2FPGA;
 
architecture Behavioral of PC2FPGA is
 
component MATCH_CMD is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
sof : in STD_LOGIC;
vld_i : in STD_LOGIC;
val_i : in STD_LOGIC_VECTOR (7 downto 0);
cmd_to_match : in STD_LOGIC_VECTOR(7 downto 0);
cmd_match : out STD_LOGIC);
end component;
 
component MODE_SEL_REGISTER is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
en : in STD_LOGIC;
sel : out STD_LOGIC);
end component;
 
signal pack_is_chars, pack_is_shorts, pack_is_ints, pack_is_floats, pack_is_longs, pack_is_doubles,
select_chars, select_shorts, select_ints, select_floats, select_longs, select_doubles,
vld_o_t, en_counter, en_counter_r, sod_o_t, vld_i_r, set_eod, rx_eof_reg: std_logic;
signal select_chars_v, select_shorts_v, select_ints_v, select_floats_v, select_ints_floats_v, select_longs_v, select_doubles_v, select_longs_doubles_v,
type_o_t, type_o_t_r, match_t_1, match_t_2, match_t_3, match_t_4, counter_value: std_logic_vector(2 downto 0);
 
signal sel_val_o_chars_v: std_logic_vector(7 downto 0);
signal short_res, sel_val_o_shorts_v: std_logic_vector(15 downto 0);
signal int_float_res, sel_val_o_ints_floats_v: std_logic_vector(31 downto 0);
signal long_double_res, sel_val_o_longs_doubles_v: std_logic_vector(63 downto 0);
 
signal val_i_r2, val_i_r3, val_i_r4, val_i_r5, val_i_r6, val_i_r7, val_i_r8: std_logic_vector(7 downto 0);
signal user_length, user_counter: std_logic_vector(15 downto 0);
 
begin
 
sod_o_t <= (pack_is_chars or pack_is_shorts or pack_is_ints or pack_is_floats or pack_is_longs or pack_is_doubles) and locked;
 
sod_o <= sod_o_t;
 
eod_o <= (not rx_eof_reg) and locked;
 
MATCH_CHAR: MATCH_CMD Port Map
( rst => rst,
clk => clk,
sof => rx_sof,
vld_i => vld_i,
val_i => val_i,
cmd_to_match => "00000001",
cmd_match => pack_is_chars
);
 
MATCH_SHORT: MATCH_CMD Port Map
( rst => rst,
clk => clk,
sof => rx_sof,
vld_i => vld_i,
val_i => val_i,
cmd_to_match => "00000010",
cmd_match => pack_is_shorts
);
 
MATCH_INT: MATCH_CMD Port Map
( rst => rst,
clk => clk,
sof => rx_sof,
vld_i => vld_i,
val_i => val_i,
cmd_to_match => "00000011",
cmd_match => pack_is_ints
);
 
MATCH_FLOAT: MATCH_CMD Port Map
( rst => rst,
clk => clk,
sof => rx_sof,
vld_i => vld_i,
val_i => val_i,
cmd_to_match => "00000100",
cmd_match => pack_is_floats
);
 
MATCH_LONG: MATCH_CMD Port Map
( rst => rst,
clk => clk,
sof => rx_sof,
vld_i => vld_i,
val_i => val_i,
cmd_to_match => "00000101",
cmd_match => pack_is_longs
);
 
MATCH_DOUBLE: MATCH_CMD Port Map
( rst => rst,
clk => clk,
sof => rx_sof,
vld_i => vld_i,
val_i => val_i,
cmd_to_match => "00000110",
cmd_match => pack_is_doubles
);
 
SELECT_CHAR: MODE_SEL_REGISTER Port map
( rst => rst,
clk => clk,
rx_sof => rx_sof,
rx_eof => rx_eof_reg,
en => pack_is_chars,
sel => select_chars
);
 
SELECT_SHORT: MODE_SEL_REGISTER Port map
( rst => rst,
clk => clk,
rx_sof => rx_sof,
rx_eof => rx_eof_reg,
en => pack_is_shorts,
sel => select_shorts
);
 
SELECT_INT: MODE_SEL_REGISTER Port map
( rst => rst,
clk => clk,
rx_sof => rx_sof,
rx_eof => rx_eof_reg,
en => pack_is_ints,
sel => select_ints
);
 
SELECT_FLOAT: MODE_SEL_REGISTER Port map
( rst => rst,
clk => clk,
rx_sof => rx_sof,
rx_eof => rx_eof_reg,
en => pack_is_floats,
sel => select_floats
);
 
SELECT_LONG: MODE_SEL_REGISTER Port map
( rst => rst,
clk => clk,
rx_sof => rx_sof,
rx_eof => rx_eof_reg,
en => pack_is_longs,
sel => select_longs
);
 
SELECT_DOUBLE: MODE_SEL_REGISTER Port map
( rst => rst,
clk => clk,
rx_sof => rx_sof,
rx_eof => rx_eof_reg,
en => pack_is_doubles,
sel => select_doubles
);
 
select_chars_v <= (others=> select_chars and locked);
select_shorts_v <= (others=> select_shorts and locked);
select_ints_v <= (others=> select_ints and locked);
select_floats_v <= (others=> select_floats and locked);
select_ints_floats_v <= (others=> (select_ints or select_floats) and locked);
select_longs_v <= (others=> select_longs and locked);
select_doubles_v <= (others=> select_doubles and locked);
select_longs_doubles_v <= (others=> (select_longs or select_doubles) and locked);
 
 
sel_val_o_chars_v <= (others=> select_chars and locked);
sel_val_o_shorts_v <= (others=> select_shorts and locked);
sel_val_o_ints_floats_v <= (others=> (select_ints or select_floats) and locked);
sel_val_o_longs_doubles_v <= (others=> (select_longs or select_doubles) and locked);
 
type_o_t <= (select_chars_v and "001") or
(select_shorts_v and "010") or
(select_ints_v and "011") or
(select_floats_v and "100") or
(select_longs_v and "101") or
(select_doubles_v and "110") ;
 
type_o <= type_o_t or type_o_t_r;
 
en_counter <= select_chars or
select_shorts or
select_ints or
select_floats or
select_longs or
select_doubles;
process(clk)
begin
if clk'event and clk='1' then
rx_eof_reg <= rx_eof;
if en_counter='0' then
counter_value <= "000";
else
counter_value <= counter_value + "001";
end if;
end if;
end process;
 
match_t_1 <= (select_shorts_v and "000") or (select_ints_floats_v and "010") or (select_longs_doubles_v and "110");
match_t_2 <= (select_shorts_v and "010") or (select_ints_floats_v and "010") or (select_longs_doubles_v and "110");
match_t_3 <= (select_shorts_v and "100") or (select_ints_floats_v and "110") or (select_longs_doubles_v and "110");
match_t_4 <= (select_shorts_v and "110") or (select_ints_floats_v and "110") or (select_longs_doubles_v and "110");
 
process(clk)
begin
if clk'event and clk='1' then
en_counter_r <= en_counter;
type_o_t_r <= type_o_t;
if counter_value = match_t_1 or counter_value = match_t_2 or counter_value = match_t_3 or counter_value = match_t_4 then
vld_o_t <= '1';
else
vld_o_t <= '0';
end if;
end if;
end process;
 
process(clk)
begin
if clk'event and clk='1' then
val_i_r2 <= val_i;
val_i_r3 <= val_i_r2;
val_i_r4 <= val_i_r3;
val_i_r5 <= val_i_r4;
val_i_r6 <= val_i_r5;
val_i_r7 <= val_i_r6;
val_i_r8 <= val_i_r7;
end if;
end process;
 
short_res(15 downto 8) <= val_i_r2;
short_res(7 downto 0) <= val_i;
 
int_float_res(31 downto 24) <= val_i_r4;
int_float_res(23 downto 16) <= val_i_r3;
int_float_res(15 downto 0) <= short_res;
 
long_double_res(63 downto 56) <= val_i_r8;
long_double_res(55 downto 48) <= val_i_r7;
long_double_res(47 downto 40) <= val_i_r6;
long_double_res(39 downto 32) <= val_i_r5;
long_double_res(31 downto 0) <= int_float_res;
 
process(clk)
begin
if clk'event and clk='1' then
vld_o <= (select_chars or ((select_shorts or select_ints or select_floats or select_longs or select_doubles) and vld_o_t and en_counter_r)) and locked;
val_o_char <= val_i and sel_val_o_chars_v;
val_o_short <= short_res and sel_val_o_shorts_v;
val_o_int_float <= int_float_res and sel_val_o_ints_floats_v;
val_o_long_double <= long_double_res and sel_val_o_longs_doubles_v;
end if;
end process;
 
end Behavioral;
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/HARDWARE/D_TYPE_LEN_CNTRL.vhd
0,0 → 1,92
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 11:37:32 05/03/2011
-- Design Name:
-- Module Name: D_TYPE_LEN_CNTRL - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity D_TYPE_LEN_CNTRL is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
locked : in STD_LOGIC;
trans_en : in STD_LOGIC;
d_type : in STD_LOGIC_VECTOR (2 downto 0);
d_len : in STD_LOGIC_VECTOR (15 downto 0);
d_type_byte : out STD_LOGIC_VECTOR (7 downto 0);
d_length_out : out STD_LOGIC_VECTOR (15 downto 0));
end D_TYPE_LEN_CNTRL;
 
architecture Behavioral of D_TYPE_LEN_CNTRL is
 
begin
 
process(clk)
begin
if rst='1' then
d_type_byte <= "00000000";
d_length_out <= "0000000000000000";
else
if clk'event and clk='1' then
if locked='1' then
if trans_en = '1' then
if d_type="001" then
d_type_byte(2 downto 0) <= d_type;
d_length_out <= d_len+ "0000000000000001";
elsif d_type="010" then
d_type_byte(2 downto 0) <= d_type;
d_length_out(15 downto 1) <= d_len(14 downto 0);
d_length_out(0)<='1';
elsif d_type="011" then
d_type_byte(2 downto 0) <= d_type;
d_length_out(15 downto 2) <= d_len(13 downto 0);
d_length_out(1 downto 0)<="01";
elsif d_type="100" then
d_type_byte(2 downto 0) <= d_type;
d_length_out(15 downto 2) <= d_len(13 downto 0);
d_length_out(1 downto 0)<="01";
elsif d_type="101" then
d_type_byte(2 downto 0) <= d_type;
d_length_out(15 downto 3) <= d_len(12 downto 0);
d_length_out(2 downto 0)<="001";
elsif d_type="110" then
d_type_byte(2 downto 0) <= d_type;
d_length_out(15 downto 3) <= d_len(12 downto 0);
d_length_out(2 downto 0)<="001";
else
d_type_byte <= "00000000";
d_length_out <= "0000000000000001";
end if;
end if;
else
d_type_byte <= "00000000";
d_length_out <= "0000000000000001";
end if;
end if;
end if;
end process;
 
 
end Behavioral;
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/HARDWARE/DATA_OUT_MUX.vhd
0,0 → 1,133
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 16:25:55 03/21/2011
-- Design Name:
-- Module Name: DATA_OUT_MUX - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity DATA_OUT_MUX is
Port ( status : in STD_LOGIC_VECTOR (2 downto 0);
addr : in STD_LOGIC_VECTOR (2 downto 0);
usr_d_on: in STD_LOGIC;
data_8 : in STD_LOGIC_VECTOR (7 downto 0);
data_16 : in STD_LOGIC_VECTOR (15 downto 0);
data_32 : in STD_LOGIC_VECTOR (31 downto 0);
data_64 : in STD_LOGIC_VECTOR (63 downto 0);
data_out : out STD_LOGIC_VECTOR (7 downto 0));
end DATA_OUT_MUX;
 
architecture Behavioral of DATA_OUT_MUX is
 
signal sel_char, sel_short, sel_int, sel_float, sel_long, sel_double: std_logic;
signal sel_char_v, sel_short_v, sel_int_v, sel_double_v: std_logic_vector(7 downto 0);
signal char_data, short_data, int_data, double_data: std_logic_vector(7 downto 0);
signal sel_shortA, sel_shortB: std_logic;
signal sel_intA, sel_intB, sel_intC, sel_intD: std_logic;
signal sel_doubleA_v, sel_doubleB_v, sel_doubleC_v, sel_doubleD_v,
sel_doubleE_v, sel_doubleF_v, sel_doubleG_v, sel_doubleH_v: std_logic_vector(7 downto 0);
signal sel_shortA_v, sel_shortB_v: std_logic_vector(7 downto 0);
signal sel_intA_v, sel_intB_v, sel_intC_v, sel_intD_v: std_logic_vector(7 downto 0);
signal sel1, sel2, sel3, sel4, sel5, sel6, sel7, sel8: std_logic;
 
begin
 
sel_char <= (not status(2)) and (not status(1)) and ( status(0));
sel_short <= (not status(2)) and ( status(1)) and (not status(0));
sel_int <= (not status(2)) and ( status(1)) and ( status(0));
sel_float <= ( status(2)) and (not status(1)) and (not status(0));
sel_long <= ( status(2)) and (not status(1)) and ( status(0));
sel_double <= ( status(2)) and ( status(1)) and (not status(0));
 
sel_char_v <= (others=> sel_char);
sel_short_v <= (others=> sel_short);
sel_int_v <= (others=> sel_int or sel_float);
sel_double_v <= (others=> sel_long or sel_double);
 
char_data <= data_8;
 
 
sel1 <= (not addr(2)) and (not addr(1)) and (not addr(0));
sel2 <= (not addr(2)) and (not addr(1)) and ( addr(0));
sel3 <= (not addr(2)) and ( addr(1)) and (not addr(0));
sel4 <= (not addr(2)) and ( addr(1)) and ( addr(0));
sel5 <= ( addr(2)) and (not addr(1)) and (not addr(0));
sel6 <= ( addr(2)) and (not addr(1)) and ( addr(0));
sel7 <= ( addr(2)) and ( addr(1)) and (not addr(0));
sel8 <= ( addr(2)) and ( addr(1)) and ( addr(0));
 
 
sel_shortA <= sel1 or sel3 or sel5 or sel7;
sel_shortB <= sel2 or sel4 or sel6 or sel8;
 
sel_shortA_v <=(others=> sel_shortA);
sel_shortB_v <=(others=> sel_shortB);
 
short_data <= (sel_shortA_v and data_16(15 downto 8)) or ((sel_shortB_v and data_16(7 downto 0)));
 
 
 
sel_intA <= sel1 or sel5;
sel_intB <= sel2 or sel6;
sel_intC <= sel3 or sel7;
sel_intD <= sel4 or sel8;
 
sel_intA_v <= (others=> sel_intA);
sel_intB_v <= (others=> sel_intB);
sel_intC_v <= (others=> sel_intC);
sel_intD_v <= (others=> sel_intD);
 
 
int_data <= (sel_intA_v and data_32(31 downto 24)) or
(sel_intB_v and data_32(23 downto 16)) or
(sel_intC_v and data_32(15 downto 8)) or
(sel_intD_v and data_32(7 downto 0)) ;
sel_doubleA_v <= (others=> sel1);
sel_doubleB_v <= (others=> sel2);
sel_doubleC_v <= (others=> sel3);
sel_doubleD_v <= (others=> sel4);
sel_doubleE_v <= (others=> sel5);
sel_doubleF_v <= (others=> sel6);
sel_doubleG_v <= (others=> sel7);
sel_doubleH_v <= (others=> sel8);
 
double_data <= (sel_doubleA_v and data_64(63 downto 56)) or
(sel_doubleB_v and data_64(55 downto 48)) or
(sel_doubleC_v and data_64(47 downto 40)) or
(sel_doubleD_v and data_64(39 downto 32)) or
(sel_doubleE_v and data_64(31 downto 24)) or
(sel_doubleF_v and data_64(23 downto 16)) or
(sel_doubleG_v and data_64(15 downto 8)) or
(sel_doubleH_v and data_64(7 downto 0)) ;
 
data_out <= (sel_char_v and char_data) or
(sel_short_v and short_data) or
(sel_int_v and int_data) or
(sel_double_v and double_data) ;
 
end Behavioral;
 
/pc_fpga_com/trunk/PC_FPGA_PLATFPORM/HARDWARE/MODE_SEL_REGISTER.vhd
0,0 → 1,64
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 13:38:55 03/02/2011
-- Design Name:
-- Module Name: MODE_SEL_REGISTER - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
 
entity MODE_SEL_REGISTER is
Port ( rst : in STD_LOGIC;
clk : in STD_LOGIC;
rx_sof : in STD_LOGIC;
rx_eof : in STD_LOGIC;
en : in STD_LOGIC;
sel : out STD_LOGIC);
end MODE_SEL_REGISTER;
 
architecture Behavioral of MODE_SEL_REGISTER is
 
signal sel_t: std_logic;
 
begin
 
process(clk)
begin
 
if rst='1' or rx_sof='0' or rx_eof='0' then
sel_t <= '0';
else
if clk'event and clk='1' then
if en='1' then
sel_t <= '1';
else
sel_t <= sel_t;
end if;
end if;
end if;
end process;
 
sel <= (en or sel_t) and rx_eof;
 
end Behavioral;
 
/pc_fpga_com/trunk/PAPER/pc_fpga_com.pdf Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
pc_fpga_com/trunk/PAPER/pc_fpga_com.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pc_fpga_com/trunk/fpga_com/fpga_com.h =================================================================== --- pc_fpga_com/trunk/fpga_com/fpga_com.h (nonexistent) +++ pc_fpga_com/trunk/fpga_com/fpga_com.h (revision 2) @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2011 Simon A. Berger + * + * This program is free software; you may redistribute it and/or modify its + * under the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program 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 General Public License + * for more details. + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +const static int FPC_CODE_CHAR = 1; +const static int FPC_CODE_SHORT = 2; +const static int FPC_CODE_INT = 3; +const static int FPC_CODE_LONG = 5; +const static int FPC_CODE_FLOAT = 4; +const static int FPC_CODE_DOUBLE = 6; + +typedef struct { + /* local and remote socket addresses */ + struct sockaddr_in l_sockaddr; + struct sockaddr_in d_sockaddr; + + /* my socket */ + int s; + size_t mtu; +} fpga_con_t; + + +void fpga_con_init( fpga_con_t *con, const void *daddr, int lport, int dport ); +ssize_t fpga_con_send( fpga_con_t *con, const void *buf, size_t len ); +void fpga_con_send_init_packet( fpga_con_t *con ); +ssize_t fpga_con_block_recv( fpga_con_t *con, void *dbuf, size_t dsize ); + + + +int fpga_con_send_charv( fpga_con_t *con, char *buf, size_t n ); +int fpga_con_send_shortv( fpga_con_t *con, int16_t *buf, size_t n ); +int fpga_con_send_intv( fpga_con_t *con, int32_t *buf, size_t n ); +int fpga_con_send_longv( fpga_con_t *con, int64_t *buf, size_t n ); +int fpga_con_send_floatv( fpga_con_t *con, float *buf, size_t n ); +int fpga_con_send_doublev( fpga_con_t *con, double *buf, size_t n ); + + +void fpga_con_rpack_char( fpga_con_t *con, int size ); +void fpga_con_rpack_short( fpga_con_t *con, int size ); +void fpga_con_rpack_int( fpga_con_t *con, int size ); +void fpga_con_rpack_long( fpga_con_t *con, int size ); +void fpga_con_rpack_float( fpga_con_t *con, int size ); +void fpga_con_rpack_double( fpga_con_t *con, int size ); + +#ifdef __cplusplus +} +#endif Index: pc_fpga_com/trunk/fpga_com/background_reader.cpp =================================================================== --- pc_fpga_com/trunk/fpga_com/background_reader.cpp (nonexistent) +++ pc_fpga_com/trunk/fpga_com/background_reader.cpp (revision 2) @@ -0,0 +1,551 @@ +/* + * Copyright (C) 2011 Simon A. Berger + * + * This program is free software; you may redistribute it and/or modify its + * under the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program 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 General Public License + * for more details. + */ + +#include +#include +#include +#include +#include + +#include "background_reader.h" +#include "fpga_com.h" + +static void handler( int signal ) { + //printf( "signal: %d\n", signal ); +} + +background_reader::background_reader(int s, size_t size) + : m_stop(false), + m_socket(s), + m_max_size(size), + m_pq_mem(0), + m_pq_max_mem(0), + m_pq_max_depth(0), + N_THREADS(1), + m_run_barrier(N_THREADS + 1), + m_threads_joined(false) + //m_native_handle(0) +{ + +} + +background_reader::~background_reader() +{ + if( !m_threads_joined ) { + printf( "WARNING: background_reader::~background_reader(): threads not joined!\n" ); + } +} + + +void background_reader::start() { + /// m_thread.reset( new boost::thread( boost::bind(&background_reader::run, this))); + + + + printf( "starting %zd background reader threads\n", N_THREADS ); + //boost::barrier run_barrier( N_THREADS + 1 ); + + while( m_thread_group.size() < N_THREADS ) { + m_thread_group.create_thread(boost::bind(&background_reader::run, this )); + } + + m_run_barrier.wait(); +} + +void background_reader::run() +{ + // BIG-UGLY-KLUDGE-WARNING! + // we have to install a signal handler, in order to disable the auto-restart behaviour of the recv call... + // This is necessary to make the recv call interuptable (= return -1 on interrupt). Otherwise the + // bg threads would either wait forever, or we would need at least two syscalls per recv (any solution that involves select). + // + // the 'handler' does nothing, as we are only interested in interrupting the recv... + + struct sigaction sa; + sa.sa_handler = handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + sigaction( SIGUSR1, &sa, 0 ); + + //m_native_handle = pthread_self(); + + { + lock_guard_t lock( m_nh_mtx ); + m_native_handles.push_back( pthread_self() ); + + } + + const size_t MTU = 64 * 1024; + + std::vectorbufs(MTU); + char *buf = bufs.data(); + + //run_barrier->wait(); + //run_barrier = 0; + m_run_barrier.wait(); + + while ( !m_stop ) { + ssize_t s = recv( m_socket, buf, MTU, 0 ); + +// if( s < 1024 && s != -1 ) { +// printf( "recved term packet %p\n", (void*)pthread_self() ); +// } + //printf( "recv: %zd\n", s ); + if ( s == -1 && errno == EINTR ) { + printf( "interrupted\n" ); + + } else { + lock_guard_t lock( m_pq_mtx ); + m_pq.push_back(std::string(buf, buf+s)); + m_pq_mem += s; + m_pq_max_mem = std::max( m_pq_mem, m_pq_max_mem ); + + + m_pq_max_depth = std::max( m_pq.size(), m_pq_max_depth ); + } +// printf( "notify\n" ); + m_can_read_condition.notify_one(); + } + + printf( "background reader thread exit\n" ); +} + +ssize_t background_reader::block_recv(void* buf, size_t size) +{ + boost::unique_lock lock( m_pq_mtx ); + + while ( ! m_pq.size() > 0 && !m_stop ) { +// printf( "cond_wait\n" ); + m_can_read_condition.wait(lock); + } + + if( m_pq.size() == 0 ) { + return -1; + } + + std::string &pbuf = m_pq.front(); + + m_pq_mem -= pbuf.size(); + + + ssize_t s = std::min( size, pbuf.size() ); + std::copy( pbuf.begin(), pbuf.end(), (char *)buf ); + m_pq.pop_front(); + + return s; +} + + +ssize_t background_reader::poll() +{ + lock_guard_t lock( m_pq_mtx ); + if( m_pq.size() > 0 ) { + return m_pq.front().size(); + } else { + return -1; + } +} + + +void background_reader::interrupt() { + //boost::thread::native_handle_type h = m_thread->native_handle(); + // pthread_kill( m_native_handle, SIGUSR1 ); + + lock_guard_t lock( m_nh_mtx ); + for( std::vector::iterator it = m_native_handles.begin(); it != m_native_handles.end(); ++it ) { + pthread_kill( *it, SIGUSR1 ); + } + +} + +void background_reader::join() { + // m_thread->join(); + m_thread_group.join_all(); + + printf( "pq max size (bytes): %zd\n", m_pq_max_mem ); + printf( "pq max depth (#packets): %zd\n", m_pq_max_depth ); + + m_threads_joined = true; +} + +ssize_t background_reader::purge() +{ + lock_guard_t lock( m_pq_mtx ); + + ssize_t s = m_pq.size(); + m_pq.clear(); + + return s; +} + + + +// int mainx() { +// fpga_con_t fc; +// +// fpga_con_init( &fc, "131.159.28.113", 12340, 12350 ); +// +// +// +// background_reader bgr( fc.s, 1024 * 1024 * 10 ); +// +// bgr.start(); +// +// char buf[1024]; +// memset( buf, 0, 1024 ); +// +// +// const size_t rbuf_size = 10 * 1024; +// char rbuf[rbuf_size]; +// +// printf( "sleep\n" ); +// // usleep( 2000000 ); +// printf( "close\n" ); +// //close( fc.s ); +// +// //bgr.stop(); +// //bgr.interrupt(); +// //getchar(); +// +// // bgr.join(); +// +// printf( "joined\n" ); +// size_t n = 0; +// for ( int i = 0; i < 10; i++ ) { +// fpga_con_send( &fc, buf, 1024 ); +// printf( "sent\n" ); +// +// +// +// while (true) { +// size_t s = bgr.block_recv( rbuf, rbuf_size ); +// n++; +// // printf( "recv: %zd\n", s ); +// if ( s < 1024 ) { +// break; +// } +// } +// +// printf( "recved: %zd\n", n ); +// } +// +// bgr.stop(); +// bgr.interrupt(); +// bgr.join(); +// printf( "bg reader joined. exit.\n" ); +// } + + + +static inline background_reader &get_bgr( fpga_bgr_t *cbgr ) { + assert( cbgr != 0 ); + assert( cbgr->bgr_cpp != 0 ); + return *(static_cast(cbgr->bgr_cpp)); +} + +void fpga_bgr_init( fpga_bgr_t *cbgr, int socket, size_t size ) { + memset( cbgr, 0, sizeof( fpga_bgr_t )); + + background_reader *bgr = new background_reader(socket, size); + cbgr->bgr_cpp = bgr; +} + +void fpga_bgr_delete( fpga_bgr_t *cbgr ) { + + background_reader *bgr = static_cast(cbgr->bgr_cpp); + delete bgr; + +} + +void fpga_bgr_start( fpga_bgr_t *cbgr) { + background_reader &bgr = get_bgr(cbgr); + bgr.start(); +} +ssize_t fpga_bgr_block_recv( fpga_bgr_t *cbgr, void *buf, size_t size ) { + background_reader &bgr = get_bgr(cbgr); + + return bgr.block_recv(buf, size); +} +ssize_t fpga_bgr_poll( fpga_bgr_t *cbgr ) { + background_reader &bgr = get_bgr(cbgr); + + return bgr.poll(); + +} +void fpga_bgr_stop_interrupt_join( fpga_bgr_t *cbgr) { + background_reader &bgr = get_bgr(cbgr); + + bgr.stop(); + bgr.interrupt(); + bgr.join(); +} + + +// template +// inline static T swap_endian( T &v ) { +// +// T vo = v; +// uint8_t *vb = (uint8_t*) &vo; +// +// for( size_t i = 0; i < sizeof(T) / 2; i++ ) { +// std::swap(vb[i], vb[sizeof(T) - i - 1]); +// +// } +// return vo; +// } + + +template +struct swap_endian { + inline T operator()( T &v ) { + + T vo = v; + uint8_t *vb = (uint8_t*) &vo; + + for( size_t i = 0; i < sizeof(T) / 2; i++ ) { + std::swap(vb[i], vb[sizeof(T) - i - 1]); + } + return vo; + } +}; + + +template +struct swap_endian { + inline T operator()( T &v ) { + uint16_t t = __bswap_16(*((uint16_t*)&v)); + + T* r = (T*)&t; // we don't want to dereference a type-punned pointer, do we? + return *r; + + } +}; + + +template +struct swap_endian { + inline T operator()( T &v ) { + uint32_t t = __bswap_32(*((uint32_t*)&v)); + + T* r = (T*)&t; + return *r; + } +}; + +template +struct swap_endian { + inline T operator()( T &v ) { + uint64_t t = __bswap_64(*((uint64_t*)&v)); + + T* r = (T*)&t; + return *r; + } +}; + + + + + +template +struct swappy_au { + const static size_t N = sizeof(T); + + + swap_endian swap; + inline void operator()( void * dest, void * src, size_t n ) { + std::copy( (char *)src, ((char *)src) + n * N, (char *)dest ); + //std::memcpy( dest, src, n * N ); + + T * ptr = (T *)dest; + T * end = ptr + n; + + // do the endian swapping in place in the aligned buffer + while( ptr < end ) { + *ptr = swap( *ptr ); + ptr++; + } + + } + +}; + +template +struct swappy_aa { + const static size_t N = sizeof(T); + swap_endian swap; + inline void operator()( void * dest, void * src, size_t n ) { + + + T * sptr = (T *)src; + T * ptr = (T *)dest; + T * end = ptr + n; + + // copy and swap on the fly, assuming that both buffers are aligned + while( ptr < end ) { + *ptr = swap( *sptr ); + ptr++; + sptr++; + } + + } + +}; + + +template +struct xerox_plain { + const static size_t N = sizeof(T); + inline void operator()( void * dest, void * src, size_t n ) { + std::copy( (char*)src, ((char*)src) + n * N, (char*)dest ); // using char* here to prevent std;:copy form making any assumptions about th alignment of src/dest + //std::copy( (T*)src, ((T*)src) + n, (T*)dest ); + } +}; + + +// template +// inline T passthrough( T &v ) { +// +// return v; +// } +// + +template +static bool fpga_bgr_recv_genv( fpga_bgr_t *cbgr, T *buf, size_t n, char ht ) { + background_reader &bgr = get_bgr(cbgr); + + + + T *buf_end = buf + n; + T *ptr = buf; + + const size_t MPU = 9000; + uint8_t rbuf[MPU]; + + CopyF xerox; + + while( ptr < buf_end ) { + + + ssize_t raw_size = bgr.block_recv(rbuf, MPU); +// printf( "ptr: %p %zd %d %d %d %d\n", ptr, size, rbuf[0], rbuf[1], rbuf[2], rbuf[3] ); + assert( raw_size > 1 ); + + if( rbuf[0] != ht ) { + printf( "drop wrong packet type: %d %d\n", rbuf[0], ht ); + } + + ssize_t size = raw_size - 1; + uint8_t *rptr = rbuf + 1; + + ssize_t ne = size / sizeof(T); + ssize_t left = buf_end - buf; + + ssize_t to_copy = std::min( ne, left ); + xerox( ptr, rptr, to_copy ); + + + ptr += to_copy; + } + + return true; +} + + +int fpga_bgr_recv_charv( fpga_bgr_t *bgr, char *buf, size_t n ) { + return fpga_bgr_recv_genv >( bgr, buf, n, FPC_CODE_CHAR ); +} + +int fpga_bgr_recv_shortv( fpga_bgr_t *bgr, int16_t *buf, size_t n ) { + return fpga_bgr_recv_genv >( bgr, buf, n, FPC_CODE_SHORT ); +} + +int fpga_bgr_recv_intv( fpga_bgr_t *bgr, int32_t *buf, size_t n ) { + return fpga_bgr_recv_genv >( bgr, buf, n, FPC_CODE_INT ); +} + +int fpga_bgr_recv_longv( fpga_bgr_t *bgr, int64_t *buf, size_t n ) { + return fpga_bgr_recv_genv >( bgr, buf, n, FPC_CODE_LONG ); +} + +int fpga_bgr_recv_floatv( fpga_bgr_t *bgr, float *buf, size_t n ) { + return fpga_bgr_recv_genv >( bgr, buf, n, FPC_CODE_FLOAT ); +} + +int fpga_bgr_recv_doublev( fpga_bgr_t *bgr, double *buf, size_t n ) { + //return fpga_bgr_recv_genv >( bgr, buf, n ); + return fpga_bgr_recv_genv >( bgr, buf, n, FPC_CODE_DOUBLE ); +} + +#if 0 + + +int main() { + fpga_con_t fc; + + fpga_con_init( &fc, "131.159.28.113", 12340, 12350 ); + + fpga_bgr_t bgr; + + fpga_bgr_init( &bgr, fc.s, 1024 * 1024 * 10 ); + + fpga_bgr_start( &bgr ); + + char buf[1024]; + memset( buf, 0, 1024 ); + int ibuf[1000]; + std::fill( ibuf, ibuf + 1000, 666 ); + + + const size_t rbuf_size = 10 * 1024; + char rbuf[rbuf_size]; + +// printf( "sleep\n" ); + // usleep( 2000000 ); +// printf( "close\n" ); + //close( fc.s ); + + //bgr.stop(); + //bgr.interrupt(); + //getchar(); + + // bgr.join(); + +// printf( "joined\n" ); + size_t n = 0; + for ( int i = 0; i < 1; i++ ) { + //fpga_con_send( &fc, buf, 1024 ); + fpga_con_send_intv( &fc, ibuf, 1000 ); + printf( "sent\n" ); + + double iv[1000]; + bool succ = fpga_bgr_recv_doublev( &bgr, iv, 1000 ); + + for( int i = 0; i < 1000; i++ ) { + printf( "%.2f ", iv[i] ); + if( i % 20 == 19 ) { + printf( "\n" ); + } + } + printf( "\n" ); + + printf( "recved: %d\n", succ ); + } + + fpga_bgr_stop_interrupt_join( &bgr ); + printf( "bg reader joined. exit.\n" ); + + fpga_bgr_delete( &bgr ); +} +#endif Index: pc_fpga_com/trunk/fpga_com/background_reader.h =================================================================== --- pc_fpga_com/trunk/fpga_com/background_reader.h (nonexistent) +++ pc_fpga_com/trunk/fpga_com/background_reader.h (revision 2) @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2011 Simon A. Berger + * + * This program is free software; you may redistribute it and/or modify its + * under the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program 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 General Public License + * for more details. + */ + + +#ifndef BACKGROUND_READER_H +#define BACKGROUND_READER_H + + +#ifdef __cplusplus + +#include +#include +#include +#include + +#include +#include + +#include +#include +// the all singing, all dancing background reader, written in shiny new c++ + +class background_reader +{ + typedef boost::mutex mutex_t; + //typedef boost::unique_lock unique_lock_t; + typedef boost::lock_guard lock_guard_t; + + boost::condition_variable m_can_read_condition; + boost::mutex m_pq_mtx; + //boost::scoped_ptr m_thread; + boost::thread_group m_thread_group; + + volatile bool m_stop; // FIXME: use atomic var + int m_socket; + + size_t m_max_size; + + std::deque m_pq; + size_t m_pq_mem; + size_t m_pq_max_mem; + + size_t m_pq_max_depth; + + + //pthread_t m_native_handle; + boost::mutex m_nh_mtx; + std::vector m_native_handles; + const size_t N_THREADS; + boost::barrier m_run_barrier; + bool m_threads_joined; + + void run(); +public: + background_reader( int s, size_t size ); + virtual ~background_reader(); + + void start(); + void interrupt(); + void stop() { m_stop = true; __sync_synchronize(); } // try to make sure that the new value of m_stop is visible to all bg threads before interrupt is called. + void join(); + + ssize_t block_recv( void* buf, size_t size ); + ssize_t poll(); + ssize_t purge(); + + +}; +#endif + +// the boring old ansi c interface + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct fpga_bgr_s { + void *bgr_cpp; +} fpga_bgr_t; + + +void fpga_bgr_init( fpga_bgr_t *bgr, int socket, size_t size ); +void fpga_bgr_delete( fpga_bgr_t *bgr ); + +void fpga_bgr_start( fpga_bgr_t *bgr); +ssize_t fpga_bgr_block_recv( fpga_bgr_t *bgr, void *buf, size_t size ); +ssize_t fpga_bgr_poll(); +void fpga_bgr_stop_interrupt_join( fpga_bgr_t *bgr); + +// high level functions +int fpga_bgr_recv_charv( fpga_bgr_t *bgr, char *buf, size_t n ); +int fpga_bgr_recv_shortv( fpga_bgr_t *bgr, int16_t *buf, size_t n ); +int fpga_bgr_recv_intv( fpga_bgr_t *bgr, int32_t *buf, size_t n ); +int fpga_bgr_recv_longv( fpga_bgr_t *bgr, int64_t *buf, size_t n ); +int fpga_bgr_recv_floatv( fpga_bgr_t *bgr, float *buf, size_t n ); +int fpga_bgr_recv_doublev( fpga_bgr_t *bgr, double *buf, size_t n ); + +#ifdef __cplusplus +} +#endif + + + +#endif // BACKGROUND_READER_H Index: pc_fpga_com/trunk/fpga_com/build.sh =================================================================== --- pc_fpga_com/trunk/fpga_com/build.sh (nonexistent) +++ pc_fpga_com/trunk/fpga_com/build.sh (revision 2) @@ -0,0 +1,2 @@ +gcc -std=c99 -Wall -O2 -c fpga_com.c +g++ -Wall -O2 -o testcase1 testcase1.cpp background_reader.cpp fpga_com.o -lboost_thread Index: pc_fpga_com/trunk/fpga_com/fpga_com.c =================================================================== --- pc_fpga_com/trunk/fpga_com/fpga_com.c (nonexistent) +++ pc_fpga_com/trunk/fpga_com/fpga_com.c (revision 2) @@ -0,0 +1,370 @@ +/* + * Copyright (C) 2011 Simon A. Berger + * + * This program is free software; you may redistribute it and/or modify its + * under the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program 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 General Public License + * for more details. + */ + + +#include + +#include +#include +#include +#include + +#include "fpga_com.h" +#include +#include +#include + +const size_t MAX_MTU = 64 * 1024; + +static void die_perror( const char *call ) { + perror( call ); + exit(-1); +} + + +void fpga_con_init( fpga_con_t *con, const void *daddr, int lport, int dport ) { + + + + /*set up local socket address*/ + memset( &con->l_sockaddr, 0, sizeof( con->l_sockaddr )); + con->l_sockaddr.sin_family = AF_INET; + con->l_sockaddr.sin_addr.s_addr = INADDR_ANY; + con->l_sockaddr.sin_port = htons(lport); + + /*setup dest socket address*/ + memset( &con->d_sockaddr, 0, sizeof( con->d_sockaddr )); + con->d_sockaddr.sin_family = AF_INET; + con->d_sockaddr.sin_addr.s_addr = inet_addr( daddr ); + con->d_sockaddr.sin_port = htons(dport); + +/* create my socket*/ + con->s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); + if( con->s < 0 ) { + die_perror( "socket" ); + } + +/* bind it to local socket*/ + int r = bind( con->s, (struct sockaddr *)&con->l_sockaddr, sizeof(con->l_sockaddr)); + if( r < 0 ) { + die_perror( "bind" ); + } + con->mtu = 1500; +} + +size_t fpga_con_get_mtu( fpga_con_t *con ) { + + return con->mtu; +} + +void fpga_con_set_mtu( fpga_con_t *con, size_t mtu ) { + + if( mtu > MAX_MTU ) { + printf( "fpga_con_set_mtu: mtu > MAX_MTU\n" ); + exit(-1); + } + con->mtu = mtu; +} + + +ssize_t fpga_con_send( fpga_con_t *con, const void *buf, size_t len ) { + + + ssize_t rsend = sendto( con->s, buf, len, 0, (struct sockaddr*)&con->d_sockaddr, sizeof(con->d_sockaddr)); + if( rsend < 0 ) { + die_perror( "sendto" ); + } + + return rsend; +} + + +/* send lut initialization packet sequence: rst, conf, empty*/ +void fpga_con_send_init_packet( fpga_con_t *con ) { + uint8_t buf[4]; + + buf[0] = 255; + fpga_con_send( con, buf, 1); + + buf[0] = 15; + fpga_con_send( con, buf, 1); + + fpga_con_send( con, buf, 0); +} + +/*blocking receive: this call will block until a packet is received*/ +ssize_t fpga_con_block_recv( fpga_con_t *con, void *dbuf, size_t dsize ) { + + ssize_t rrecv = recv( con->s, dbuf, dsize, 0 ); + + if( rrecv < 0 ) { + die_perror( "recv" ); + } + + return rrecv; +} + + +static __inline size_t mymin( size_t a, size_t b ) { + return a < b ? a : b; +} + +//const static size_t MTU = 1500; +const static size_t PH_SIZE = 1; + + +// static __inline size_t pack( uint8_t *buf, uint8_t ht, size_t buf_size, void *src, size_t src_size ) { +// assert( src_size + PH_SIZR <= buf_size ); +// +// buf[0] = ht; +// memcpy( buf + PH_SIZE, src, src_size ); +// +// return src_size + PH_SIZE; +// } + +// TODO; check how large the impact of doing the byte swappin on unaligned values really is +// there is no simple way around it (like in the receiving direction). +static __inline void swappy_16( void *dest, void *src, size_t n ) { + uint16_t *idest = (uint16_t*)dest; + uint16_t *isrc = (uint16_t*)src; + + for( size_t i = 0; i < n / 2; i++ ) { + idest[i] = __bswap_16(isrc[i]); + } +} + +static __inline void swappy_32( void *dest, void *src, size_t n ) { + uint32_t *idest = (uint32_t*)dest; + uint32_t *isrc = (uint32_t*)src; + + for( size_t i = 0; i < n / 4; i++ ) { + idest[i] = __bswap_32(isrc[i]); + } + +} + + +static __inline void swappy_64( void *dest, void *src, size_t n ) { + uint64_t *idest = (uint64_t*)dest; + uint64_t *isrc = (uint64_t*)src; + + for( size_t i = 0; i < n / 8; i++ ) { + idest[i] = __bswap_64(isrc[i]); + } +} + +#define BS_NONE (0) +#define BS_16 (1) +#define BS_32 (2) +#define BS_64 (3) + +static __inline size_t pack_and_send( fpga_con_t *con, uint8_t *buf, size_t buf_size, uint8_t ht, void *src, size_t src_size, int swap ) { + const size_t pack_size = src_size + PH_SIZE; + + assert( pack_size <= buf_size ); + + buf[0] = ht; + + switch( swap ) { + case BS_NONE: + memcpy( buf + PH_SIZE, src, src_size ); + break; + + case BS_16: + swappy_16( buf + PH_SIZE, src, src_size ); + break; + + case BS_32: + swappy_32( buf + PH_SIZE, src, src_size ); + break; + + + case BS_64: + swappy_64( buf + PH_SIZE, src, src_size ); + break; + + default: + assert(0); + } + + fpga_con_send( con, buf, pack_size ); + + return src_size + PH_SIZE; +} + + + + +int fpga_con_send_charv( fpga_con_t *con, char *buf, size_t n ) { + + + const size_t blocksize = (con->mtu - PH_SIZE); + uint8_t sb[MAX_MTU]; + + size_t sent = 0; + while( sent < n ) { + const size_t to_copy = mymin( blocksize, n - sent ); + + pack_and_send( con, sb, con->mtu, FPC_CODE_CHAR, (void*) &buf[sent], to_copy, BS_NONE ); + sent += to_copy; + } + + return 1; + +} + +int fpga_con_send_shortv( fpga_con_t *con, int16_t *buf, size_t n ) { + + + const size_t TSIZE = sizeof( short ); + + const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE; + uint8_t sb[MAX_MTU]; + + size_t sent = 0; + while( sent < n ) { + const size_t to_copy = mymin( blocksize, n - sent ); + + //fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE ); + pack_and_send( con, sb, con->mtu, FPC_CODE_SHORT, (void*) &buf[sent], to_copy * TSIZE, BS_16 ); + + sent += to_copy; + + } + return 1; + +} +int fpga_con_send_intv( fpga_con_t *con, int32_t *buf, size_t n ) { + + + const size_t TSIZE = sizeof( int ); + + const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE; + + uint8_t sb[MAX_MTU]; + + size_t sent = 0; + while( sent < n ) { + const size_t to_copy = mymin( blocksize, n - sent ); + +// fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE ); + pack_and_send( con, sb, con->mtu, FPC_CODE_INT, (void*) &buf[sent], to_copy * TSIZE, BS_32 ); + + sent += to_copy; + + } + + return 1; +} + + +int fpga_con_send_longv( fpga_con_t *con, int64_t *buf, size_t n ) { + + + const size_t TSIZE = sizeof( int64_t ); + + const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE; + + uint8_t sb[MAX_MTU]; + + size_t sent = 0; + while( sent < n ) { + const size_t to_copy = mymin( blocksize, n - sent ); + +// fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE ); + pack_and_send( con, sb, con->mtu, FPC_CODE_LONG, (void*) &buf[sent], to_copy * TSIZE, BS_64 ); + + sent += to_copy; + + } + + return 1; +} + +int fpga_con_send_floatv( fpga_con_t *con, float *buf, size_t n ) { + const size_t TSIZE = sizeof( int ); + + const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE; + + uint8_t sb[MAX_MTU]; + + size_t sent = 0; + while( sent < n ) { + const size_t to_copy = mymin( blocksize, n - sent ); + +// fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE ); + pack_and_send( con, sb, con->mtu, FPC_CODE_FLOAT, (void*) &buf[sent], to_copy * TSIZE, BS_32 ); + + sent += to_copy; + + } + + return 1; +} + +int fpga_con_send_doublev( fpga_con_t *con, double *buf, size_t n ) { + + + const size_t TSIZE = sizeof( double ); + + const size_t blocksize = (con->mtu - PH_SIZE) / TSIZE; + + uint8_t sb[MAX_MTU]; + + + size_t sent = 0; + while( sent < n ) { + const size_t to_copy = mymin( blocksize, n - sent ); + +// fpga_con_send( con, (void*) &buf[sent], to_copy * TSIZE ); + pack_and_send( con, sb, con->mtu, FPC_CODE_DOUBLE, (void*) &buf[sent], to_copy * TSIZE, BS_64 ); + sent += to_copy; + } + + return 1; +} + +static void fpga_con_rpack( fpga_con_t *con, int code, int size ) { + char buf[3] = { 120, 0, 0 }; + buf[0] += code; + + + assert( size > 0 && size < 0xffff ); + unsigned short ssize = size; + + swappy_16( &buf[1], &ssize, 2); + + fpga_con_send(con, buf, 3); +} + +void fpga_con_rpack_char( fpga_con_t *con, int size ) { + fpga_con_rpack( con, FPC_CODE_CHAR, size ); +} +void fpga_con_rpack_short( fpga_con_t *con, int size ) { + fpga_con_rpack( con, FPC_CODE_SHORT, size ); +} +void fpga_con_rpack_int( fpga_con_t *con, int size ) { + fpga_con_rpack( con, FPC_CODE_INT, size); +} +void fpga_con_rpack_long( fpga_con_t *con, int size ) { + fpga_con_rpack( con, FPC_CODE_LONG, size); +} + +void fpga_con_rpack_float( fpga_con_t *con, int size ) { + fpga_con_rpack( con, FPC_CODE_FLOAT, size ); +} +void fpga_con_rpack_double( fpga_con_t *con, int size ) { + fpga_con_rpack( con, FPC_CODE_DOUBLE, size ); +} + Index: pc_fpga_com/trunk/fpga_com/testcase1.cpp =================================================================== --- pc_fpga_com/trunk/fpga_com/testcase1.cpp (nonexistent) +++ pc_fpga_com/trunk/fpga_com/testcase1.cpp (revision 2) @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2011 Simon A. Berger + * + * This program is free software; you may redistribute it and/or modify its + * under the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program 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 General Public License + * for more details. + */ + +#include + +#include +#include +#include +#include +#include +#include "fpga_com.h" +#include "background_reader.h" + +int main() { + + fpga_con_t fc; + + fpga_con_init( &fc, "192.168.1.1", 21844, 21845 ); + + fpga_bgr_t bgr; + + fpga_bgr_init( &bgr, fc.s, 1024 * 1024 * 10 ); + + fpga_bgr_start( &bgr ); + + + fpga_con_send_init_packet( &fc ); + + bool do_char = !false; + bool do_short = !false; + bool do_int = true; + bool do_long = true; + bool do_float = true; + bool do_double = true; + const int N = 127; + if(do_char) + { + char test[N]; + for( int i = 0; i < N; i++ ) { + + test[i] = i;// + 'a'; + + } + + fpga_con_send_charv( &fc, test, N); + + + char rec[N]; + fpga_con_rpack_char(&fc,N); + fpga_bgr_recv_charv(&bgr, rec, N ); + + + printf( "recv char: \n" ); + for( int i = 0; i < N; i++ ) { + printf( " recv: %d %d\n", test[i], rec[i] ); + } + + } + if(do_short) + { + + short test[N]; + for( int i = 0; i < N; i++ ) { + + test[i] = i; + + } + + fpga_con_send_shortv( &fc, test, N); + + + short rec[N]; + fpga_con_rpack_short(&fc,N); + fpga_bgr_recv_shortv(&bgr, rec, N ); + + + printf( "recv short: \n" ); + for( int i = 0; i < N; i++ ) { + printf( " recv: %d %d\n", test[i], rec[i] ); + + + } + + + + } + if( do_int ) + { + int test[N]; + for( int i = 0; i < N; i++ ) { + + test[i] = i; + + } + + fpga_con_send_intv( &fc, test, N); + + + + + int rec[N]; + fpga_con_rpack_int(&fc,N); + fpga_bgr_recv_intv(&bgr, rec, N ); + + + printf( "recv int: \n" ); + for( int i = 0; i < N; i++ ) { + printf( " recv: %d %d\n", test[i], rec[i] ); + } + + } + if( do_long ) + { + int64_t test[N]; + for( int i = 0; i < N; i++ ) { + + test[i] = i * int64_t(1024) * 1024 * 1024; + + } + + fpga_con_send_longv( &fc, test, N); + + + int64_t rec[N]; + fpga_con_rpack_long(&fc,N); + fpga_bgr_recv_longv(&bgr, rec, N ); + + + printf( "recv long: \n" ); + for( int i = 0; i < N; i++ ) { + std::cout << " recv " << test[i] << " " << rec[i] << std::endl; + } + } + + if( do_float ) + { + float test[N]; + for( int i = 0; i < N; i++ ) { + + test[i] = i * 100000; + + } + + fpga_con_send_floatv( &fc, test, N); + + + float rec[N]; + fpga_con_rpack_float(&fc,N); + fpga_bgr_recv_floatv(&bgr, rec, N ); + + + printf( "recv float: \n" ); + for( int i = 0; i < N; i++ ) { + printf( " recv: %f %f\n", test[i], rec[i] ); + } + } + + if(do_double) + { + double test[N]; + for( int i = 0; i < N; i++ ) { + + test[i] = i * 1000000; + + } + + fpga_con_send_doublev( &fc, test, N); + + double rec[N]; + fpga_con_rpack_double(&fc,N); + fpga_bgr_recv_doublev(&bgr, rec, N ); + + + printf( "recv double: \n" ); + for( int i = 0; i < N; i++ ) { + printf( " recv: %f %f\n", test[i], rec[i] ); + } + } + + fpga_bgr_stop_interrupt_join(&bgr); + fpga_bgr_delete(&bgr); + + +} Index: pc_fpga_com/trunk/fpga_com/README =================================================================== --- pc_fpga_com/trunk/fpga_com/README (nonexistent) +++ pc_fpga_com/trunk/fpga_com/README (revision 2) @@ -0,0 +1,11 @@ +Use the build script (build.sh) to compile the simple test program (testcase1.cpp). +In this test case we send an array of 10 floats, after which the program waits +for a reply consisting of 10 float from the FPGA. The software interface depends +on a working installation of the boost libraries (www.boost.org) and a resonable +c++ compiler and STL implementation. + +The example also serves as the official documentation for the software interface, +as far as the initilization of the fpga_con_t and fpga_bgr_t objects is concerned. + +Visit https://github.com/sim82/c_tools/tree/master/fpga_com for the latest version +of this library. Index: pc_fpga_com/trunk/README.txt =================================================================== --- pc_fpga_com/trunk/README.txt (nonexistent) +++ pc_fpga_com/trunk/README.txt (revision 2) @@ -0,0 +1,83 @@ +================================================================================= +PC-FPGA COMMUNICATION PLATFORM and VERSATILE UDP/IP CORE IMPLEMENTATION FOR FPGAs +================================================================================= + +Release date: March 21th, 2011 + + +Description +----------- + +This package provides an open-source VHDL implementation of a UDP/IP core architecture +and a PC-FPGA interface for transmission of basic C types (chars, 16/32/64-bit integers, floats and doubles). + + +Package Structure +----------------- + +This package contains the following files and folder: + +-README : This file + +-UDP_IP_CORE_FLEX_Spartan3 : This folder contains VHDL, XCO and NGC files for Spartan3 devices. + +-UDP_IP_CORE_FLEX_Virtex5 : This folder contains VHDL, XCO and NGC files for Virtex5 devices. + +-PC_FPGA_PLATFPORM : This folder contains VHDL, XCO and NGC files for Virtex5 devices as well as C/C++ files. + +-PAPER : This folder contains a paper that describes in detail the design and implementation of the core and the platform. + + + +Verification Details +-------------------- + +The development board HTG-V5-PCIE by HiTech Global populated with a V5SX95T-1 FPGA was used to verify the correct behavior of the platform and the core. + + +Citation +-------- + +By using this component in any architecture design and associated publication, you agree to cite it as: +"A Versatile UDP/IP based PC-FPGA Communication Platform", by Nikolaos Alachiotis, Simon A. Berger and Alexandros Stamatakis, +submitted to FPL2011. + + +Authors and Contact Details +--------------------------- + +Nikos Alachiotis n.alachiotis@gmail.com, nikolaos.alachiotis@h-its.org +Simon A. Berger simon.berger@h-its.org +Alexandros Stamatakis alexandros.stamatakis@h-its.org + + +Scientific Computing Group (Exelixis Lab) +Heidelberg Institute for Theoretical Studies (HITS gGmbH) + +Schloss-Wolfsbrunnenweg 35 +D-69118 Heidelberg +Germany + + +Copyright +--------- + +This component is free. In case you use it for any purpose, particularly +when publishing work relying on this component you must cite it as: N. Alachiotis, S.A. Berger, A. Stamatakis: "A Versatile UDP/IP based PC-FPGA Communication Platform". + +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 of the License, or +(at your option) any later version. + +This component 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 General Public License for more details. + + + +Release Notes +------------- + +Release date: March 21th, 2011 Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/PACKET_RECEIVER_FSM.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/PACKET_RECEIVER_FSM.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/PACKET_RECEIVER_FSM.vhd (revision 2) @@ -0,0 +1,238 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 03:48:34 02/07/2010 +-- Design Name: +-- Module Name: PACKET_RECEIVER_FSM - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity PACKET_RECEIVER_FSM is + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + + -- Signals from EMAC + rx_sof: in STD_LOGIC; -- active low input + rx_eof: in STD_LOGIC; -- active low input + + -- Signals to Counter and Comparator + sel_comp_Bval: out STD_LOGIC; + comp_Bval: out STD_LOGIC_VECTOR(10 downto 0); + rst_count : out STD_LOGIC; + en_count : out STD_LOGIC; + + -- Signal from Comparator + comp_eq: in STD_LOGIC; + + -- Signals to Length Register + wren_MSbyte: out STD_LOGIC; + wren_LSbyte: out STD_LOGIC; + + -- Signal to user interface + valid_out_usr_data: out STD_LOGIC); +end PACKET_RECEIVER_FSM; + +architecture Behavioral of PACKET_RECEIVER_FSM is + +TYPE state is (rst_state, + idle_state, + detect_n_store_usr_length_MSbyte_state, + store_usr_length_LSbyte_state, + checksum_gap_state, + receive_usr_data_state); + +signal current_st,next_st: state; + +constant udp_length_match_cycle : std_logic_vector(10 downto 0):="00000100100"; -- UDP length MSbyte - 2 +constant udp_checksum_skip : std_logic_vector(10 downto 0):="00000000001"; +constant gnd_vec : std_logic_vector(10 downto 0):="00000000000"; +begin + +process(current_st,rx_sof,rx_eof,comp_eq) +begin +case current_st is + + +when rst_state => + + sel_comp_Bval<='0'; + comp_Bval<=gnd_vec; + rst_count<='1'; + en_count<='0'; + + wren_MSbyte<='0'; + wren_LSbyte<='0'; + + valid_out_usr_data<='0'; + + next_st<=idle_state; + +when idle_state => + + if rx_sof='0' then -- rx_sof is active low + sel_comp_Bval<='0'; + comp_Bval<=udp_length_match_cycle; + rst_count<='1'; + en_count<='0'; + + wren_MSbyte<='0'; + wren_LSbyte<='0'; + + valid_out_usr_data<='0'; + + next_st<=detect_n_store_usr_length_MSbyte_state; + + else + sel_comp_Bval<='0'; + comp_Bval<=gnd_vec; + rst_count<='0'; + en_count<='0'; + + wren_MSbyte<='0'; + wren_LSbyte<='0'; + + valid_out_usr_data<='0'; + + next_st<=idle_state; + end if; + +when detect_n_store_usr_length_MSbyte_state => + + if comp_eq='1' then -- comp_eq is active high + sel_comp_Bval<='0'; + comp_Bval<=udp_checksum_skip; -- Just to skip the UDP checksum field + rst_count<='1'; + en_count<='0'; + + wren_MSbyte<='1'; + wren_LSbyte<='0'; + + valid_out_usr_data<='0'; + + next_st<=store_usr_length_LSbyte_state; + + else + sel_comp_Bval<='0'; + comp_Bval<=udp_length_match_cycle; + rst_count<='0'; + en_count<='1'; + + wren_MSbyte<='0'; + wren_LSbyte<='0'; + + valid_out_usr_data<='0'; + + next_st<=detect_n_store_usr_length_MSbyte_state; + end if; + +when store_usr_length_LSbyte_state => + + sel_comp_Bval<='0'; + comp_Bval<=udp_checksum_skip; -- Just to skip the UDP checksum field + rst_count<='0'; + en_count<='1'; + + wren_MSbyte<='0'; + wren_LSbyte<='1'; + + valid_out_usr_data<='0'; + + next_st<=checksum_gap_state; + +when checksum_gap_state => + + if comp_eq='1' then -- comp_eq is active high + sel_comp_Bval<='1'; + comp_Bval<=gnd_vec; + rst_count<='1'; + en_count<='0'; + + wren_MSbyte<='0'; + wren_LSbyte<='0'; + + valid_out_usr_data<='0'; + + next_st<=receive_usr_data_state; + + else + sel_comp_Bval<='0'; + comp_Bval<=udp_checksum_skip; + rst_count<='0'; + en_count<='1'; + + wren_MSbyte<='0'; + wren_LSbyte<='0'; + + valid_out_usr_data<='0'; + + next_st<=checksum_gap_state; + end if; + +when receive_usr_data_state => + + if (comp_eq='1' or rx_eof='0') then -- comp_eq is active high rx_eof is active-low + sel_comp_Bval<='0'; + comp_Bval<=udp_length_match_cycle; + rst_count<='1'; + en_count<='0'; + + wren_MSbyte<='0'; + wren_LSbyte<='0'; + + valid_out_usr_data<='1'; + + next_st<=idle_state; + + else + sel_comp_Bval<='1'; + comp_Bval<=gnd_vec; + rst_count<='0'; + en_count<='1'; + + wren_MSbyte<='0'; + wren_LSbyte<='0'; + + valid_out_usr_data<='1'; + + next_st<=receive_usr_data_state; + end if; + + +end case; +end process; + + + + +process(clk) +begin +if (rst='1') then + current_st<= rst_state; +elsif (clk'event and clk='1') then + current_st <= next_st; +end if; +end process; + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.xco =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.xco (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.xco (revision 2) @@ -0,0 +1,59 @@ +############################################################## +# +# Xilinx Core Generator version K.39 +# Date: Mon Nov 30 15:37:25 2009 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# BEGIN Project Options +SET addpads = False +SET asysymbol = False +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = False +SET designentry = VHDL +SET device = xc5vsx95t +SET devicefamily = virtex5 +SET flowvendor = Other +SET formalverification = False +SET foundationsym = False +SET implementationfiletype = Ngc +SET package = ff1136 +SET removerpms = False +SET simulationfiles = Structural +SET speedgrade = -1 +SET verilogsim = False +SET vhdlsim = True +# END Project Options +# BEGIN Select +SELECT Comparator family Xilinx,_Inc. 9.0 +# END Select +# BEGIN Parameters +CSET aclr=false +CSET ainitval=0 +CSET aset=false +CSET ce=false +CSET cepriority=Sync_Overrides_CE +CSET component_name=comp_11b_equal +CSET constantbport=false +CSET constantbportvalue=0000000000000000 +CSET datatype=Unsigned +CSET nonregisteredoutput=false +CSET operation=eq +CSET pipelinestages=0 +CSET radix=2 +CSET registeredoutput=true +CSET sclr=false +CSET sset=false +CSET syncctrlpriority=Reset_Overrides_Set +CSET width=11 +# END Parameters +GENERATE +# CRC: 6f28c282 + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/REG_8b_wren.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/REG_8b_wren.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/REG_8b_wren.vhd (revision 2) @@ -0,0 +1,56 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 14:40:03 02/07/2010 +-- Design Name: +-- Module Name: REG_8b_wren - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity REG_8b_wren is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + wren : in STD_LOGIC; + input_val : in STD_LOGIC_VECTOR (7 downto 0); + output_val : inout STD_LOGIC_VECTOR(7 downto 0)); +end REG_8b_wren; + +architecture Behavioral of REG_8b_wren is + +begin + +process(clk) +begin +if rst='1' then + output_val<="00000000"; +else + if clk'event and clk='1' then + if wren='1' then + output_val<=input_val; + end if; + end if; +end if; +end process; + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_11B_EN_RECEIV.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_11B_EN_RECEIV.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_11B_EN_RECEIV.vhd (revision 2) @@ -0,0 +1,58 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 16:16:57 11/30/2009 +-- Design Name: +-- Module Name: COUNTER_11B_EN_RECEIV - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity COUNTER_11B_EN_RECEIV is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + count_en : in STD_LOGIC; + value_O : inout STD_LOGIC_VECTOR (10 downto 0)); +end COUNTER_11B_EN_RECEIV; + +architecture Behavioral of COUNTER_11B_EN_RECEIV is + +begin + +process(clk) +begin +if rst='1' then + value_O<="00000000000"; +else + if clk'event and clk='1' then + if count_en='1' then + value_O<=value_O+"00000000001"; + else + value_O<=value_O; + end if; + end if; +end if; +end process; + + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_6B_LUT_FIFO_MODE.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_6B_LUT_FIFO_MODE.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_6B_LUT_FIFO_MODE.vhd (revision 2) @@ -0,0 +1,63 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 02:30:12 11/30/2009 +-- Design Name: +-- Module Name: COUNTER_6B_LUT_FIFO_MODE - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity COUNTER_6B_LUT_FIFO_MODE is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + funct_sel : in STD_LOGIC; -- 0 for lut addressing, 1 for fifo addressing + count_en : in STD_LOGIC; + value_O : inout STD_LOGIC_VECTOR (5 downto 0)); +end COUNTER_6B_LUT_FIFO_MODE; + +architecture Behavioral of COUNTER_6B_LUT_FIFO_MODE is + +begin + +process(clk) +begin +if rst='1' then + if funct_sel='0' then + value_O<=(others=>'0'); + else + value_O<="100111"; + end if; +else + if clk'event and clk='1' then + if count_en='1' then + value_O<=value_O+"000001"; + else + value_O<=value_O; + end if; + end if; +end if; +end process; + + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.ngc =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.ngc (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.ngc (revision 2) @@ -0,0 +1,3 @@ +XILINX-XDB 0.1 STUB 0.1 ASCII +XILINX-XDM V1.4e +$92x5d=#Zl|bdaa:!3-522):'?%8#?/$09355=789:;<=>70323<54438$;j6;ysy;6pc`69:<&=h59:HLSQQ86M5/QJg[Uthbli"Zge^Dfhvci{}obbRM`Psm`avuhz&ID^HIJN^Ffwlai'}g{#Rmh/bmntZ0eWl{~ma agn31?FNBKBUGENKASD]W]UC>3JEFADZ[EE37?FIUMVMNBH\NTHMM[LHAG>1H^HO[EE38@7=AL81L?6IAD39J47=N9;1B>?5F339J07=N=01BBDZ\T@VF2>JHIMOO;6B@GHABH1=K]]>?7A[[6b9Neoiu^lxxeb`l;LkmkwPbzzcdb>5A0018J4643G;:?6@>229M56597C<<;O056>H4:2D?>6@:2:L56>H0:2D3>6@6f:LA[GSTX@DT\_A_S69MAQQHZB;0C?5@K09S0>VFZ]k0\D@PBTQJ@]dS7'noeS~z}ubvvv`Ykgnch"jka_ommtlvbd`dnh#oPepwbhZhh|l{~maQm.h]b[`wXflUi#dQzsd]`ewt~Wyf~Rbztr,oqqYffm$bSjo{e^`jp*rnm{UlicU>]/k\plcu'eed|RzfldqX4X(nW}cgi"a>06c3?P6(oldTy|zcuwqaZjho`i%kh`Pnnlsmuckagoo"lQjqtco[kismxj`Rl!i^c\atYimVh$eR{|e^abvwXxexSa{{s/nvpZgil'cTklzj_ckw+qobzVmnbV?R.h]wm`t(dfe{SygcerY3Y+oX|`fn#b??7^QT4S7'noeS~z}ubvvv`Ykgnch"jka_ommtlvbd`dnh#oPepwbhZhh|l{~maQm.h]b[`wXflUi#ykbp^pfwpjsi2_XI_QNLHCPg>STM[U]E^GMLD18RFE>3_CN[RZVPD3g?]OKAGR&TIL/0/3#WQSE(9$:,L]LIH48\VRKAK=0T^ZPGOFa?]YDG[OTECH@6:ZgfZOcn2RodR^}ilTfvvohf8:0TicPM`hlvScu{`ee==5Wdl]Nmkiu^lxxeb`;;`*3-1=f 8#?7l&=)59b,6/33h"?%95n(4+7?d:76=1j0<0;;`>1:1=f4:4?7l2;>79b80<76=1j0809;`]fuZd13hUliRl9;`]dpZd13hUgiRl9;`]opZd13hUeiRl;;`aov1=f{l~?7o&?)59a,4/33k"9%95m(2+7?g.3!=1i$8';;c>3:1=e484?7o2=>59a86833k6?2;5m<483:1=e4<48=6mPcnosewcX~0U; -Vflhl{$FIUM)Mnbh|ntnp#55(6&99Te}==;bg0?fjll2ida}Q9b^grqdj5>2ida}Q9b^grqdj+kVida}o}e^t:[5*IGGO'BB@J1c58gjkwW?hTi|{nl-a\gjkwi{oTz4Q?,za\lduXyhUliRl20-a\lduXyhUeiRl20-a\lduXyhUgxRl20-a\lduXizo1="l_icp[dY`|Vh64)eX{pdhSh`nbmg>4)eX`hyT~k{=1.`[mgtWxkT`hQm=1.`[mgtWhUliRl20-a\fZehfz~jby3?,b]kevYfWe~Tn0>#c^jbwZgXflUi1="l_c]ueisb59:;<=>?012345678%w9>6m`mq]5fZcv}hfToRm`mqcqaZp>W9UsyQ>8:ggmc4iom20bjmmuhng3>wfWl{Tn:5~a^ef[g10nb}4:qpaq{GHy237MNwc;D90?7|[8:1;;4<:011=5`f2;:?oiua4c82?k2d2=1/844;5:Pa?112:0:??7?f`8141ec3Z;h6:950;306<6ai38;8nj4Sd843?6=9:82b0:3:1=7?tS02933<428995=hn:327ga=q\:k1<7?51;31V772><1?7?<282ee?473>0n:<50;g97?c|@=80Vl4={485>x"4j3=97):7:7d8m04=83.847;7;o14>5=50;&01=7=1<7*<8;4g?k502:10e;=50;&0=831b;<4?::`77?6=93:16=44}c37>5<6290;wE:=;%1a>424c==3;9wE:=;[c90~3=>3?1:7s+3c841>"c2>90(k484:&05?533`=n6=44o4c94?=n>90;66a89;29?l172900c8k50;9l1f<722e>h7>5;h71>5<#;10>46`<7;28?l36290/?54:8:l03?7<3`?;6=4+3986<>h4?3807d:i:18'7=<202d8;7=4;h6f>5<#;10>46`<7;68?l2c290/?54:8:l03?3<3`<<6=4+3985`>h4?3:07d89:18'7=<1l2d8;7?4;h46>5<#;10=h6`<7;08?l03290/?549d:l03?5<3`<86=4+3985`>h4?3>07d8=:18'7=<1l2d8;7;4;n7a>5<n1<75`7983>>o093:17b9l:188m2`=831b:<4?::m4e?6=3f?m6=44o6`94?=e<>0;6<4?:1y'7g<6<2B?:6F;2:m27?6=3th8o7>53;294~"4j3;97E:9;I61?!7e281bn7>5;h32>5<l51d9K03=O<;1/=o47;h36>5<>o603:17b=<:188yg5b290>6=4?{%1a>4c<@=<0D9<4$0`93>o6=3:17d?9:188m41=831b=54?::m07?6=3th8h7>57;294~"4j3;m7E:9;I61?!7e2;1b=84?::k22?6=3`;<6=44i0:94?=n900;66g>a;29?j542900q~;m:18`[1c3W?n7S;k;_7b?[3a3W=j7S96;_5`?[1e3W?h7S;m;<64>45<5:i1?45rs4;94?4|V<801>j5199~w01=838pR8?4=2f95<=z{<<1<71v8;50;0xZ1`<5:l1=:5rs4694?4|V=o01>h5149~w05=838pR9j4=2g950=z{?o1<7k5199~w3g=838pR;:4=2d95==z{?31<7{t;o0;6?u23g807>;4l3;>7p}=2;296~;4m39870=k:0c8yxu213:1>vP:2:?:>04<,=;1>55rs4594?4|V<;0144:1:&75?4f3ty>:7>52z\64>;>2<:0(9?52c9~w03=838pR9h4=887b>"3938h7p}:4;296~X3m27269k4$5396a=z{<91<7vP95:?:>33<,=;1>>5rs7c94?4|V?>014494:&75?433ty=57>52z\57>;>2?90(9?5249~w3>=838pR;<4=8856>"3938=7p}81;296~X092726:?4$53962=z{>21<752zJ76>{i>j0;6?uG439~j3b=838pD9<4}o4f>5<5sA>97p`9f;296~N3:2we;=4?:3yK07=zf>;1<76sa7583>7}O<;1vb:;50;0xL14{I61?xh1=3:1=vF;2:m23<728qC8?5rn7594?7|@=80qpsr@AAx<=<5>kk=5;9r@A@x4xFGXrwKL \ No newline at end of file Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.xco =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.xco (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.xco (revision 2) @@ -0,0 +1,63 @@ +############################################################## +# +# Xilinx Core Generator version K.39 +# Date: Sat Feb 12 16:26:42 2011 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# BEGIN Project Options +SET addpads = False +SET asysymbol = False +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = False +SET designentry = VHDL +SET device = xc5vsx95t +SET devicefamily = virtex5 +SET flowvendor = Other +SET formalverification = False +SET foundationsym = False +SET implementationfiletype = Ngc +SET package = ff1136 +SET removerpms = False +SET simulationfiles = Structural +SET speedgrade = -1 +SET verilogsim = False +SET vhdlsim = True +# END Project Options +# BEGIN Select +SELECT Distributed_Memory_Generator family Xilinx,_Inc. 3.4 +# END Select +# BEGIN Parameters +CSET ce_overrides=ce_overrides_sync_controls +CSET coefficient_file="C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/ipv4_lut.coe" +CSET common_output_ce=false +CSET common_output_clk=false +CSET component_name=dist_mem_64x8 +CSET data_width=8 +CSET default_data=0 +CSET default_data_radix=16 +CSET depth=64 +CSET dual_port_address=non_registered +CSET dual_port_output_clock_enable=false +CSET input_clock_enable=false +CSET input_options=non_registered +CSET memory_type=single_port_ram +CSET output_options=registered +CSET pipeline_stages=0 +CSET qualify_we_with_i_ce=false +CSET reset_qdpo=false +CSET reset_qspo=false +CSET single_port_output_clock_enable=false +CSET sync_reset_qdpo=false +CSET sync_reset_qspo=false +# END Parameters +GENERATE +# CRC: b55d2f1c + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/OVERRIDE_LUT_CONTROL.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/OVERRIDE_LUT_CONTROL.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/OVERRIDE_LUT_CONTROL.vhd (revision 2) @@ -0,0 +1,108 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 15:09:25 11/30/2009 +-- Design Name: +-- Module Name: OVERRIDE_LUT_CONTROL - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity OVERRIDE_LUT_CONTROL is + Port ( clk : in STD_LOGIC; + input_addr : in STD_LOGIC_VECTOR (5 downto 0); + sel_total_length_MSBs : out STD_LOGIC; + sel_total_length_LSBs : out STD_LOGIC; + sel_header_checksum_MSBs : out STD_LOGIC; + sel_header_checksum_LSBs : out STD_LOGIC; + sel_length_MSBs : out STD_LOGIC; + sel_length_LSBs : out STD_LOGIC + ); +end OVERRIDE_LUT_CONTROL; + +architecture Behavioral of OVERRIDE_LUT_CONTROL is + +component comp_6b_equal is + port ( + qa_eq_b : out STD_LOGIC; + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 5 downto 0 ); + b : in STD_LOGIC_VECTOR ( 5 downto 0 ) + ); +end component; + +constant total_length_addr1 : std_logic_vector(5 downto 0):="010000"; +constant total_length_addr2 : std_logic_vector(5 downto 0):="010001"; + +constant header_checksum_addr1 : std_logic_vector(5 downto 0):="011000"; +constant header_checksum_addr2 : std_logic_vector(5 downto 0):="011001"; + +constant length_addr1 : std_logic_vector(5 downto 0):="100110"; +constant length_addr2 : std_logic_vector(5 downto 0):="100111"; + + +signal sel_header_checksum_MSBs_tmp : std_logic; +signal sel_total_length_MSBs_tmp : std_logic; +signal sel_length_MSBs_tmp : std_logic; + +begin + +TARGET_TOTAL_LENGTH_1 : comp_6b_equal port map (sel_total_length_MSBs_tmp,clk,input_addr,total_length_addr1); + +process(clk) +begin +if clk'event and clk='1' then + sel_total_length_LSBs<=sel_total_length_MSBs_tmp; +end if; +end process; +sel_total_length_MSBs<=sel_total_length_MSBs_tmp; + +--TARGET_TOTAL_LENGTH_2 : comp_6b_equal port map (sel_total_length_LSBs,clk,input_addr,total_length_addr2); + +TARGET_HEADER_CHECKSUM_1 : comp_6b_equal port map (sel_header_checksum_MSBs_tmp,clk,input_addr,header_checksum_addr1); +process(clk) +begin +if clk'event and clk='1' then + sel_header_checksum_LSBs<=sel_header_checksum_MSBs_tmp; +end if; +end process; + +sel_header_checksum_MSBs<=sel_header_checksum_MSBs_tmp; + + + +--TARGET_HEADER_CHECKSUM_2 : comp_6b_equal port map (sel_header_checksum_LSBs,clk,input_addr,header_checksum_addr2); + +TARGET_LENGTH_1 : comp_6b_equal port map (sel_length_MSBs_tmp,clk,input_addr,length_addr1); + +process(clk) +begin +if clk'event and clk='1' then + sel_length_LSBs<=sel_length_MSBs_tmp; +end if; +end process; + +sel_length_MSBs<=sel_length_MSBs_tmp; +--TARGET_LENGTH_2 : comp_6b_equal port map (sel_length_LSBs,clk,input_addr,length_addr2); + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/CONFIG_CONTROL.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/CONFIG_CONTROL.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/CONFIG_CONTROL.vhd (revision 2) @@ -0,0 +1,215 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 14:28:06 01/11/2011 +-- Design Name: +-- Module Name: CONFIG_CONTROL - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity CONFIG_CONTROL is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + config_en : in STD_LOGIC; + nxt_sof : in STD_LOGIC; + wren : out STD_LOGIC; + addr : out STD_LOGIC_VECTOR (5 downto 0); + ulock_en : in STD_LOGIC; + wren_checksum_1 : out STD_LOGIC; + wren_checksum_2 : out STD_LOGIC; + locked : out STD_LOGIC + ); +end CONFIG_CONTROL; + +architecture Behavioral of CONFIG_CONTROL is + +TYPE state is (rst_state, + idle_state, + pre_config_state, + config_state, + lock_state + ); + +signal current_st,next_st: state; + +signal rst_count, en_count, stop_s, wren_checksum_1_t: std_logic; +signal counter: std_logic_vector(5 downto 0); + + + + +component wraddr_lut_mem is + port ( + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 5 downto 0 ); + qspo : out STD_LOGIC_VECTOR ( 5 downto 0 ) + ); +end component; + +begin + +process(clk) +begin +if (rst='1') then + current_st<= rst_state; +elsif (clk'event and clk='1') then + current_st <= next_st; +end if; +end process; + + +process(current_st,config_en,nxt_sof,ulock_en,stop_s) +begin +case current_st is + +when rst_state => + + rst_count <='1'; + en_count <='0'; + + wren <='0'; + + locked<='0'; + + next_st<=idle_state; + +when idle_state => + + rst_count <='0'; + en_count <='0'; + + wren <='0'; + + locked<='0'; + + if config_en='1' then + next_st <= pre_config_state; + else + next_st <= idle_state; + end if; + +when pre_config_state => + + rst_count <='0'; + en_count <='0'; + + wren <='0'; + + locked<='0'; + + if nxt_sof='0' then + en_count <='1'; + next_st <= config_state; + else + en_count <='0'; + next_st <= pre_config_state; + end if; + + +when config_state => + + rst_count <='0'; + en_count <='1'; + + wren <='1'; + + locked<='0'; + + if stop_s='1' then + next_st <= lock_state; + else + next_st <= config_state; + end if; + +when lock_state => + + rst_count <='1'; + en_count <='0'; + + wren <='0'; + + locked<='1'; + + if ulock_en='1' then + next_st <= rst_state; + else + next_st <= lock_state; + end if; + +end case; +end process; + +process(clk) +begin +if rst_count='1' then + counter <= "000000"; +else + if clk'event and clk='1' then + if en_count='1' then + counter <= counter + "000001"; + end if; + end if; +end if; +end process; + +process(clk) +begin +if clk'event and clk='1' then + if counter = "100101" then + stop_s <='1'; + else + stop_s <='0'; + end if; +end if; +end process; + +process(clk) +begin +if clk'event and clk='1' then + if counter = "010111" then + wren_checksum_1_t <='1'; + else + wren_checksum_1_t <='0'; + end if; +end if; +end process; + +wren_checksum_1 <= wren_checksum_1_t; + +process(clk) +begin +if clk'event and clk='1' then + wren_checksum_2 <= wren_checksum_1_t; +end if; +end process; + + + +wraddrlutmem: wraddr_lut_mem Port Map + ( + clk => clk, + a=> counter, + qspo=> addr); + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPV4_PACKET_TRANSMITTER.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPV4_PACKET_TRANSMITTER.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPV4_PACKET_TRANSMITTER.vhd (revision 2) @@ -0,0 +1,478 @@ +----------------------------------------------------------------------------------------- +-- Copyright (C) 2010 Nikolaos Ch. Alachiotis -- +-- -- +-- Engineer: Nikolaos Ch. Alachiotis -- +-- -- +-- Contact: alachiot@cs.tum.edu -- +-- n.alachiotis@gmail.com -- +-- -- +-- Create Date: 14:45:39 11/27/2009 -- +-- Module Name: IPV4_PACKET_TRANSMITTER -- +-- Target Devices: Virtex 5 FPGAs -- +-- Tool versions: ISE 10.1 -- +-- Description: This component can be used to send IPv4 Ethernet Packets. -- +-- Additional Comments: The look-up table contains the header fields of the IP packet, -- +-- so please keep in mind that you have to reinitialize this LUT. -- +-- -- +----------------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity IPV4_PACKET_TRANSMITTER is + Port ( rst : in STD_LOGIC; + clk_125MHz : in STD_LOGIC; + transmit_start_enable : in STD_LOGIC; + transmit_data_length : in STD_LOGIC_VECTOR (15 downto 0); + usr_data_trans_phase_on : out STD_LOGIC; + transmit_data_input_bus : in STD_LOGIC_VECTOR (7 downto 0); + start_of_frame_O : out STD_LOGIC; + end_of_frame_O : out STD_LOGIC; + source_ready : out STD_LOGIC; + transmit_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0); + + flex_wren: in STD_LOGIC; + flex_wraddr: in STD_LOGIC_VECTOR(5 downto 0); + flex_wrdata: in STD_LOGIC_VECTOR(7 downto 0); + + flex_checksum_baseval: in std_logic_vector(15 downto 0) + ); +end IPV4_PACKET_TRANSMITTER; + +architecture Behavioral of IPV4_PACKET_TRANSMITTER is + + +----------------------------------------------------------------------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------------------------------------------- +-- IPv4 PACKET STRUCTURE : -- +-- Size | Description | Transmission Order | Position -- +-- ----------------------------------------------------------------------------------------------------------- +-- 6 bytes | Destin MAC Address (PC) | 0 1 2 3 4 5 | LUT -- +-- | X-X-X-X-X-X | | -- +-- | | | -- +-- 6 bytes | Source MAC Address (FPGA) | 6 7 8 9 10 11 | LUT -- +-- | 11111111-11111111-11111111-11111111-... | | -- +-- 2 bytes | Ethernet Type * | 12 13 | LUT -- +-- | (fixed to 00001000-00000000 :=> | | -- +-- | Internet Protocol, Version 4 (IPv4)) | | -- +-- -- Start of IPv4 Packet ** - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- | -- +-- 1 byte | 4 MSBs = Version , 4 LSBs = Header Length | 14 | LUT -- +-- | 0100 0101 | | -- +-- 1 byte | Differentiated Services | 15 | LUT -- +-- | 00000000 | | -- +-- 2 bytes | Total Length | 16 17 | REG -- +-- | 00000000-00100100 (base: 20 + 8 + datalength)| | -- +-- 2 bytes | Identification | 18 19 | LUT -- +-- | 00000000-00000000 | | -- +-- 2 bytes | 3 MSBs = Flags , 13 LSBs = Fragment Offset | 20 21 | LUT -- +-- | 010 - 0000000000000 | | -- +-- 1 byte | Time to Live | 22 | LUT -- +-- | 01000000 | | -- +-- 1 byte | Protocol | 23 | LUT -- +-- | 00010001 | | -- +-- 2 bytes | Header Checksum | 24 25 | REG -- +-- | 10110111 01111101 (base value) | | -- +-- 4 bytes | Source IP Address | 26 27 28 29 | LUT -- +-- | X-X-X-X - FPGA | | -- +-- 4 bytes | Destin IP Address | 30 31 32 33 | LUT -- +-- | X-X-X-X - PC | | -- +-- -- Start of UDP Packet *** - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- | -- +-- 2 bytes | Source Port | 34 35 | LUT -- +-- | X-X | | -- +-- 2 bytes | Destination Port | 36 37 | LUT -- +-- | X-X | | -- +-- 2 bytes | Length | 38 39 | REG -- +-- | 00000000 - 00010000 (8 + # data bytes) | | -- +-- 2 bytes | Checksum | 40 41 | LUT -- +-- | 00000000 - 00000000 | | -- +-- X bytes | Data | 42 .. X | from input -- +-- | | | -- +----------------------------------------------------------------------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------------------------------------------- + +-- * More details about the Ethernet Type value you can find here: +-- http://en.wikipedia.org/wiki/Ethertype + +-- ** More details about the Internet Protocol, Version 4 (IPv4) you can find here: +-- http://en.wikipedia.org/wiki/IPv4 + +-- *** More details about the Internet Protocol, Version 4 (IPv4) you can find here: +-- http://en.wikipedia.org/wiki/User_Datagram_Protocol + +----------------------------------------------------------------------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------------- +-- COMPONENT DECLARATION +-------------------------------------------------------------------------------------- + +component REG_16B_WREN is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + wren : in STD_LOGIC; + input : in STD_LOGIC_VECTOR (15 downto 0); + output : out STD_LOGIC_VECTOR (15 downto 0)); +end component; + +component IPV4_LUT_INDEXER is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + transmit_enable : in STD_LOGIC; + LUT_index : out STD_LOGIC_VECTOR (5 downto 0)); +end component; + +--component dist_mem_64x8 is +-- port ( +-- clk : in STD_LOGIC := 'X'; +-- a : in STD_LOGIC_VECTOR ( 5 downto 0 ); +-- qspo : out STD_LOGIC_VECTOR ( 7 downto 0 ) +-- ); +--end component; + +component dist_mem_64x8 is + port ( + clk : in STD_LOGIC := 'X'; + we : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 5 downto 0 ); + d : in STD_LOGIC_VECTOR ( 7 downto 0 ); + qspo : out STD_LOGIC_VECTOR ( 7 downto 0 ) + ); +end component; + +component OVERRIDE_LUT_CONTROL is + Port ( clk : in STD_LOGIC; + input_addr : in STD_LOGIC_VECTOR (5 downto 0); + sel_total_length_MSBs : out STD_LOGIC; + sel_total_length_LSBs : out STD_LOGIC; + sel_header_checksum_MSBs : out STD_LOGIC; + sel_header_checksum_LSBs : out STD_LOGIC; + sel_length_MSBs : out STD_LOGIC; + sel_length_LSBs : out STD_LOGIC + ); +end component; + +component TARGET_EOF is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + start : in STD_LOGIC; + total_length_from_reg : in STD_LOGIC_VECTOR(15 downto 0); + eof_O : out STD_LOGIC); +end component; + +component ENABLE_USER_DATA_TRANSMISSION is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + start_usr_data_trans : in STD_LOGIC; + stop_usr_data_trans : in STD_LOGIC; + usr_data_sel : out STD_LOGIC); +end component; + +component ALLOW_ZERO_UDP_CHECKSUM is + Port ( clk : in STD_LOGIC; + input : in STD_LOGIC; + output_to_readen : out STD_LOGIC; + output_to_datasel : out STD_LOGIC); +end component; + + +-------------------------------------------------------------------------------------- +-- SIGNAL DECLARATION +-------------------------------------------------------------------------------------- + +signal transmit_start_enable_tmp, + sel_total_length_MSBs, + sel_total_length_LSBs, + sel_header_checksum_MSBs, + sel_header_checksum_LSBs, + sel_length_MSBs, + sel_length_LSBs, + lut_out_sel, + source_ready_previous_value, + end_of_frame_O_tmp, + transmit_start_enable_reg, + usr_data_sel_sig, + start_usr_data_read, + start_usr_data_trans : STD_LOGIC; + +signal LUT_addr, + LUT_addr_dual, + sel_rd, + sel_wr: STD_LOGIC_VECTOR(5 downto 0); + +signal transmit_data_input_bus_tmp, + transmit_data_output_bus_tmp, + sel_total_length_MSBs_vec, + sel_total_length_LSBs_vec, + sel_header_checksum_MSBs_vec, + sel_header_checksum_LSBs_vec, + sel_length_MSBs_vec, + sel_length_LSBs_vec, + lut_out_sel_vec, + transmit_data_output_bus_no_usr_data, + usr_data_not_sel_vec, + usr_data_sel_vec : STD_LOGIC_VECTOR(7 downto 0); + +signal transmit_data_length_tmp, + data_length_regout, + tmp_total_length, + tmp_header_checksum, + tmp_header_checksum_baseval, + tmp_length : STD_LOGIC_VECTOR(15 downto 0); + + +begin + +transmit_start_enable_tmp<=transmit_start_enable; + +transmit_data_length_tmp<=transmit_data_length; + +transmit_data_input_bus_tmp<=transmit_data_input_bus; + +---------------------------------------------------------------------------------------------------- +-- start_of_frame_O signal +---------------------------------------------------------------------------------------------------- +-- Description: start_of_frame_O is active low +-- We connect it to the delayed for one clock cycle transmit_start_enable input signal +-- through a NOT gate since transmit_start_enable is active high. + +process(clk_125MHz) +begin +if clk_125MHz'event and clk_125MHz='1' then + transmit_start_enable_reg<=transmit_start_enable_tmp; -- Delay transmit_start_enable one cycle. +end if; +end process; + +start_of_frame_O<=not transmit_start_enable_reg; + +---------------------------------------------------------------------------------------------------- +-- end_of_frame_O signal +---------------------------------------------------------------------------------------------------- +-- Description: end_of_frame_O is active low +-- The TARGET_EOF module targets the last byte of the packet that is being transmitted +-- based on a counter that counts the number of transmitted bytes and a comparator that +-- detects the last byte which is the th byte. + +TARGET_EOF_port_map: TARGET_EOF port map +( + rst =>rst, + clk =>clk_125MHz, + start =>transmit_start_enable_reg, + total_length_from_reg =>tmp_total_length, + eof_O =>end_of_frame_O_tmp +); + +--* The counter in TARGET_EOF starts from -X, where X is the number of bytes transmitted before the +-- IPv4 packet. (MAC addresses + Ethernet Type) + +end_of_frame_O<=end_of_frame_O_tmp; + +---------------------------------------------------------------------------------------------------- +-- source_ready signal +---------------------------------------------------------------------------------------------------- +-- Description: source_ready is active low +-- This signal is idle(high). (based on rst and end_of_frame_O_tmp). +-- This signal is active(low). (based on transmit_start_enable and end_of_frame_O_tmp). + +process(clk_125MHz) +begin +if rst='1' then + source_ready<='1'; + source_ready_previous_value<='1'; +else + if clk_125MHz'event and clk_125MHz='1' then + if (transmit_start_enable_tmp='1' and source_ready_previous_value='1') then + source_ready<='0'; + source_ready_previous_value<='0'; + else + if (end_of_frame_O_tmp='0' and source_ready_previous_value='0') then + source_ready<='1'; + source_ready_previous_value<='1'; + end if; + end if; + end if; +end if; +end process; + +---------------------------------------------------------------------------------------------------- +-- transmit_data_output_bus +---------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------- +-- Component Name: REG_16B_WREN +-- Instance Name: NUMBER_OR_DATA_IN_BYTES_REGISTER +-- Description: Register that holds the number of bytes of input data +-- that will be transmitted in the packet. +---------------------------------------------------------------------------------------------------- +NUMBER_OR_DATA_IN_BYTES_REGISTER : REG_16B_WREN port map +( + rst =>rst, + clk =>clk_125MHz, + wren =>transmit_start_enable_tmp, -- The transmit_start_enable input signal can be used as wren. + input =>transmit_data_length_tmp, + output =>data_length_regout +); +---------------------------------------------------------------------------------------------------- + +tmp_total_length<="0000000000011100" + data_length_regout; + + +tmp_header_checksum_baseval<=flex_checksum_baseval; +--tmp_header_checksum_baseval<="1011011101111101"; -- CHANGE VALUE! : You have to change this value! +tmp_header_checksum<=tmp_header_checksum_baseval - data_length_regout; + +tmp_length<="0000000000001000" + data_length_regout; + +---------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------- +-- Component Name: IPV4_LUT_INDEXER +-- Instance Name: IPV4_LUT_INDEXER_port_map +-- Description: When transmit_enable is high for one cycle IPV4_LUT_INDEXER generates the +-- addresses to the LUT that contains the header section of the IP packet. +---------------------------------------------------------------------------------------------------- +IPV4_LUT_INDEXER_port_map : IPV4_LUT_INDEXER port map +( + rst =>rst, + clk =>clk_125MHz, + transmit_enable =>transmit_start_enable_tmp, + LUT_index =>LUT_addr +); +---------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------- +-- Component Name: dist_mem_64x8 +-- Instance Name: LUT_MEM +-- Description: LUT that contains the header section. +---------------------------------------------------------------------------------------------------- +LUT_addr_dual <= (LUT_addr and sel_rd) or (flex_wraddr and sel_wr); + +sel_rd <= (others=> not flex_wren); +sel_wr <= (others=> flex_wren); + +LUT_MEM : dist_mem_64x8 port map +( + --clk =>clk_125MHz, + --a =>LUT_addr_dual, + --qspo =>transmit_data_output_bus_tmp + + clk =>clk_125MHz, + we =>flex_wren, + a => LUT_addr_dual, + d => flex_wrdata, + qspo =>transmit_data_output_bus_tmp + + +); + + + + + + + +---------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------- +-- Component Name: OVERRIDE_LUT_CONTROL +-- Instance Name: OVERRIDE_LUT_CONTROL_port_map +-- Description: Decides whether the output byte will come from the LUT or not. +---------------------------------------------------------------------------------------------------- +OVERRIDE_LUT_CONTROL_port_map : OVERRIDE_LUT_CONTROL port map +( + clk =>clk_125MHz, + input_addr =>LUT_addr, + sel_total_length_MSBs =>sel_total_length_MSBs, + sel_total_length_LSBs =>sel_total_length_LSBs, + sel_header_checksum_MSBs =>sel_header_checksum_MSBs, + sel_header_checksum_LSBs =>sel_header_checksum_LSBs, + sel_length_MSBs =>sel_length_MSBs, + sel_length_LSBs =>sel_length_LSBs +); +---------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------- +-- MUX 7 to 1 +sel_total_length_MSBs_vec<=(others=>sel_total_length_MSBs); +sel_total_length_LSBs_vec<=(others=>sel_total_length_LSBs); +sel_header_checksum_MSBs_vec<=(others=>sel_header_checksum_MSBs); +sel_header_checksum_LSBs_vec<=(others=>sel_header_checksum_LSBs); +sel_length_MSBs_vec<=(others=>sel_length_MSBs); +sel_length_LSBs_vec<=(others=>sel_length_LSBs); +lut_out_sel_vec <= (others=>lut_out_sel); + +lut_out_sel<=(not sel_total_length_MSBs) and (not sel_total_length_LSBs) and + (not sel_header_checksum_MSBs) and (not sel_header_checksum_LSBs) and + (not sel_length_MSBs) and (not sel_length_LSBs); + +-- MUX output +transmit_data_output_bus_no_usr_data<= (transmit_data_output_bus_tmp and lut_out_sel_vec) or + (tmp_total_length(15 downto 8) and sel_total_length_MSBs_vec) or + (tmp_total_length(7 downto 0) and sel_total_length_LSBs_vec) or + (tmp_header_checksum(15 downto 8) and sel_header_checksum_MSBs_vec) or + (tmp_header_checksum(7 downto 0) and sel_header_checksum_LSBs_vec) or + (tmp_length(15 downto 8) and sel_length_MSBs_vec) or + (tmp_length(7 downto 0) and sel_length_LSBs_vec); +---------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------- +-- Component Name: ALLOW_ZERO_UDP_CHECKSUM +-- Instance Name: ALLOW_ZERO_UDP_CHECKSUM_port_map +-- Description: Delays the user data transmition phase in order to transmit two bytes with zero +-- first. +---------------------------------------------------------------------------------------------------- +ALLOW_ZERO_UDP_CHECKSUM_port_map: ALLOW_ZERO_UDP_CHECKSUM port map +( + clk =>clk_125MHz, + input =>sel_length_LSBs, + output_to_readen =>start_usr_data_read, + output_to_datasel =>start_usr_data_trans +); +---------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------- +-- Component Name: ENABLE_USER_DATA_TRANSMISSION +-- Instance Name: ENABLE_USER_DATA_READ_port_map +-- Description: Sets usr_data_trans_phase_on signal one cycle before the transmittion of the +-- first user byte. +---------------------------------------------------------------------------------------------------- +ENABLE_USER_DATA_READ_port_map: ENABLE_USER_DATA_TRANSMISSION port map +( rst =>rst, + clk =>clk_125MHz, + start_usr_data_trans =>start_usr_data_read, + stop_usr_data_trans =>end_of_frame_O_tmp, + usr_data_sel =>usr_data_trans_phase_on +); +---------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------- +-- Component Name: ENABLE_USER_DATA_TRANSMISSION +-- Instance Name: ENABLE_USER_DATA_TRANSMISSION_port_map +-- Description: Sets usr_data_sel_sig signal to select user data for transmittion. +---------------------------------------------------------------------------------------------------- +ENABLE_USER_DATA_TRANSMISSION_port_map: ENABLE_USER_DATA_TRANSMISSION port map +( rst =>rst, + clk =>clk_125MHz, + start_usr_data_trans =>start_usr_data_trans, + stop_usr_data_trans =>end_of_frame_O_tmp, + usr_data_sel =>usr_data_sel_sig +); +---------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------------- +-- MUX 2 to 1 +usr_data_not_sel_vec<=(others=>not usr_data_sel_sig); +usr_data_sel_vec<=(others=>usr_data_sel_sig); + +-- MUX output +transmit_data_output_bus<=(transmit_data_output_bus_no_usr_data and usr_data_not_sel_vec) or + (transmit_data_input_bus and usr_data_sel_vec); +---------------------------------------------------------------------------------------------------- + +end Behavioral; Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.vhd (revision 2) @@ -0,0 +1,213 @@ +-------------------------------------------------------------------------------- +-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved. +-------------------------------------------------------------------------------- +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: K.39 +-- \ \ Application: netgen +-- / / Filename: wraddr_lut_mem.vhd +-- /___/ /\ Timestamp: Sat Feb 12 13:38:28 2011 +-- \ \ / \ +-- \___\/\___\ +-- +-- Command : -intstyle ise -w -sim -ofmt vhdl "C:\VERIFICATION PLATFORM\UDP_IP_FLEX\COREGEN\tmp\_cg\wraddr_lut_mem.ngc" "C:\VERIFICATION PLATFORM\UDP_IP_FLEX\COREGEN\tmp\_cg\wraddr_lut_mem.vhd" +-- Device : 5vsx95tff1136-1 +-- Input file : C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/tmp/_cg/wraddr_lut_mem.ngc +-- Output file : C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/tmp/_cg/wraddr_lut_mem.vhd +-- # of Entities : 1 +-- Design Name : wraddr_lut_mem +-- Xilinx : C:\Xilinx\10.1\ISE +-- +-- Purpose: +-- This VHDL netlist is a verification model and uses simulation +-- primitives which may not represent the true implementation of the +-- device, however the netlist is functionally correct and should not +-- be modified. This file cannot be synthesized and should only be used +-- with supported simulation tools. +-- +-- Reference: +-- Development System Reference Guide, Chapter 23 +-- Synthesis and Simulation Design Guide, Chapter 6 +-- +-------------------------------------------------------------------------------- + + +-- synthesis translate_off +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +use UNISIM.VPKG.ALL; + +entity wraddr_lut_mem is + port ( + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 5 downto 0 ); + qspo : out STD_LOGIC_VECTOR ( 5 downto 0 ) + ); +end wraddr_lut_mem; + +architecture STRUCTURE of wraddr_lut_mem is + signal N0 : STD_LOGIC; + signal N1 : STD_LOGIC; + signal a_2 : STD_LOGIC_VECTOR ( 5 downto 0 ); + signal qspo_3 : STD_LOGIC_VECTOR ( 5 downto 0 ); + signal BU2_U0_gen_rom_rom_inst_spo_int : STD_LOGIC_VECTOR ( 5 downto 0 ); + signal BU2_qdpo : STD_LOGIC_VECTOR ( 0 downto 0 ); +begin + a_2(5) <= a(5); + a_2(4) <= a(4); + a_2(3) <= a(3); + a_2(2) <= a(2); + a_2(1) <= a(1); + a_2(0) <= a(0); + qspo(5) <= qspo_3(5); + qspo(4) <= qspo_3(4); + qspo(3) <= qspo_3(3); + qspo(2) <= qspo_3(2); + qspo(1) <= qspo_3(1); + qspo(0) <= qspo_3(0); + VCC_0 : VCC + port map ( + P => N1 + ); + GND_1 : GND + port map ( + G => N0 + ); + BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000041 : LUT5 + generic map( + INIT => X"31266226" + ) + port map ( + I0 => a_2(4), + I1 => a_2(5), + I2 => a_2(1), + I3 => a_2(2), + I4 => a_2(3), + O => BU2_U0_gen_rom_rom_inst_spo_int(4) + ); + BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000051 : LUT5 + generic map( + INIT => X"16063662" + ) + port map ( + I0 => a_2(4), + I1 => a_2(5), + I2 => a_2(3), + I3 => a_2(2), + I4 => a_2(1), + O => BU2_U0_gen_rom_rom_inst_spo_int(5) + ); + BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom0000111 : LUT5 + generic map( + INIT => X"31276723" + ) + port map ( + I0 => a_2(4), + I1 => a_2(5), + I2 => a_2(1), + I3 => a_2(2), + I4 => a_2(3), + O => BU2_U0_gen_rom_rom_inst_spo_int(1) + ); + BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000021 : LUT5 + generic map( + INIT => X"13166627" + ) + port map ( + I0 => a_2(4), + I1 => a_2(5), + I2 => a_2(2), + I3 => a_2(1), + I4 => a_2(3), + O => BU2_U0_gen_rom_rom_inst_spo_int(2) + ); + BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000031 : LUT5 + generic map( + INIT => X"32166336" + ) + port map ( + I0 => a_2(4), + I1 => a_2(5), + I2 => a_2(2), + I3 => a_2(1), + I4 => a_2(3), + O => BU2_U0_gen_rom_rom_inst_spo_int(3) + ); + BU2_U0_gen_rom_rom_inst_Mrom_spo_int_rom000011 : LUT6 + generic map( + INIT => X"1B161F061F043F2C" + ) + port map ( + I0 => a_2(3), + I1 => a_2(4), + I2 => a_2(5), + I3 => a_2(0), + I4 => a_2(1), + I5 => a_2(2), + O => BU2_U0_gen_rom_rom_inst_spo_int(0) + ); + BU2_U0_gen_rom_rom_inst_qspo_int_5 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_rom_rom_inst_spo_int(5), + Q => qspo_3(5) + ); + BU2_U0_gen_rom_rom_inst_qspo_int_4 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_rom_rom_inst_spo_int(4), + Q => qspo_3(4) + ); + BU2_U0_gen_rom_rom_inst_qspo_int_3 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_rom_rom_inst_spo_int(3), + Q => qspo_3(3) + ); + BU2_U0_gen_rom_rom_inst_qspo_int_2 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_rom_rom_inst_spo_int(2), + Q => qspo_3(2) + ); + BU2_U0_gen_rom_rom_inst_qspo_int_1 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_rom_rom_inst_spo_int(1), + Q => qspo_3(1) + ); + BU2_U0_gen_rom_rom_inst_qspo_int_0 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_rom_rom_inst_spo_int(0), + Q => qspo_3(0) + ); + BU2_XST_GND : GND + port map ( + G => BU2_qdpo(0) + ); + +end STRUCTURE; + +-- synthesis translate_on Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/ALLOW_ZERO_UDP_CHECKSUM.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/ALLOW_ZERO_UDP_CHECKSUM.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/ALLOW_ZERO_UDP_CHECKSUM.vhd (revision 2) @@ -0,0 +1,60 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 14:46:33 12/04/2009 +-- Design Name: +-- Module Name: ALLOW_ZERO_UDP_CHECKSUM - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity ALLOW_ZERO_UDP_CHECKSUM is + Port ( clk : in STD_LOGIC; + input : in STD_LOGIC; + output_to_readen : out STD_LOGIC; + output_to_datasel : out STD_LOGIC); +end ALLOW_ZERO_UDP_CHECKSUM; + +architecture Behavioral of ALLOW_ZERO_UDP_CHECKSUM is + +signal input_reg : std_logic; + +begin + +process(clk) +begin + if clk'event and clk='1' then + input_reg<=input; + end if; +end process; + +output_to_readen<=input_reg; + +process(clk) +begin + if clk'event and clk='1' then + output_to_datasel<=input_reg; + end if; +end process; + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_11B_EN_TRANS.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_11B_EN_TRANS.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/COUNTER_11B_EN_TRANS.vhd (revision 2) @@ -0,0 +1,58 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 16:16:57 11/30/2009 +-- Design Name: +-- Module Name: COUNTER_11B_EN_TRANS - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity COUNTER_11B_EN_TRANS is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + count_en : in STD_LOGIC; + value_O : inout STD_LOGIC_VECTOR (10 downto 0)); +end COUNTER_11B_EN_TRANS; + +architecture Behavioral of COUNTER_11B_EN_TRANS is + +begin + +process(clk) +begin +if rst='1' then + value_O<="11111110110"; +else + if clk'event and clk='1' then + if count_en='1' then + value_O<=value_O+"00000000001"; + else + value_O<=value_O; + end if; + end if; +end if; +end process; + + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.vhd (revision 2) @@ -0,0 +1,141 @@ +-------------------------------------------------------------------------------- +-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved. +-------------------------------------------------------------------------------- +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: K.39 +-- \ \ Application: netgen +-- / / Filename: comp_6b_equal.vhd +-- /___/ /\ Timestamp: Mon Nov 30 14:23:03 2009 +-- \ \ / \ +-- \___\/\___\ +-- +-- Command : -intstyle ise -w -sim -ofmt vhdl C:\PHd_Projects\The_Felsenstein_CoProcessor\COREGEN_Design\tmp\_cg\comp_6b_equal.ngc C:\PHd_Projects\The_Felsenstein_CoProcessor\COREGEN_Design\tmp\_cg\comp_6b_equal.vhd +-- Device : 5vsx95tff1136-1 +-- Input file : C:/PHd_Projects/The_Felsenstein_CoProcessor/COREGEN_Design/tmp/_cg/comp_6b_equal.ngc +-- Output file : C:/PHd_Projects/The_Felsenstein_CoProcessor/COREGEN_Design/tmp/_cg/comp_6b_equal.vhd +-- # of Entities : 1 +-- Design Name : comp_6b_equal +-- Xilinx : C:\Xilinx\10.1\ISE +-- +-- Purpose: +-- This VHDL netlist is a verification model and uses simulation +-- primitives which may not represent the true implementation of the +-- device, however the netlist is functionally correct and should not +-- be modified. This file cannot be synthesized and should only be used +-- with supported simulation tools. +-- +-- Reference: +-- Development System Reference Guide, Chapter 23 +-- Synthesis and Simulation Design Guide, Chapter 6 +-- +-------------------------------------------------------------------------------- + + +-- synthesis translate_off +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +use UNISIM.VPKG.ALL; + +entity comp_6b_equal is + port ( + qa_eq_b : out STD_LOGIC; + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 5 downto 0 ); + b : in STD_LOGIC_VECTOR ( 5 downto 0 ) + ); +end comp_6b_equal; + +architecture STRUCTURE of comp_6b_equal is + signal BU2_N01 : STD_LOGIC; + signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o85_16 : STD_LOGIC; + + signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result : STD_LOGIC; + signal BU2_a_ge_b : STD_LOGIC; + signal NLW_VCC_P_UNCONNECTED : STD_LOGIC; + signal NLW_GND_G_UNCONNECTED : STD_LOGIC; + signal a_2 : STD_LOGIC_VECTOR ( 5 downto 0 ); + signal b_3 : STD_LOGIC_VECTOR ( 5 downto 0 ); +begin + a_2(5) <= a(5); + a_2(4) <= a(4); + a_2(3) <= a(3); + a_2(2) <= a(2); + a_2(1) <= a(1); + a_2(0) <= a(0); + b_3(5) <= b(5); + b_3(4) <= b(4); + b_3(3) <= b(3); + b_3(2) <= b(2); + b_3(1) <= b(1); + b_3(0) <= b(0); + VCC_0 : VCC + port map ( + P => NLW_VCC_P_UNCONNECTED + ); + GND_1 : GND + port map ( + G => NLW_GND_G_UNCONNECTED + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o107 : +LUT6 + generic map( + INIT => X"0000000080200802" + ) + port map ( + I0 => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o85_16 +, + I1 => b_3(5), + I2 => b_3(4), + I3 => a_2(5), + I4 => a_2(4), + I5 => BU2_N01, + O => BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o107_SW0 : +LUT4 + generic map( + INIT => X"6FF6" + ) + port map ( + I0 => a_2(0), + I1 => b_3(0), + I2 => a_2(3), + I3 => b_3(3), + O => BU2_N01 + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o85 : +LUT4 + generic map( + INIT => X"9009" + ) + port map ( + I0 => a_2(1), + I1 => b_3(1), + I2 => a_2(2), + I3 => b_3(2), + O => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o85_16 + + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_gen_output_reg_output_reg_fd_output_1 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result, + Q => qa_eq_b + ); + BU2_XST_GND : GND + port map ( + G => BU2_a_ge_b + ); + +end STRUCTURE; + +-- synthesis translate_on Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.xco =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.xco (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.xco (revision 2) @@ -0,0 +1,63 @@ +############################################################## +# +# Xilinx Core Generator version K.39 +# Date: Sat Feb 12 12:38:28 2011 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# BEGIN Project Options +SET addpads = False +SET asysymbol = False +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = False +SET designentry = VHDL +SET device = xc5vsx95t +SET devicefamily = virtex5 +SET flowvendor = Other +SET formalverification = False +SET foundationsym = False +SET implementationfiletype = Ngc +SET package = ff1136 +SET removerpms = False +SET simulationfiles = Structural +SET speedgrade = -1 +SET verilogsim = False +SET vhdlsim = True +# END Project Options +# BEGIN Select +SELECT Distributed_Memory_Generator family Xilinx,_Inc. 3.4 +# END Select +# BEGIN Parameters +CSET ce_overrides=ce_overrides_sync_controls +CSET coefficient_file="C:/VERIFICATION PLATFORM/UDP_IP_FLEX/THE_FELSENSTEIN_COPROCESSOR/wraddr_lut.coe" +CSET common_output_ce=false +CSET common_output_clk=false +CSET component_name=wraddr_lut_mem +CSET data_width=6 +CSET default_data=0 +CSET default_data_radix=16 +CSET depth=64 +CSET dual_port_address=non_registered +CSET dual_port_output_clock_enable=false +CSET input_clock_enable=false +CSET input_options=non_registered +CSET memory_type=rom +CSET output_options=registered +CSET pipeline_stages=0 +CSET qualify_we_with_i_ce=false +CSET reset_qdpo=false +CSET reset_qspo=false +CSET single_port_output_clock_enable=false +CSET sync_reset_qdpo=false +CSET sync_reset_qspo=false +# END Parameters +GENERATE +# CRC: 5a000833 + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.ngc =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.ngc (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.ngc (revision 2) @@ -0,0 +1,3 @@ +XILINX-XDB 0.1 STUB 0.1 ASCII +XILINX-XDM V1.4e +$8dx5d=#Zl|bdaa:!3-522):'?%8#?/$0937>7)88:0=<4FNQWW>d:683:5==5>1;KMTPR=j5;;6=0i;4tp|<3sno;:?;#>119:456789:;<=>?0127?<6718:05=>60123456719:2?6LZ299AQVYNFOE:7N;:;B8,TMbXX{eainz|/Ujf[Cck{ldxxhga_BmSvjeb{zey#NA]EFGM[Actand$x`~ _be,gjkwW8;iShzam,mcj753JBNOFQCIBGMW@YSQYO27NABMHVWAA733JEYIRIJNDPBPLIIW@DMC:5LRDCWAA72FDMIKK7:NLCLEFD=1GYY:;;MWW2f=JiceyZh||inl`?Hoig{\n~~g`n29M555H6?:1E=5=4N0;1?K443G8;?6@=129M675H4>;1E8?5A539M27=I?;1E4?5A9g9MFZDR[YCES]\@PR58J@RPG[A:7B<4OJ38T1=WI[^j7]GA_CWPMA^e3YCESO[\N@OF5>W13ZE^^NK;;U[SA3e<]9%licQ|tsw`pptbWeelen heo]mkkvnxlfbbhj!a^grqdjXff~n}xoc_c,j[dYbyVdnSo!heo]lqqvr|Vxnk#aztqww[wc`'on$cxzuu]2=f=R8&mnbR}{rtawqwcXdfmbo#ijn^lljuowmeceii n_dsveiYig}ozylbPb/k\eZcvWgoTn"gPurg\gdtuqVzgy~Qcuuq-hprXign%eRintd]amq)salxTkh`T1\,j[qobz&fdc}Q{imgp_5[)aV~b`h!`12;:g>S7'noeS~z}ubvvv`Ykgnch"jka_ommtlvbd`dnh#oPepwbhZhh|l{~maQm.h]b[`wXflUi#dQzsd]`ewt~Wyf~Rbztr,oqqYffm$bSjo{e^`jp*rnm{UlicU>]/k\plcu'eed|RzfldqX4X(nW}cgi"a>88;`?P6(oldTy|zcuwqaZjho`i%kh`Pnnlsmuckagoo"lQjqtco[kismxj`Rl!i^c\atYimVh$eR{|e^abvwXxexSa{{s/nvpZgil'cTklzj_ckw+qobzVmnbV?R.h]wm`t(dfe{SygcerY3Y+oX|`fn#b8<4U1-dakYt|{hxx|j_mmdmf(`mgUecc~fpdnjj`b)iVozylbPnnvfupgkWk$bSlQjq^lf[g)smdzT~h}zluc8QVCUWHFBM^m4URGQ[SOTAKFN?6XLC89UM@QX\PZN=i5WIMKM\(^CJ):%=-][UC"3*4&F[JCB:6V\TMKA3>^T\VMEHo5W_BMQAZOINF<0TilPIed8\anXX{cfZh||inl24>^ceVGjfb|Yesqjkk773QnfS@gaosTfvvohf=1j$=';;`*2-0=f 8:"86o'2(68e-5.<2k#8$:4a)7*0>g/> >0m%9&4:c+<,27l2>0?68e979<2k7>3:4a=1=0>g;<7>0m1;14:c?2;22kTi|Qm6:c\c`Ye>2kTkyQm6:c\h`Ye>2kT`yQm6:c\j`Ye<2kh`:4argw0>d/8 >0n%?&5:`+55/33k"9%95m(2+7?g.3!=1i$8';;c*5-1=e >#?7o&7)59a,0;;c>7:1=e4<4?7o29>59a82833k63295m<8<05>eXkfg{mkPv8]3(%^nd`ds,NA]E!Efj`tf|fx+== >.11\mu553jo87nbde:aliuY69kUn}xoc269`khvX98hTi|{nl-a\gjkwi{oTz4Q?,OMMA)HHFL;im6m`mq]25gYby|kg nQlolrbv`Yq1V:'wnQgar]reZabWk7; nQgar]reZhbWk7; nQgar]reZjsWk7; nQgar]bw`r:8%iTdl}Pa^ew[g;7$jUcm~Qn_ds\f86+kVnjxlQ{yqg>5)eX{pdhS}|foskw}87+kVbjR}lls?3(fYoizUzmRi{_c?3(fYpam~c14)eX`hyTmnb}=1.`[vikVoemobj=1.`[mgtWzynx0>#c^jbwZwfWeoTn0>#c^jbwZgXolUi1="l_c]`kkusig~6?012345*z::1hc`~P10`\atsfdViTobcasg\rwfWn~Tn:5~a^nf[g16?4>33;3bd<5=1=iwc;9:09m12<33-??68>4}Rg9=0<528995=hn:37;3g=T9j02:7>5120:4cg=:<20;;6>7<6;;3;jl4=595a?sR3;3:1=7?51dyP55<>=381=><60gc960>0j2.?j7?k;W76>7}r:90:7x<>:19~ 6`==2h2=7>51980>4>|@=n0Vl4={287>x"3<33:7);<:9g8m0g=83.?=78;;o63>5=;6?54i7294?"3931=;6;54i4a94?"393==;6l54i6;94?"393287c:?:198m=7=83.?=76<;o63>4=43g>;6>54i6g94?"393287c:?:598m2b=83.?=76<;o63>0=i1<7*;1;:0?k272?10e:l50;&75?>43g>;6:54i6c94?"393287c:?:998m2>=83.?=76<;o63><==1<7*;1;:0?k272h10c4950;9j=5<722h?i7>51;294~N3l2.?87:j;n1f>5<:183M2c3->?6<:4o0194?=zj00;6?657;3fM2c3Sk18v=54;190?{#<=0286*k:808 c<>;2.8m7=k;h;g>5<>i>03:17d6i:188k25=831d;<4?::m46?6=3`?j6=4+40850>h383:07d8=:18'04<1<2d?<7?4;h42>5<#<80=86`;0;08?l07290/8<494:l74?5<3`?m6=4+40850>h383>07d;j:18'04<1<2d?<7;4;h7g>5<#<80=86`;0;48?l3d290/8<494:l74?1<3`?i6=4+40850>h383207d;6:18'04<1<2d?<774;h7;>5<#<80=86`;0;c8?l1>290/8<473:l74?6<3`2:6=4+408;7>h383;07d6?:18'045<#<803?6`;0;18?l1b290/8<473:l74?2<3`=o6=4+408;7>h383?07d9l:18'045<#<803?6`;0;58?l1f290/8<473:l74?><3`=36=4+408;7>h383307d98:18'045<>o>83:17b7m:188m=6F;d:m27?6=3th?97>53;294~"3<3;97E;>;I6g?!7e281bn7>5;h32>5<5<>o603:17b=l:188yg2f290>6=4?{%67>4c<@<;0D9j4$0`93>o6=3:17d?9:188m41=831b=54?::m0g?6=3th?:7>57;294~"3<3;m7E;>;I6g?!7e211b=84?::k22?6=3`;<6=44i0:94?=n900;66g>a;29?j5d2900qo:8:184>5<7s->?65;29?l712900e<950;9j5=<722c:57>5;h3b>5<5<>o603:17d?6:188m4g=831d?n4?::p35<72jqU5n5Q729]37=Y>o1U;95Q989]===Y1k1U5l5Q709]35=:=;0:?6s|9183>7}Y1916884m;|q:3?6=:rT2;63;5;61?xu1=3:1>vP:a:?72?7>3ty=i7>52z\56>;3>3;<7p}9d;296~X1927?:7?:;|q5g?6=:rT=<63;7;3:?xu1j3:1>vP:f:?73?703ty=m7>52z\6a>;3?3;>7p}99;296~X2l27?m7?8;|q5o63;a;36?xu1?3:1>vP:b:?752z\6=>;313;<7p}93;296~X2027?57?:;|q;0?6=:rT<563;6;3b?xu?l3:1>vP71:?72?7?3ty3o7>52z\;4>;3>3;=7p}7b;296~X0n27?;7?n;|q;e?6=:rTvP8d:?73?713ty347>52z\4g>;3i3;37p}77;296~X0j27?m7?9;|q;2?6=:rTvP88:?7=?7?3ty3>7>52z\43>;313;=7p};b;296~;3=3;:70:7:2a8yv2>2909w0:6:2a891>=9>1v9o50;0x91g=;j16854>8:p03<72;q68;43ty?;7>52z?73?5d34>36m636:4c8 1e=:j1v;k50;0xZ34<500=>6*;c;11?xu1l3:1>vP91:?:>37<,=i1?95rs7a94?4|V?:014490:&7g?523ty=n7>52z\6b>;>2"3k39<7p}99;296~X2l27268j4$5a97==z{?21<7n636:4`8 1e=:;1v;850;0xZ0?<500>56*;c;00?xu1;3:1>vP:8:?:>0><,=i1>95rs9694?4|V>3014489:&7g?423ty3h7>52z\;5>;>21;0(9m5279~w=e=838pR5>4=88;4>"3k38<7p}7b;296~X0n2726:h4$5a96==z{1k1<7vP8b:?:>2d<,=i1>i5rs9494?4|V>k01448a:&7g?4b3ty397>52z\4<>;>2>20(9m52g9~w=4=838pR:94=8843>"3k39;7p}60;296~X>827264>4$5a974=z{0=1<7?2.?o7=<;|m==<72;qC8i5rn8;94?4|@=n0qc7n:181M2c3td2n7>52zJ7`>{i1j0;6?uG4e9~j5<5sA>o7p`6f;296~N3l2wem=4?:3yK0a=zfh;1<77}OvF;d:me=<72;qC8i5rn`;94?4|@=n0qcon:181M2c3tdjn7>52zJ7`>{iij0;6?uG4e9~jdb=838pD9j4}ocf>5<5sA>o7p`nf;296~N3l2we;l4?:0yK0a=zf091<7?tH5f8yk?3290:wE:k;|l:1?6=9rB?h6sa9783>4}Oj0 + + allow_match<='0'; + + next_st<=idle_state; + +when idle_state => + + allow_match<='0'; + + if sof='0' then + next_st <= header_state; + else + next_st <= idle_state; + end if; + +when header_state => + + if vld_i='1' then + allow_match<='1'; + next_st <= rst_state; + else + allow_match<='0'; + next_st <= header_state; + end if; + +end case; +end process; + +allow_match_v <=(others=>allow_match); +val_i_to_match <= val_i and allow_match_v; + +process(clk) +begin +if clk'event and clk='1' then + if val_i_to_match = cmd_to_match then + cmd_match <='1'; + else + cmd_match <='0'; + end if; +end if; +end process; + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/TARGET_EOF.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/TARGET_EOF.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/TARGET_EOF.vhd (revision 2) @@ -0,0 +1,106 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 16:22:56 11/30/2009 +-- Design Name: +-- Module Name: TARGET_EOF - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity TARGET_EOF is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + start : in STD_LOGIC; + total_length_from_reg : in STD_LOGIC_VECTOR(15 downto 0); + eof_O : out STD_LOGIC); +end TARGET_EOF; + +architecture Behavioral of TARGET_EOF is + +signal count_end : std_logic:='0'; +signal count_en_sig : std_logic:='0'; +signal rst_counter : std_logic:='0'; + +component COUNTER_11B_EN_TRANS is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + count_en : in STD_LOGIC; + value_O : inout STD_LOGIC_VECTOR (10 downto 0)); +end component; + +signal value_O_tmp : std_logic_vector(10 downto 0); + +component comp_11b_equal is + port ( + qa_eq_b : out STD_LOGIC; + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 10 downto 0 ); + b : in STD_LOGIC_VECTOR ( 10 downto 0 ) + ); +end component; + +signal last_byte,last_byte_reg_in,last_byte_reg_out : std_logic; + +begin + +process(clk) +begin +if (rst='1' or count_end='1') then + count_en_sig<='0'; + rst_counter<='1'; +else + rst_counter<='0'; + if clk'event and clk='1' then + if (start='1' and count_en_sig='0') then + count_en_sig<='1'; + end if; + end if; +end if; +end process; + + +COUNT_TRANFERED_BYTES : COUNTER_11B_EN_TRANS port map +( rst =>rst_counter, + clk =>clk, + count_en => count_en_sig, + value_O =>value_O_tmp +); + +COMP_TO_TARGET_LAST_BYTE : comp_11b_equal port map +( + qa_eq_b =>last_byte_reg_in, + clk =>clk, + a =>value_O_tmp, + b =>total_length_from_reg(10 downto 0) +); + +process(clk) +begin +if clk'event and clk='1' then + last_byte_reg_out<=last_byte_reg_in; +end if; +end process; +eof_O<=not last_byte_reg_out; +count_end<=last_byte_reg_out; +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.ngc =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.ngc (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.ngc (revision 2) @@ -0,0 +1,3 @@ +XILINX-XDB 0.1 STUB 0.1 ASCII +XILINX-XDM V1.4e +$d;x5d=#Zl|bdaa:!3-522):'?%8#?/$09355=789:;<=>?0123456682:;<=>?0123457789;;7=>?0123456799:;<<>40123456789::8=>?1193456789:;<8>;01224>6789:;<=>?8123457739:;<=>?012;41678:1:"=h45wq{=0ran8;8: ?j;78JJUSS2h6>6=0>1:49MKVR\3n{~l2::1<25>0=AGZ^X7}r`>6>58b310BB][[:e>4>5869221CXZ_UU8gtj:0294:>665OTVSQQ1139;>JSSX\^1}~~`<683:47<03E^X][[:rrl82<76;1JE='_OYEKGLAUKLJ%VKI]LD^@!ZDQ]JTZ@KMQ%HC_KHEO-wiu)Xkn%oe~zPmdo\21~?&gmd=?5LHDAH[IODMGYNSYW_E89@KHKN\]OO=95LOSG\C@HBZH^BCCQFNGM4?FTBI]OO=6J=;GF2?B57C<>0178J7779<1E><>=5:L155523G8:<9;4N33310=I:8:=96@=1156?K4681?0B???949M6477=2D9=H59;=>7C<>5378J772;<1E><;;5:L150323G8:9;;4N33630=I:8?396@=14;e?KDXJ\Y[ECQ_RNRP3>HB\^EYG:5AOLGQC@7;P:8VDK1R^XL897X> gdl\wuYuid$x|ob_hlpp*KuidUym`?=2:W3+bciWzzT~lc!sqpbiZoi{}%F~lcPr`o167=R8&mnbR}_scn*vvuidUbb~z Mscn[wgj;;80Y=!heo]ptZtfe'y{~lcPioqw+HtfeVxja9<=;T2,c`hX{yUym` |pscn[lht|&Gym`Q}al716>S7'noeS~~Pr`o-wutfeVcey!Br`o\vdk1:;1^<"ijn^qs[wgj&zzym`Qfnrv,IwgjW{kf;?<4U1-dakYtxVxja#}r`o\mkus'DxjaR|nm907?P6(oldT}Q}al,ptwgjW`dxx"|pn]jjq:76;>0Y=!heo]ptZtfe'y{~lcPioqw+tuwgVcex1?1259V4*abfVy{Sob.rrqehYnfz~$}~~`_hlw8785<2_;#jka_rr\vdk){yxjaRgasu-rwuiXag~7?3<;;T2,c`hX{yUym` |pscn[lht|&{x|bQfnu>7:72<]9%licQ|p^pbi+uwzhgTec}{/pqskZoi|5?5>95Z0.efjZuwW{kf"~~}al]jjvr(yzzdSd`{<7<10>S7'noeS~~Pr`o-wutfeVcey!~sqm\mkr;?7887X> gdl\wuYuid$x|ob_hlpp*wtxfUbbyQ?229V4*abfVy{Sob.rrqehYnfz~$}~~`_hlw[4443\:$kh`Psq]qeh(tx{kfSd`|t.sptjYnf}U9>>5Z0.efjZuwW{kf"~~}al]jjvr(yzzdSd`{_200?P6(oldT}Q}al,ptwgjW`dxx"|pn]jjqY3::1^<"ijn^qs[wgj&zzym`Qfnrv,uvvhW`dS8<<;T2,c`hX{yUym` |pscn[lht|&{x|bQfnu]566=R8&mnbR}_scn*vvuidUbb~z qrrl[lhsW>887X> gdl\wuYuid$x|ob_hlpp*uwgVcex1>1229V4*abfVy{Sob.rrqehYnfz~$}aPiov?5;443\:$kh`Psq]qeh(tx{kfSd`|t.qskZoi|585>>5Z0.efjZuwW{kf"~~}al]jjvr({yeTecz33?00?P6(oldT}Q}al,ptwgjW`dxx"}o^kmp929::1^<"ijn^qs[wgj&zzym`Qfnrv,wuiXag~793<<;T2,c`hX{yUym` |pscn[lht|&y{cRgat=4=66=R8&mnbR}_scn*vvuidUbb~z sqm\mkr;?7k0Y^K]_@NJEVe<]ZOYS[G\ICNF7>PDK01]EHYPTXRF0>QDDB80[H?k;YKOMK^*PMH+<#?/SUWA$5(6(HYHED84XRVOMG1^c`VZye`Xjrrklj463:1=f484?7l2=>59b86833h6?2;5n<483:1=f4<487nbd4:f+4,2b/> >0h%9&4:f?4;2b;>7<0h1950?68`919l2nbyQbel]50}>512nbyQbel]50}>+l`yS`kb_fgm[s5X<%DDBH"AOOG2af=caz~TahcP65z;(aot|VgnaRijn^t0[1*|kVbjRkpn]`hn;7$jUcm~Qllj?2(fYoizUzh}aPcd?3(fYoizUo1<"l_icp[vvh59&hSknd^ojb87+kVbjR|pn?2(fYpam~c15"l_sgd[dYcW`d{yy}20-a\lduXl7: nQiqgomkcX{}kli~3?,b]kevYvlyeT~~z20-a\v`aXlyxjSd`uu?3(fYv}hfbjtQxe<2/gZu~fjUnbllce<3/gZbbx}b6:9"l_icp[avui4:'oRfns^sptjYtzz~6#c^s`aZlhagoo1="l_lgn[qwm4;'oRfns^k\g`;7$jUcm~Qkpn?3(fYjmdUbbdzPfhnf9aot|VgnaR8;x9,nmc*dWmommxb{_ecwe86+kVbjR}r`?3(fYoizUz}aPcd?3(fYflmxT{dj{h<4/gZnf{V{o|b3?,b]kevYv{yeT~~z20-11>bn{}Ufi`Q94y:\`lusWdofSjka_w1\0Z~t|V;886jfsu]nahY`mgU}?R:# Ykomk~'KFXN,Jkaescwkw&68';%<>Qfp248`ui/8 <0h}a'1(48`ui/: <0h}a'3(48`ui/< <0h}a'5(48`ui/> <0h}a'7(:8`ui;?3:5;6jr`*3-2=cx{k#=$94dqpb,7/03mzym%=&7:fsvd.3!>1o|o'5(;8`utf4<0;255jdhd1jbb33`Uhi55agb`vmib03xn{c%>&7:sgtj.6!>1zh}a'2(58uavh :#<7|jo)6*3>wcxf">%:5~dqm+2,1wtxf":%:5~sqm+6,1'8;pqsk-2.?2{x|b&:)69rwui/> =0}~~`(6+4?tuwg5:5;6|pn>2:2=v{ye7>394qrrl86803xy{c1:17:sptj:26>1z}a36?;8uvvh4>0;2:5~sqm?3;1uwg!:":6}o)3*2>uwg!8":6}o)1*2>uwg!>":6}o)7*2>uwg!<":6}o)5*<>uwg5=1<394sqpb,5/03zzym%?&7:qsvd.5!>1x|o'3(58wutf =#<7~~}a)7*=>uwzh6>6=0=;vg~DEv6<=1KLu?l:G87>4}T:90i?775120gf=2=:>h>{R03>g5=13;8>il74;04f06<~]>m6=4>:0817~U583h8644>33fa<1<5?k?;7)9;:358R2e=:r947?4u3;94>{#=g!2d21k0b9l51:9j<7<72->h65o4n5`96>=n080;6):l:9c8j1d=;21b4=4?:%6`>=g!2d21k0b9l55:9j=1<72->h64m4n5`94>=n1:0;6):l:8a8j1d=921b5?4?:%6`>65f9083>!2d20i0b9l53:9j=5<72->h64m4n5`90>=n0o0;6):l:8a8j1d==21b4h4?:%6`>!2d20i0b9l57:9j5$5a9`6=i;:m`=?6=,=i1h>5a4c81?>id03:1(9m5d29m0g<432eh;7>5$5a9`6=i5a4c85?>id<3:1(9m5d29m0g<032cn47>5;c50>5<6290;wE9=;%73>2512=9809=vF82:X2e?77so0o6o4j:039g?7528:1=?4i:03955f;c3?!232=20clo50;&7g?ge3g>i6=54o`;94?"3k3ki7c:m:098kd>=83.?o7om;o6a>7=i6954o`794?"3k3ki7c:m:498kd2=83.?o7om;o6a>3=10eh850;&7g?c03g>i6=54id794?"3k3o<7c:m:098m`2=83.?o7k8;o6a>7=i6954id394?"3k3o<7c:m:498ma1=831bh;4?::k;0?6=,=i14l5a4c83?>o?;3:1(9m58`9m0g<632c3>7>5$5a9o0n3:1(9m58`9m0g<232c287>5$5a9=f=i;:k:6?6=,=i15n5a4c81?>o>93:1(9m59b9m0g<432c2<7>5$5a9=f=io?l3:1(9m59b9m0g<032ch?7>5;h:`>5<i6<54ob;94?"3k3n87c:m:398kf>=83.?o7j<;o6a>6=i6854ob794?"3k3n87c:m:798kf2=83.?o7j<;o6a>2=>od:3:17dl>:18'0f4;h`3>5<#6`;b;38?lga290/8n4m2:l7f?4<3`kn6=4+4b8a6>h3j3907dok:18'0f5<#6`;b;78?jba290/8n4j0:l7f?6<3fnn6=4+4b8f4>h3j3;07bjk:18'0f5<#h3j3?07bj6:18'0f5<#h6oh4n5`94>=hjj0;6):l:cd8j1d=921dno4?:%6`>g`65`b`83>!2d2kl0b9l53:9lf<<72->h6oh4n5`90>=hj10;6):l:cd8j1d==21dn:4?:%6`>g`!2d2kl0b9l57:9j`0<722h<57>51;294~"2838?7E97;I51?j442900qo8>:180>5<7s-?;6?<4H6:8L24<,;?1=6g>b;29?l462900c9j50;9~f34=8391<7>t$42967=O?11C;?5+2482?l7e2900e??50;9l0a<722wi:>4?:283>5}#=909>6F88:J46>"5=3;0e5;|`50?6=;3:15;n6g>5<6=4<:183!372;80D:64H608 73=92c:n7>5;h02>5<5239K3==O?;1/>84>;h3a>5<>{e>>0;6>4?:1y'15<5:2B<46F82:&11?7>i3l3:17pl98;297?6=8r.><7<=;I5;?M153-8>6<5f1c83>>o593:17b:k:188yg36290j6=4?{%73>1c<@>20D:<4$379<>o6;3:17d?;:188m43=831b=;4?::k23?6=3`;36=44i3394?=n?<0;66g86;29?j202900qo;=:18b>5<7s-?;69k4H6:8L24<,;?1>6g>3;29?l732900e<;50;9j53<722c:;7>5;h3;>5<>o0>3:17b:8:188yg34290j6=4?{%73>1c<@>20D:<4$3791>o6;3:17d?;:188m43=831b=;4?::k23?6=3`;36=44i3394?=n?<0;66g86;29?j202900qo;;:18b>5<7s-?;69k4H6:8L24<,;?1?6g>3;29?l732900e<;50;9j53<722c:;7>5;h3;>5<>o0>3:17b:8:188yg32290j6=4?{%73>1c<@>20D:<4$3793>o6;3:17d?;:188m43=831b=;4?::k23?6=3`;36=44i3394?=n?<0;66g86;29?j202900qo;9:18b>5<7s-?;69k4H6:8L24<,;?186g>3;29?l732900e<;50;9j53<722c:;7>5;h3;>5<>o0>3:17b:8:188yg30290j6=4?{%73>1c<@>20D:<4$3792>o6;3:17d?;:188m43=831b=;4?::k23?6=3`;36=44i3394?=n?<0;66g86;29?j202900qo;7:18b>5<7s-?;69k4H6:8L24<,;?1>6g>3;29?l732900e<;50;9j53<722c:;7>5;h3;>5<>o0>3:17b:8:188yv>d290:=vP7c:?55?7e34<96=0:n6395;3a?80128h01;951c9>2=<6j27>=79:;<71>23<5<91;85255841>;2=3=>70;9:678901=?<1695485:pa=<720qUi55250842>;2:3==70;<:648902=??1698486:?62?1134?<6:84=4:933=z{ko1<7?6{_fe?[bb3Wno7Sjl;_fa?[bf3Wn27Sj7;_cb?[g>3Wk37So8;_c5?[g23Wk?7So<;_`g?[dd3Whi7Sln;_`:?[d?3Wh<7Sl9;<5:>755<5sWi27089:5f8yv3c2909wSm7;<46>1b5<5sWi>708=:5f8yv3>2909wSm;;<42>1b16<6027>87?7;<76>4><5<<1=5525682<>;203;37p}79;29=~X?;27>=7?8;<71>41<5<91=:5255823>;2=3;<70;9:058901=9>16954>7:p<=<720qU4?5250822>;2:3;=70;<:048902=9?16984>6:?62?7134?<6<84=4:953=z{1=1<77t^938907=9<169?4>5:?67?7234??6<;4=47950=:=?0:963:7;36?83?28?0q~69:18:[>734?:6<:4=40951=:=:0:863:4;37?83228>01885159>12<6<27>47?;;|q;1?6=1rT11<6;27>97?<;<75>45<5<=1=>5259827>{t1m0;6?uQ959>1=<592wx5o4?:3y]=6=:=>09=6s|9`83>7}Y1;169;4=1:p=<<72;qU5<5254815>{t110;6?uQ919>11<592wx5:4?:3y]7}Y0l169?4=1:p=0<72;qU4i5250815>{t>00;6?u260815>;293><7p}9a;296~;1:38:70;=:558yv0e2909w08<:338905=<>1v;m50;0x932=:816994;7:p2a<72;q6:84=1:?61?203ty=i7>52z?52?4634?=6994}r4e>5<5s4<<6??4=45902=z{>:1<79;ce?87>2ho01<75ae9>5<`3<5831i952188f7>;613o970?6:d3894?=k816=44k6:?2=?e534;26i94=0;9g6=z{;h1<7:t=6190<=:900i863>9;f6?87>2j:0q~6m:181[>334;265:4$6396f=z{131<7"0938n7p}77;296~X?927:576>;%52>7`21:0(:?5319~w=3=838pR:h4=0;93c=#?808=6s|9e83>7}Y1=16=4464:&45?553ty2n7>52z\:7>;613387)9>:218yv?f2909wS7=;<3:><4<,>;1?95rs8;94?4|V0;01<75909'34<4=2wx554?:3y]=5=:9002<6*81;15?xu>?3:1>vP7f:?2=?>a3-=:6>94}r;5>5<5sW2n70?6:9g8 27=;11v4;50;0xZ=b<58314i5+7080=>{t0j0;6?uQ8b9>5<9;g;?!162:h0q~j;:181[ee34;26nl4$6397f=z{m81<7"0939n7p}k0;296~Xd027:57m7;%52>6`2j=0(:?5419~wfc=838pRn84=0;9g3=#?80?=6s|ce83>7}Yk<16=44l5:&45?253tyho7>52z\`0>;613i?7)9>:518yxh68>0;65<5sA=97p`>0c83>7}O?;1vb<>l:181M153td:5<5sA=97p`>1283>7}O?;1vb0;6?uG739~j47?2909wE9=;|l25<<72;qC;?5G479~j47f2909wE9=;I65?xh69k0;6?uG739K03=zf8;h6=4={I51?M213td:=i4?:3yK37=O=7p`>1g83>7}O?;1C8;5rn003>5<5sA=97E:9;|lf6safg83>4}O?;1vb<>?:182M153td:<<4?:0yK37=zf8:96=4>{I51?xh68:0;65<6sA=97psr}AB@4232ml::8ml8|BCF~6zHIZpqMN \ No newline at end of file Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/REG_16B_WREN.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/REG_16B_WREN.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/REG_16B_WREN.vhd (revision 2) @@ -0,0 +1,56 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 21:15:16 11/27/2009 +-- Design Name: +-- Module Name: REG_16B_WREN - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: 16bit wide Register with write enable option. +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity REG_16B_WREN is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + wren : in STD_LOGIC; + input : in STD_LOGIC_VECTOR (15 downto 0); + output : out STD_LOGIC_VECTOR (15 downto 0)); +end REG_16B_WREN; + +architecture Behavioral of REG_16B_WREN is + +begin + +process(clk) +begin +if rst='1' then + output<="0000000000000000"; +else +if clk'event and clk='1' then + if wren='1' then + output<=input; + end if; +end if; +end if; +end process; + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPV4_LUT_INDEXER.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPV4_LUT_INDEXER.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPV4_LUT_INDEXER.vhd (revision 2) @@ -0,0 +1,110 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 22:11:55 11/27/2009 +-- Design Name: +-- Module Name: IPV4_LUT_INDEXER - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity IPV4_LUT_INDEXER is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + transmit_enable : in STD_LOGIC; + LUT_index : out STD_LOGIC_VECTOR (5 downto 0)); +end IPV4_LUT_INDEXER; + +architecture Behavioral of IPV4_LUT_INDEXER is + +component dist_mem_64x8 is + port ( + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 5 downto 0 ); + qspo : out STD_LOGIC_VECTOR ( 7 downto 0 ) + ); +end component; + +component COUNTER_6B_LUT_FIFO_MODE is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + funct_sel : in STD_LOGIC; -- 0 for lut addressing, 1 for fifo addressing -- only LUT support is used + count_en : in STD_LOGIC; + value_O : inout STD_LOGIC_VECTOR (5 downto 0)); +end component; + +component comp_6b_equal is + port ( + qa_eq_b : out STD_LOGIC; + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 5 downto 0 ); + b : in STD_LOGIC_VECTOR ( 5 downto 0 ) + ); +end component; + +signal count_en_sig , count_end , rst_counter: std_logic :='0'; +signal count_val: std_logic_Vector(5 downto 0):=(others=>'0'); +signal count_en_sig_comb : std_logic; +constant lut_upper_address :std_logic_vector(5 downto 0):="100110"; -- position 38 + +begin + +process(clk) +begin +if (rst='1' or count_end='1') then + count_en_sig<='0'; + rst_counter<='1'; +else + rst_counter<='0'; + if clk'event and clk='1' then + if (transmit_enable='1' and count_en_sig='0') then + count_en_sig<='1'; + end if; + end if; +end if; +end process; + +LUT_END_CHECK : comp_6b_equal port map ( +qa_eq_b =>count_end, + clk =>clk, + a =>count_val, + b =>lut_upper_address + +); + +count_en_sig_comb <=count_en_sig or transmit_enable; + + + +LUT_INDEXER_MODULE : COUNTER_6B_LUT_FIFO_MODE port map ( + rst => rst_counter, + clk => clk, + funct_sel =>'0', -- for now only one function is supported + count_en =>count_en_sig_comb, + value_O =>count_val +); + +LUT_index<=count_val; + + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.xco =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.xco (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_6b_equal.xco (revision 2) @@ -0,0 +1,59 @@ +############################################################## +# +# Xilinx Core Generator version K.39 +# Date: Mon Nov 30 13:23:03 2009 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# BEGIN Project Options +SET addpads = False +SET asysymbol = False +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = False +SET designentry = VHDL +SET device = xc5vsx95t +SET devicefamily = virtex5 +SET flowvendor = Other +SET formalverification = False +SET foundationsym = False +SET implementationfiletype = Ngc +SET package = ff1136 +SET removerpms = False +SET simulationfiles = Structural +SET speedgrade = -1 +SET verilogsim = False +SET vhdlsim = True +# END Project Options +# BEGIN Select +SELECT Comparator family Xilinx,_Inc. 9.0 +# END Select +# BEGIN Parameters +CSET aclr=false +CSET ainitval=0 +CSET aset=false +CSET ce=false +CSET cepriority=Sync_Overrides_CE +CSET component_name=comp_6b_equal +CSET constantbport=false +CSET constantbportvalue=0000000000000000 +CSET datatype=Unsigned +CSET nonregisteredoutput=false +CSET operation=eq +CSET pipelinestages=0 +CSET radix=2 +CSET registeredoutput=true +CSET sclr=false +CSET sset=false +CSET syncctrlpriority=Reset_Overrides_Set +CSET width=6 +# END Parameters +GENERATE +# CRC: 74b0a9bd + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/ENABLE_USER_DATA_TRANSMISSION.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/ENABLE_USER_DATA_TRANSMISSION.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/ENABLE_USER_DATA_TRANSMISSION.vhd (revision 2) @@ -0,0 +1,64 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 12:05:48 12/04/2009 +-- Design Name: +-- Module Name: ENABLE_USER_DATA_TRANSMISSION - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity ENABLE_USER_DATA_TRANSMISSION is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + start_usr_data_trans : in STD_LOGIC; + stop_usr_data_trans : in STD_LOGIC; + usr_data_sel : out STD_LOGIC); +end ENABLE_USER_DATA_TRANSMISSION; + +architecture Behavioral of ENABLE_USER_DATA_TRANSMISSION is + +signal usr_data_sel_prev : std_logic :='0'; + +begin + +process(clk) +begin +if rst='1' then + usr_data_sel<='0'; + usr_data_sel_prev<='0'; +else + if clk'event and clk='1' then + if (start_usr_data_trans='1' and usr_data_sel_prev='0') then + usr_data_sel<='1'; + usr_data_sel_prev<='1'; + end if; + if (stop_usr_data_trans='0' and usr_data_sel_prev='1') then -- stop_usr_data_trans is active low + usr_data_sel<='0'; + usr_data_sel_prev<='0'; + end if; + end if; +end if; +end process; + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/comp_11b_equal.vhd (revision 2) @@ -0,0 +1,196 @@ +-------------------------------------------------------------------------------- +-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved. +-------------------------------------------------------------------------------- +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: K.39 +-- \ \ Application: netgen +-- / / Filename: comp_11b_equal.vhd +-- /___/ /\ Timestamp: Mon Nov 30 16:37:25 2009 +-- \ \ / \ +-- \___\/\___\ +-- +-- Command : -intstyle ise -w -sim -ofmt vhdl C:\PHd_Projects\The_Felsenstein_CoProcessor\COREGEN_Design\tmp\_cg\comp_11b_equal.ngc C:\PHd_Projects\The_Felsenstein_CoProcessor\COREGEN_Design\tmp\_cg\comp_11b_equal.vhd +-- Device : 5vsx95tff1136-1 +-- Input file : C:/PHd_Projects/The_Felsenstein_CoProcessor/COREGEN_Design/tmp/_cg/comp_11b_equal.ngc +-- Output file : C:/PHd_Projects/The_Felsenstein_CoProcessor/COREGEN_Design/tmp/_cg/comp_11b_equal.vhd +-- # of Entities : 1 +-- Design Name : comp_11b_equal +-- Xilinx : C:\Xilinx\10.1\ISE +-- +-- Purpose: +-- This VHDL netlist is a verification model and uses simulation +-- primitives which may not represent the true implementation of the +-- device, however the netlist is functionally correct and should not +-- be modified. This file cannot be synthesized and should only be used +-- with supported simulation tools. +-- +-- Reference: +-- Development System Reference Guide, Chapter 23 +-- Synthesis and Simulation Design Guide, Chapter 6 +-- +-------------------------------------------------------------------------------- + + +-- synthesis translate_off +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +use UNISIM.VPKG.ALL; + +entity comp_11b_equal is + port ( + qa_eq_b : out STD_LOGIC; + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 10 downto 0 ); + b : in STD_LOGIC_VECTOR ( 10 downto 0 ) + ); +end comp_11b_equal; + +architecture STRUCTURE of comp_11b_equal is + signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o189_29 : STD_LOGIC; + + signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o139_28 : STD_LOGIC; + + signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o62_27 : STD_LOGIC; + + signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o26_26 : STD_LOGIC; + + signal BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result : STD_LOGIC; + signal BU2_a_ge_b : STD_LOGIC; + signal NLW_VCC_P_UNCONNECTED : STD_LOGIC; + signal NLW_GND_G_UNCONNECTED : STD_LOGIC; + signal a_2 : STD_LOGIC_VECTOR ( 10 downto 0 ); + signal b_3 : STD_LOGIC_VECTOR ( 10 downto 0 ); +begin + a_2(10) <= a(10); + a_2(9) <= a(9); + a_2(8) <= a(8); + a_2(7) <= a(7); + a_2(6) <= a(6); + a_2(5) <= a(5); + a_2(4) <= a(4); + a_2(3) <= a(3); + a_2(2) <= a(2); + a_2(1) <= a(1); + a_2(0) <= a(0); + b_3(10) <= b(10); + b_3(9) <= b(9); + b_3(8) <= b(8); + b_3(7) <= b(7); + b_3(6) <= b(6); + b_3(5) <= b(5); + b_3(4) <= b(4); + b_3(3) <= b(3); + b_3(2) <= b(2); + b_3(1) <= b(1); + b_3(0) <= b(0); + VCC_0 : VCC + port map ( + P => NLW_VCC_P_UNCONNECTED + ); + GND_1 : GND + port map ( + G => NLW_GND_G_UNCONNECTED + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o206 : +LUT6 + generic map( + INIT => X"9000000000000000" + ) + port map ( + I0 => a_2(2), + I1 => b_3(2), + I2 => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o26_26 +, + I3 => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o62_27 +, + I4 => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o139_28 +, + I5 => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o189_29 +, + O => BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o189 : +LUT6 + generic map( + INIT => X"9009000000009009" + ) + port map ( + I0 => a_2(5), + I1 => b_3(5), + I2 => a_2(6), + I3 => b_3(6), + I4 => a_2(7), + I5 => b_3(7), + O => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o189_29 + + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o139 : +LUT6 + generic map( + INIT => X"9009000000009009" + ) + port map ( + I0 => a_2(8), + I1 => b_3(8), + I2 => a_2(9), + I3 => b_3(9), + I4 => a_2(10), + I5 => b_3(10), + O => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o139_28 + + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o62 : +LUT4 + generic map( + INIT => X"9009" + ) + port map ( + I0 => a_2(3), + I1 => b_3(3), + I2 => a_2(4), + I3 => b_3(4), + O => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o62_27 + + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o26 : +LUT4 + generic map( + INIT => X"9009" + ) + port map ( + I0 => a_2(0), + I1 => b_3(0), + I2 => a_2(1), + I3 => b_3(1), + O => +BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_i_use_carry_plus_luts_lut_and_i_gate_bit_tier_gen_1_i_tier_loop_tiles_0_i_tile_o26_26 + + ); + BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_gen_output_reg_output_reg_fd_output_1 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_structure_logic_gen_nonpipelined_a_equal_notequal_b_i_a_eq_ne_b_temp_result, + Q => qa_eq_b + ); + BU2_XST_GND : GND + port map ( + G => BU2_a_ge_b + ); + +end STRUCTURE; + +-- synthesis translate_on Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/UDP_IP_Core.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/UDP_IP_Core.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/UDP_IP_Core.vhd (revision 2) @@ -0,0 +1,188 @@ +----------------------------------------------------------------------------------------- +-- Copyright (C) 2010 Nikolaos Ch. Alachiotis -- +-- -- +-- Engineer: Nikolaos Ch. Alachiotis -- +-- -- +-- Contact: n.alachiotis@gmail.com -- +-- -- +-- Create Date: 04/03/2011 -- +-- Module Name: UDP_IP_Core -- +-- Target Devices: Virtex 5 FPGAs -- +-- Tool versions: ISE 10.1 -- +-- Description: This component can be used to transmit and receive UDP/IP -- +-- Ethernet Packets (IPv4). -- +-- Additional Comments: The core has been area-optimized and is suitable for direct -- +-- PC-FPGA communication at Gigabit speed. -- +-- -- +----------------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity UDP_IP_Core is + Port ( rst : in STD_LOGIC; -- active-high + clk_125MHz : in STD_LOGIC; + + -- Transmit signals + transmit_start_enable : in STD_LOGIC; + transmit_data_length : in STD_LOGIC_VECTOR (15 downto 0); + usr_data_trans_phase_on : out STD_LOGIC; + transmit_data_input_bus : in STD_LOGIC_VECTOR (7 downto 0); + start_of_frame_O : out STD_LOGIC; + end_of_frame_O : out STD_LOGIC; + source_ready : out STD_LOGIC; + transmit_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0); + + --Receive Signals + rx_sof : in STD_LOGIC; + rx_eof : in STD_LOGIC; + input_bus : in STD_LOGIC_VECTOR(7 downto 0); + valid_out_usr_data : out STD_LOGIC; + usr_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0); + + + locked : out STD_LOGIC + ); +end UDP_IP_Core; + +architecture Behavioral of UDP_IP_Core is + +component IPV4_PACKET_TRANSMITTER is + Port ( rst : in STD_LOGIC; + clk_125MHz : in STD_LOGIC; + transmit_start_enable : in STD_LOGIC; + transmit_data_length : in STD_LOGIC_VECTOR (15 downto 0); + usr_data_trans_phase_on : out STD_LOGIC; + transmit_data_input_bus : in STD_LOGIC_VECTOR (7 downto 0); + start_of_frame_O : out STD_LOGIC; + end_of_frame_O : out STD_LOGIC; + source_ready : out STD_LOGIC; + transmit_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0); + + flex_wren: in STD_LOGIC; + flex_wraddr: in STD_LOGIC_VECTOR(5 downto 0); + flex_wrdata: in STD_LOGIC_VECTOR(7 downto 0); + + flex_checksum_baseval: in std_logic_vector(15 downto 0) + ); +end component; + +component IPv4_PACKET_RECEIVER is + Port ( rst : in STD_LOGIC; + clk_125Mhz : in STD_LOGIC; + rx_sof : in STD_LOGIC; + rx_eof : in STD_LOGIC; + input_bus : in STD_LOGIC_VECTOR(7 downto 0); + valid_out_usr_data : out STD_LOGIC; + usr_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0)); +end component; + +component FLEX_CONTROL is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + r_sof : in STD_LOGIC; + r_usrvld : in STD_LOGIC; + r_data : in STD_LOGIC_VECTOR (7 downto 0); + r_usrdata: in STD_LOGIC_VECTOR (7 downto 0); + r_eof : in STD_LOGIC; + l_wren : out STD_LOGIC; + l_addr : out STD_LOGIC_VECTOR (5 downto 0); + l_data : out STD_LOGIC_VECTOR (7 downto 0); + checksum_baseval : out STD_LOGIC_VECTOR(15 downto 0); + locked : out STD_LOGIC +); +end component; + +signal valid_out_usr_data_t : STD_LOGIC; +signal usr_data_output_bus_t : STD_LOGIC_VECTOR (7 downto 0); + +signal flex_wren: STD_LOGIC; +signal flex_wraddr: STD_LOGIC_VECTOR(5 downto 0); +signal flex_wrdata: STD_LOGIC_VECTOR(7 downto 0); +signal flex_checksum_baseval: std_logic_vector(15 downto 0); + +signal core_rst: std_logic; + +component MATCH_CMD is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + sof : in STD_LOGIC; + vld_i : in STD_LOGIC; + val_i : in STD_LOGIC_VECTOR (7 downto 0); + cmd_to_match : in STD_LOGIC_VECTOR(7 downto 0); + cmd_match : out STD_LOGIC); +end component; + +begin + +MATCH_RST_CODE: MATCH_CMD Port Map +( rst => rst, + clk => clk_125MHz, + sof => rx_sof, + vld_i => valid_out_usr_data_t, + val_i => usr_data_output_bus_t, + cmd_to_match => "11111111", + cmd_match => core_rst + ); + +IPV4_PACKET_TRANSMITTER_port_map: IPV4_PACKET_TRANSMITTER + Port Map + ( rst => core_rst, + clk_125MHz => clk_125MHz, + transmit_start_enable => transmit_start_enable, + transmit_data_length => transmit_data_length, + usr_data_trans_phase_on => usr_data_trans_phase_on, + transmit_data_input_bus => transmit_data_input_bus, + start_of_frame_O => start_of_frame_O, + end_of_frame_O => end_of_frame_O, + source_ready => source_ready, + transmit_data_output_bus => transmit_data_output_bus, + flex_wren => flex_wren, + flex_wraddr => flex_wraddr, + flex_wrdata => flex_wrdata, + flex_checksum_baseval => flex_checksum_baseval + ); + + +IPv4_PACKET_RECEIVER_port_map: IPv4_PACKET_RECEIVER + Port Map + ( rst => core_rst, + clk_125Mhz => clk_125Mhz, + rx_sof => rx_sof, + rx_eof => rx_eof, + input_bus => input_bus, + valid_out_usr_data => valid_out_usr_data_t, + usr_data_output_bus => usr_data_output_bus_t + ); + + +valid_out_usr_data <= valid_out_usr_data_t; +usr_data_output_bus <= usr_data_output_bus_t; + +FLEX_CONTROL_port_map: FLEX_CONTROL + Port Map + ( rst => core_rst, + clk => clk_125Mhz, + r_sof => rx_sof, + r_usrvld => valid_out_usr_data_t, + r_data => input_bus, + r_usrdata => usr_data_output_bus_t, + r_eof => rx_eof, + l_wren => flex_wren, + l_addr => flex_wraddr, + l_data => flex_wrdata, + checksum_baseval => flex_checksum_baseval, + locked => locked + ); + + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/dist_mem_64x8.vhd (revision 2) @@ -0,0 +1,299 @@ +-------------------------------------------------------------------------------- +-- Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved. +-------------------------------------------------------------------------------- +-- ____ ____ +-- / /\/ / +-- /___/ \ / Vendor: Xilinx +-- \ \ \/ Version: K.39 +-- \ \ Application: netgen +-- / / Filename: dist_mem_64x8.vhd +-- /___/ /\ Timestamp: Sat Feb 12 17:26:42 2011 +-- \ \ / \ +-- \___\/\___\ +-- +-- Command : -intstyle ise -w -sim -ofmt vhdl "C:\VERIFICATION PLATFORM\UDP_IP_FLEX\COREGEN\tmp\_cg\dist_mem_64x8.ngc" "C:\VERIFICATION PLATFORM\UDP_IP_FLEX\COREGEN\tmp\_cg\dist_mem_64x8.vhd" +-- Device : 5vsx95tff1136-1 +-- Input file : C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/tmp/_cg/dist_mem_64x8.ngc +-- Output file : C:/VERIFICATION PLATFORM/UDP_IP_FLEX/COREGEN/tmp/_cg/dist_mem_64x8.vhd +-- # of Entities : 1 +-- Design Name : dist_mem_64x8 +-- Xilinx : C:\Xilinx\10.1\ISE +-- +-- Purpose: +-- This VHDL netlist is a verification model and uses simulation +-- primitives which may not represent the true implementation of the +-- device, however the netlist is functionally correct and should not +-- be modified. This file cannot be synthesized and should only be used +-- with supported simulation tools. +-- +-- Reference: +-- Development System Reference Guide, Chapter 23 +-- Synthesis and Simulation Design Guide, Chapter 6 +-- +-------------------------------------------------------------------------------- + + +-- synthesis translate_off +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +use UNISIM.VPKG.ALL; + +entity dist_mem_64x8 is + port ( + clk : in STD_LOGIC := 'X'; + we : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 5 downto 0 ); + d : in STD_LOGIC_VECTOR ( 7 downto 0 ); + qspo : out STD_LOGIC_VECTOR ( 7 downto 0 ) + ); +end dist_mem_64x8; + +architecture STRUCTURE of dist_mem_64x8 is + signal N0 : STD_LOGIC; + signal N1 : STD_LOGIC; + signal a_2 : STD_LOGIC_VECTOR ( 5 downto 0 ); + signal d_3 : STD_LOGIC_VECTOR ( 7 downto 0 ); + signal qspo_4 : STD_LOGIC_VECTOR ( 7 downto 0 ); + signal BU2_U0_gen_sp_ram_spram_inst_spo_int : STD_LOGIC_VECTOR ( 7 downto 0 ); + signal BU2_qdpo : STD_LOGIC_VECTOR ( 0 downto 0 ); +begin + a_2(5) <= a(5); + a_2(4) <= a(4); + a_2(3) <= a(3); + a_2(2) <= a(2); + a_2(1) <= a(1); + a_2(0) <= a(0); + d_3(7) <= d(7); + d_3(6) <= d(6); + d_3(5) <= d(5); + d_3(4) <= d(4); + d_3(3) <= d(3); + d_3(2) <= d(2); + d_3(1) <= d(1); + d_3(0) <= d(0); + qspo(7) <= qspo_4(7); + qspo(6) <= qspo_4(6); + qspo(5) <= qspo_4(5); + qspo(4) <= qspo_4(4); + qspo(3) <= qspo_4(3); + qspo(2) <= qspo_4(2); + qspo(1) <= qspo_4(1); + qspo(0) <= qspo_4(0); + VCC_0 : VCC + port map ( + P => N1 + ); + GND_1 : GND + port map ( + G => N0 + ); + BU2_U0_gen_sp_ram_spram_inst_Mram_ram8 : RAM64X1S + generic map( + INIT => X"0000000000000000" + ) + port map ( + A0 => a_2(0), + A1 => a_2(1), + A2 => a_2(2), + A3 => a_2(3), + A4 => a_2(4), + A5 => a_2(5), + D => d_3(7), + WCLK => clk, + WE => we, + O => BU2_U0_gen_sp_ram_spram_inst_spo_int(7) + ); + BU2_U0_gen_sp_ram_spram_inst_Mram_ram7 : RAM64X1S + generic map( + INIT => X"0000000000504000" + ) + port map ( + A0 => a_2(0), + A1 => a_2(1), + A2 => a_2(2), + A3 => a_2(3), + A4 => a_2(4), + A5 => a_2(5), + D => d_3(6), + WCLK => clk, + WE => we, + O => BU2_U0_gen_sp_ram_spram_inst_spo_int(6) + ); + BU2_U0_gen_sp_ram_spram_inst_Mram_ram6 : RAM64X1S + generic map( + INIT => X"0000000000010000" + ) + port map ( + A0 => a_2(0), + A1 => a_2(1), + A2 => a_2(2), + A3 => a_2(3), + A4 => a_2(4), + A5 => a_2(5), + D => d_3(5), + WCLK => clk, + WE => we, + O => BU2_U0_gen_sp_ram_spram_inst_spo_int(5) + ); + BU2_U0_gen_sp_ram_spram_inst_Mram_ram5 : RAM64X1S + generic map( + INIT => X"0000000000800000" + ) + port map ( + A0 => a_2(0), + A1 => a_2(1), + A2 => a_2(2), + A3 => a_2(3), + A4 => a_2(4), + A5 => a_2(5), + D => d_3(4), + WCLK => clk, + WE => we, + O => BU2_U0_gen_sp_ram_spram_inst_spo_int(4) + ); + BU2_U0_gen_sp_ram_spram_inst_Mram_ram4 : RAM64X1S + generic map( + INIT => X"0000000000001000" + ) + port map ( + A0 => a_2(0), + A1 => a_2(1), + A2 => a_2(2), + A3 => a_2(3), + A4 => a_2(4), + A5 => a_2(5), + D => d_3(3), + WCLK => clk, + WE => we, + O => BU2_U0_gen_sp_ram_spram_inst_spo_int(3) + ); + BU2_U0_gen_sp_ram_spram_inst_Mram_ram3 : RAM64X1S + generic map( + INIT => X"0000000000014000" + ) + port map ( + A0 => a_2(0), + A1 => a_2(1), + A2 => a_2(2), + A3 => a_2(3), + A4 => a_2(4), + A5 => a_2(5), + D => d_3(2), + WCLK => clk, + WE => we, + O => BU2_U0_gen_sp_ram_spram_inst_spo_int(2) + ); + BU2_U0_gen_sp_ram_spram_inst_Mram_ram2 : RAM64X1S + generic map( + INIT => X"0000000000000000" + ) + port map ( + A0 => a_2(0), + A1 => a_2(1), + A2 => a_2(2), + A3 => a_2(3), + A4 => a_2(4), + A5 => a_2(5), + D => d_3(1), + WCLK => clk, + WE => we, + O => BU2_U0_gen_sp_ram_spram_inst_spo_int(1) + ); + BU2_U0_gen_sp_ram_spram_inst_Mram_ram1 : RAM64X1S + generic map( + INIT => X"0000000000804000" + ) + port map ( + A0 => a_2(0), + A1 => a_2(1), + A2 => a_2(2), + A3 => a_2(3), + A4 => a_2(4), + A5 => a_2(5), + D => d_3(0), + WCLK => clk, + WE => we, + O => BU2_U0_gen_sp_ram_spram_inst_spo_int(0) + ); + BU2_U0_gen_sp_ram_spram_inst_qspo_int_7 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_sp_ram_spram_inst_spo_int(7), + Q => qspo_4(7) + ); + BU2_U0_gen_sp_ram_spram_inst_qspo_int_6 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_sp_ram_spram_inst_spo_int(6), + Q => qspo_4(6) + ); + BU2_U0_gen_sp_ram_spram_inst_qspo_int_5 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_sp_ram_spram_inst_spo_int(5), + Q => qspo_4(5) + ); + BU2_U0_gen_sp_ram_spram_inst_qspo_int_4 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_sp_ram_spram_inst_spo_int(4), + Q => qspo_4(4) + ); + BU2_U0_gen_sp_ram_spram_inst_qspo_int_3 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_sp_ram_spram_inst_spo_int(3), + Q => qspo_4(3) + ); + BU2_U0_gen_sp_ram_spram_inst_qspo_int_2 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_sp_ram_spram_inst_spo_int(2), + Q => qspo_4(2) + ); + BU2_U0_gen_sp_ram_spram_inst_qspo_int_1 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_sp_ram_spram_inst_spo_int(1), + Q => qspo_4(1) + ); + BU2_U0_gen_sp_ram_spram_inst_qspo_int_0 : FD + generic map( + INIT => '0' + ) + port map ( + C => clk, + D => BU2_U0_gen_sp_ram_spram_inst_spo_int(0), + Q => qspo_4(0) + ); + BU2_XST_GND : GND + port map ( + G => BU2_qdpo(0) + ); + +end STRUCTURE; + +-- synthesis translate_on Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.ngc =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.ngc (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/wraddr_lut_mem.ngc (revision 2) @@ -0,0 +1,3 @@ +XILINX-XDB 0.1 STUB 0.1 ASCII +XILINX-XDM V1.4e +$c;x5d=#Zl|bdaa:!3-522):'?%8#?/$0937>7)811:?<89635;?407>:<=><>41C355C619O:??K559?<8?;h45wq{=0ran8;8: ?j;78JJUSS2h6>6=0j;78JJUSS2m6>6=0>1:49MKVR\3n{~l2::1<25>0=AGZ^X7}r`>6>58692<1CXZ_UU8gtj:2294:>685OTVSQQ11395>JSSX\^1}~~`<483:47<>3E^X][[:rrl80<76:1IY?64BTQ\MK@H92I?;6M5/WGQMCODI]CDB-^CAUDLVH)RLYUB\RHCEY-@KWC@MG%a}!Pcf-tvdbczVf~xRcjm/ldk44O7:2C:>6G=2:K06>O3:2C>56GAIUQWEQC13EEJHHJ8;MMDMFGK<2F^X8:4LTV5g>Kfbfx]i}fooa8Ilhhz_oydaa2:L36>H6=2D9==::;O02403H5992>7C<>0878J7750<1E><;?5:L150723G8:9?;4N33670=I:8??96@=147e?KDXJ\Y[ECQ_RNRP3>HB\^EYG<5@2:MH5>V33YKYXl5_IO]AQVOCPk1[ECQMURLBI@7?01326g=R8&mnbR|`m/pliZoi{}%F~bcPsqm\mkrXzfg;<=>>100b?P6(oldT~bc!rno\mkus'DxdaR}o^kmpZthe9:;l5Z0.efjZthe'xdaRgasu-NvjkX{yeTeczPrno345639;k0Y=!heo]qkh(ugdUbb~z Msmn[vvhW`dSab0123147b3\:$kh`Prno-vjkXagy#|}o^kmpZ66m2_;#jka_smn*wijW`dxx"|pn]jjqY69l1^<"ijn^pli+theVcey!~sqm\mkrX:8o0Y=!heo]qkh(ugdUbb~z qrrl[lhsW:;n7X> gdl\vjk)zfgTec}{/pqskZoi|V>:i6[?/fgm[wij&{efSd`|t.sptjYnf}U>=h5Z0.efjZthe'xdaRgasu-ptjYnf}6;2e:W3+bciW{ef"ab_hlpp*uwgVcex1=11d9V4*abfVxda#|`m^kmwq)txfUbby2;>0g8Q5)`mgUyc` }ol]jjvr({yeTecz35?c8QVCUWHFBM^m4URGQ[SOTAKFN?6XLC89UM@QX\PZN=i5WIMKM\(^CJ):%=-][UC"3*4&F[JCB:6V\TMKA3>^T\VMEHo5W_BMQAZOINF<0TilPIed8\anXX{cfZh||inl24>^ceVGjfb|Yesqjkk773QnfS@gaosTfvvohf=1j$=';;`*2-1=f ;#?7l&<)59b,1/33h">%95n<1<7?d:66=1j0?0;;`>0:1=f4=4=7l2::1<7?d:26:1h`f:4d)2*0>b/9 >0h%<&4:f+7,2"86j'5(48`93=879?7ig|t^ofiZabfV|8S9"/Xhnjj}&DG[O+Kh`jr`vlv%77&8$;?Rg379gtj.7!?1o|b&>)79gtj.5!?1o|b&<)79gtj.3!?1o|b&:)99gtj:2294<7i~}a)2*3>bwzh":%:5kpsc+6,1'8;erqe-2.?2n{~l&:)89gtwg;=3:546kkig0mca23:<=vlye797>17:sgtjYdm11zh}aPcmi;?tbwgVxxx45~dqm\wwus?2{x|b&?)69rwui/9 =0}~~`(3+4?tuwg!9";6|pn*7-2=v{ye#9$94qrrl85803xy{c1?17:sptj:56>1z}a33?58uvvh4=427|}o=794;1%55|pn>6>5803zzym%>&7:qsvd.6!>1x|o'2(58wutf :#<7~~}a)6*3>uwzh">%45|psc?1?69:2}ni6y}aefq[issWdof>l5xr`fgvZjr|Vgna!jfsu]nahY`mgU}?R:#NNLF(KIIM8on7z|ndep\hprXelg'hd}{_lgn[bciW9T8!ul_icp[tbwgVigg0>#c^jbwZekc4;'oRfns^sgtjYdm4:'oRfns^f>4)eX`hyT}a20-a\v`gcWdcm1<"l_icp[tuwg4;'oRyfduj>2)eXzlmTmRjPiorvpv;7$jUcm~Qxe<2/gZvnxlfbbhQ|t`efw86+kVbjRkpn]qwq;7$jUyijQkpsc\mkvr|4:'oRzamke}Zqb59&hS~wac^gmegjb58&hSikti?50)eX`hyTh}|n=1.`[mgtWxy{cR}}su?3(fYoizUzh}aPssqw95*dWxinSgafndf>4)eXelgTxt~j=1.`[mgtW`Uhi0>#c^jbwZbwg4:'oRcjm^kmmqYaaeo6{okds]oqqYjmd$fek"l_egeepjsWmkm0>#c^jbwZuwzh7; nQgar]rwuiXkl7; nQndep\slbs`4<'oRfns^sgtj;7$jUcm~Q~sqm\vvr:8%w9:6y}aefq[issWdofSig|t^ofiZabfV|8S9Qwsu]2yEFwl<1KLu?::G87>4}T9003;7<5120gf=2=9l9i=v`91;38j34=<2.>j7;m;|Q23?>02;0:??jm8582a6d63Z8>65750;306ad?<3;n?o<4S059<<<72899ho6;:0g0f7=cj<0;6<4>{R3:>=1=:3;8>il74;3f7g7<~]>86=4>:0822~U6132<6?4>33fa<1<6m:h:7);n:348R36=:r957?4u3c94>{#;o027ol::18g>646=u->?6o;4$4g93==n>10;6):>:7g8j16=821b::4?:%62>3c!262?o0b9>52:9j20<72->:6;k4n5297>=n>=0;6):>:7g8j16=<21b:>4?:%62>3c>i>j3:1(9?5a09m05<732e2m7>5$539e4=i<90:76a69;29 17=i81e8=4=;:m:i>?3:1(9?5a09m05<332e2:7>5$539e4=i<90>76l:9;295?6=8rB>46*;4;7:?j5b2900qo?k:182>5<7sA?37):;:0f8k4e=831vn<<50;1b>a<646T>3;33`5c;32>c<693o1==4i:`8a>ag0<,821n:5+3`80`>i0m3:1(9?57g9m05<732e5$5393c=i<90:76a8c;29 17=?o1e8=4=;:m4f?6=,=;1;k5a4180?>i0i3:1(9?57g9m05<332e<57>5$5393c=i<90>76gm2;29 17=j:1e8=4?;:ka5?6=,=;1n>5a4182?>oe83:1(9?5b29m05<532cjj7>5$539f6=i<90876gne;29 17=j:1e8=4;;:kb`?6=,=;1n>5a4186?>of=3:17do;:188m3>=83.?=78j;o63>5=;6?54i7794?"3931=;6=54i6794?"393=<7c:?:098m22=83.?=798;o63>7=91<7*;1;54?k272:10e:<50;&75?103g>;6954i6394?"393=<7c:?:498m<3=831b;=4?::m:f?6=,=;1m<5a4183?>i>i3:1(9?5a09m05<632e257>5$539e4=i<90976a68;29 17=i81e8=4<;:m:3?6=,=;1m<5a4187?>i>>3:1(9?5a09m05<232c2?7>5;h;1>5<1<75f8483>!2621<0b9>50:9j<1<72->:6584n5295>=n0:0;6):>:948j16=:21b4?4?:%62>=0!2621<0b9>54:9j<5<72->:6584n5291>=hik0;6):>:`a8j16=821dml4?:%62>de!262hi0b9>52:9le=<72->:6lm4n5297>=hi>0;6):>:`a8j16=<21dm;4?:%62>de>o?03:17b6i:18'04<>92d?<7>4;n:f>5<#<802=6`;0;38?j>c290/8<461:l74?4<3f2h6=4+408:5>h383907b6m:18'04<>92d?<7:4;n:b>5<#<802=6`;0;78?lg42900n8j50;394?6|,=>1=i5G5b9K1==h9j0;66sm4c83>6<729q/894>b:J6g>N202.987?4i0694?=n9h0;66a;2;29?xd3k3:1?7>50z&70?7e3A?h7E;7;%07>4=n9=0;66g>a;29?j252900qo:k:180>5<7s->?6<,;>1=6g>4;29?l7f2900c9<50;9~f1c=8391<7>t$5695g=O=j1C955+2582?l732900e5}#<=0:n6F:c:J6<>"5<3;0e<:50;9j5d<722e?>7>5;|`64?6=;3:15;n61>5<>6=48:183!232;20D8m4H4:8 72==2c:i7>5;h3e>5<>o5:3:17d<<:188k6e=831vn9650;494?6|,=>1>:5G5b9K1==#:=037d?j:188m4`=831b>=4?::k15?6=3`896=44o2a94?=zj==1<7850;2x 12=:>1C9n5G599'61<43`;n6=44i0d94?=n:90;66g=1;29?l452900c>m50;9~f10=83<1<7>t$56962=O=j1C955+2584?l7b2900e5;h01>5<94;;h3f>5<>o593:17d<=:188k6e=831vn9750;494?6|,=>1>:5G5b9K1==#:=0=7d?j:188m4`=831b>=4?::k15?6=3`896=44o2a94?=z{>:1<79t^62891d=9=168n4>4:?7`?7334>n6<:4=5d951=:=90:86s|9183>45|Vhh0Rlo4^`;8Zd>i0R:l4^6c8Z2?50;0xZ0=<6n27?;7?i;<65>4`<5=k1=k524882b>{t>m0;6:uQ669>00<6n27?47?j;<64>4c<5=<1=h524`82a>;313;n7p}9c;293~X1>27?97?j;<6;>74<5==1>?5247816>;3i38;70:6:308yv0e29075<5=21>=5246814>;3>38:70:n:33891?=:81v;o50;5xZ32<5=?1>?5249815>;3?38:70:9:32891g=:;16844=0:p2<<72;qU:>5244815>{t=80;6?u24c82e>;3=39h7p}:2;296~;3k3;j70:9:2a8yv342909w0:k:0c8911=;j1v8:50;0x91c=9h16854a:?7=?5d3ty>:7>52z?64?7f34>j6>m4}|q1f?6=91q6=i4>c:?26?1134;96:;4=00931=:9;02;51?8752>;01<<5849>5776<;<31>=4<58814<52138;4>;6:3h970?=:c38944=j916=?4nf:?26?gb34;96lj4=009=6=:9;0j863>2;;7?8752h?01<<5949~w7e=83?p18753d9>57767;<31>d5<58815?5rs7d94?4|V?201<<5699'12<5l2wx:i4?:3y]22=:9;0=;6*:7;0f?xu1k3:1>vP96:?26?013-?<6?h4}r4a>5<5sW<>70?=:778 01=;91v;o50;0xZ32<5881:95+56805>{t>00;6?uQ629>57<1;2.>;7==;|q44?6=:rT<<63>2;53?!302:90q~o=:181[?e34;964l4$45971=z{h:1<7"2?39=7p}6e;296~X>027:>777;%74>610856srnc294?7|@<20qcl>:182M3?3tdi>7>52zJ6<>{ij:0;6?uG599~jg2=838pD864}o`6>5<5sA?37p`m6;296~N202wen:4?:3yK1==zfk21<72909wE;7;|lae?6=:rB>46sabc83>7}O=11vbom50;0xL0>vF:8:m=a<728qC955rn`c94?7|@<20qcom:182M3?3tdjo7>51zJ6<>{iim0;65<6sA?37psr}AB@a3=i1onh4:m}ABA5{GHYqvLM \ No newline at end of file Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPv4_PACKET_RECEIVER.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPv4_PACKET_RECEIVER.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/IPv4_PACKET_RECEIVER.vhd (revision 2) @@ -0,0 +1,182 @@ +----------------------------------------------------------------------------------------- +-- Copyright (C) 2010 Nikolaos Ch. Alachiotis -- +-- -- +-- Engineer: Nikolaos Ch. Alachiotis -- +-- -- +-- Contact: alachiot@cs.tum.edu -- +-- n.alachiotis@gmail.com -- +-- -- +-- Create Date: 14:32:06 02/07/2010 -- +-- Module Name: IPv4_PACKET_RECEIVER -- +-- Target Devices: Virtex 5 FPGAs -- +-- Tool versions: ISE 10.1 -- +-- Description: This component can be used to receive IPv4 Ethernet Packets. -- +-- Additional Comments: -- +-- -- +-- The receiver does not operate properly for data section of 1 or 2 bytes only. -- +-- -- +----------------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity IPv4_PACKET_RECEIVER is + Port ( rst : in STD_LOGIC; + clk_125Mhz : in STD_LOGIC; + rx_sof : in STD_LOGIC; + rx_eof : in STD_LOGIC; + input_bus : in STD_LOGIC_VECTOR(7 downto 0); + valid_out_usr_data : out STD_LOGIC; + usr_data_output_bus : out STD_LOGIC_VECTOR (7 downto 0)); +end IPv4_PACKET_RECEIVER; + +architecture Behavioral of IPv4_PACKET_RECEIVER is + +component PACKET_RECEIVER_FSM is + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + + -- Signals from EMAC + rx_sof: in STD_LOGIC; -- active low input + rx_eof: in STD_LOGIC; -- active low input + + -- Signals to Counter and Comparator + sel_comp_Bval: out STD_LOGIC; + comp_Bval: out STD_LOGIC_VECTOR(10 downto 0); + rst_count : out STD_LOGIC; + en_count : out STD_LOGIC; + + -- Signal from Comparator + comp_eq: in STD_LOGIC; + + -- Signals to Length Register + wren_MSbyte: out STD_LOGIC; + wren_LSbyte: out STD_LOGIC; + + -- Signal to user interface + valid_out_usr_data : out STD_LOGIC); +end component; + +component REG_8b_wren is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + wren : in STD_LOGIC; + input_val : in STD_LOGIC_VECTOR (7 downto 0); + output_val : inout STD_LOGIC_VECTOR(7 downto 0)); +end component; + +component COUNTER_11B_EN_RECEIV is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + count_en : in STD_LOGIC; + value_O : inout STD_LOGIC_VECTOR (10 downto 0)); +end component; + +component comp_11b_equal is + port ( + qa_eq_b : out STD_LOGIC; + clk : in STD_LOGIC := 'X'; + a : in STD_LOGIC_VECTOR ( 10 downto 0 ); + b : in STD_LOGIC_VECTOR ( 10 downto 0 ) + ); +end component; + +signal sel_comp_Bval, + rst_count, + en_count, + comp_eq, + wren_MSbyte, + wren_LSbyte: STD_LOGIC; + +signal MSbyte_reg_val_out, + LSbyte_reg_val_out : STD_LOGIC_VECTOR(7 downto 0); + +signal counter_val, + match_val, + comp_Bval, + comp_sel_val_vec, + comp_n_sel_val_vec, + length_val: STD_LOGIC_VECTOR(10 downto 0); + +constant length_offest : STD_LOGIC_VECTOR(7 downto 0):="00001010"; +-- This value is formed as 2 (1 clock the latency of comparator and 1 clock fro changing the FSM state) + 8 (number of bytes of UDP header section) + +begin + +usr_data_output_bus<=input_bus; + +PACKET_RECEIVER_FSM_port_map: PACKET_RECEIVER_FSM Port Map +( + rst => rst, + clk => clk_125MHz, + + rx_sof => rx_sof, + rx_eof => rx_eof, + + sel_comp_Bval => sel_comp_Bval, + comp_Bval => comp_Bval, + rst_count => rst_count, + en_count => en_count, + + comp_eq => comp_eq, + + wren_MSbyte => wren_MSbyte, + wren_LSbyte => wren_LSbyte, + + valid_out_usr_data => valid_out_usr_data +); + +MSbyte_REG: REG_8b_wren Port Map +( + rst => rst, + clk => clk_125MHz, + wren => wren_MSbyte, + input_val => input_bus, + output_val =>MSbyte_reg_val_out +); + +LSbyte_REG: REG_8b_wren Port Map +( + rst => rst, + clk => clk_125MHz, + wren => wren_LSbyte, + input_val => input_bus, + output_val =>LSbyte_reg_val_out +); + +COUNTER_11B_EN_port_map: COUNTER_11B_EN_RECEIV Port Map +( + rst => rst_count, + clk => clk_125MHz, + count_en => en_count, + value_O => counter_val +); + +Comp_11b_equal_port_map: Comp_11b_equal Port Map +( + qa_eq_b => comp_eq, + clk => clk_125MHz, + a => counter_val, + b => match_val + ); + +length_val(7 downto 0)<= LSbyte_reg_val_out-length_offest; +length_val(10 downto 8)<= MSbyte_reg_val_out (2 downto 0); + +comp_sel_val_vec<=(others=> sel_comp_Bval); +comp_n_sel_val_vec<= (others=> not sel_comp_Bval); + +match_val<= (comp_sel_val_vec and length_val) or (comp_n_sel_val_vec and comp_Bval); + + +end Behavioral; + Index: pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/FLEX_CONTROL.vhd =================================================================== --- pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/FLEX_CONTROL.vhd (nonexistent) +++ pc_fpga_com/trunk/UDP_IP_CORE_FLEX_Virtex5/FLEX_CONTROL.vhd (revision 2) @@ -0,0 +1,138 @@ +---------------------------------------------------------------------------------- +-- Company: +-- Engineer: +-- +-- Create Date: 15:06:05 01/12/2011 +-- Design Name: +-- Module Name: FLEX_CONTROL - Behavioral +-- Project Name: +-- Target Devices: +-- Tool versions: +-- Description: +-- +-- Dependencies: +-- +-- Revision: +-- Revision 0.01 - File Created +-- Additional Comments: +-- +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +---- Uncomment the following library declaration if instantiating +---- any Xilinx primitives in this code. +--library UNISIM; +--use UNISIM.VComponents.all; + +entity FLEX_CONTROL is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + r_sof : in STD_LOGIC; + r_usrvld : in STD_LOGIC; + r_data : in STD_LOGIC_VECTOR (7 downto 0); + r_usrdata: in STD_LOGIC_VECTOR (7 downto 0); + r_eof : in STD_LOGIC; + l_wren : out STD_LOGIC; + l_addr : out STD_LOGIC_VECTOR (5 downto 0); + l_data : out STD_LOGIC_VECTOR (7 downto 0); + checksum_baseval : out STD_LOGIC_VECTOR(15 downto 0); + locked : out STD_LOGIC + ); +end FLEX_CONTROL; + +architecture Behavioral of FLEX_CONTROL is + +component MATCH_CMD_CODE is + Port ( clk : in STD_LOGIC; + vld : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(7 downto 0); + eof : in STD_LOGIC; + cmd_code : in STD_LOGIC_VECTOR (7 downto 0); + sig_out : out STD_LOGIC); +end component; + +component MATCH_CMD is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + sof : in STD_LOGIC; + vld_i : in STD_LOGIC; + val_i : in STD_LOGIC_VECTOR (7 downto 0); + cmd_to_match : in STD_LOGIC_VECTOR(7 downto 0); + cmd_match : out STD_LOGIC); +end component; + +signal config_en, ulock_en, wren_checksum_1, wren_checksum_2,local_rst: std_logic; + +component CONFIG_CONTROL is + Port ( rst : in STD_LOGIC; + clk : in STD_LOGIC; + config_en : in STD_LOGIC; + nxt_sof : in STD_LOGIC; + wren : out STD_LOGIC; + addr : out STD_LOGIC_VECTOR (5 downto 0); + ulock_en : in STD_LOGIC; + wren_checksum_1 : out STD_LOGIC; + wren_checksum_2 : out STD_LOGIC; + locked : out STD_LOGIC + ); +end component; + +signal checksum_baseval_t: std_logic_vector(15 downto 0); + +begin + +MATCH_RST_CODE: MATCH_CMD Port Map +( rst => rst, + clk => clk, + sof => r_sof, + vld_i => r_usrvld, + val_i => r_usrdata, + cmd_to_match => "00001111", + cmd_match => config_en + ); + +ulock_en <= '0'; + +CONFIG_CONTROL_FSM: CONFIG_CONTROL Port Map +( rst => rst, + clk => clk, + config_en => config_en, + nxt_sof => r_sof, + wren => l_wren, + addr => l_addr, + ulock_en => ulock_en, + wren_checksum_1 => wren_checksum_1, + wren_checksum_2 => wren_checksum_2, + locked => locked +); + +process(clk) +begin +if rst = '1' then + checksum_baseval_t <= (others=>'0'); +else + if clk'event and clk='1' then + if wren_checksum_1='1' then + checksum_baseval_t(15 downto 8) <= r_data; + end if; + if wren_checksum_2='1' then + checksum_baseval_t(7 downto 0) <= r_data; + end if; + end if; +end if; +end process; + +checksum_baseval <= checksum_baseval_t; + +process(clk) +begin +if clk'event and clk='1' then + l_data <= r_data; +end if; +end process; + +end Behavioral; +
© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.