Compare commits
94 Commits
dev/debug
...
dev/design
| Author | SHA1 | Date | |
|---|---|---|---|
| 64843b462d | |||
| c0714f271e | |||
| c165d346a0 | |||
| 753f4a2128 | |||
| 6155c6a9fb | |||
| bb65aea4f1 | |||
| 5d3b761b07 | |||
| d7e46445d8 | |||
| cacfe04061 | |||
| 4270c2fca8 | |||
| cf2985813a | |||
| f670df9b54 | |||
| 6542995930 | |||
| b0e886893b | |||
| d90167984a | |||
| 3a1d9c27e7 | |||
| c9aa2cde0f | |||
| ccd9964ada | |||
| 1a3b811e75 | |||
| 9c74fe91e8 | |||
| c8e11a2a1f | |||
| 0a68a753be | |||
| 906d5090cd | |||
| dc761f31dc | |||
| 10dc60b54f | |||
| 4f82a27cb7 | |||
| fc36390cfe | |||
| ba9dee9275 | |||
| 5b9469560a | |||
| 966704a4de | |||
| d8d89b3566 | |||
| 1504569fb6 | |||
| b2c92070a2 | |||
| 51d715a728 | |||
| 9efbd6586f | |||
| eacffd44b3 | |||
| 5c1866d571 | |||
| f9f4a10cdf | |||
| e6cb0e0f6e | |||
| dad163b6ac | |||
| 3a2d8eda2b | |||
| 78095ad9a1 | |||
| c77b54aec6 | |||
| 429cf3d085 | |||
| 7f6a3e03a1 | |||
| 66a15cd6e0 | |||
| f2a8d8a28e | |||
| ecb2ed3b7f | |||
| 2a928c2407 | |||
| bc0a1c8b66 | |||
| 9b72dfb8d9 | |||
| 8c4154baf0 | |||
| c279f1158d | |||
| 4fc354955c | |||
| 57570bea00 | |||
| 03d0abbe86 | |||
| d26bc29507 | |||
| e9c39ea344 | |||
| 7c3fe36df1 | |||
| f719533eb9 | |||
| 179347659b | |||
| 9fd311d671 | |||
| a018b3d215 | |||
| 138c5d7dce | |||
| 16cef61a88 | |||
| d68c22211d | |||
| b7409534ed | |||
| 3ea03fd40c | |||
| ea381320f3 | |||
| bd8dc9d0d3 | |||
| 2e22eb68df | |||
| d5c3ff873f | |||
| 5f1f4e5a16 | |||
| 4efc2f02a9 | |||
| 312bc0c798 | |||
| c4a7c21bea | |||
| e083cd5c2e | |||
| 264c9ecb8e | |||
| fc0e710b3e | |||
| 275055291e | |||
| 002f0cace5 | |||
| 91eaf6c4f8 | |||
| 9b189f931f | |||
| a8a3aff498 | |||
| b54e69dec0 | |||
| 7be26d9d1a | |||
| 3dcaaf8ea5 | |||
| dfccc01225 | |||
| 4eb937e13f | |||
| 21785aaac7 | |||
| 8e46f965df | |||
| 7f9ad95e68 | |||
| 4786d2d7f6 | |||
| 58500b7549 |
@ -1,3 +1,10 @@
|
|||||||
# reflectometer_fpga_project
|
# reflectometer_fpga_project
|
||||||
|
|
||||||
Проект по разработке аппаратной вычислительной части для отпического рефлектометра для обнаружения утечек.
|
Проект по разработке аппаратной вычислительной части для оптического рефлектометра для обнаружения утечек.
|
||||||
|
|
||||||
|
## Структура
|
||||||
|
- constaints: констрейны под ПЛИСы
|
||||||
|
- designs: разные сборные дизайны, включая полный проект
|
||||||
|
- rtl: код блоков, в каждой папке есть src и tests
|
||||||
|
- scripts: скрипты для сборки
|
||||||
|
- software: программные скрипты
|
||||||
172
constraints/ax7102.xdc
Normal file
172
constraints/ax7102.xdc
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
# === iostandard ===
|
||||||
|
set_property CFGBVS VCCO [current_design]
|
||||||
|
set_property CONFIG_VOLTAGE 3.3 [current_design]
|
||||||
|
|
||||||
|
# === SPI flash config ===
|
||||||
|
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
|
||||||
|
set_property CONFIG_MODE SPIx4 [current_design]
|
||||||
|
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
|
||||||
|
|
||||||
|
# === clock config ===
|
||||||
|
create_clock -period 5.000 [get_ports sys_clk_p]
|
||||||
|
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
|
||||||
|
set_property PACKAGE_PIN R4 [get_ports sys_clk_p]
|
||||||
|
set_property PACKAGE_PIN T4 [get_ports sys_clk_n]
|
||||||
|
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_n]
|
||||||
|
|
||||||
|
# === reset button ===
|
||||||
|
set_property IOSTANDARD LVCMOS15 [get_ports rst_n]
|
||||||
|
set_property PACKAGE_PIN T6 [get_ports rst_n]
|
||||||
|
|
||||||
|
# === leds ===
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]
|
||||||
|
set_property PACKAGE_PIN C17 [get_ports {led[0]}]
|
||||||
|
set_property PACKAGE_PIN D17 [get_ports {led[1]}]
|
||||||
|
set_property PACKAGE_PIN V20 [get_ports {led[2]}]
|
||||||
|
set_property PACKAGE_PIN U20 [get_ports {led[3]}]
|
||||||
|
|
||||||
|
# === 1Gb ethernet PHY ===
|
||||||
|
set_property PACKAGE_PIN V10 [get_ports e_mdio]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_mdio]
|
||||||
|
set_property PACKAGE_PIN W10 [get_ports e_mdc]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_mdc]
|
||||||
|
set_property PULLTYPE PULLUP [get_ports e_mdc]
|
||||||
|
set_property SLEW SLOW [get_ports e_mdio]
|
||||||
|
set_property PULLTYPE PULLUP [get_ports e_mdio]
|
||||||
|
# eth rx
|
||||||
|
create_clock -period 8.000 -name rx_clk [get_ports e_rxc]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_rxc]
|
||||||
|
set_property PACKAGE_PIN K18 [get_ports e_rxc]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_rxdv]
|
||||||
|
set_property PACKAGE_PIN M22 [get_ports e_rxdv]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_rxer]
|
||||||
|
set_property PACKAGE_PIN N19 [get_ports e_rxer]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {e_rxd[*]}]
|
||||||
|
set_property PACKAGE_PIN N22 [get_ports {e_rxd[0]}]
|
||||||
|
set_property PACKAGE_PIN H18 [get_ports {e_rxd[1]}]
|
||||||
|
set_property PACKAGE_PIN H17 [get_ports {e_rxd[2]}]
|
||||||
|
set_property PACKAGE_PIN K19 [get_ports {e_rxd[3]}]
|
||||||
|
set_property PACKAGE_PIN M21 [get_ports {e_rxd[4]}]
|
||||||
|
set_property PACKAGE_PIN L21 [get_ports {e_rxd[5]}]
|
||||||
|
set_property PACKAGE_PIN N20 [get_ports {e_rxd[6]}]
|
||||||
|
set_property PACKAGE_PIN M20 [get_ports {e_rxd[7]}]
|
||||||
|
|
||||||
|
# eth tx
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_txc]
|
||||||
|
set_property PACKAGE_PIN J17 [get_ports e_txc]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_gtxc]
|
||||||
|
set_property PACKAGE_PIN L18 [get_ports e_gtxc]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_txen]
|
||||||
|
set_property PACKAGE_PIN M16 [get_ports e_txen]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_txer]
|
||||||
|
set_property PACKAGE_PIN M13 [get_ports e_txer]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {e_txd[*]}]
|
||||||
|
set_property PACKAGE_PIN M15 [get_ports {e_txd[0]}]
|
||||||
|
set_property PACKAGE_PIN L14 [get_ports {e_txd[1]}]
|
||||||
|
set_property PACKAGE_PIN K16 [get_ports {e_txd[2]}]
|
||||||
|
set_property PACKAGE_PIN L16 [get_ports {e_txd[3]}]
|
||||||
|
set_property PACKAGE_PIN K17 [get_ports {e_txd[4]}]
|
||||||
|
set_property PACKAGE_PIN L20 [get_ports {e_txd[5]}]
|
||||||
|
set_property PACKAGE_PIN L19 [get_ports {e_txd[6]}]
|
||||||
|
set_property PACKAGE_PIN L13 [get_ports {e_txd[7]}]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports e_reset]
|
||||||
|
set_property PACKAGE_PIN L15 [get_ports e_reset]
|
||||||
|
|
||||||
|
create_clock -period 8.000 -name tx_clk [get_ports e_gtxc]
|
||||||
|
|
||||||
|
set_false_path -reset_path -from [get_clocks sys_clk_p] -to [get_clocks rx_clk]
|
||||||
|
|
||||||
|
# === ADC an9238 (J4 header) ===
|
||||||
|
set_property PACKAGE_PIN K14 [get_ports ch2_clk]
|
||||||
|
set_property PACKAGE_PIN K13 [get_ports {ch2_data[0]}]
|
||||||
|
set_property PACKAGE_PIN H14 [get_ports {ch2_data[1]}]
|
||||||
|
set_property PACKAGE_PIN J14 [get_ports {ch2_data[2]}]
|
||||||
|
set_property PACKAGE_PIN H15 [get_ports {ch2_data[3]}]
|
||||||
|
set_property PACKAGE_PIN J15 [get_ports {ch2_data[4]}]
|
||||||
|
set_property PACKAGE_PIN G13 [get_ports {ch2_data[5]}]
|
||||||
|
set_property PACKAGE_PIN H13 [get_ports {ch2_data[6]}]
|
||||||
|
set_property PACKAGE_PIN J21 [get_ports {ch2_data[7]}]
|
||||||
|
set_property PACKAGE_PIN J20 [get_ports {ch2_data[8]}]
|
||||||
|
set_property PACKAGE_PIN G16 [get_ports {ch2_data[9]}]
|
||||||
|
set_property PACKAGE_PIN G15 [get_ports {ch2_data[10]}]
|
||||||
|
set_property PACKAGE_PIN H19 [get_ports {ch2_data[11]}]
|
||||||
|
set_property PACKAGE_PIN J19 [get_ports ch2_otr]
|
||||||
|
|
||||||
|
set_property PACKAGE_PIN J16 [get_ports ch1_data[1]]
|
||||||
|
set_property PACKAGE_PIN F15 [get_ports ch1_data[0]]
|
||||||
|
set_property PACKAGE_PIN K22 [get_ports ch1_data[3]]
|
||||||
|
set_property PACKAGE_PIN K21 [get_ports ch1_data[2]]
|
||||||
|
set_property PACKAGE_PIN H22 [get_ports ch1_data[5]]
|
||||||
|
set_property PACKAGE_PIN J22 [get_ports ch1_data[4]]
|
||||||
|
set_property PACKAGE_PIN G20 [get_ports ch1_data[7]]
|
||||||
|
set_property PACKAGE_PIN H20 [get_ports ch1_data[6]]
|
||||||
|
set_property PACKAGE_PIN G22 [get_ports ch1_data[9]]
|
||||||
|
set_property PACKAGE_PIN G21 [get_ports ch1_data[8]]
|
||||||
|
set_property PACKAGE_PIN D22 [get_ports ch1_data[11]]
|
||||||
|
set_property PACKAGE_PIN E22 [get_ports ch1_data[10]]
|
||||||
|
set_property PACKAGE_PIN D21 [get_ports ch1_clk]
|
||||||
|
set_property PACKAGE_PIN E21 [get_ports ch1_otr]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports ch2_clk]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {ch2_data[*]}]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports ch2_otr]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {ch1_data[*]}]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports ch1_clk]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports ch1_otr]
|
||||||
|
|
||||||
|
set_property SLEW FAST [get_ports ch2_clk]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# === DAC an9767(J5 header) ===
|
||||||
|
set_property PACKAGE_PIN F13 [get_ports {da1_clk}]
|
||||||
|
set_property PACKAGE_PIN F14 [get_ports {da1_wrt}]
|
||||||
|
set_property PACKAGE_PIN AB15 [get_ports {da1_data[13]}]
|
||||||
|
set_property PACKAGE_PIN AA15 [get_ports {da1_data[12]}]
|
||||||
|
set_property PACKAGE_PIN AA14 [get_ports {da1_data[11]}]
|
||||||
|
set_property PACKAGE_PIN Y13 [get_ports {da1_data[10]}]
|
||||||
|
set_property PACKAGE_PIN AB17 [get_ports {da1_data[9]}]
|
||||||
|
set_property PACKAGE_PIN AB16 [get_ports {da1_data[8]}]
|
||||||
|
set_property PACKAGE_PIN AA16 [get_ports {da1_data[7]}]
|
||||||
|
set_property PACKAGE_PIN Y16 [get_ports {da1_data[6]}]
|
||||||
|
set_property PACKAGE_PIN AB12 [get_ports {da1_data[5]}]
|
||||||
|
set_property PACKAGE_PIN AB11 [get_ports {da1_data[4]}]
|
||||||
|
set_property PACKAGE_PIN Y14 [get_ports {da1_data[3]}]
|
||||||
|
set_property PACKAGE_PIN W14 [get_ports {da1_data[2]}]
|
||||||
|
set_property PACKAGE_PIN C19 [get_ports {da1_data[1]}]
|
||||||
|
set_property PACKAGE_PIN C18 [get_ports {da1_data[0]}]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[*]}]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {da1_wrt}]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {da1_clk}]
|
||||||
|
|
||||||
|
set_property PACKAGE_PIN E14 [get_ports da2_clk]
|
||||||
|
set_property PACKAGE_PIN E13 [get_ports da2_wrt]
|
||||||
|
set_property PACKAGE_PIN D15 [get_ports {da2_data[13]}]
|
||||||
|
set_property PACKAGE_PIN D14 [get_ports {da2_data[12]}]
|
||||||
|
set_property PACKAGE_PIN B13 [get_ports {da2_data[11]}]
|
||||||
|
set_property PACKAGE_PIN C13 [get_ports {da2_data[10]}]
|
||||||
|
set_property PACKAGE_PIN AB13 [get_ports {da2_data[9]}]
|
||||||
|
set_property PACKAGE_PIN AA13 [get_ports {da2_data[8]}]
|
||||||
|
set_property PACKAGE_PIN A19 [get_ports {da2_data[7]}]
|
||||||
|
set_property PACKAGE_PIN A18 [get_ports {da2_data[6]}]
|
||||||
|
set_property PACKAGE_PIN E18 [get_ports {da2_data[5]}]
|
||||||
|
set_property PACKAGE_PIN F18 [get_ports {da2_data[4]}]
|
||||||
|
set_property PACKAGE_PIN F20 [get_ports {da2_data[3]}]
|
||||||
|
set_property PACKAGE_PIN F19 [get_ports {da2_data[2]}]
|
||||||
|
set_property PACKAGE_PIN A20 [get_ports {da2_data[1]}]
|
||||||
|
set_property PACKAGE_PIN B20 [get_ports {da2_data[0]}]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports da2_clk]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports da2_wrt]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {da2_data[*]}]
|
||||||
|
|
||||||
|
|
||||||
@ -59,39 +59,82 @@ set_property SLEW FAST [get_ports {rgmii_txd[*]}]
|
|||||||
create_clock -period 8.000 [get_ports rgmii_rxc]
|
create_clock -period 8.000 [get_ports rgmii_rxc]
|
||||||
|
|
||||||
# === DAC (J11 header) ===
|
# === DAC (J11 header) ===
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports p2_clk]
|
#set_property IOSTANDARD LVCMOS33 [get_ports p2_clk]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports p2_wrt]
|
#set_property IOSTANDARD LVCMOS33 [get_ports p2_wrt]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[13]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[13]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[12]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[12]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[11]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[11]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[10]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[10]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[9]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[9]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[8]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[8]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[7]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[7]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[6]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[6]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[5]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[5]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[4]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[4]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[3]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[3]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[2]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[2]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[1]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[1]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[0]}]
|
#set_property IOSTANDARD LVCMOS33 [get_ports {p2_data[0]}]
|
||||||
|
|
||||||
|
#set_property SLEW FAST [get_ports p2_clk]
|
||||||
|
|
||||||
|
#set_property PACKAGE_PIN C18 [get_ports p2_clk]
|
||||||
|
#set_property PACKAGE_PIN C19 [get_ports p2_wrt]
|
||||||
|
#set_property PACKAGE_PIN B17 [get_ports {p2_data[13]}]
|
||||||
|
#set_property PACKAGE_PIN B18 [get_ports {p2_data[12]}]
|
||||||
|
#set_property PACKAGE_PIN D17 [get_ports {p2_data[11]}]
|
||||||
|
#set_property PACKAGE_PIN C17 [get_ports {p2_data[10]}]
|
||||||
|
#set_property PACKAGE_PIN A15 [get_ports {p2_data[9]}]
|
||||||
|
#set_property PACKAGE_PIN A16 [get_ports {p2_data[8]}]
|
||||||
|
#set_property PACKAGE_PIN B15 [get_ports {p2_data[7]}]
|
||||||
|
#set_property PACKAGE_PIN B16 [get_ports {p2_data[6]}]
|
||||||
|
#set_property PACKAGE_PIN A13 [get_ports {p2_data[5]}]
|
||||||
|
#set_property PACKAGE_PIN A14 [get_ports {p2_data[4]}]
|
||||||
|
#set_property PACKAGE_PIN E16 [get_ports {p2_data[3]}]
|
||||||
|
#set_property PACKAGE_PIN D16 [get_ports {p2_data[2]}]
|
||||||
|
#set_property PACKAGE_PIN C14 [get_ports {p2_data[1]}]
|
||||||
|
#set_property PACKAGE_PIN C15 [get_ports {p2_data[0]}]
|
||||||
|
|
||||||
|
# === ADC an9238 (J11 header) ===
|
||||||
|
set_property PACKAGE_PIN G21 [get_ports ch2_clk]
|
||||||
|
set_property PACKAGE_PIN G22 [get_ports {ch2_data[0]}]
|
||||||
|
set_property PACKAGE_PIN C22 [get_ports {ch2_data[1]}]
|
||||||
|
set_property PACKAGE_PIN B22 [get_ports {ch2_data[2]}]
|
||||||
|
set_property PACKAGE_PIN F19 [get_ports {ch2_data[3]}]
|
||||||
|
set_property PACKAGE_PIN F20 [get_ports {ch2_data[4]}]
|
||||||
|
set_property PACKAGE_PIN D20 [get_ports {ch2_data[5]}]
|
||||||
|
set_property PACKAGE_PIN C20 [get_ports {ch2_data[6]}]
|
||||||
|
set_property PACKAGE_PIN A18 [get_ports {ch2_data[7]}]
|
||||||
|
set_property PACKAGE_PIN A19 [get_ports {ch2_data[8]}]
|
||||||
|
set_property PACKAGE_PIN B20 [get_ports {ch2_data[9]}]
|
||||||
|
set_property PACKAGE_PIN A20 [get_ports {ch2_data[10]}]
|
||||||
|
set_property PACKAGE_PIN F18 [get_ports {ch2_data[11]}]
|
||||||
|
set_property PACKAGE_PIN E18 [get_ports ch2_otr]
|
||||||
|
set_property PACKAGE_PIN C18 [get_ports ch1_data[1]]
|
||||||
|
set_property PACKAGE_PIN C19 [get_ports ch1_data[0]]
|
||||||
|
set_property PACKAGE_PIN B17 [get_ports ch1_data[3]]
|
||||||
|
set_property PACKAGE_PIN B18 [get_ports ch1_data[2]]
|
||||||
|
set_property PACKAGE_PIN D17 [get_ports ch1_data[5]]
|
||||||
|
set_property PACKAGE_PIN C17 [get_ports ch1_data[4]]
|
||||||
|
set_property PACKAGE_PIN A15 [get_ports ch1_data[7]]
|
||||||
|
set_property PACKAGE_PIN A16 [get_ports ch1_data[6]]
|
||||||
|
set_property PACKAGE_PIN B15 [get_ports ch1_data[9]]
|
||||||
|
set_property PACKAGE_PIN B16 [get_ports ch1_data[8]]
|
||||||
|
set_property PACKAGE_PIN A13 [get_ports ch1_data[11]]
|
||||||
|
set_property PACKAGE_PIN A14 [get_ports ch1_data[10]]
|
||||||
|
set_property PACKAGE_PIN E16 [get_ports ch1_clk]
|
||||||
|
set_property PACKAGE_PIN D16 [get_ports ch1_otr]
|
||||||
|
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports ch2_clk]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {ch2_data[*]}]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports ch2_otr]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports {ch1_data[*]}]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports ch1_clk]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports ch1_otr]
|
||||||
|
|
||||||
|
# 1 bit DAC)))
|
||||||
|
set_property PACKAGE_PIN E17 [get_ports debug_dac]
|
||||||
|
set_property IOSTANDARD LVCMOS33 [get_ports debug_dac]
|
||||||
|
|
||||||
set_property SLEW FAST [get_ports p2_clk]
|
|
||||||
|
|
||||||
set_property PACKAGE_PIN C18 [get_ports p2_clk]
|
|
||||||
set_property PACKAGE_PIN C19 [get_ports p2_wrt]
|
|
||||||
set_property PACKAGE_PIN B17 [get_ports {p2_data[13]}]
|
|
||||||
set_property PACKAGE_PIN B18 [get_ports {p2_data[12]}]
|
|
||||||
set_property PACKAGE_PIN D17 [get_ports {p2_data[11]}]
|
|
||||||
set_property PACKAGE_PIN C17 [get_ports {p2_data[10]}]
|
|
||||||
set_property PACKAGE_PIN A15 [get_ports {p2_data[9]}]
|
|
||||||
set_property PACKAGE_PIN A16 [get_ports {p2_data[8]}]
|
|
||||||
set_property PACKAGE_PIN B15 [get_ports {p2_data[7]}]
|
|
||||||
set_property PACKAGE_PIN B16 [get_ports {p2_data[6]}]
|
|
||||||
set_property PACKAGE_PIN A13 [get_ports {p2_data[5]}]
|
|
||||||
set_property PACKAGE_PIN A14 [get_ports {p2_data[4]}]
|
|
||||||
set_property PACKAGE_PIN E16 [get_ports {p2_data[3]}]
|
|
||||||
set_property PACKAGE_PIN D16 [get_ports {p2_data[2]}]
|
|
||||||
set_property PACKAGE_PIN C14 [get_ports {p2_data[1]}]
|
|
||||||
set_property PACKAGE_PIN C15 [get_ports {p2_data[0]}]
|
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# Директория с тестовыми проектами под ПЛИСу
|
# Директория с тестовыми проектами под ПЛИСу
|
||||||
|
|
||||||
- eth_ctrl_debug: проект с ethernet и контроллером. Позволяет через ILA проверить, что пакет правильно принимается и что значения правильно выставляются.
|
- adc_dac_synchronizer: проект для тестирования и отладки связки сэмплер + контроллер + генератор, проверки синхронизации между импульсами.
|
||||||
|
- reflectometer_base: базовый проект рефлектометра без внешних интерфейсов, только I/O через AXI Stream.
|
||||||
- eth_generator: проект на базе eth_ctrl_debug, в который включен генератор импульсов. В паре с ЦАП можно через консольку по Ethernet запускать генерацию разных импульсов.
|
- reflectometer_prototype: тестовый проект под AX7102 с управлением и отправкой данных по ethernet.
|
||||||
56
designs/adc_dac_synchoronizer/Makefile
Normal file
56
designs/adc_dac_synchoronizer/Makefile
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
#
|
||||||
|
# Copyright (c) 2025 FPGA Ninja, LLC
|
||||||
|
#
|
||||||
|
# Authors:
|
||||||
|
# - Alex Forencich
|
||||||
|
#
|
||||||
|
|
||||||
|
# FPGA settings
|
||||||
|
FPGA_PART = xc7a100tfgg484-2
|
||||||
|
FPGA_TOP = sync_top
|
||||||
|
FPGA_ARCH = artix7
|
||||||
|
|
||||||
|
RTL_DIR = ../../rtl
|
||||||
|
|
||||||
|
|
||||||
|
include ../../scripts/vivado.mk
|
||||||
|
|
||||||
|
|
||||||
|
SYN_FILES += $(sort $(shell find ../../rtl/sampler/src -type f -name '*.sv'))
|
||||||
|
SYN_FILES += $(sort $(shell find ../../rtl/generator/src -type f -name '*.sv'))
|
||||||
|
SYN_FILES += sync_top.sv
|
||||||
|
|
||||||
|
XCI_FILES += $(sort $(shell find ip/ -type f -name '*.xci'))
|
||||||
|
|
||||||
|
XDC_FILES += ../../constraints/ax7102.xdc
|
||||||
|
XDC_FILES += debug.xdc
|
||||||
|
|
||||||
|
SYN_FILES += tb_sync_top.sv
|
||||||
|
SIM_TOP = tb_top
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
program: $(PROJECT).bit
|
||||||
|
echo "open_hw_manager" > program.tcl
|
||||||
|
echo "connect_hw_server" >> program.tcl
|
||||||
|
echo "open_hw_target" >> program.tcl
|
||||||
|
echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl
|
||||||
|
echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl
|
||||||
|
echo "set_property PROGRAM.FILE {$(PROJECT).bit} [current_hw_device]" >> program.tcl
|
||||||
|
echo "program_hw_devices [current_hw_device]" >> program.tcl
|
||||||
|
echo "exit" >> program.tcl
|
||||||
|
vivado -nojournal -nolog -mode batch -source program.tcl
|
||||||
|
|
||||||
|
$(PROJECT).mcs $(PROJECT).prm: $(PROJECT).bit
|
||||||
|
echo "write_cfgmem -force -format mcs -size 16 -interface SPIx4 -loadbit {up 0x0000000 $*.bit} -checksum -file $*.mcs" > generate_mcs.tcl
|
||||||
|
echo "exit" >> generate_mcs.tcl
|
||||||
|
vivado -nojournal -nolog -mode batch -source generate_mcs.tcl
|
||||||
|
mkdir -p rev
|
||||||
|
COUNT=100; \
|
||||||
|
while [ -e rev/$*_rev$$COUNT.bit ]; \
|
||||||
|
do COUNT=$$((COUNT+1)); done; \
|
||||||
|
COUNT=$$((COUNT-1)); \
|
||||||
|
for x in .mcs .prm; \
|
||||||
|
do cp $*$$x rev/$*_rev$$COUNT$$x; \
|
||||||
|
echo "Output: rev/$*_rev$$COUNT$$x"; done;
|
||||||
3
designs/adc_dac_synchoronizer/debug.xdc
Normal file
3
designs/adc_dac_synchoronizer/debug.xdc
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Primary clocks
|
||||||
|
create_clock -name eth_clk -period 8.000 [get_ports dac_clk_in]
|
||||||
|
create_clock -name acc_clk -period 15.385 [get_ports adc_clk_in]
|
||||||
124
designs/adc_dac_synchoronizer/sync_top.sv
Normal file
124
designs/adc_dac_synchoronizer/sync_top.sv
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module sync_top
|
||||||
|
#(
|
||||||
|
parameter int unsigned DAC_DATA_WIDTH = 14, // DAC bit-width
|
||||||
|
parameter int unsigned ADC_DATA_WIDTH = 12, // ADC bit-width
|
||||||
|
parameter int unsigned PACK_FACTOR = 1, // number of ADC readings per transaction
|
||||||
|
parameter int unsigned PROCESS_MODE = 0, // representation format of ADC readings (0 - direct code, 1 - 2's completment)
|
||||||
|
parameter int unsigned ZERO_LEVEL = 0
|
||||||
|
)
|
||||||
|
(
|
||||||
|
input clk_adc,
|
||||||
|
input rst_adc,
|
||||||
|
input clk_dac,
|
||||||
|
input rst_dac,
|
||||||
|
input start,
|
||||||
|
input out_of_range,
|
||||||
|
input [31:0] pulse_width,
|
||||||
|
input [31:0] pulse_period,
|
||||||
|
input [DAC_DATA_WIDTH-1:0] pulse_height,
|
||||||
|
input [15:0] pulse_num, // DAC counter limit
|
||||||
|
input [31:0] smp_num, // ADC counter limit
|
||||||
|
output [ADC_DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata,
|
||||||
|
output m_axis_tvalid
|
||||||
|
);
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Internal signals
|
||||||
|
//------------------------------------------------------------
|
||||||
|
wire dac_done, dac_request, adc_done, adc_request;
|
||||||
|
wire [DAC_DATA_WIDTH-1:0] dac_signal;
|
||||||
|
wire [ADC_DATA_WIDTH-1:0] adc_singnal;
|
||||||
|
generate
|
||||||
|
if (ADC_DATA_WIDTH > DAC_DATA_WIDTH) begin : g_pad_zeros
|
||||||
|
assign adc_singnal = { {(ADC_DATA_WIDTH - DAC_DATA_WIDTH){1'b0}}, dac_signal };
|
||||||
|
end
|
||||||
|
else begin : g_truncate
|
||||||
|
assign adc_singnal = dac_signal[ADC_DATA_WIDTH-1:0];
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// DAC -> ADC CDC
|
||||||
|
//------------------------------------------------------------
|
||||||
|
logic [2:0] stretch; // 125/65~=2. Чтобы поймать единичный импульс, растянем его во времени
|
||||||
|
logic [1:0] sync_DA;
|
||||||
|
wire dac_done_stretched;
|
||||||
|
|
||||||
|
always_ff @(posedge clk_dac or posedge rst_dac)
|
||||||
|
begin
|
||||||
|
if (rst_dac)
|
||||||
|
stretch <= 0;
|
||||||
|
else begin
|
||||||
|
stretch[0] <= dac_done;
|
||||||
|
stretch[1] <= stretch[0];
|
||||||
|
stretch[2] <= stretch[1];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assign dac_done_stretched = |stretch;
|
||||||
|
|
||||||
|
always_ff @(posedge clk_adc or posedge rst_adc) begin
|
||||||
|
if (rst_adc)
|
||||||
|
sync_DA <= 0;
|
||||||
|
else begin
|
||||||
|
sync_DA[0] <= dac_done_stretched;
|
||||||
|
sync_DA[1] <= sync_DA[0];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assign adc_request = sync_DA[1];
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// ADC -> DAC CDC
|
||||||
|
//------------------------------------------------------------
|
||||||
|
logic [1:0] sync_AD;
|
||||||
|
|
||||||
|
always_ff @(posedge clk_dac or posedge rst_dac) begin
|
||||||
|
if (rst_dac)
|
||||||
|
sync_AD <= 0;
|
||||||
|
else begin
|
||||||
|
sync_AD[0] <= adc_done;
|
||||||
|
sync_AD[1] <= sync_AD[0];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assign dac_request = sync_AD[1];
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Generator
|
||||||
|
//------------------------------------------------------------
|
||||||
|
generator #(
|
||||||
|
.DATA_WIDTH(DAC_DATA_WIDTH),
|
||||||
|
.ZERO_LEVEL(ZERO_LEVEL)
|
||||||
|
) generator_inst (
|
||||||
|
.clk_dac(clk_dac),
|
||||||
|
.rst(rst_dac),
|
||||||
|
.start(start),
|
||||||
|
.pulse_width(pulse_width),
|
||||||
|
.pulse_period(pulse_period),
|
||||||
|
.pulse_height(pulse_height),
|
||||||
|
.pulse_num(pulse_num),
|
||||||
|
.dac_out(dac_signal),
|
||||||
|
.request(dac_request),
|
||||||
|
.done(dac_done)
|
||||||
|
);
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Sampler
|
||||||
|
//------------------------------------------------------------
|
||||||
|
sampler #(
|
||||||
|
.DATA_WIDTH(ADC_DATA_WIDTH),
|
||||||
|
.PACK_FACTOR(PACK_FACTOR),
|
||||||
|
.PROCESS_MODE(PROCESS_MODE)
|
||||||
|
) sampler_inst (
|
||||||
|
.clk_in(clk_adc),
|
||||||
|
.rst(rst_adc),
|
||||||
|
.data_in(adc_singnal),
|
||||||
|
.out_of_range(out_of_range),
|
||||||
|
.smp_num(smp_num),
|
||||||
|
.m_axis_tdata(m_axis_tdata),
|
||||||
|
.m_axis_tvalid(m_axis_tvalid),
|
||||||
|
.request(adc_request),
|
||||||
|
.done(adc_done)
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
||||||
308
designs/adc_dac_synchoronizer/tb_sync_top.sv
Normal file
308
designs/adc_dac_synchoronizer/tb_sync_top.sv
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module tb_top;
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Параметры
|
||||||
|
//------------------------------------------------------------
|
||||||
|
localparam DAC_DATA_WIDTH = 14;
|
||||||
|
localparam ADC_DATA_WIDTH = 12;
|
||||||
|
localparam PACK_FACTOR = 1;
|
||||||
|
localparam PROCESS_MODE = 0;
|
||||||
|
localparam LOGIC_ZERO_LEVEL = 0; // DAC -5V for logic zero
|
||||||
|
localparam VOLTAGE_ZERO_LEVEL = 2**(DAC_DATA_WIDTH-1); // DAC 0V for logic zero
|
||||||
|
localparam CLK_DAC_PERIOD = 8;
|
||||||
|
localparam CLK_ADC_PERIOD = 15.385;
|
||||||
|
|
||||||
|
localparam ZERO_LEVEL = LOGIC_ZERO_LEVEL; // "logic" VS "true"
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Тактовые сигналы и сброс
|
||||||
|
//------------------------------------------------------------
|
||||||
|
logic clk_dac;
|
||||||
|
logic rst_dac;
|
||||||
|
logic clk_adc;
|
||||||
|
logic rst_adc;
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Управление и конфиг
|
||||||
|
//------------------------------------------------------------
|
||||||
|
logic dac_start;
|
||||||
|
logic [31:0] pulse_width;
|
||||||
|
logic [31:0] pulse_period;
|
||||||
|
logic [DAC_DATA_WIDTH-1:0] pulse_height;
|
||||||
|
logic [15:0] pulse_num;
|
||||||
|
logic [31:0] smp_num;
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Входы
|
||||||
|
//------------------------------------------------------------
|
||||||
|
reg out_of_range;
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Выходы
|
||||||
|
//------------------------------------------------------------
|
||||||
|
wire [ADC_DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata;
|
||||||
|
wire m_axis_tvalid;
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// DUT
|
||||||
|
//------------------------------------------------------------
|
||||||
|
sync_top #(
|
||||||
|
.DAC_DATA_WIDTH(DAC_DATA_WIDTH),
|
||||||
|
.ADC_DATA_WIDTH(ADC_DATA_WIDTH),
|
||||||
|
.PACK_FACTOR(PACK_FACTOR),
|
||||||
|
.PROCESS_MODE(PROCESS_MODE),
|
||||||
|
.ZERO_LEVEL(ZERO_LEVEL)
|
||||||
|
) dut (
|
||||||
|
.clk_adc(clk_adc),
|
||||||
|
.clk_dac(clk_dac),
|
||||||
|
.rst_adc(rst_adc),
|
||||||
|
.rst_dac(rst_dac),
|
||||||
|
.start(dac_start),
|
||||||
|
.pulse_width(pulse_width),
|
||||||
|
.pulse_period(pulse_period),
|
||||||
|
.pulse_height(pulse_height),
|
||||||
|
.pulse_num(pulse_num),
|
||||||
|
.smp_num(smp_num),
|
||||||
|
.m_axis_tdata(m_axis_tdata),
|
||||||
|
.m_axis_tvalid(m_axis_tvalid),
|
||||||
|
.out_of_range(out_of_range)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Тактовые сигналы
|
||||||
|
initial begin
|
||||||
|
clk_adc = 0;
|
||||||
|
forever #(CLK_ADC_PERIOD/2) clk_adc = ~clk_adc;
|
||||||
|
end
|
||||||
|
initial begin
|
||||||
|
clk_dac = 0;
|
||||||
|
forever #(CLK_DAC_PERIOD/2) clk_dac = ~clk_dac;
|
||||||
|
end
|
||||||
|
|
||||||
|
// === Таски для тестипрования ===
|
||||||
|
// Таска сброса DAC DUT
|
||||||
|
task automatic reset_dut_dac(
|
||||||
|
input int rst_duration // сколько тактов держать сброс
|
||||||
|
);
|
||||||
|
rst_dac <= 1;
|
||||||
|
repeat(rst_duration) @(posedge clk_dac);
|
||||||
|
rst_dac <= 0;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// Таска сброса ADC DUT
|
||||||
|
task automatic reset_dut_adc(
|
||||||
|
input int rst_duration // сколько тактов держать сброс
|
||||||
|
);
|
||||||
|
rst_adc <= 1;
|
||||||
|
repeat(rst_duration) @(posedge clk_adc);
|
||||||
|
rst_adc <= 0;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// Таска запуска DUT
|
||||||
|
task automatic start_dut(
|
||||||
|
input int start_duration // сколько тактов держать импульс
|
||||||
|
);
|
||||||
|
dac_start <= 1;
|
||||||
|
repeat(start_duration) @(posedge clk_dac);
|
||||||
|
dac_start <= 0;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// Таска конфигурации DUT
|
||||||
|
task automatic set_config(
|
||||||
|
input logic [31:0] w, // ширина импульса
|
||||||
|
input logic [31:0] p, // период импульса
|
||||||
|
input logic [15:0] n, // количество импульсов
|
||||||
|
input logic [DAC_DATA_WIDTH-1:0] h, // высота импульса
|
||||||
|
input logic [31:0] sn // число сэмплов
|
||||||
|
);
|
||||||
|
// Задаем конфигурационные регистры
|
||||||
|
@(posedge clk_dac);
|
||||||
|
pulse_width <= w;
|
||||||
|
pulse_period <= p;
|
||||||
|
pulse_num <= n;
|
||||||
|
pulse_height <= h;
|
||||||
|
smp_num <= sn;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// // Таска проверки устойчивости к долгим управляющим импульсам
|
||||||
|
// task automatic check_impulses;
|
||||||
|
// // Локальные переменные для хранения случайных параметров
|
||||||
|
// int rand_start_duration;
|
||||||
|
// int rand_delay;
|
||||||
|
// int rand_ack;
|
||||||
|
// bit rand_first;
|
||||||
|
// int total_impulse_cycles = 0;
|
||||||
|
|
||||||
|
// int pulse_w = 11;
|
||||||
|
// int pulse_p = 31;
|
||||||
|
// int pulse_n = 5;
|
||||||
|
// int pulse_h = 1024;
|
||||||
|
|
||||||
|
// $display("[TB] -check_impulses- Check system stability under random latencies");
|
||||||
|
|
||||||
|
// // Установка конфигурации
|
||||||
|
// set_config(
|
||||||
|
// .w(pulse_w),
|
||||||
|
// .p(pulse_p),
|
||||||
|
// .n(pulse_n),
|
||||||
|
// .h(pulse_h)
|
||||||
|
// );
|
||||||
|
|
||||||
|
// reset_dut(5);
|
||||||
|
// repeat(2) @(posedge clk);
|
||||||
|
|
||||||
|
// // Старт норме 1 такт. Сделаем случайным от 5 до 25 тактов.
|
||||||
|
// rand_start_duration = $urandom_range(5, 25);
|
||||||
|
// $display("[TB] Long start: %0d clocks", rand_start_duration);
|
||||||
|
|
||||||
|
// // Фоновый процесс подсчета тактов импульса
|
||||||
|
// fork
|
||||||
|
// begin : counter_proc
|
||||||
|
// forever begin
|
||||||
|
// @(negedge clk); // 180 deg. phase shift for "DAC strobing signal"
|
||||||
|
// if (dac_out == pulse_h) begin
|
||||||
|
// total_impulse_cycles++;
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// join_none
|
||||||
|
|
||||||
|
// // Параллельный запуск длинного старта и обработки синхронизации
|
||||||
|
// fork
|
||||||
|
// // Поток 1: Удерживаем старт аномально долго
|
||||||
|
// begin
|
||||||
|
// start_dut(rand_start_duration);
|
||||||
|
// end
|
||||||
|
// // Поток 2: Обслуживаем n=4 циклов синхронизации со случайными задержками
|
||||||
|
// begin
|
||||||
|
// repeat(pulse_n) begin
|
||||||
|
// // Рандомизируем параметры для каждого из 4-х рукопожатий
|
||||||
|
// rand_first = $urandom; // Случайно: Самплер первый (1) или Генератор первый (0)
|
||||||
|
// rand_delay = $urandom_range(1, 8); // Случайная задержка ожидания (1..8 тактов)
|
||||||
|
// rand_ack = $urandom_range(5, 10); // Аномально долгий удерживаемый импульс sampler_done (10..30 тактов)
|
||||||
|
|
||||||
|
// synchronize(
|
||||||
|
// .sampler_first(rand_first),
|
||||||
|
// .delay_before_ack(rand_delay),
|
||||||
|
// .ack_duration(rand_ack)
|
||||||
|
// );
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// join
|
||||||
|
// repeat(pulse_p+5) @(posedge clk);
|
||||||
|
// disable counter_proc;
|
||||||
|
// // Ожидание завершения переходных процессов
|
||||||
|
// repeat(10) @(posedge clk);
|
||||||
|
// if (total_impulse_cycles == pulse_w*pulse_n)
|
||||||
|
// $display("[TB] -check_impulses- Pulse generation CORRECT");
|
||||||
|
// else begin
|
||||||
|
// $display("[ERROR] -check_impulses- Pulse generation INCORRECT. Total number of pulses: %d, must be: %d", total_impulse_cycles, pulse_w*pulse_n);
|
||||||
|
// $finish;
|
||||||
|
// end
|
||||||
|
// $display("[TB] -check_impulses- Done");
|
||||||
|
// endtask
|
||||||
|
|
||||||
|
// task automatic run_test_case(
|
||||||
|
// input int pulse_w,
|
||||||
|
// input int pulse_p,
|
||||||
|
// input int pulse_n,
|
||||||
|
// input int pulse_h,
|
||||||
|
// input bit skip_reset, // skip reset sequence on demand
|
||||||
|
// input bit count_level // count ticks of amplitude == pulse_h or amplitude != pulse_h
|
||||||
|
// );
|
||||||
|
// int total_impulse_cycles = 0;
|
||||||
|
|
||||||
|
// if (!skip_reset) begin
|
||||||
|
// reset_dut(1);
|
||||||
|
// @(posedge clk);
|
||||||
|
// end
|
||||||
|
|
||||||
|
// set_config(
|
||||||
|
// .w(pulse_w),
|
||||||
|
// .p(pulse_p),
|
||||||
|
// .n(pulse_n),
|
||||||
|
// .h(pulse_h)
|
||||||
|
// );
|
||||||
|
// @(posedge clk);
|
||||||
|
|
||||||
|
// start_dut(1);
|
||||||
|
|
||||||
|
// // Фоновый процесс подсчета тактов импульса
|
||||||
|
// fork
|
||||||
|
// begin : counter_proc
|
||||||
|
// forever begin
|
||||||
|
// @(negedge clk); // 180 deg. phase shift for "DAC strobing signal"
|
||||||
|
// if (count_level) begin
|
||||||
|
// if (dac_out == pulse_h) begin
|
||||||
|
// total_impulse_cycles++;
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// else begin
|
||||||
|
// if (dac_out != current_zero_level) begin
|
||||||
|
// total_impulse_cycles++;
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// join_none
|
||||||
|
|
||||||
|
// repeat(pulse_n) begin
|
||||||
|
// synchronize(
|
||||||
|
// .sampler_first(0),
|
||||||
|
// .delay_before_ack(1),
|
||||||
|
// .ack_duration(2)
|
||||||
|
// );
|
||||||
|
// end
|
||||||
|
// repeat(pulse_p+5) @(posedge clk);
|
||||||
|
// disable counter_proc;
|
||||||
|
// repeat(10) @(posedge clk);
|
||||||
|
|
||||||
|
// if (count_level) begin
|
||||||
|
// if (total_impulse_cycles == pulse_w*pulse_n)
|
||||||
|
// $display("[TB] -run_test_case- Pulse generation CORRECT");
|
||||||
|
// else begin
|
||||||
|
// $display("[ERROR] -run_test_case- Pulse generation INCORRECT. Total number of pulses: %d, must be: %d", total_impulse_cycles, pulse_w*pulse_n);
|
||||||
|
// $finish;
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// else begin
|
||||||
|
// if (total_impulse_cycles == 0)
|
||||||
|
// $display("[TB] -run_test_case- Pulse generation CORRECT");
|
||||||
|
// else begin
|
||||||
|
// $display("[ERROR] -run_test_case- Pulse generation INCORRECT. Total number of pulses: %d, must be: %d", total_impulse_cycles, 0);
|
||||||
|
// $finish;
|
||||||
|
// end
|
||||||
|
// end
|
||||||
|
// endtask
|
||||||
|
|
||||||
|
// --- ОСНОВНОЙ ПРОЦЕСС ТЕСТИРОВАНИЯ ---
|
||||||
|
initial begin
|
||||||
|
$display("[TB] Tests start");
|
||||||
|
|
||||||
|
// Инициализация
|
||||||
|
dac_start = 0;
|
||||||
|
pulse_width = 0;
|
||||||
|
pulse_period = 0;
|
||||||
|
pulse_height = 0;
|
||||||
|
pulse_num = 0;
|
||||||
|
smp_num = 0;
|
||||||
|
out_of_range = 0;
|
||||||
|
fork
|
||||||
|
reset_dut_adc(3);
|
||||||
|
reset_dut_dac(6);
|
||||||
|
join
|
||||||
|
@(posedge clk_dac);
|
||||||
|
@(posedge clk_adc);
|
||||||
|
set_config(
|
||||||
|
.w(50),
|
||||||
|
.p(125),
|
||||||
|
.n(5),
|
||||||
|
.h(1024),
|
||||||
|
.sn(65)
|
||||||
|
);
|
||||||
|
start_dut(1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$display("[TB] ALL PASSED");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@ -1,7 +0,0 @@
|
|||||||
# Тестовый проект Eth + CTRL
|
|
||||||
Проект состоит из AXIS Ethernet и контроллера. Для тестирования сделано три разных частотных домена: ethernet 125MHz, DAC 130MHz, ADC 65MHz для тестирования сихронизации. Есть ILA на все выходы контроллера и на шину AXIS eth -> ctrl. Для отправки пакетов используйте скрипт ```console.py --debug```.
|
|
||||||
|
|
||||||
## Сборка
|
|
||||||
```make all``` - собрать все до битстрима
|
|
||||||
|
|
||||||
```make vivado``` - открыть проект в Vivado
|
|
||||||
@ -1,147 +0,0 @@
|
|||||||
set_clock_groups -name ASYNC_UDP_CTRL -asynchronous -group [get_clocks rgmii_rxc] -group [get_clocks clk_out1_clk_wiz_ctrl_inst] -group [get_clocks clk_out2_clk_wiz_ctrl_inst]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
create_debug_core u_ila_0 ila
|
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/clk]
|
|
||||||
connect_debug_port u_ila_0/clk [get_nets [list clk_wiz_ctrl_inst/inst/clk_out2]]
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
|
||||||
set_property port_width 32 [get_debug_ports u_ila_0/probe0]
|
|
||||||
connect_debug_port u_ila_0/probe0 [get_nets [list {adc_pulse_period_dbg[0]} {adc_pulse_period_dbg[1]} {adc_pulse_period_dbg[2]} {adc_pulse_period_dbg[3]} {adc_pulse_period_dbg[4]} {adc_pulse_period_dbg[5]} {adc_pulse_period_dbg[6]} {adc_pulse_period_dbg[7]} {adc_pulse_period_dbg[8]} {adc_pulse_period_dbg[9]} {adc_pulse_period_dbg[10]} {adc_pulse_period_dbg[11]} {adc_pulse_period_dbg[12]} {adc_pulse_period_dbg[13]} {adc_pulse_period_dbg[14]} {adc_pulse_period_dbg[15]} {adc_pulse_period_dbg[16]} {adc_pulse_period_dbg[17]} {adc_pulse_period_dbg[18]} {adc_pulse_period_dbg[19]} {adc_pulse_period_dbg[20]} {adc_pulse_period_dbg[21]} {adc_pulse_period_dbg[22]} {adc_pulse_period_dbg[23]} {adc_pulse_period_dbg[24]} {adc_pulse_period_dbg[25]} {adc_pulse_period_dbg[26]} {adc_pulse_period_dbg[27]} {adc_pulse_period_dbg[28]} {adc_pulse_period_dbg[29]} {adc_pulse_period_dbg[30]} {adc_pulse_period_dbg[31]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe1]
|
|
||||||
connect_debug_port u_ila_0/probe1 [get_nets [list {finish_cnt[0]} {finish_cnt[1]} {finish_cnt[2]} {finish_cnt[3]} {finish_cnt[4]} {finish_cnt[5]} {finish_cnt[6]} {finish_cnt[7]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe2]
|
|
||||||
connect_debug_port u_ila_0/probe2 [get_nets [list {adc_pulse_num_dbg[0]} {adc_pulse_num_dbg[1]} {adc_pulse_num_dbg[2]} {adc_pulse_num_dbg[3]} {adc_pulse_num_dbg[4]} {adc_pulse_num_dbg[5]} {adc_pulse_num_dbg[6]} {adc_pulse_num_dbg[7]} {adc_pulse_num_dbg[8]} {adc_pulse_num_dbg[9]} {adc_pulse_num_dbg[10]} {adc_pulse_num_dbg[11]} {adc_pulse_num_dbg[12]} {adc_pulse_num_dbg[13]} {adc_pulse_num_dbg[14]} {adc_pulse_num_dbg[15]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe3]
|
|
||||||
connect_debug_port u_ila_0/probe3 [get_nets [list adc_rst_dbg]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe4]
|
|
||||||
connect_debug_port u_ila_0/probe4 [get_nets [list adc_start_dbg]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe5]
|
|
||||||
connect_debug_port u_ila_0/probe5 [get_nets [list finish_dbg]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe6]
|
|
||||||
connect_debug_port u_ila_0/probe6 [get_nets [list finish_pending]]
|
|
||||||
create_debug_core u_ila_1 ila
|
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_1]
|
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_1]
|
|
||||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_1]
|
|
||||||
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_1]
|
|
||||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_1]
|
|
||||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_1]
|
|
||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_1]
|
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_1]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/clk]
|
|
||||||
connect_debug_port u_ila_1/clk [get_nets [list rgmii_rxc_IBUF_BUFG]]
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe0]
|
|
||||||
set_property port_width 2 [get_debug_ports u_ila_1/probe0]
|
|
||||||
connect_debug_port u_ila_1/probe0 [get_nets [list {axis_mac0/rx_state[0]} {axis_mac0/rx_state[1]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe1]
|
|
||||||
set_property port_width 16 [get_debug_ports u_ila_1/probe1]
|
|
||||||
connect_debug_port u_ila_1/probe1 [get_nets [list {axis_mac0/udp_rec_data_length[0]} {axis_mac0/udp_rec_data_length[1]} {axis_mac0/udp_rec_data_length[2]} {axis_mac0/udp_rec_data_length[3]} {axis_mac0/udp_rec_data_length[4]} {axis_mac0/udp_rec_data_length[5]} {axis_mac0/udp_rec_data_length[6]} {axis_mac0/udp_rec_data_length[7]} {axis_mac0/udp_rec_data_length[8]} {axis_mac0/udp_rec_data_length[9]} {axis_mac0/udp_rec_data_length[10]} {axis_mac0/udp_rec_data_length[11]} {axis_mac0/udp_rec_data_length[12]} {axis_mac0/udp_rec_data_length[13]} {axis_mac0/udp_rec_data_length[14]} {axis_mac0/udp_rec_data_length[15]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe2]
|
|
||||||
set_property port_width 96 [get_debug_ports u_ila_1/probe2]
|
|
||||||
connect_debug_port u_ila_1/probe2 [get_nets [list {udp_ctrl_inst/cfg_bus_eth[0]} {udp_ctrl_inst/cfg_bus_eth[1]} {udp_ctrl_inst/cfg_bus_eth[2]} {udp_ctrl_inst/cfg_bus_eth[3]} {udp_ctrl_inst/cfg_bus_eth[4]} {udp_ctrl_inst/cfg_bus_eth[5]} {udp_ctrl_inst/cfg_bus_eth[6]} {udp_ctrl_inst/cfg_bus_eth[7]} {udp_ctrl_inst/cfg_bus_eth[8]} {udp_ctrl_inst/cfg_bus_eth[9]} {udp_ctrl_inst/cfg_bus_eth[10]} {udp_ctrl_inst/cfg_bus_eth[11]} {udp_ctrl_inst/cfg_bus_eth[12]} {udp_ctrl_inst/cfg_bus_eth[13]} {udp_ctrl_inst/cfg_bus_eth[14]} {udp_ctrl_inst/cfg_bus_eth[15]} {udp_ctrl_inst/cfg_bus_eth[16]} {udp_ctrl_inst/cfg_bus_eth[17]} {udp_ctrl_inst/cfg_bus_eth[18]} {udp_ctrl_inst/cfg_bus_eth[19]} {udp_ctrl_inst/cfg_bus_eth[20]} {udp_ctrl_inst/cfg_bus_eth[21]} {udp_ctrl_inst/cfg_bus_eth[22]} {udp_ctrl_inst/cfg_bus_eth[23]} {udp_ctrl_inst/cfg_bus_eth[24]} {udp_ctrl_inst/cfg_bus_eth[25]} {udp_ctrl_inst/cfg_bus_eth[26]} {udp_ctrl_inst/cfg_bus_eth[27]} {udp_ctrl_inst/cfg_bus_eth[28]} {udp_ctrl_inst/cfg_bus_eth[29]} {udp_ctrl_inst/cfg_bus_eth[30]} {udp_ctrl_inst/cfg_bus_eth[31]} {udp_ctrl_inst/cfg_bus_eth[32]} {udp_ctrl_inst/cfg_bus_eth[33]} {udp_ctrl_inst/cfg_bus_eth[34]} {udp_ctrl_inst/cfg_bus_eth[35]} {udp_ctrl_inst/cfg_bus_eth[36]} {udp_ctrl_inst/cfg_bus_eth[37]} {udp_ctrl_inst/cfg_bus_eth[38]} {udp_ctrl_inst/cfg_bus_eth[39]} {udp_ctrl_inst/cfg_bus_eth[40]} {udp_ctrl_inst/cfg_bus_eth[41]} {udp_ctrl_inst/cfg_bus_eth[42]} {udp_ctrl_inst/cfg_bus_eth[43]} {udp_ctrl_inst/cfg_bus_eth[44]} {udp_ctrl_inst/cfg_bus_eth[45]} {udp_ctrl_inst/cfg_bus_eth[46]} {udp_ctrl_inst/cfg_bus_eth[47]} {udp_ctrl_inst/cfg_bus_eth[48]} {udp_ctrl_inst/cfg_bus_eth[49]} {udp_ctrl_inst/cfg_bus_eth[50]} {udp_ctrl_inst/cfg_bus_eth[51]} {udp_ctrl_inst/cfg_bus_eth[52]} {udp_ctrl_inst/cfg_bus_eth[53]} {udp_ctrl_inst/cfg_bus_eth[54]} {udp_ctrl_inst/cfg_bus_eth[55]} {udp_ctrl_inst/cfg_bus_eth[56]} {udp_ctrl_inst/cfg_bus_eth[57]} {udp_ctrl_inst/cfg_bus_eth[58]} {udp_ctrl_inst/cfg_bus_eth[59]} {udp_ctrl_inst/cfg_bus_eth[60]} {udp_ctrl_inst/cfg_bus_eth[61]} {udp_ctrl_inst/cfg_bus_eth[62]} {udp_ctrl_inst/cfg_bus_eth[63]} {udp_ctrl_inst/cfg_bus_eth[64]} {udp_ctrl_inst/cfg_bus_eth[65]} {udp_ctrl_inst/cfg_bus_eth[66]} {udp_ctrl_inst/cfg_bus_eth[67]} {udp_ctrl_inst/cfg_bus_eth[68]} {udp_ctrl_inst/cfg_bus_eth[69]} {udp_ctrl_inst/cfg_bus_eth[70]} {udp_ctrl_inst/cfg_bus_eth[71]} {udp_ctrl_inst/cfg_bus_eth[72]} {udp_ctrl_inst/cfg_bus_eth[73]} {udp_ctrl_inst/cfg_bus_eth[74]} {udp_ctrl_inst/cfg_bus_eth[75]} {udp_ctrl_inst/cfg_bus_eth[76]} {udp_ctrl_inst/cfg_bus_eth[77]} {udp_ctrl_inst/cfg_bus_eth[78]} {udp_ctrl_inst/cfg_bus_eth[79]} {udp_ctrl_inst/cfg_bus_eth[80]} {udp_ctrl_inst/cfg_bus_eth[81]} {udp_ctrl_inst/cfg_bus_eth[82]} {udp_ctrl_inst/cfg_bus_eth[83]} {udp_ctrl_inst/cfg_bus_eth[84]} {udp_ctrl_inst/cfg_bus_eth[85]} {udp_ctrl_inst/cfg_bus_eth[86]} {udp_ctrl_inst/cfg_bus_eth[87]} {udp_ctrl_inst/cfg_bus_eth[88]} {udp_ctrl_inst/cfg_bus_eth[89]} {udp_ctrl_inst/cfg_bus_eth[90]} {udp_ctrl_inst/cfg_bus_eth[91]} {udp_ctrl_inst/cfg_bus_eth[92]} {udp_ctrl_inst/cfg_bus_eth[93]} {udp_ctrl_inst/cfg_bus_eth[94]} {udp_ctrl_inst/cfg_bus_eth[95]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe3]
|
|
||||||
set_property port_width 16 [get_debug_ports u_ila_1/probe3]
|
|
||||||
connect_debug_port u_ila_1/probe3 [get_nets [list {axis_mac0/rx_payload_len[0]} {axis_mac0/rx_payload_len[1]} {axis_mac0/rx_payload_len[2]} {axis_mac0/rx_payload_len[3]} {axis_mac0/rx_payload_len[4]} {axis_mac0/rx_payload_len[5]} {axis_mac0/rx_payload_len[6]} {axis_mac0/rx_payload_len[7]} {axis_mac0/rx_payload_len[8]} {axis_mac0/rx_payload_len[9]} {axis_mac0/rx_payload_len[10]} {axis_mac0/rx_payload_len[11]} {axis_mac0/rx_payload_len[12]} {axis_mac0/rx_payload_len[13]} {axis_mac0/rx_payload_len[14]} {axis_mac0/rx_payload_len[15]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe4]
|
|
||||||
set_property port_width 8 [get_debug_ports u_ila_1/probe4]
|
|
||||||
connect_debug_port u_ila_1/probe4 [get_nets [list {m_axis_rx_tdata[0]} {m_axis_rx_tdata[1]} {m_axis_rx_tdata[2]} {m_axis_rx_tdata[3]} {m_axis_rx_tdata[4]} {m_axis_rx_tdata[5]} {m_axis_rx_tdata[6]} {m_axis_rx_tdata[7]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe5]
|
|
||||||
set_property port_width 3 [get_debug_ports u_ila_1/probe5]
|
|
||||||
connect_debug_port u_ila_1/probe5 [get_nets [list {udp_ctrl_inst/eth_state[0]} {udp_ctrl_inst/eth_state[1]} {udp_ctrl_inst/eth_state[2]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe6]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe6]
|
|
||||||
connect_debug_port u_ila_1/probe6 [get_nets [list axis_mac0/arp_found]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe7]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe7]
|
|
||||||
connect_debug_port u_ila_1/probe7 [get_nets [list udp_ctrl_inst/axis_hs]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe8]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe8]
|
|
||||||
connect_debug_port u_ila_1/probe8 [get_nets [list udp_ctrl_inst/busy_flag_eth]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe9]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe9]
|
|
||||||
connect_debug_port u_ila_1/probe9 [get_nets [list axis_mac0/m_axis_rx_tlast]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe10]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe10]
|
|
||||||
connect_debug_port u_ila_1/probe10 [get_nets [list m_axis_rx_tlast]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe11]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe11]
|
|
||||||
connect_debug_port u_ila_1/probe11 [get_nets [list axis_mac0/m_axis_rx_tready]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe12]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe12]
|
|
||||||
connect_debug_port u_ila_1/probe12 [get_nets [list m_axis_rx_tready]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe13]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe13]
|
|
||||||
connect_debug_port u_ila_1/probe13 [get_nets [list axis_mac0/req_ready]]
|
|
||||||
create_debug_core u_ila_2 ila
|
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_2]
|
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_2]
|
|
||||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_2]
|
|
||||||
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_2]
|
|
||||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_2]
|
|
||||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_2]
|
|
||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_2]
|
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_2]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_2/clk]
|
|
||||||
connect_debug_port u_ila_2/clk [get_nets [list clk_wiz_ctrl_inst/inst/clk_out1]]
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe0]
|
|
||||||
set_property port_width 12 [get_debug_ports u_ila_2/probe0]
|
|
||||||
connect_debug_port u_ila_2/probe0 [get_nets [list {dac_pulse_height_dbg[0]} {dac_pulse_height_dbg[1]} {dac_pulse_height_dbg[2]} {dac_pulse_height_dbg[3]} {dac_pulse_height_dbg[4]} {dac_pulse_height_dbg[5]} {dac_pulse_height_dbg[6]} {dac_pulse_height_dbg[7]} {dac_pulse_height_dbg[8]} {dac_pulse_height_dbg[9]} {dac_pulse_height_dbg[10]} {dac_pulse_height_dbg[11]}]]
|
|
||||||
create_debug_port u_ila_2 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe1]
|
|
||||||
set_property port_width 16 [get_debug_ports u_ila_2/probe1]
|
|
||||||
connect_debug_port u_ila_2/probe1 [get_nets [list {dac_pulse_num_dbg[0]} {dac_pulse_num_dbg[1]} {dac_pulse_num_dbg[2]} {dac_pulse_num_dbg[3]} {dac_pulse_num_dbg[4]} {dac_pulse_num_dbg[5]} {dac_pulse_num_dbg[6]} {dac_pulse_num_dbg[7]} {dac_pulse_num_dbg[8]} {dac_pulse_num_dbg[9]} {dac_pulse_num_dbg[10]} {dac_pulse_num_dbg[11]} {dac_pulse_num_dbg[12]} {dac_pulse_num_dbg[13]} {dac_pulse_num_dbg[14]} {dac_pulse_num_dbg[15]}]]
|
|
||||||
create_debug_port u_ila_2 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe2]
|
|
||||||
set_property port_width 32 [get_debug_ports u_ila_2/probe2]
|
|
||||||
connect_debug_port u_ila_2/probe2 [get_nets [list {dac_pulse_period_dbg[0]} {dac_pulse_period_dbg[1]} {dac_pulse_period_dbg[2]} {dac_pulse_period_dbg[3]} {dac_pulse_period_dbg[4]} {dac_pulse_period_dbg[5]} {dac_pulse_period_dbg[6]} {dac_pulse_period_dbg[7]} {dac_pulse_period_dbg[8]} {dac_pulse_period_dbg[9]} {dac_pulse_period_dbg[10]} {dac_pulse_period_dbg[11]} {dac_pulse_period_dbg[12]} {dac_pulse_period_dbg[13]} {dac_pulse_period_dbg[14]} {dac_pulse_period_dbg[15]} {dac_pulse_period_dbg[16]} {dac_pulse_period_dbg[17]} {dac_pulse_period_dbg[18]} {dac_pulse_period_dbg[19]} {dac_pulse_period_dbg[20]} {dac_pulse_period_dbg[21]} {dac_pulse_period_dbg[22]} {dac_pulse_period_dbg[23]} {dac_pulse_period_dbg[24]} {dac_pulse_period_dbg[25]} {dac_pulse_period_dbg[26]} {dac_pulse_period_dbg[27]} {dac_pulse_period_dbg[28]} {dac_pulse_period_dbg[29]} {dac_pulse_period_dbg[30]} {dac_pulse_period_dbg[31]}]]
|
|
||||||
create_debug_port u_ila_2 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe3]
|
|
||||||
set_property port_width 32 [get_debug_ports u_ila_2/probe3]
|
|
||||||
connect_debug_port u_ila_2/probe3 [get_nets [list {dac_pulse_width_dbg[0]} {dac_pulse_width_dbg[1]} {dac_pulse_width_dbg[2]} {dac_pulse_width_dbg[3]} {dac_pulse_width_dbg[4]} {dac_pulse_width_dbg[5]} {dac_pulse_width_dbg[6]} {dac_pulse_width_dbg[7]} {dac_pulse_width_dbg[8]} {dac_pulse_width_dbg[9]} {dac_pulse_width_dbg[10]} {dac_pulse_width_dbg[11]} {dac_pulse_width_dbg[12]} {dac_pulse_width_dbg[13]} {dac_pulse_width_dbg[14]} {dac_pulse_width_dbg[15]} {dac_pulse_width_dbg[16]} {dac_pulse_width_dbg[17]} {dac_pulse_width_dbg[18]} {dac_pulse_width_dbg[19]} {dac_pulse_width_dbg[20]} {dac_pulse_width_dbg[21]} {dac_pulse_width_dbg[22]} {dac_pulse_width_dbg[23]} {dac_pulse_width_dbg[24]} {dac_pulse_width_dbg[25]} {dac_pulse_width_dbg[26]} {dac_pulse_width_dbg[27]} {dac_pulse_width_dbg[28]} {dac_pulse_width_dbg[29]} {dac_pulse_width_dbg[30]} {dac_pulse_width_dbg[31]}]]
|
|
||||||
create_debug_port u_ila_2 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe4]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_2/probe4]
|
|
||||||
connect_debug_port u_ila_2/probe4 [get_nets [list dac_rst_dbg]]
|
|
||||||
create_debug_port u_ila_2 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe5]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_2/probe5]
|
|
||||||
connect_debug_port u_ila_2/probe5 [get_nets [list dac_start_dbg]]
|
|
||||||
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
|
|
||||||
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
|
|
||||||
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
|
|
||||||
connect_debug_port dbg_hub/clk [get_nets dac_clk]
|
|
||||||
@ -1,298 +0,0 @@
|
|||||||
`timescale 1 ns / 1 ns
|
|
||||||
|
|
||||||
module eth_ctrl_debug_top #(
|
|
||||||
parameter int unsigned DAC_DATA_WIDTH = 12
|
|
||||||
)(
|
|
||||||
input sys_clk_p,
|
|
||||||
input sys_clk_n,
|
|
||||||
input rst_n,
|
|
||||||
|
|
||||||
output [3:0] led,
|
|
||||||
|
|
||||||
output e_reset,
|
|
||||||
output e_mdc,
|
|
||||||
inout e_mdio,
|
|
||||||
|
|
||||||
output [3:0] rgmii_txd,
|
|
||||||
output rgmii_txctl,
|
|
||||||
output rgmii_txc,
|
|
||||||
input [3:0] rgmii_rxd,
|
|
||||||
input rgmii_rxctl,
|
|
||||||
input rgmii_rxc
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Internal GMII-side signals
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
wire [7:0] gmii_txd;
|
|
||||||
wire gmii_tx_en;
|
|
||||||
wire gmii_tx_er;
|
|
||||||
wire gmii_tx_clk;
|
|
||||||
wire gmii_crs;
|
|
||||||
wire gmii_col;
|
|
||||||
wire [7:0] gmii_rxd_i;
|
|
||||||
wire gmii_rx_dv;
|
|
||||||
wire gmii_rx_er;
|
|
||||||
wire gmii_rx_clk;
|
|
||||||
|
|
||||||
wire [31:0] pack_total_len;
|
|
||||||
|
|
||||||
wire e_rx_dv;
|
|
||||||
wire [7:0] e_rxd;
|
|
||||||
wire e_tx_en;
|
|
||||||
wire [7:0] e_txd;
|
|
||||||
wire e_rst_n;
|
|
||||||
wire sys_clk;
|
|
||||||
|
|
||||||
wire duplex_mode;
|
|
||||||
|
|
||||||
assign duplex_mode = 1'b1;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// System clock buffer (200 MHz differential input)
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
IBUFDS sys_clk_ibufgds (
|
|
||||||
.O (sys_clk),
|
|
||||||
.I (sys_clk_p),
|
|
||||||
.IB (sys_clk_n)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// IDELAYCTRL
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
(* IODELAY_GROUP = "rgmii_idelay_group" *)
|
|
||||||
IDELAYCTRL IDELAYCTRL_inst (
|
|
||||||
.RDY (),
|
|
||||||
.REFCLK (sys_clk),
|
|
||||||
.RST (1'b0)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Generated clocks for controller
|
|
||||||
// Need to create this IP in Vivado:
|
|
||||||
// input : 200 MHz
|
|
||||||
// output0: 130 MHz
|
|
||||||
// output1: 65 MHz
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
wire dac_clk;
|
|
||||||
wire adc_clk;
|
|
||||||
wire clk_wiz_locked;
|
|
||||||
|
|
||||||
clk_wiz_ctrl_inst clk_wiz_ctrl_inst (
|
|
||||||
.clk_in1 (sys_clk),
|
|
||||||
.reset (~rst_n),
|
|
||||||
.clk_out1 (dac_clk), // 130 MHz
|
|
||||||
.clk_out2 (adc_clk), // 65 MHz
|
|
||||||
.locked (clk_wiz_locked)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// GMII <-> RGMII conversion
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
util_gmii_to_rgmii util_gmii_to_rgmii_m0 (
|
|
||||||
.reset (1'b0),
|
|
||||||
.rgmii_td (rgmii_txd),
|
|
||||||
.rgmii_tx_ctl (rgmii_txctl),
|
|
||||||
.rgmii_txc (rgmii_txc),
|
|
||||||
.rgmii_rd (rgmii_rxd),
|
|
||||||
.rgmii_rx_ctl (rgmii_rxctl),
|
|
||||||
.gmii_rx_clk (gmii_rx_clk),
|
|
||||||
.gmii_txd (e_txd),
|
|
||||||
.gmii_tx_en (e_tx_en),
|
|
||||||
.gmii_tx_er (1'b0),
|
|
||||||
.gmii_tx_clk (gmii_tx_clk),
|
|
||||||
.gmii_crs (gmii_crs),
|
|
||||||
.gmii_col (gmii_col),
|
|
||||||
.gmii_rxd (gmii_rxd_i),
|
|
||||||
.rgmii_rxc (rgmii_rxc),
|
|
||||||
.gmii_rx_dv (gmii_rx_dv),
|
|
||||||
.gmii_rx_er (gmii_rx_er),
|
|
||||||
.speed_selection (2'b10),
|
|
||||||
.duplex_mode (duplex_mode)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// GMII arbitration / adaptation
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
gmii_arbi arbi_inst (
|
|
||||||
.clk (gmii_tx_clk),
|
|
||||||
.rst_n (rst_n),
|
|
||||||
.speed (2'b10),
|
|
||||||
.link (1'b1),
|
|
||||||
.pack_total_len (pack_total_len),
|
|
||||||
.e_rst_n (e_rst_n),
|
|
||||||
.gmii_rx_dv (gmii_rx_dv),
|
|
||||||
.gmii_rxd (gmii_rxd_i),
|
|
||||||
.gmii_tx_en (gmii_tx_en),
|
|
||||||
.gmii_txd (gmii_txd),
|
|
||||||
.e_rx_dv (e_rx_dv),
|
|
||||||
.e_rxd (e_rxd),
|
|
||||||
.e_tx_en (e_tx_en),
|
|
||||||
.e_txd (e_txd)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// axis_mac interface
|
|
||||||
// RX stream from Ethernet goes into controller
|
|
||||||
// TX stream is unused for now
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
wire req_ready;
|
|
||||||
|
|
||||||
reg send_req;
|
|
||||||
reg [15:0] data_length;
|
|
||||||
|
|
||||||
reg [7:0] s_axis_tx_tdata;
|
|
||||||
reg s_axis_tx_tvalid;
|
|
||||||
wire s_axis_tx_tready;
|
|
||||||
reg s_axis_tx_tlast;
|
|
||||||
|
|
||||||
(* MARK_DEBUG="true" *) wire [7:0] m_axis_rx_tdata;
|
|
||||||
(* MARK_DEBUG="true" *) wire m_axis_rx_tvalid;
|
|
||||||
(* MARK_DEBUG="true" *) wire m_axis_rx_tlast;
|
|
||||||
(* MARK_DEBUG="true" *) wire m_axis_rx_tready;
|
|
||||||
|
|
||||||
// Always ready to accept RX payload bytes
|
|
||||||
assign m_axis_rx_tready = 1'b1;
|
|
||||||
|
|
||||||
// TX disabled
|
|
||||||
always @(*) begin
|
|
||||||
send_req = 1'b0;
|
|
||||||
data_length = 16'd0;
|
|
||||||
s_axis_tx_tdata = 8'd0;
|
|
||||||
s_axis_tx_tvalid= 1'b0;
|
|
||||||
s_axis_tx_tlast = 1'b0;
|
|
||||||
end
|
|
||||||
|
|
||||||
axis_mac axis_mac0 (
|
|
||||||
.gmii_tx_clk (gmii_tx_clk),
|
|
||||||
.gmii_rx_clk (gmii_rx_clk),
|
|
||||||
.rst_n (e_rst_n),
|
|
||||||
|
|
||||||
.gmii_rx_dv (e_rx_dv),
|
|
||||||
.gmii_rxd (e_rxd),
|
|
||||||
.gmii_tx_en (gmii_tx_en),
|
|
||||||
.gmii_txd (gmii_txd),
|
|
||||||
|
|
||||||
.send_req (send_req),
|
|
||||||
.data_length (data_length),
|
|
||||||
.req_ready (req_ready),
|
|
||||||
|
|
||||||
.s_axis_tx_tdata (s_axis_tx_tdata),
|
|
||||||
.s_axis_tx_tvalid (s_axis_tx_tvalid),
|
|
||||||
.s_axis_tx_tready (s_axis_tx_tready),
|
|
||||||
.s_axis_tx_tlast (s_axis_tx_tlast),
|
|
||||||
|
|
||||||
.m_axis_rx_tdata (m_axis_rx_tdata),
|
|
||||||
.m_axis_rx_tvalid (m_axis_rx_tvalid),
|
|
||||||
.m_axis_rx_tready (m_axis_rx_tready),
|
|
||||||
.m_axis_rx_tlast (m_axis_rx_tlast)
|
|
||||||
);
|
|
||||||
|
|
||||||
// PHY reset helper from your original example
|
|
||||||
reset reset_m0 (
|
|
||||||
.clk (sys_clk),
|
|
||||||
.key1 (rst_n),
|
|
||||||
.rst_n (e_reset)
|
|
||||||
);
|
|
||||||
|
|
||||||
// MDIO lines are not driven here yet
|
|
||||||
assign e_mdc = 1'b0;
|
|
||||||
assign e_mdio = 1'bz;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Controller reset
|
|
||||||
// Use both external reset and clk_wiz lock
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
wire ctrl_rst_n = rst_n & clk_wiz_locked;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Debug finish generator
|
|
||||||
//
|
|
||||||
// After each adc_start pulse generates one finish pulse after some delay.
|
|
||||||
// This is just for first bring-up so the controller can leave busy state
|
|
||||||
// If you don't want this, replace with:
|
|
||||||
// wire finish_dbg = 1'b0;
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
(* MARK_DEBUG="true" *) logic finish_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) logic [7:0] finish_cnt;
|
|
||||||
(* MARK_DEBUG="true" *) logic finish_pending;
|
|
||||||
|
|
||||||
// Controller outputs to debug
|
|
||||||
(* MARK_DEBUG="true" *) wire [31:0] dac_pulse_width_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire [31:0] dac_pulse_period_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire [DAC_DATA_WIDTH-1:0] dac_pulse_height_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire [15:0] dac_pulse_num_dbg;
|
|
||||||
|
|
||||||
(* MARK_DEBUG="true" *) wire [31:0] adc_pulse_period_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire [15:0] adc_pulse_num_dbg;
|
|
||||||
|
|
||||||
(* MARK_DEBUG="true" *) wire dac_start_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire adc_start_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire dac_rst_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire adc_rst_dbg;
|
|
||||||
|
|
||||||
always_ff @(posedge adc_clk or negedge ctrl_rst_n) begin
|
|
||||||
if (!ctrl_rst_n) begin
|
|
||||||
finish_dbg <= 1'b0;
|
|
||||||
finish_cnt <= 8'd0;
|
|
||||||
finish_pending <= 1'b0;
|
|
||||||
end else begin
|
|
||||||
finish_dbg <= 1'b0;
|
|
||||||
|
|
||||||
if (adc_start_dbg) begin
|
|
||||||
finish_pending <= 1'b1;
|
|
||||||
finish_cnt <= 8'd80;
|
|
||||||
end else if (finish_pending) begin
|
|
||||||
if (finish_cnt == 8'd0) begin
|
|
||||||
finish_dbg <= 1'b1;
|
|
||||||
finish_pending <= 1'b0;
|
|
||||||
end else begin
|
|
||||||
finish_cnt <= finish_cnt - 8'd1;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Controller
|
|
||||||
// ETH domain = gmii_rx_clk, because RX AXI master comes from axis_mac RX side
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
control #(
|
|
||||||
.DAC_DATA_WIDTH(DAC_DATA_WIDTH)
|
|
||||||
) udp_ctrl_inst (
|
|
||||||
.eth_clk_in (gmii_rx_clk),
|
|
||||||
.dac_clk_in (dac_clk),
|
|
||||||
.adc_clk_in (adc_clk),
|
|
||||||
.rst_n (ctrl_rst_n),
|
|
||||||
|
|
||||||
.s_axis_tdata (m_axis_rx_tdata),
|
|
||||||
.s_axis_tvalid (m_axis_rx_tvalid),
|
|
||||||
.s_axis_tready (), // controller internally always ready in current version
|
|
||||||
.s_axis_tlast (m_axis_rx_tlast),
|
|
||||||
|
|
||||||
.finish (finish_dbg),
|
|
||||||
|
|
||||||
.dac_pulse_width (dac_pulse_width_dbg),
|
|
||||||
.dac_pulse_period (dac_pulse_period_dbg),
|
|
||||||
.dac_pulse_height (dac_pulse_height_dbg),
|
|
||||||
.dac_pulse_num (dac_pulse_num_dbg),
|
|
||||||
|
|
||||||
.adc_pulse_period (adc_pulse_period_dbg),
|
|
||||||
.adc_pulse_num (adc_pulse_num_dbg),
|
|
||||||
|
|
||||||
.dac_start (dac_start_dbg),
|
|
||||||
.adc_start (adc_start_dbg),
|
|
||||||
|
|
||||||
.dac_rst (dac_rst_dbg),
|
|
||||||
.adc_rst (adc_rst_dbg)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Simple LED status
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
assign led[0] = clk_wiz_locked;
|
|
||||||
assign led[1] = m_axis_rx_tvalid;
|
|
||||||
assign led[2] = dac_start_dbg;
|
|
||||||
assign led[3] = adc_rst_dbg;
|
|
||||||
|
|
||||||
endmodule
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
# Тестовый проект Generator + ETH + CTRL
|
|
||||||
Проект состоит из AXIS Ethernet, контроллера и генератора. Позволяет генерировать сигналы, задав параметры через Ethernet.
|
|
||||||
## Сборка
|
|
||||||
```make all``` - собрать все до битстрима
|
|
||||||
|
|
||||||
```make vivado``` - открыть проект в Vivado
|
|
||||||
|
|
||||||
## Управление
|
|
||||||
Используйте software/console.py. Пример:
|
|
||||||
|
|
||||||
```python3 console.py --pulse_width 3_500_000 --pulse_period 20_000_000 --pulse_height 10000 --pulse_num 5500 --dac-bits 14```
|
|
||||||
@ -1,117 +0,0 @@
|
|||||||
set_clock_groups -name ASYNC_UDP_CTRL -asynchronous -group [get_clocks rgmii_rxc] -group [get_clocks clk_out1_clk_wiz_ctrl_inst] -group [get_clocks clk_out2_clk_wiz_ctrl_inst]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
connect_debug_port u_ila_2/probe0 [get_nets [list {dac_pulse_height_dbg[0]} {dac_pulse_height_dbg[1]} {dac_pulse_height_dbg[2]} {dac_pulse_height_dbg[3]} {dac_pulse_height_dbg[4]} {dac_pulse_height_dbg[5]} {dac_pulse_height_dbg[6]} {dac_pulse_height_dbg[7]} {dac_pulse_height_dbg[8]} {dac_pulse_height_dbg[9]} {dac_pulse_height_dbg[10]} {dac_pulse_height_dbg[11]}]]
|
|
||||||
connect_debug_port u_ila_2/probe1 [get_nets [list {dac_pulse_num_dbg[0]} {dac_pulse_num_dbg[1]} {dac_pulse_num_dbg[2]} {dac_pulse_num_dbg[3]} {dac_pulse_num_dbg[4]} {dac_pulse_num_dbg[5]} {dac_pulse_num_dbg[6]} {dac_pulse_num_dbg[7]} {dac_pulse_num_dbg[8]} {dac_pulse_num_dbg[9]} {dac_pulse_num_dbg[10]} {dac_pulse_num_dbg[11]} {dac_pulse_num_dbg[12]} {dac_pulse_num_dbg[13]} {dac_pulse_num_dbg[14]} {dac_pulse_num_dbg[15]}]]
|
|
||||||
connect_debug_port u_ila_2/probe2 [get_nets [list {dac_pulse_period_dbg[0]} {dac_pulse_period_dbg[1]} {dac_pulse_period_dbg[2]} {dac_pulse_period_dbg[3]} {dac_pulse_period_dbg[4]} {dac_pulse_period_dbg[5]} {dac_pulse_period_dbg[6]} {dac_pulse_period_dbg[7]} {dac_pulse_period_dbg[8]} {dac_pulse_period_dbg[9]} {dac_pulse_period_dbg[10]} {dac_pulse_period_dbg[11]} {dac_pulse_period_dbg[12]} {dac_pulse_period_dbg[13]} {dac_pulse_period_dbg[14]} {dac_pulse_period_dbg[15]} {dac_pulse_period_dbg[16]} {dac_pulse_period_dbg[17]} {dac_pulse_period_dbg[18]} {dac_pulse_period_dbg[19]} {dac_pulse_period_dbg[20]} {dac_pulse_period_dbg[21]} {dac_pulse_period_dbg[22]} {dac_pulse_period_dbg[23]} {dac_pulse_period_dbg[24]} {dac_pulse_period_dbg[25]} {dac_pulse_period_dbg[26]} {dac_pulse_period_dbg[27]} {dac_pulse_period_dbg[28]} {dac_pulse_period_dbg[29]} {dac_pulse_period_dbg[30]} {dac_pulse_period_dbg[31]}]]
|
|
||||||
connect_debug_port u_ila_2/probe3 [get_nets [list {dac_pulse_width_dbg[0]} {dac_pulse_width_dbg[1]} {dac_pulse_width_dbg[2]} {dac_pulse_width_dbg[3]} {dac_pulse_width_dbg[4]} {dac_pulse_width_dbg[5]} {dac_pulse_width_dbg[6]} {dac_pulse_width_dbg[7]} {dac_pulse_width_dbg[8]} {dac_pulse_width_dbg[9]} {dac_pulse_width_dbg[10]} {dac_pulse_width_dbg[11]} {dac_pulse_width_dbg[12]} {dac_pulse_width_dbg[13]} {dac_pulse_width_dbg[14]} {dac_pulse_width_dbg[15]} {dac_pulse_width_dbg[16]} {dac_pulse_width_dbg[17]} {dac_pulse_width_dbg[18]} {dac_pulse_width_dbg[19]} {dac_pulse_width_dbg[20]} {dac_pulse_width_dbg[21]} {dac_pulse_width_dbg[22]} {dac_pulse_width_dbg[23]} {dac_pulse_width_dbg[24]} {dac_pulse_width_dbg[25]} {dac_pulse_width_dbg[26]} {dac_pulse_width_dbg[27]} {dac_pulse_width_dbg[28]} {dac_pulse_width_dbg[29]} {dac_pulse_width_dbg[30]} {dac_pulse_width_dbg[31]}]]
|
|
||||||
connect_debug_port u_ila_2/probe4 [get_nets [list dac_rst_dbg]]
|
|
||||||
connect_debug_port u_ila_2/probe5 [get_nets [list dac_start_dbg]]
|
|
||||||
|
|
||||||
|
|
||||||
connect_debug_port u_ila_1/probe7 [get_nets [list p2_wrt_OBUF]]
|
|
||||||
|
|
||||||
create_debug_core u_ila_0 ila
|
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
|
|
||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/clk]
|
|
||||||
connect_debug_port u_ila_0/clk [get_nets [list rgmii_rxc_IBUF_BUFG]]
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
|
||||||
set_property port_width 3 [get_debug_ports u_ila_0/probe0]
|
|
||||||
connect_debug_port u_ila_0/probe0 [get_nets [list {udp_ctrl_inst/eth_state[0]} {udp_ctrl_inst/eth_state[1]} {udp_ctrl_inst/eth_state[2]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
|
||||||
set_property port_width 96 [get_debug_ports u_ila_0/probe1]
|
|
||||||
connect_debug_port u_ila_0/probe1 [get_nets [list {udp_ctrl_inst/cfg_bus_eth[0]} {udp_ctrl_inst/cfg_bus_eth[1]} {udp_ctrl_inst/cfg_bus_eth[2]} {udp_ctrl_inst/cfg_bus_eth[3]} {udp_ctrl_inst/cfg_bus_eth[4]} {udp_ctrl_inst/cfg_bus_eth[5]} {udp_ctrl_inst/cfg_bus_eth[6]} {udp_ctrl_inst/cfg_bus_eth[7]} {udp_ctrl_inst/cfg_bus_eth[8]} {udp_ctrl_inst/cfg_bus_eth[9]} {udp_ctrl_inst/cfg_bus_eth[10]} {udp_ctrl_inst/cfg_bus_eth[11]} {udp_ctrl_inst/cfg_bus_eth[12]} {udp_ctrl_inst/cfg_bus_eth[13]} {udp_ctrl_inst/cfg_bus_eth[14]} {udp_ctrl_inst/cfg_bus_eth[15]} {udp_ctrl_inst/cfg_bus_eth[16]} {udp_ctrl_inst/cfg_bus_eth[17]} {udp_ctrl_inst/cfg_bus_eth[18]} {udp_ctrl_inst/cfg_bus_eth[19]} {udp_ctrl_inst/cfg_bus_eth[20]} {udp_ctrl_inst/cfg_bus_eth[21]} {udp_ctrl_inst/cfg_bus_eth[22]} {udp_ctrl_inst/cfg_bus_eth[23]} {udp_ctrl_inst/cfg_bus_eth[24]} {udp_ctrl_inst/cfg_bus_eth[25]} {udp_ctrl_inst/cfg_bus_eth[26]} {udp_ctrl_inst/cfg_bus_eth[27]} {udp_ctrl_inst/cfg_bus_eth[28]} {udp_ctrl_inst/cfg_bus_eth[29]} {udp_ctrl_inst/cfg_bus_eth[30]} {udp_ctrl_inst/cfg_bus_eth[31]} {udp_ctrl_inst/cfg_bus_eth[32]} {udp_ctrl_inst/cfg_bus_eth[33]} {udp_ctrl_inst/cfg_bus_eth[34]} {udp_ctrl_inst/cfg_bus_eth[35]} {udp_ctrl_inst/cfg_bus_eth[36]} {udp_ctrl_inst/cfg_bus_eth[37]} {udp_ctrl_inst/cfg_bus_eth[38]} {udp_ctrl_inst/cfg_bus_eth[39]} {udp_ctrl_inst/cfg_bus_eth[40]} {udp_ctrl_inst/cfg_bus_eth[41]} {udp_ctrl_inst/cfg_bus_eth[42]} {udp_ctrl_inst/cfg_bus_eth[43]} {udp_ctrl_inst/cfg_bus_eth[44]} {udp_ctrl_inst/cfg_bus_eth[45]} {udp_ctrl_inst/cfg_bus_eth[46]} {udp_ctrl_inst/cfg_bus_eth[47]} {udp_ctrl_inst/cfg_bus_eth[48]} {udp_ctrl_inst/cfg_bus_eth[49]} {udp_ctrl_inst/cfg_bus_eth[50]} {udp_ctrl_inst/cfg_bus_eth[51]} {udp_ctrl_inst/cfg_bus_eth[52]} {udp_ctrl_inst/cfg_bus_eth[53]} {udp_ctrl_inst/cfg_bus_eth[54]} {udp_ctrl_inst/cfg_bus_eth[55]} {udp_ctrl_inst/cfg_bus_eth[56]} {udp_ctrl_inst/cfg_bus_eth[57]} {udp_ctrl_inst/cfg_bus_eth[58]} {udp_ctrl_inst/cfg_bus_eth[59]} {udp_ctrl_inst/cfg_bus_eth[60]} {udp_ctrl_inst/cfg_bus_eth[61]} {udp_ctrl_inst/cfg_bus_eth[62]} {udp_ctrl_inst/cfg_bus_eth[63]} {udp_ctrl_inst/cfg_bus_eth[64]} {udp_ctrl_inst/cfg_bus_eth[65]} {udp_ctrl_inst/cfg_bus_eth[66]} {udp_ctrl_inst/cfg_bus_eth[67]} {udp_ctrl_inst/cfg_bus_eth[68]} {udp_ctrl_inst/cfg_bus_eth[69]} {udp_ctrl_inst/cfg_bus_eth[70]} {udp_ctrl_inst/cfg_bus_eth[71]} {udp_ctrl_inst/cfg_bus_eth[72]} {udp_ctrl_inst/cfg_bus_eth[73]} {udp_ctrl_inst/cfg_bus_eth[74]} {udp_ctrl_inst/cfg_bus_eth[75]} {udp_ctrl_inst/cfg_bus_eth[76]} {udp_ctrl_inst/cfg_bus_eth[77]} {udp_ctrl_inst/cfg_bus_eth[78]} {udp_ctrl_inst/cfg_bus_eth[79]} {udp_ctrl_inst/cfg_bus_eth[80]} {udp_ctrl_inst/cfg_bus_eth[81]} {udp_ctrl_inst/cfg_bus_eth[82]} {udp_ctrl_inst/cfg_bus_eth[83]} {udp_ctrl_inst/cfg_bus_eth[84]} {udp_ctrl_inst/cfg_bus_eth[85]} {udp_ctrl_inst/cfg_bus_eth[86]} {udp_ctrl_inst/cfg_bus_eth[87]} {udp_ctrl_inst/cfg_bus_eth[88]} {udp_ctrl_inst/cfg_bus_eth[89]} {udp_ctrl_inst/cfg_bus_eth[90]} {udp_ctrl_inst/cfg_bus_eth[91]} {udp_ctrl_inst/cfg_bus_eth[92]} {udp_ctrl_inst/cfg_bus_eth[93]} {udp_ctrl_inst/cfg_bus_eth[94]} {udp_ctrl_inst/cfg_bus_eth[95]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe2]
|
|
||||||
connect_debug_port u_ila_0/probe2 [get_nets [list {m_axis_rx_tdata[0]} {m_axis_rx_tdata[1]} {m_axis_rx_tdata[2]} {m_axis_rx_tdata[3]} {m_axis_rx_tdata[4]} {m_axis_rx_tdata[5]} {m_axis_rx_tdata[6]} {m_axis_rx_tdata[7]}]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe3]
|
|
||||||
connect_debug_port u_ila_0/probe3 [get_nets [list udp_ctrl_inst/axis_hs]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe4]
|
|
||||||
connect_debug_port u_ila_0/probe4 [get_nets [list udp_ctrl_inst/busy_flag_eth]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe5]
|
|
||||||
connect_debug_port u_ila_0/probe5 [get_nets [list m_axis_rx_tlast]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe6]
|
|
||||||
connect_debug_port u_ila_0/probe6 [get_nets [list m_axis_rx_tready]]
|
|
||||||
create_debug_core u_ila_1 ila
|
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_1]
|
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_1]
|
|
||||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_1]
|
|
||||||
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_1]
|
|
||||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_1]
|
|
||||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_1]
|
|
||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_1]
|
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_1]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/clk]
|
|
||||||
connect_debug_port u_ila_1/clk [get_nets [list clk_wiz_ctrl_inst/inst/clk_out1]]
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe0]
|
|
||||||
set_property port_width 14 [get_debug_ports u_ila_1/probe0]
|
|
||||||
connect_debug_port u_ila_1/probe0 [get_nets [list {p2_data_OBUF[0]} {p2_data_OBUF[1]} {p2_data_OBUF[2]} {p2_data_OBUF[3]} {p2_data_OBUF[4]} {p2_data_OBUF[5]} {p2_data_OBUF[6]} {p2_data_OBUF[7]} {p2_data_OBUF[8]} {p2_data_OBUF[9]} {p2_data_OBUF[10]} {p2_data_OBUF[11]} {p2_data_OBUF[12]} {p2_data_OBUF[13]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe1]
|
|
||||||
set_property port_width 16 [get_debug_ports u_ila_1/probe1]
|
|
||||||
connect_debug_port u_ila_1/probe1 [get_nets [list {dac_pulse_num[0]} {dac_pulse_num[1]} {dac_pulse_num[2]} {dac_pulse_num[3]} {dac_pulse_num[4]} {dac_pulse_num[5]} {dac_pulse_num[6]} {dac_pulse_num[7]} {dac_pulse_num[8]} {dac_pulse_num[9]} {dac_pulse_num[10]} {dac_pulse_num[11]} {dac_pulse_num[12]} {dac_pulse_num[13]} {dac_pulse_num[14]} {dac_pulse_num[15]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe2]
|
|
||||||
set_property port_width 14 [get_debug_ports u_ila_1/probe2]
|
|
||||||
connect_debug_port u_ila_1/probe2 [get_nets [list {dac_pulse_height[0]} {dac_pulse_height[1]} {dac_pulse_height[2]} {dac_pulse_height[3]} {dac_pulse_height[4]} {dac_pulse_height[5]} {dac_pulse_height[6]} {dac_pulse_height[7]} {dac_pulse_height[8]} {dac_pulse_height[9]} {dac_pulse_height[10]} {dac_pulse_height[11]} {dac_pulse_height[12]} {dac_pulse_height[13]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe3]
|
|
||||||
set_property port_width 32 [get_debug_ports u_ila_1/probe3]
|
|
||||||
connect_debug_port u_ila_1/probe3 [get_nets [list {dac_pulse_period[0]} {dac_pulse_period[1]} {dac_pulse_period[2]} {dac_pulse_period[3]} {dac_pulse_period[4]} {dac_pulse_period[5]} {dac_pulse_period[6]} {dac_pulse_period[7]} {dac_pulse_period[8]} {dac_pulse_period[9]} {dac_pulse_period[10]} {dac_pulse_period[11]} {dac_pulse_period[12]} {dac_pulse_period[13]} {dac_pulse_period[14]} {dac_pulse_period[15]} {dac_pulse_period[16]} {dac_pulse_period[17]} {dac_pulse_period[18]} {dac_pulse_period[19]} {dac_pulse_period[20]} {dac_pulse_period[21]} {dac_pulse_period[22]} {dac_pulse_period[23]} {dac_pulse_period[24]} {dac_pulse_period[25]} {dac_pulse_period[26]} {dac_pulse_period[27]} {dac_pulse_period[28]} {dac_pulse_period[29]} {dac_pulse_period[30]} {dac_pulse_period[31]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe4]
|
|
||||||
set_property port_width 32 [get_debug_ports u_ila_1/probe4]
|
|
||||||
connect_debug_port u_ila_1/probe4 [get_nets [list {dac_pulse_width[0]} {dac_pulse_width[1]} {dac_pulse_width[2]} {dac_pulse_width[3]} {dac_pulse_width[4]} {dac_pulse_width[5]} {dac_pulse_width[6]} {dac_pulse_width[7]} {dac_pulse_width[8]} {dac_pulse_width[9]} {dac_pulse_width[10]} {dac_pulse_width[11]} {dac_pulse_width[12]} {dac_pulse_width[13]} {dac_pulse_width[14]} {dac_pulse_width[15]} {dac_pulse_width[16]} {dac_pulse_width[17]} {dac_pulse_width[18]} {dac_pulse_width[19]} {dac_pulse_width[20]} {dac_pulse_width[21]} {dac_pulse_width[22]} {dac_pulse_width[23]} {dac_pulse_width[24]} {dac_pulse_width[25]} {dac_pulse_width[26]} {dac_pulse_width[27]} {dac_pulse_width[28]} {dac_pulse_width[29]} {dac_pulse_width[30]} {dac_pulse_width[31]}]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe5]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe5]
|
|
||||||
connect_debug_port u_ila_1/probe5 [get_nets [list dac_rst]]
|
|
||||||
create_debug_port u_ila_1 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe6]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_1/probe6]
|
|
||||||
connect_debug_port u_ila_1/probe6 [get_nets [list dac_start]]
|
|
||||||
create_debug_core u_ila_2 ila
|
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_2]
|
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_2]
|
|
||||||
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_2]
|
|
||||||
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_2]
|
|
||||||
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_2]
|
|
||||||
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_2]
|
|
||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_2]
|
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_2]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_2/clk]
|
|
||||||
connect_debug_port u_ila_2/clk [get_nets [list clk_wiz_ctrl_inst/inst/clk_out2]]
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe0]
|
|
||||||
set_property port_width 8 [get_debug_ports u_ila_2/probe0]
|
|
||||||
connect_debug_port u_ila_2/probe0 [get_nets [list {finish_cnt[0]} {finish_cnt[1]} {finish_cnt[2]} {finish_cnt[3]} {finish_cnt[4]} {finish_cnt[5]} {finish_cnt[6]} {finish_cnt[7]}]]
|
|
||||||
create_debug_port u_ila_2 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe1]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_2/probe1]
|
|
||||||
connect_debug_port u_ila_2/probe1 [get_nets [list finish_dbg]]
|
|
||||||
create_debug_port u_ila_2 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe2]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_2/probe2]
|
|
||||||
connect_debug_port u_ila_2/probe2 [get_nets [list finish_pending]]
|
|
||||||
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
|
|
||||||
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
|
|
||||||
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
|
|
||||||
connect_debug_port dbg_hub/clk [get_nets adc_clk]
|
|
||||||
@ -1,345 +0,0 @@
|
|||||||
`timescale 1 ns / 1 ns
|
|
||||||
|
|
||||||
module eth_generator_top #(
|
|
||||||
parameter int unsigned DAC_DATA_WIDTH = 14
|
|
||||||
)(
|
|
||||||
input sys_clk_p,
|
|
||||||
input sys_clk_n,
|
|
||||||
input rst_n,
|
|
||||||
|
|
||||||
output [3:0] led,
|
|
||||||
|
|
||||||
output e_reset,
|
|
||||||
output e_mdc,
|
|
||||||
inout e_mdio,
|
|
||||||
|
|
||||||
output [3:0] rgmii_txd,
|
|
||||||
output rgmii_txctl,
|
|
||||||
output rgmii_txc,
|
|
||||||
input [3:0] rgmii_rxd,
|
|
||||||
input rgmii_rxctl,
|
|
||||||
input rgmii_rxc,
|
|
||||||
|
|
||||||
// DAC
|
|
||||||
output p2_clk,
|
|
||||||
output p2_wrt,
|
|
||||||
(* MARK_DEBUG="true" *) output [13:0] p2_data
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Internal GMII-side signals
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
wire [7:0] gmii_txd;
|
|
||||||
wire gmii_tx_en;
|
|
||||||
wire gmii_tx_er;
|
|
||||||
wire gmii_tx_clk;
|
|
||||||
wire gmii_crs;
|
|
||||||
wire gmii_col;
|
|
||||||
wire [7:0] gmii_rxd_i;
|
|
||||||
wire gmii_rx_dv;
|
|
||||||
wire gmii_rx_er;
|
|
||||||
wire gmii_rx_clk;
|
|
||||||
|
|
||||||
wire [31:0] pack_total_len;
|
|
||||||
|
|
||||||
wire e_rx_dv;
|
|
||||||
wire [7:0] e_rxd;
|
|
||||||
wire e_tx_en;
|
|
||||||
wire [7:0] e_txd;
|
|
||||||
wire e_rst_n;
|
|
||||||
wire sys_clk;
|
|
||||||
|
|
||||||
wire duplex_mode;
|
|
||||||
|
|
||||||
|
|
||||||
assign duplex_mode = 1'b1;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// System clock buffer (200 MHz differential input)
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
IBUFDS sys_clk_ibufgds (
|
|
||||||
.O (sys_clk),
|
|
||||||
.I (sys_clk_p),
|
|
||||||
.IB (sys_clk_n)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// IDELAYCTRL
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
(* IODELAY_GROUP = "rgmii_idelay_group" *)
|
|
||||||
IDELAYCTRL IDELAYCTRL_inst (
|
|
||||||
.RDY (),
|
|
||||||
.REFCLK (sys_clk),
|
|
||||||
.RST (1'b0)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Generated clocks for controller
|
|
||||||
// Need to create this IP in Vivado:
|
|
||||||
// input : 200 MHz
|
|
||||||
// output0: 130 MHz
|
|
||||||
// output1: 65 MHz
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
wire dac_clk;
|
|
||||||
wire adc_clk;
|
|
||||||
wire clk_wiz_locked;
|
|
||||||
|
|
||||||
clk_wiz_ctrl_inst clk_wiz_ctrl_inst (
|
|
||||||
.clk_in1 (sys_clk),
|
|
||||||
.reset (~rst_n),
|
|
||||||
.clk_out1 (dac_clk), // 130 MHz
|
|
||||||
.clk_out2 (adc_clk), // 65 MHz
|
|
||||||
.locked (clk_wiz_locked)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// GMII <-> RGMII conversion
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
util_gmii_to_rgmii util_gmii_to_rgmii_m0 (
|
|
||||||
.reset (1'b0),
|
|
||||||
.rgmii_td (rgmii_txd),
|
|
||||||
.rgmii_tx_ctl (rgmii_txctl),
|
|
||||||
.rgmii_txc (rgmii_txc),
|
|
||||||
.rgmii_rd (rgmii_rxd),
|
|
||||||
.rgmii_rx_ctl (rgmii_rxctl),
|
|
||||||
.gmii_rx_clk (gmii_rx_clk),
|
|
||||||
.gmii_txd (e_txd),
|
|
||||||
.gmii_tx_en (e_tx_en),
|
|
||||||
.gmii_tx_er (1'b0),
|
|
||||||
.gmii_tx_clk (gmii_tx_clk),
|
|
||||||
.gmii_crs (gmii_crs),
|
|
||||||
.gmii_col (gmii_col),
|
|
||||||
.gmii_rxd (gmii_rxd_i),
|
|
||||||
.rgmii_rxc (rgmii_rxc),
|
|
||||||
.gmii_rx_dv (gmii_rx_dv),
|
|
||||||
.gmii_rx_er (gmii_rx_er),
|
|
||||||
.speed_selection (2'b10),
|
|
||||||
.duplex_mode (duplex_mode)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// GMII arbitration / adaptation
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
gmii_arbi arbi_inst (
|
|
||||||
.clk (gmii_tx_clk),
|
|
||||||
.rst_n (rst_n),
|
|
||||||
.speed (2'b10),
|
|
||||||
.link (1'b1),
|
|
||||||
.pack_total_len (pack_total_len),
|
|
||||||
.e_rst_n (e_rst_n),
|
|
||||||
.gmii_rx_dv (gmii_rx_dv),
|
|
||||||
.gmii_rxd (gmii_rxd_i),
|
|
||||||
.gmii_tx_en (gmii_tx_en),
|
|
||||||
.gmii_txd (gmii_txd),
|
|
||||||
.e_rx_dv (e_rx_dv),
|
|
||||||
.e_rxd (e_rxd),
|
|
||||||
.e_tx_en (e_tx_en),
|
|
||||||
.e_txd (e_txd)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// axis_mac interface
|
|
||||||
// RX stream from Ethernet goes into controller
|
|
||||||
// TX stream is unused for now
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
wire req_ready;
|
|
||||||
|
|
||||||
reg send_req;
|
|
||||||
reg [15:0] data_length;
|
|
||||||
|
|
||||||
reg [7:0] s_axis_tx_tdata;
|
|
||||||
reg s_axis_tx_tvalid;
|
|
||||||
wire s_axis_tx_tready;
|
|
||||||
reg s_axis_tx_tlast;
|
|
||||||
|
|
||||||
(* MARK_DEBUG="true" *) wire [7:0] m_axis_rx_tdata;
|
|
||||||
(* MARK_DEBUG="true" *) wire m_axis_rx_tvalid;
|
|
||||||
(* MARK_DEBUG="true" *) wire m_axis_rx_tlast;
|
|
||||||
(* MARK_DEBUG="true" *) wire m_axis_rx_tready;
|
|
||||||
|
|
||||||
// Always ready to accept RX payload bytes
|
|
||||||
assign m_axis_rx_tready = 1'b1;
|
|
||||||
|
|
||||||
// TX disabled
|
|
||||||
always @(*) begin
|
|
||||||
send_req = 1'b0;
|
|
||||||
data_length = 16'd0;
|
|
||||||
s_axis_tx_tdata = 8'd0;
|
|
||||||
s_axis_tx_tvalid= 1'b0;
|
|
||||||
s_axis_tx_tlast = 1'b0;
|
|
||||||
end
|
|
||||||
|
|
||||||
axis_mac axis_mac0 (
|
|
||||||
.gmii_tx_clk (gmii_tx_clk),
|
|
||||||
.gmii_rx_clk (gmii_rx_clk),
|
|
||||||
.rst_n (e_rst_n),
|
|
||||||
|
|
||||||
.gmii_rx_dv (e_rx_dv),
|
|
||||||
.gmii_rxd (e_rxd),
|
|
||||||
.gmii_tx_en (gmii_tx_en),
|
|
||||||
.gmii_txd (gmii_txd),
|
|
||||||
|
|
||||||
.send_req (send_req),
|
|
||||||
.data_length (data_length),
|
|
||||||
.req_ready (req_ready),
|
|
||||||
|
|
||||||
.s_axis_tx_tdata (s_axis_tx_tdata),
|
|
||||||
.s_axis_tx_tvalid (s_axis_tx_tvalid),
|
|
||||||
.s_axis_tx_tready (s_axis_tx_tready),
|
|
||||||
.s_axis_tx_tlast (s_axis_tx_tlast),
|
|
||||||
|
|
||||||
.m_axis_rx_tdata (m_axis_rx_tdata),
|
|
||||||
.m_axis_rx_tvalid (m_axis_rx_tvalid),
|
|
||||||
.m_axis_rx_tready (m_axis_rx_tready),
|
|
||||||
.m_axis_rx_tlast (m_axis_rx_tlast)
|
|
||||||
);
|
|
||||||
|
|
||||||
// PHY reset helper from your original example
|
|
||||||
reset reset_m0 (
|
|
||||||
.clk (sys_clk),
|
|
||||||
.key1 (rst_n),
|
|
||||||
.rst_n (e_reset)
|
|
||||||
);
|
|
||||||
|
|
||||||
// MDIO lines are not driven here yet
|
|
||||||
assign e_mdc = 1'b0;
|
|
||||||
assign e_mdio = 1'bz;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Controller reset
|
|
||||||
// Use both external reset and clk_wiz lock
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
wire ctrl_rst_n = rst_n & clk_wiz_locked;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Debug finish generator (still used here, since generator doesn't have finish signal)
|
|
||||||
//
|
|
||||||
// After each adc_start pulse generates one finish pulse after some delay.
|
|
||||||
// This is just for first bring-up so the controller can leave busy state
|
|
||||||
// If you don't want this, replace with:
|
|
||||||
// wire finish_dbg = 1'b0;
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
(* MARK_DEBUG="true" *) logic finish_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) logic [7:0] finish_cnt;
|
|
||||||
(* MARK_DEBUG="true" *) logic finish_pending;
|
|
||||||
|
|
||||||
// Controller outputs to debug
|
|
||||||
(* MARK_DEBUG="true" *) wire [31:0] dac_pulse_width;
|
|
||||||
(* MARK_DEBUG="true" *) wire [31:0] dac_pulse_period;
|
|
||||||
(* MARK_DEBUG="true" *) wire [DAC_DATA_WIDTH-1:0] dac_pulse_height;
|
|
||||||
(* MARK_DEBUG="true" *) wire [15:0] dac_pulse_num;
|
|
||||||
|
|
||||||
(* MARK_DEBUG="true" *) wire [31:0] adc_pulse_period_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire [15:0] adc_pulse_num_dbg;
|
|
||||||
|
|
||||||
(* MARK_DEBUG="true" *) wire dac_start;
|
|
||||||
(* MARK_DEBUG="true" *) wire adc_start_dbg;
|
|
||||||
(* MARK_DEBUG="true" *) wire dac_rst;
|
|
||||||
(* MARK_DEBUG="true" *) wire adc_rst_dbg;
|
|
||||||
|
|
||||||
always_ff @(posedge adc_clk or negedge ctrl_rst_n) begin
|
|
||||||
if (!ctrl_rst_n) begin
|
|
||||||
finish_dbg <= 1'b0;
|
|
||||||
finish_cnt <= 8'd0;
|
|
||||||
finish_pending <= 1'b0;
|
|
||||||
end else begin
|
|
||||||
finish_dbg <= 1'b0;
|
|
||||||
|
|
||||||
if (adc_start_dbg) begin
|
|
||||||
finish_pending <= 1'b1;
|
|
||||||
finish_cnt <= 8'd80;
|
|
||||||
end else if (finish_pending) begin
|
|
||||||
if (finish_cnt == 8'd0) begin
|
|
||||||
finish_dbg <= 1'b1;
|
|
||||||
finish_pending <= 1'b0;
|
|
||||||
end else begin
|
|
||||||
finish_cnt <= finish_cnt - 8'd1;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Controller
|
|
||||||
// ETH domain = gmii_rx_clk, because RX AXI master comes from axis_mac RX side
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
control #(
|
|
||||||
.DAC_DATA_WIDTH(DAC_DATA_WIDTH)
|
|
||||||
) udp_ctrl_inst (
|
|
||||||
.eth_clk_in (gmii_rx_clk),
|
|
||||||
.dac_clk_in (dac_clk),
|
|
||||||
.adc_clk_in (adc_clk),
|
|
||||||
.rst_n (ctrl_rst_n),
|
|
||||||
|
|
||||||
.s_axis_tdata (m_axis_rx_tdata),
|
|
||||||
.s_axis_tvalid (m_axis_rx_tvalid),
|
|
||||||
.s_axis_tready (), // controller internally always ready in current version
|
|
||||||
.s_axis_tlast (m_axis_rx_tlast),
|
|
||||||
|
|
||||||
.finish (finish_dbg),
|
|
||||||
|
|
||||||
.dac_pulse_width (dac_pulse_width),
|
|
||||||
.dac_pulse_period (dac_pulse_period),
|
|
||||||
.dac_pulse_height (dac_pulse_height),
|
|
||||||
.dac_pulse_num (dac_pulse_num),
|
|
||||||
|
|
||||||
.adc_pulse_period (adc_pulse_period_dbg),
|
|
||||||
.adc_pulse_num (adc_pulse_num_dbg),
|
|
||||||
|
|
||||||
.dac_start (dac_start),
|
|
||||||
.adc_start (adc_start_dbg),
|
|
||||||
|
|
||||||
.dac_rst (dac_rst),
|
|
||||||
.adc_rst (adc_rst_dbg)
|
|
||||||
);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// DAC
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
generator #(
|
|
||||||
.DATA_WIDTH(DAC_DATA_WIDTH)
|
|
||||||
) generator_inst (
|
|
||||||
.clk_in(dac_clk),
|
|
||||||
.rst(dac_rst),
|
|
||||||
.start(dac_start),
|
|
||||||
.pulse_width(dac_pulse_width),
|
|
||||||
.pulse_period(dac_pulse_period),
|
|
||||||
.pulse_height(dac_pulse_height),
|
|
||||||
.pulse_num(dac_pulse_num),
|
|
||||||
.pulse(p2_wrt ),
|
|
||||||
.pulse_height_out(p2_data)
|
|
||||||
);
|
|
||||||
|
|
||||||
// dac clk mgt
|
|
||||||
wire p2_clk_oddr;
|
|
||||||
|
|
||||||
ODDR #(
|
|
||||||
.DDR_CLK_EDGE("SAME_EDGE"),
|
|
||||||
.INIT(1'b0),
|
|
||||||
.SRTYPE("SYNC")
|
|
||||||
) ODDR_p2_clk (
|
|
||||||
.Q (p2_clk_oddr),
|
|
||||||
.C (dac_clk),
|
|
||||||
.CE(1'b1),
|
|
||||||
.D1(1'b1),
|
|
||||||
.D2(1'b0),
|
|
||||||
.R (1'b0),
|
|
||||||
.S (1'b0)
|
|
||||||
);
|
|
||||||
|
|
||||||
OBUF OBUF_p2_clk (
|
|
||||||
.I(p2_clk_oddr),
|
|
||||||
.O(p2_clk)
|
|
||||||
);
|
|
||||||
|
|
||||||
//assign p2_wrt = p2_clk;
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
// Simple LED status
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
assign led[0] = clk_wiz_locked;
|
|
||||||
assign led[1] = m_axis_rx_tvalid;
|
|
||||||
assign led[2] = dac_start;
|
|
||||||
assign led[3] = adc_rst_dbg;
|
|
||||||
|
|
||||||
endmodule
|
|
||||||
@ -7,8 +7,8 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# FPGA settings
|
# FPGA settings
|
||||||
FPGA_PART = xc7a35tfgg484-1
|
FPGA_PART = xc7a100tfgg484-2
|
||||||
FPGA_TOP = eth_ctrl_debug_top
|
FPGA_TOP = reflectometer_top
|
||||||
FPGA_ARCH = artix7
|
FPGA_ARCH = artix7
|
||||||
|
|
||||||
RTL_DIR = ../../rtl
|
RTL_DIR = ../../rtl
|
||||||
@ -16,13 +16,14 @@ RTL_DIR = ../../rtl
|
|||||||
|
|
||||||
include ../../scripts/vivado.mk
|
include ../../scripts/vivado.mk
|
||||||
|
|
||||||
SYN_FILES += eth_ctrl_debug.sv
|
SYN_FILES += reflectometer.sv
|
||||||
|
SYN_FILES += tb_reflectometer.sv
|
||||||
SYN_FILES += $(sort $(shell find ../../rtl -type f \( -name '*.v' -o -name '*.sv' \)))
|
SYN_FILES += $(sort $(shell find ../../rtl -type f \( -name '*.v' -o -name '*.sv' \)))
|
||||||
|
|
||||||
XCI_FILES = $(sort $(shell find ../../rtl/ethernet-udp/src -type f -name '*.xci'))
|
XCI_FILES = $(sort $(shell find ../../rtl/ethernet-udp/src -type f -name '*.xci'))
|
||||||
XCI_FILES += $(sort $(shell find ip/ -type f -name '*.xci'))
|
XCI_FILES += $(sort $(shell find ip/ -type f -name '*.xci'))
|
||||||
|
|
||||||
XDC_FILES += ../../constraints/ax7a035b.xdc
|
XDC_FILES += ../../constraints/ax7102.xdc
|
||||||
XDC_FILES += debug.xdc
|
XDC_FILES += debug.xdc
|
||||||
|
|
||||||
|
|
||||||
145
designs/reflectometer_base/README.md
Normal file
145
designs/reflectometer_base/README.md
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
# Рефлектометр
|
||||||
|
|
||||||
|
Модуль представляет собой законченную встраиваемую систему рефлектометра, объединяющую:
|
||||||
|
|
||||||
|
- контроллер управления
|
||||||
|
- генератор импульсов (DAC path)
|
||||||
|
- сэмплер данных (ADC path)
|
||||||
|
- аккумулятор и обработчик данных
|
||||||
|
|
||||||
|
Система предназначена для формирования импульсов, синхронного сбора отраженного сигнала, накопления результатов и передачи обработанных данных во внешнюю систему.
|
||||||
|
|
||||||
|
Данный модуль является полноценным интегрируемым блоком, который может использоваться как самостоятельная аппаратная подсистема внутри более крупного проекта.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Назначение системы
|
||||||
|
|
||||||
|
Основная задача системы:
|
||||||
|
|
||||||
|
1. Получить параметры измерения через AXI Stream
|
||||||
|
2. Сформировать последовательность импульсов на DAC
|
||||||
|
3. Выполнить синходную выборку данных с ADC
|
||||||
|
4. Накопить и обработать результаты
|
||||||
|
5. Передать итоговые данные обратно через AXI Stream
|
||||||
|
|
||||||
|
Таким образом реализуется полный цикл измерения без необходимости внешнего управления отдельными блоками.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Состав системы
|
||||||
|
|
||||||
|
### Controller
|
||||||
|
|
||||||
|
Принимает входные команды по AXI Stream (Ethernet RX), декодирует параметры измерения и управляет всеми внутренними модулями системы.
|
||||||
|
|
||||||
|
Формирует:
|
||||||
|
|
||||||
|
- запуск генератора (`dac_start`)
|
||||||
|
- запуск аккумулятора (`adc_start`)
|
||||||
|
- параметры импульсов DAC
|
||||||
|
- параметры выборки ADC
|
||||||
|
- локальные reset-сигналы
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Generator
|
||||||
|
|
||||||
|
Формирует последовательность импульсов на DAC с заданными:
|
||||||
|
|
||||||
|
- амплитудой
|
||||||
|
- длительностью
|
||||||
|
- периодом
|
||||||
|
- количеством повторений
|
||||||
|
|
||||||
|
Для каждого импульса инициирует запуск выборки в сэмплере.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Sampler
|
||||||
|
|
||||||
|
Выполняет синхронный сбор данных с ADC по запросу генератора.
|
||||||
|
|
||||||
|
Поддерживает:
|
||||||
|
|
||||||
|
- фильтрацию `out_of_range`
|
||||||
|
- упаковку данных
|
||||||
|
- преобразование типа кода ( прямой или дополнительный)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Accumulator
|
||||||
|
|
||||||
|
Получает поток данных от сэмплера, выполняет накопление, усреднение и оконную обработку, после чего формирует пакеты для передачи результата.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Управление системой
|
||||||
|
|
||||||
|
Пользователь взаимодействует только с контроллером через AXI Stream-интерфейс.
|
||||||
|
|
||||||
|
Прямое управление генератором, сэмплером и аккумулятором не требуется.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Clock Domain Crossing (CDC)
|
||||||
|
|
||||||
|
Система работает в нескольких тактовых доменах:
|
||||||
|
|
||||||
|
- Ethernet RX (`gmii_rx_clk`)
|
||||||
|
- Ethernet TX (`gmii_tx_clk`)
|
||||||
|
- DAC (`dac_clk`)
|
||||||
|
- ADC (`adc_clk`)
|
||||||
|
|
||||||
|
Для корректной синхронизации между DAC и ADC используются специальные CDC-регистры для сигналов:
|
||||||
|
|
||||||
|
- `sample_req`
|
||||||
|
- `sample_done`
|
||||||
|
|
||||||
|
Это обеспечивает безопасную передачу handshake-сигналов между тактовыми доменами.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Список параметров
|
||||||
|
|
||||||
|
### DAC_DATA_WIDTH
|
||||||
|
Ширина выходных данных отправляемых на ЦАП.
|
||||||
|
|
||||||
|
### ZERO_LEVEL
|
||||||
|
Уровень сигнала в состоянии отсутствия импульса (базовый уровень сигнала).
|
||||||
|
|
||||||
|
Типовые значения:
|
||||||
|
|
||||||
|
- `8192` — середина диапазона ЦАП
|
||||||
|
- `0` — нулевой уровень
|
||||||
|
|
||||||
|
### ADC_DATA_WIDTH
|
||||||
|
Ширина входных данных, получаемых с АЦП.
|
||||||
|
|
||||||
|
### PACK_FACTOR
|
||||||
|
Количество отсчетов, собираемых в один выходной пакет.
|
||||||
|
|
||||||
|
### PROCESS_MODE
|
||||||
|
Режим интерпретации входного кода:
|
||||||
|
|
||||||
|
- `0` — прямой код
|
||||||
|
- `1` — дополнительный код
|
||||||
|
|
||||||
|
### ACCUM_WIDTH
|
||||||
|
Размер данных для аккумуляции, должен быть степенью числа 2. По умолчанию - 32
|
||||||
|
|
||||||
|
### N_MAX
|
||||||
|
Максимальное число окон в последовательности. Должно быть степенью числа 2. Влияет на размер используемой памяти.
|
||||||
|
|
||||||
|
### WINDOW_SIZE
|
||||||
|
Размер окна усреднения
|
||||||
|
|
||||||
|
### PACKET_SIZE
|
||||||
|
Размер выходного пакета
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Сборка
|
||||||
|
```make all``` - собрать все до битстрима
|
||||||
|
|
||||||
|
```make vivado``` - открыть проект в Vivado
|
||||||
1
designs/reflectometer_base/debug.xdc
Normal file
1
designs/reflectometer_base/debug.xdc
Normal file
@ -0,0 +1 @@
|
|||||||
|
set_clock_groups -name ASYNC_UDP_CTRL -asynchronous -group [get_clocks rgmii_rxc] -group [get_clocks clk_out1_clk_wiz_ctrl_inst] -group [get_clocks clk_out2_clk_wiz_ctrl_inst]
|
||||||
320
designs/reflectometer_base/reflectometer.sv
Normal file
320
designs/reflectometer_base/reflectometer.sv
Normal file
@ -0,0 +1,320 @@
|
|||||||
|
`timescale 1 ns / 1 ns
|
||||||
|
|
||||||
|
module reflectometer_top #(
|
||||||
|
parameter int unsigned DAC_DATA_WIDTH = 14,
|
||||||
|
parameter int unsigned ADC_DATA_WIDTH = 12,
|
||||||
|
parameter PACK_FACTOR = 1,
|
||||||
|
parameter PROCESS_MODE = 0,
|
||||||
|
parameter ZERO_LEVEL = 8192,
|
||||||
|
parameter ACCUM_WIDTH = 32,
|
||||||
|
parameter N_MAX = 4096,
|
||||||
|
parameter WINDOW_SIZE = 65,
|
||||||
|
parameter PACKET_SIZE = 1024
|
||||||
|
)(
|
||||||
|
input sys_clk,
|
||||||
|
input rst_n,
|
||||||
|
|
||||||
|
output [3:0] led,
|
||||||
|
|
||||||
|
input gmii_rx_clk,
|
||||||
|
input gmii_tx_clk,
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) output logic [7:0] s_axis_tx_tdata,
|
||||||
|
(* MARK_DEBUG="true" *) output logic s_axis_tx_tvalid,
|
||||||
|
(* MARK_DEBUG="true" *) input logic s_axis_tx_tready,
|
||||||
|
(* MARK_DEBUG="true" *) output logic s_axis_tx_tlast,
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) input wire [7:0] m_axis_rx_tdata,
|
||||||
|
(* MARK_DEBUG="true" *) input wire m_axis_rx_tvalid,
|
||||||
|
(* MARK_DEBUG="true" *) input wire m_axis_rx_tlast,
|
||||||
|
(* MARK_DEBUG="true" *) output wire m_axis_rx_tready,
|
||||||
|
|
||||||
|
// axis_mac
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) input logic req_ready,
|
||||||
|
(* MARK_DEBUG="true" *) output logic send_req,
|
||||||
|
|
||||||
|
// DAC
|
||||||
|
|
||||||
|
output wire p2_clk,
|
||||||
|
(* MARK_DEBUG="true" *) output wire [DAC_DATA_WIDTH-1:0] p2_data,
|
||||||
|
(* MARK_DEBUG="true" *) output wire p2_wrt,
|
||||||
|
|
||||||
|
// ADC
|
||||||
|
output ch2_clk,
|
||||||
|
(* MARK_DEBUG="true" *) input [ADC_DATA_WIDTH-1:0] ch2_data,
|
||||||
|
input ch2_otr
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// IDELAYCTRL
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
(* IODELAY_GROUP = "rgmii_idelay_group" *)
|
||||||
|
IDELAYCTRL IDELAYCTRL_inst (
|
||||||
|
.RDY (),
|
||||||
|
.REFCLK (sys_clk),
|
||||||
|
.RST (1'b0)
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Generated clocks for controller
|
||||||
|
// Need to create this IP in Vivado:
|
||||||
|
// input : 200 MHz
|
||||||
|
// output0: 130 MHz
|
||||||
|
// output1: 65 MHz
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
wire dac_clk;
|
||||||
|
wire adc_clk;
|
||||||
|
wire clk_wiz_locked;
|
||||||
|
|
||||||
|
clk_wiz_ctrl_inst clk_wiz_ctrl_inst (
|
||||||
|
.clk_in1 (sys_clk),
|
||||||
|
.reset (~rst_n),
|
||||||
|
.clk_out1 (dac_clk), // 130 MHz
|
||||||
|
.clk_out2 (adc_clk), // 65 MHz
|
||||||
|
.locked (clk_wiz_locked)
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// axis_mac interface
|
||||||
|
// RX stream from Ethernet goes into controller
|
||||||
|
// TX stream is unused for now
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Controller reset
|
||||||
|
// Use both external reset and clk_wiz lock
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
wire ctrl_rst_n = rst_n & clk_wiz_locked;
|
||||||
|
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) logic finish;
|
||||||
|
|
||||||
|
// Controller outputs to debug
|
||||||
|
(* MARK_DEBUG="true" *) wire [31:0] dac_pulse_width;
|
||||||
|
(* MARK_DEBUG="true" *) wire [31:0] dac_pulse_period;
|
||||||
|
(* MARK_DEBUG="true" *) wire [DAC_DATA_WIDTH-1:0] dac_pulse_height;
|
||||||
|
(* MARK_DEBUG="true" *) wire [15:0] dac_pulse_num;
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) wire [31:0] adc_pulse_period;
|
||||||
|
(* MARK_DEBUG="true" *) wire [15:0] adc_pulse_num;
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) wire dac_start;
|
||||||
|
(* MARK_DEBUG="true" *) wire adc_start;
|
||||||
|
(* MARK_DEBUG="true" *) wire dac_rst;
|
||||||
|
(* MARK_DEBUG="true" *) wire adc_rst;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Controller
|
||||||
|
// ETH domain = gmii_rx_clk, because RX AXI master comes from axis_mac RX side
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
control #(
|
||||||
|
.DAC_DATA_WIDTH(DAC_DATA_WIDTH)
|
||||||
|
) udp_ctrl_inst (
|
||||||
|
.eth_clk_in (gmii_rx_clk),
|
||||||
|
.dac_clk_in (dac_clk),
|
||||||
|
.adc_clk_in (adc_clk),
|
||||||
|
.rst_n (ctrl_rst_n),
|
||||||
|
|
||||||
|
.s_axis_tdata (m_axis_rx_tdata),
|
||||||
|
.s_axis_tvalid (m_axis_rx_tvalid),
|
||||||
|
.s_axis_tready (m_axis_rx_tready),
|
||||||
|
.s_axis_tlast (m_axis_rx_tlast),
|
||||||
|
|
||||||
|
.finish (finish),
|
||||||
|
|
||||||
|
.dac_pulse_width (dac_pulse_width),
|
||||||
|
.dac_pulse_period (dac_pulse_period),
|
||||||
|
.dac_pulse_height (dac_pulse_height),
|
||||||
|
.dac_pulse_num (dac_pulse_num),
|
||||||
|
|
||||||
|
.adc_pulse_period (adc_pulse_period),
|
||||||
|
.adc_pulse_num (adc_pulse_num),
|
||||||
|
|
||||||
|
.dac_start (dac_start),
|
||||||
|
.adc_start (adc_start),
|
||||||
|
|
||||||
|
.dac_rst (dac_rst),
|
||||||
|
.adc_rst (adc_rst)
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// DAC
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) logic sample_req;
|
||||||
|
(* MARK_DEBUG="true" *) logic sample_req_sync1;
|
||||||
|
(* MARK_DEBUG="true" *) logic sample_req_sync2;
|
||||||
|
(* MARK_DEBUG="true" *) logic sample_req_sync3;
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) logic sample_done;
|
||||||
|
(* MARK_DEBUG="true" *) logic sample_done_sync1;
|
||||||
|
(* MARK_DEBUG="true" *) logic sample_done_sync2;
|
||||||
|
(* MARK_DEBUG="true" *) logic sample_done_sync3;
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// DAC -> ADC CDC
|
||||||
|
//------------------------------------------------------------
|
||||||
|
always_ff @(posedge adc_clk or posedge adc_rst) begin
|
||||||
|
if (adc_rst) begin
|
||||||
|
sample_req <= 1'b0;
|
||||||
|
sample_req_sync2 <= 1'b0;
|
||||||
|
sample_req_sync3 <= 1'b0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
sample_req_sync2 <= sample_req_sync1;
|
||||||
|
sample_req_sync3 <= sample_req_sync2;
|
||||||
|
sample_req <= sample_req_sync3;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// ADC -> DAC CDC
|
||||||
|
//------------------------------------------------------------
|
||||||
|
always_ff @(posedge dac_clk or posedge dac_rst) begin
|
||||||
|
if (dac_rst) begin
|
||||||
|
sample_done <= 1'b0;
|
||||||
|
sample_done_sync2 <= 1'b0;
|
||||||
|
sample_done_sync3 <= 1'b0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
sample_done_sync2 <= sample_done_sync1;
|
||||||
|
sample_done_sync3 <= sample_done_sync2;
|
||||||
|
sample_done <= sample_done_sync3;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// Generator
|
||||||
|
//------------------------------------------------------------
|
||||||
|
|
||||||
|
generator #(
|
||||||
|
.DATA_WIDTH(DAC_DATA_WIDTH),
|
||||||
|
.ZERO_LEVEL(ZERO_LEVEL)
|
||||||
|
) generator_inst (
|
||||||
|
.clk_in(dac_clk),
|
||||||
|
.rst(dac_rst),
|
||||||
|
.start(dac_start),
|
||||||
|
.pulse_width(dac_pulse_width),
|
||||||
|
.pulse_period(dac_pulse_period),
|
||||||
|
.pulse_height(dac_pulse_height),
|
||||||
|
.pulse_num(dac_pulse_num),
|
||||||
|
.pulse(p2_wrt),
|
||||||
|
.pulse_height_out(p2_data),
|
||||||
|
.sample_done(sample_done),
|
||||||
|
.sample_req(sample_req_sync1)
|
||||||
|
);
|
||||||
|
|
||||||
|
wire ch2_clk_oddr;
|
||||||
|
|
||||||
|
ODDR #(
|
||||||
|
.DDR_CLK_EDGE("SAME_EDGE"),
|
||||||
|
.INIT(1'b0),
|
||||||
|
.SRTYPE("SYNC")
|
||||||
|
) ODDR_ch2_clk (
|
||||||
|
.Q (ch2_clk_oddr),
|
||||||
|
.C (adc_clk),
|
||||||
|
.CE(1'b1),
|
||||||
|
.D1(1'b1),
|
||||||
|
.D2(1'b0),
|
||||||
|
.R (1'b0),
|
||||||
|
.S (1'b0)
|
||||||
|
);
|
||||||
|
|
||||||
|
OBUF OBUF_ch2_clk (
|
||||||
|
.I(ch2_clk_oddr),
|
||||||
|
.O(ch2_clk)
|
||||||
|
);
|
||||||
|
|
||||||
|
wire p2_clk_oddr;
|
||||||
|
|
||||||
|
ODDR #(
|
||||||
|
.DDR_CLK_EDGE("SAME_EDGE"),
|
||||||
|
.INIT(1'b0),
|
||||||
|
.SRTYPE("SYNC")
|
||||||
|
) ODDR_p2_clk (
|
||||||
|
.Q (p2_clk_oddr),
|
||||||
|
.C (dac_clk),
|
||||||
|
.CE(1'b1),
|
||||||
|
.D1(1'b1),
|
||||||
|
.D2(1'b0),
|
||||||
|
.R (1'b0),
|
||||||
|
.S (1'b0)
|
||||||
|
);
|
||||||
|
|
||||||
|
OBUF OBUF_p2_clk (
|
||||||
|
.I(p2_clk_oddr),
|
||||||
|
.O(p2_clk)
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// ADC
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) logic [ADC_DATA_WIDTH*PACK_FACTOR-1:0] accum_m_axis_tdata;
|
||||||
|
(* MARK_DEBUG="true" *) logic acum_m_axis_tvalid;
|
||||||
|
|
||||||
|
sampler
|
||||||
|
#(
|
||||||
|
.DATA_WIDTH(ADC_DATA_WIDTH),
|
||||||
|
.PACK_FACTOR(PACK_FACTOR),
|
||||||
|
.PROCESS_MODE(PROCESS_MODE)
|
||||||
|
)
|
||||||
|
sampler_dut
|
||||||
|
(
|
||||||
|
.clk_in(adc_clk),
|
||||||
|
.rst(adc_rst),
|
||||||
|
.data_in(ch2_data),
|
||||||
|
.out_of_range(ch2_otr),
|
||||||
|
.m_axis_tdata(accum_m_axis_tdata),
|
||||||
|
.m_axis_tvalid(acum_m_axis_tvalid),
|
||||||
|
.smp_num(adc_pulse_period),
|
||||||
|
.sample_req(sample_req),
|
||||||
|
.sample_done(sample_done_sync1)
|
||||||
|
);
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Accumulator
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
accumulator_top
|
||||||
|
#(
|
||||||
|
.DATA_WIDTH(ADC_DATA_WIDTH),
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH),
|
||||||
|
.N_MAX(N_MAX),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.PACKET_SIZE(PACKET_SIZE)
|
||||||
|
)
|
||||||
|
accumulator_top_dut
|
||||||
|
(
|
||||||
|
.clk_in(adc_clk),
|
||||||
|
.rst(adc_rst),
|
||||||
|
.s_axis_tdata(accum_m_axis_tdata),
|
||||||
|
.s_axis_tvalid(acum_m_axis_tvalid),
|
||||||
|
.start(adc_start),
|
||||||
|
.smp_num(adc_pulse_period),
|
||||||
|
.seq_num(adc_pulse_num),
|
||||||
|
|
||||||
|
.eth_clk_in(gmii_tx_clk),
|
||||||
|
.req_ready(req_ready),
|
||||||
|
.send_req(send_req),
|
||||||
|
.m_axis_tdata(s_axis_tx_tdata),
|
||||||
|
.m_axis_tvalid(s_axis_tx_tvalid),
|
||||||
|
.m_axis_tready(s_axis_tx_tready),
|
||||||
|
.m_axis_tlast(s_axis_tx_tlast),
|
||||||
|
|
||||||
|
.finish(finish)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Simple LED status
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
assign led[0] = clk_wiz_locked;
|
||||||
|
assign led[1] = m_axis_rx_tvalid;
|
||||||
|
assign led[2] = dac_start;
|
||||||
|
|
||||||
|
endmodule
|
||||||
267
designs/reflectometer_base/tb_reflectometer.sv
Normal file
267
designs/reflectometer_base/tb_reflectometer.sv
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module tb_reflectometer;
|
||||||
|
|
||||||
|
// parameters
|
||||||
|
localparam int unsigned DAC_DATA_WIDTH = 14;
|
||||||
|
localparam int unsigned ADC_DATA_WIDTH = 12;
|
||||||
|
localparam PACK_FACTOR = 1; // not used in TB
|
||||||
|
localparam PROCESS_MODE = 0; // 0 - uint, 1 - int
|
||||||
|
localparam ZERO_LEVEL = 8192; // DAC zero voltage representation (2^14 / 2)
|
||||||
|
localparam ACCUM_WIDTH = 32; // accumulator number bit witdth
|
||||||
|
localparam N_MAX = 4096; // max value of windows to average by experiments
|
||||||
|
localparam WINDOW_SIZE = 65; // fixed subwindow size to average by time
|
||||||
|
localparam PACKET_SIZE = 1024; // bytes per UDP packet
|
||||||
|
|
||||||
|
localparam int unsigned ADC_CLK_MHZ = 65;
|
||||||
|
localparam int unsigned DAC_CLK_MHZ = 125;
|
||||||
|
|
||||||
|
// may be changed for test purposes
|
||||||
|
localparam int unsigned PULSE_WIDTH = 2**6;
|
||||||
|
localparam int unsigned PULSE_PERIOD = 2**8;
|
||||||
|
localparam int unsigned PULSE_NUM = 10;
|
||||||
|
localparam int unsigned PULSE_HEIGHT = 2**12;
|
||||||
|
localparam int unsigned PULSE_PERIOD_ADC = (int'(real'(ADC_CLK_MHZ) / real'(DAC_CLK_MHZ) * real'(PULSE_PERIOD)) / int'(WINDOW_SIZE)) * int'(WINDOW_SIZE);
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
if (PULSE_WIDTH <= 0)
|
||||||
|
$fatal(1, "PULSE_WIDTH should be positive");
|
||||||
|
if (PULSE_PERIOD <= 0)
|
||||||
|
$fatal(1, "PULSE_PERIOD should be positive");
|
||||||
|
if (PULSE_NUM <= 0)
|
||||||
|
$fatal(1, "PULSE_NUM should be positive");
|
||||||
|
if (PULSE_HEIGHT <= 0)
|
||||||
|
$fatal(1, "PULSE_HEIGHT should be positive");
|
||||||
|
if (PULSE_WIDTH >= 2**32-1)
|
||||||
|
$fatal(1, "PULSE_WIDTH too high");
|
||||||
|
if (PULSE_PERIOD >= 2**32-1)
|
||||||
|
$fatal(1, "PULSE_PERIOD too high");
|
||||||
|
if (PULSE_NUM >= 2**16-1)
|
||||||
|
$fatal(1, "PULSE_NUM too high");
|
||||||
|
if (PULSE_HEIGHT >= 2**DAC_DATA_WIDTH-1)
|
||||||
|
$fatal(1, "PULSE_HEIGHT too high");
|
||||||
|
if (PULSE_PERIOD_ADC % WINDOW_SIZE == 0)
|
||||||
|
$fatal(1, "PULSE_PERIOD_ADC isn't multiple of WINDOW_SIZE");
|
||||||
|
end
|
||||||
|
|
||||||
|
// DUT signals
|
||||||
|
logic clk200, clk_eth_phy_tx, clk_eth_phy_rx; // GMII clocks
|
||||||
|
logic rst_n;
|
||||||
|
wire [3:0] status_leds; // [ None, dac_start, m_axis_valid, clk_wiz_locked ]
|
||||||
|
|
||||||
|
wire dac_clk, dac_en;
|
||||||
|
wire [DAC_DATA_WIDTH-1:0] dac_data;
|
||||||
|
wire adc_clk;
|
||||||
|
logic adc_otr;
|
||||||
|
logic [ADC_DATA_WIDTH-1:0] adc_data;
|
||||||
|
|
||||||
|
wire [7:0] s_axis_tx_tdata;
|
||||||
|
wire s_axis_tx_tvalid;
|
||||||
|
logic s_axis_tx_tready;
|
||||||
|
wire s_axis_tx_tlast;
|
||||||
|
|
||||||
|
logic phy_ready;
|
||||||
|
wire accum_tx_start;
|
||||||
|
logic [7:0] m_axis_rx_tdata;
|
||||||
|
logic m_axis_rx_tvalid;
|
||||||
|
logic m_axis_rx_tlast;
|
||||||
|
logic m_axis_rx_tready;
|
||||||
|
|
||||||
|
logic [127:0] dut_config = 0;
|
||||||
|
|
||||||
|
// DUT
|
||||||
|
reflectometer_top #(
|
||||||
|
.DAC_DATA_WIDTH(DAC_DATA_WIDTH),
|
||||||
|
.ADC_DATA_WIDTH(ADC_DATA_WIDTH),
|
||||||
|
.PACK_FACTOR(PACK_FACTOR),
|
||||||
|
.PROCESS_MODE(PROCESS_MODE),
|
||||||
|
.ZERO_LEVEL(ZERO_LEVEL),
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH),
|
||||||
|
.N_MAX(N_MAX),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.PACKET_SIZE(PACKET_SIZE)
|
||||||
|
) DUT (
|
||||||
|
.sys_clk(clk200), // main clk 200 mhz
|
||||||
|
.rst_n(rst_n), // rst_n
|
||||||
|
.led(status_leds), // indication [3:0]
|
||||||
|
.gmii_rx_clk(clk_eth_phy_rx), // ext. clk from PHY
|
||||||
|
.gmii_tx_clk(clk_eth_phy_tx), // ext. clk from PHY
|
||||||
|
// accumulated data stream
|
||||||
|
.s_axis_tx_tdata(s_axis_tx_tdata),
|
||||||
|
.s_axis_tx_tvalid(s_axis_tx_tvalid),
|
||||||
|
.s_axis_tx_tready(s_axis_tx_tready),
|
||||||
|
.s_axis_tx_tlast(s_axis_tx_tlast),
|
||||||
|
// controller data stream
|
||||||
|
.m_axis_rx_tdata(m_axis_rx_tdata),
|
||||||
|
.m_axis_rx_tvalid(m_axis_rx_tvalid),
|
||||||
|
.m_axis_rx_tlast(m_axis_rx_tlast),
|
||||||
|
.m_axis_rx_tready(m_axis_rx_tready),
|
||||||
|
|
||||||
|
.req_ready(phy_ready), // AXI-stream requester ready
|
||||||
|
.send_req(accum_tx_start), // AXI-stream start transmit
|
||||||
|
.p2_clk(dac_clk), // DAC clk
|
||||||
|
.p2_data(dac_data), // DAC [DAC_DATA_WIDTH-1:0] data
|
||||||
|
.p2_wrt(dac_en), // DAC write enable
|
||||||
|
.ch2_clk(adc_clk), // ADC clk
|
||||||
|
.ch2_data(adc_data), // ADC [ADC_DATA_WIDTH-1:0] data
|
||||||
|
.ch2_otr(adc_otr) // ADC signal out-of-range
|
||||||
|
);
|
||||||
|
|
||||||
|
// clocks
|
||||||
|
initial begin
|
||||||
|
// 200 MHz
|
||||||
|
clk200 = 1'b0;
|
||||||
|
forever #2.5 clk200 = ~clk200;
|
||||||
|
end
|
||||||
|
initial begin
|
||||||
|
// 125 MHz
|
||||||
|
clk_eth_phy_tx = 1'b0;
|
||||||
|
forever #4 clk_eth_phy_tx = ~clk_eth_phy_tx;
|
||||||
|
end
|
||||||
|
initial begin
|
||||||
|
// 125 MHz
|
||||||
|
clk_eth_phy_rx = 1'b0;
|
||||||
|
forever #4 clk_eth_phy_rx = ~clk_eth_phy_rx;
|
||||||
|
end
|
||||||
|
|
||||||
|
// ADC input noise simulation
|
||||||
|
always @(posedge adc_clk or negedge rst_n) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
adc_data <= '0;
|
||||||
|
end else begin
|
||||||
|
adc_data <= $urandom() & ((1 << ADC_DATA_WIDTH) - 1);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assign adc_otr = 1'b0;
|
||||||
|
|
||||||
|
// AXIS tasks
|
||||||
|
task automatic axis_send_byte(
|
||||||
|
ref logic clk,
|
||||||
|
input logic [7:0] data,
|
||||||
|
input logic last,
|
||||||
|
ref logic tvalid,
|
||||||
|
ref logic [7:0] tdata,
|
||||||
|
ref logic tlast,
|
||||||
|
input logic tready
|
||||||
|
);
|
||||||
|
@(posedge clk);
|
||||||
|
tdata <= data;
|
||||||
|
tlast <= last;
|
||||||
|
tvalid <= 1'b1;
|
||||||
|
|
||||||
|
// Ждем готовности приемника
|
||||||
|
wait(tready === 1'b1);
|
||||||
|
|
||||||
|
@(posedge clk);
|
||||||
|
tvalid <= 1'b0;
|
||||||
|
tlast <= 1'b0;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic dut_soft_reset();
|
||||||
|
axis_send_byte(
|
||||||
|
.clk(clk_eth_phy_rx),
|
||||||
|
.data(8'b00001111),
|
||||||
|
.last(1'b1),
|
||||||
|
.tvalid(m_axis_rx_tvalid),
|
||||||
|
.tdata(m_axis_rx_tdata),
|
||||||
|
.tlast(m_axis_rx_tlast),
|
||||||
|
.tready(m_axis_rx_tready)
|
||||||
|
);
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic dut_start();
|
||||||
|
axis_send_byte(
|
||||||
|
.clk(clk_eth_phy_rx),
|
||||||
|
.data(8'b11110000),
|
||||||
|
.last(1'b1),
|
||||||
|
.tvalid(m_axis_rx_tvalid),
|
||||||
|
.tdata(m_axis_rx_tdata),
|
||||||
|
.tlast(m_axis_rx_tlast),
|
||||||
|
.tready(m_axis_rx_tready)
|
||||||
|
);
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// task automatic dut_send_config(
|
||||||
|
// input logic [127:0] ctrl_config
|
||||||
|
// );
|
||||||
|
// // команда set_data
|
||||||
|
// axis_send_byte(
|
||||||
|
// .clk(clk_eth_phy_rx),
|
||||||
|
// .data(8'b10001000),
|
||||||
|
// .last(1'b0),
|
||||||
|
// .tvalid(m_axis_rx_tvalid),
|
||||||
|
// .tdata(m_axis_rx_tdata),
|
||||||
|
// .tlast(m_axis_rx_tlast),
|
||||||
|
// .tready(m_axis_rx_tready)
|
||||||
|
// );
|
||||||
|
// // config burst
|
||||||
|
// for (int i = 0; i < 16; i++) begin
|
||||||
|
// logic [7:0] byte_to_send;
|
||||||
|
// logic is_last;
|
||||||
|
|
||||||
|
// // get byte
|
||||||
|
// byte_to_send = ctrl_config[i*8 +: 8];
|
||||||
|
// // tlast for last byte
|
||||||
|
// is_last = (i == 15);
|
||||||
|
|
||||||
|
// axis_send_byte(
|
||||||
|
// .clk(clk_eth_phy_rx),
|
||||||
|
// .data(byte_to_send),
|
||||||
|
// .last(is_last),
|
||||||
|
// .tvalid(m_axis_rx_tvalid),
|
||||||
|
// .tdata(m_axis_rx_tdata),
|
||||||
|
// .tlast(m_axis_rx_tlast),
|
||||||
|
// .tready(m_axis_rx_tready)
|
||||||
|
// );
|
||||||
|
// end
|
||||||
|
// endtask
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// some helpers for controller axis
|
||||||
|
|
||||||
|
// GAME PLAN
|
||||||
|
// 1. setup reflectometer
|
||||||
|
// 2. create some reference signal with noise + virtual ADC
|
||||||
|
// 3. setup m_axis endpoint for controller to start reflectometer (create multiple tasks)
|
||||||
|
// 4. setup s_axis endpoint for data gathering and plotting
|
||||||
|
// 5. check standalone reflectometer
|
||||||
|
// 6. add reference signal averaging loop throw generator pulse posedge detection
|
||||||
|
// 7. visual comparision of reference VS reflectometer
|
||||||
|
// 8. add statistics for signal comparision (MSE/RMSE)
|
||||||
|
|
||||||
|
// main TB
|
||||||
|
initial begin
|
||||||
|
// setup
|
||||||
|
rst_n = 1'b0;
|
||||||
|
s_axis_tx_tready = 1'b0;
|
||||||
|
m_axis_rx_tdata = 1'b0;
|
||||||
|
m_axis_rx_tvalid = 1'b0;
|
||||||
|
m_axis_rx_tlast = 1'b0;
|
||||||
|
phy_ready = 1'b0;
|
||||||
|
|
||||||
|
// startup
|
||||||
|
#100;
|
||||||
|
rst_n = 1'b1;
|
||||||
|
wait(DUT.clk_wiz_ctrl_inst.locked == 1'b1);
|
||||||
|
#20;
|
||||||
|
$display("=== clocks ready / wiz. locked ===");
|
||||||
|
#40;
|
||||||
|
// ready to work
|
||||||
|
|
||||||
|
dut_config[31:0] = PULSE_WIDTH;
|
||||||
|
dut_config[63:32] = PULSE_PERIOD;
|
||||||
|
dut_config[79:64] = PULSE_NUM;
|
||||||
|
dut_config[79+DAC_DATA_WIDTH:80] = PULSE_HEIGHT;
|
||||||
|
dut_config[127:96] = PULSE_PERIOD_ADC;
|
||||||
|
|
||||||
|
// dut_send_config(dut_config);
|
||||||
|
dut_start();
|
||||||
|
// dut_start();
|
||||||
|
#1000;
|
||||||
|
// dut_soft_reset();
|
||||||
|
|
||||||
|
$display("=== ALL BASIC TESTS PASSED ===");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
@ -7,8 +7,8 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# FPGA settings
|
# FPGA settings
|
||||||
FPGA_PART = xc7a35tfgg484-1
|
FPGA_PART = xc7a100tfgg484-2
|
||||||
FPGA_TOP = eth_generator_top
|
FPGA_TOP = prototype_top
|
||||||
FPGA_ARCH = artix7
|
FPGA_ARCH = artix7
|
||||||
|
|
||||||
RTL_DIR = ../../rtl
|
RTL_DIR = ../../rtl
|
||||||
@ -16,13 +16,14 @@ RTL_DIR = ../../rtl
|
|||||||
|
|
||||||
include ../../scripts/vivado.mk
|
include ../../scripts/vivado.mk
|
||||||
|
|
||||||
SYN_FILES += eth_generator.sv
|
SYN_FILES += prototype.sv
|
||||||
|
SYN_FILES += ../reflectometer_base/reflectometer.sv
|
||||||
SYN_FILES += $(sort $(shell find ../../rtl -type f \( -name '*.v' -o -name '*.sv' \)))
|
SYN_FILES += $(sort $(shell find ../../rtl -type f \( -name '*.v' -o -name '*.sv' \)))
|
||||||
|
|
||||||
XCI_FILES = $(sort $(shell find ../../rtl/ethernet-udp/src -type f -name '*.xci'))
|
XCI_FILES = $(sort $(shell find ../../rtl/ethernet-udp/src -type f -name '*.xci'))
|
||||||
XCI_FILES += $(sort $(shell find ip/ -type f -name '*.xci'))
|
XCI_FILES += $(sort $(shell find ip/ -type f -name '*.xci'))
|
||||||
|
|
||||||
XDC_FILES += ../../constraints/ax7a035b.xdc
|
XDC_FILES += ../../constraints/ax7102.xdc
|
||||||
XDC_FILES += debug.xdc
|
XDC_FILES += debug.xdc
|
||||||
|
|
||||||
|
|
||||||
13
designs/reflectometer_prototype/README.md
Normal file
13
designs/reflectometer_prototype/README.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Тестовый проект рефлектометра
|
||||||
|
Проект состоит из AXIS Ethernet и основной части рефлектометра - генератора, сэмплера, контроллера и синхронизирующей логики. Разработан для AX7102, АЦП AN9238, ЦАП AD9767. Плата подключается по ethernet к компьютеру, IP должен быть 192.168.0.3 у компьютера, в ПЛИС установлен IP 192.168.0.2, после подключения должен пройти ARP и после этого можно начнить коммуникацию через консольку.
|
||||||
|
## Сборка
|
||||||
|
```make all``` - собрать все до битстрима
|
||||||
|
|
||||||
|
```make vivado``` - открыть проект в Vivado
|
||||||
|
|
||||||
|
## Управление
|
||||||
|
Используйте software/console.py. Примеры:
|
||||||
|
|
||||||
|
```python3 console.py --pulse_width 3500 --pulse_period 20000 --pulse_height 15000 --pulse_num 550 --dac-bits 14```
|
||||||
|
|
||||||
|
```python3 console.py --pulse_width 15000 --pulse_period 20000 --pulse_height 1500 --pulse_num 550 --dac-bits 14```
|
||||||
238
designs/reflectometer_prototype/debug.xdc
Normal file
238
designs/reflectometer_prototype/debug.xdc
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
set_clock_groups -name ASYNC_UDP_CTRL -asynchronous -group [get_clocks rx_clk] -group [get_clocks clk_out1_clk_wiz_ctrl_inst] -group [get_clocks clk_out2_clk_wiz_ctrl_inst]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
connect_debug_port u_ila_0/clk [get_nets [list clk_wiz_ctrl_inst/inst/clk_out2]]
|
||||||
|
connect_debug_port u_ila_0/probe0 [get_nets [list {accumulator_top_dut/output_async_fifo/wr_state[0]} {accumulator_top_dut/output_async_fifo/wr_state[1]} {accumulator_top_dut/output_async_fifo/wr_state[2]}]]
|
||||||
|
connect_debug_port u_ila_0/probe1 [get_nets [list {sampler_dut/smp_num_reg[0]} {sampler_dut/smp_num_reg[1]} {sampler_dut/smp_num_reg[2]} {sampler_dut/smp_num_reg[3]} {sampler_dut/smp_num_reg[4]} {sampler_dut/smp_num_reg[5]} {sampler_dut/smp_num_reg[6]} {sampler_dut/smp_num_reg[7]} {sampler_dut/smp_num_reg[8]} {sampler_dut/smp_num_reg[9]} {sampler_dut/smp_num_reg[10]} {sampler_dut/smp_num_reg[11]} {sampler_dut/smp_num_reg[12]} {sampler_dut/smp_num_reg[13]} {sampler_dut/smp_num_reg[14]} {sampler_dut/smp_num_reg[15]} {sampler_dut/smp_num_reg[16]} {sampler_dut/smp_num_reg[17]} {sampler_dut/smp_num_reg[18]} {sampler_dut/smp_num_reg[19]} {sampler_dut/smp_num_reg[20]} {sampler_dut/smp_num_reg[21]} {sampler_dut/smp_num_reg[22]} {sampler_dut/smp_num_reg[23]} {sampler_dut/smp_num_reg[24]} {sampler_dut/smp_num_reg[25]} {sampler_dut/smp_num_reg[26]} {sampler_dut/smp_num_reg[27]} {sampler_dut/smp_num_reg[28]} {sampler_dut/smp_num_reg[29]} {sampler_dut/smp_num_reg[30]} {sampler_dut/smp_num_reg[31]}]]
|
||||||
|
connect_debug_port u_ila_0/probe2 [get_nets [list {adc_pulse_num[0]} {adc_pulse_num[1]} {adc_pulse_num[2]} {adc_pulse_num[3]} {adc_pulse_num[4]} {adc_pulse_num[5]} {adc_pulse_num[6]} {adc_pulse_num[7]} {adc_pulse_num[8]} {adc_pulse_num[9]} {adc_pulse_num[10]} {adc_pulse_num[11]} {adc_pulse_num[12]} {adc_pulse_num[13]} {adc_pulse_num[14]} {adc_pulse_num[15]}]]
|
||||||
|
connect_debug_port u_ila_0/probe4 [get_nets [list {accum_m_axis_tdata[0]} {accum_m_axis_tdata[1]} {accum_m_axis_tdata[2]} {accum_m_axis_tdata[3]} {accum_m_axis_tdata[4]} {accum_m_axis_tdata[5]} {accum_m_axis_tdata[6]} {accum_m_axis_tdata[7]} {accum_m_axis_tdata[8]} {accum_m_axis_tdata[9]} {accum_m_axis_tdata[10]} {accum_m_axis_tdata[11]}]]
|
||||||
|
connect_debug_port u_ila_0/probe5 [get_nets [list {sampler_dut/cnt_smp_num[0]} {sampler_dut/cnt_smp_num[1]} {sampler_dut/cnt_smp_num[2]} {sampler_dut/cnt_smp_num[3]} {sampler_dut/cnt_smp_num[4]} {sampler_dut/cnt_smp_num[5]} {sampler_dut/cnt_smp_num[6]} {sampler_dut/cnt_smp_num[7]} {sampler_dut/cnt_smp_num[8]} {sampler_dut/cnt_smp_num[9]} {sampler_dut/cnt_smp_num[10]} {sampler_dut/cnt_smp_num[11]} {sampler_dut/cnt_smp_num[12]} {sampler_dut/cnt_smp_num[13]} {sampler_dut/cnt_smp_num[14]} {sampler_dut/cnt_smp_num[15]} {sampler_dut/cnt_smp_num[16]} {sampler_dut/cnt_smp_num[17]} {sampler_dut/cnt_smp_num[18]} {sampler_dut/cnt_smp_num[19]} {sampler_dut/cnt_smp_num[20]} {sampler_dut/cnt_smp_num[21]} {sampler_dut/cnt_smp_num[22]} {sampler_dut/cnt_smp_num[23]} {sampler_dut/cnt_smp_num[24]} {sampler_dut/cnt_smp_num[25]} {sampler_dut/cnt_smp_num[26]} {sampler_dut/cnt_smp_num[27]} {sampler_dut/cnt_smp_num[28]} {sampler_dut/cnt_smp_num[29]} {sampler_dut/cnt_smp_num[30]} {sampler_dut/cnt_smp_num[31]}]]
|
||||||
|
connect_debug_port u_ila_0/probe6 [get_nets [list {sampler_dut/data_converted[0]} {sampler_dut/data_converted[1]} {sampler_dut/data_converted[2]} {sampler_dut/data_converted[3]} {sampler_dut/data_converted[4]} {sampler_dut/data_converted[5]} {sampler_dut/data_converted[6]} {sampler_dut/data_converted[7]} {sampler_dut/data_converted[8]} {sampler_dut/data_converted[9]} {sampler_dut/data_converted[10]} {sampler_dut/data_converted[11]}]]
|
||||||
|
connect_debug_port u_ila_0/probe7 [get_nets [list {adc_pulse_period[0]} {adc_pulse_period[1]} {adc_pulse_period[2]} {adc_pulse_period[3]} {adc_pulse_period[4]} {adc_pulse_period[5]} {adc_pulse_period[6]} {adc_pulse_period[7]} {adc_pulse_period[8]} {adc_pulse_period[9]} {adc_pulse_period[10]} {adc_pulse_period[11]} {adc_pulse_period[12]} {adc_pulse_period[13]} {adc_pulse_period[14]} {adc_pulse_period[15]} {adc_pulse_period[16]} {adc_pulse_period[17]} {adc_pulse_period[18]} {adc_pulse_period[19]} {adc_pulse_period[20]} {adc_pulse_period[21]} {adc_pulse_period[22]} {adc_pulse_period[23]} {adc_pulse_period[24]} {adc_pulse_period[25]} {adc_pulse_period[26]} {adc_pulse_period[27]} {adc_pulse_period[28]} {adc_pulse_period[29]} {adc_pulse_period[30]} {adc_pulse_period[31]}]]
|
||||||
|
connect_debug_port u_ila_0/probe8 [get_nets [list {accumulator_top_dut/accum_main/wr_state[0]} {accumulator_top_dut/accum_main/wr_state[1]} {accumulator_top_dut/accum_main/wr_state[2]} {accumulator_top_dut/accum_main/wr_state[3]}]]
|
||||||
|
connect_debug_port u_ila_0/probe9 [get_nets [list {accumulator_top_dut/accum_main/adder_dut/cnt[0]} {accumulator_top_dut/accum_main/adder_dut/cnt[1]} {accumulator_top_dut/accum_main/adder_dut/cnt[2]} {accumulator_top_dut/accum_main/adder_dut/cnt[3]} {accumulator_top_dut/accum_main/adder_dut/cnt[4]} {accumulator_top_dut/accum_main/adder_dut/cnt[5]} {accumulator_top_dut/accum_main/adder_dut/cnt[6]} {accumulator_top_dut/accum_main/adder_dut/cnt[7]} {accumulator_top_dut/accum_main/adder_dut/cnt[8]} {accumulator_top_dut/accum_main/adder_dut/cnt[9]} {accumulator_top_dut/accum_main/adder_dut/cnt[10]} {accumulator_top_dut/accum_main/adder_dut/cnt[11]} {accumulator_top_dut/accum_main/adder_dut/cnt[12]} {accumulator_top_dut/accum_main/adder_dut/cnt[13]} {accumulator_top_dut/accum_main/adder_dut/cnt[14]} {accumulator_top_dut/accum_main/adder_dut/cnt[15]}]]
|
||||||
|
connect_debug_port u_ila_0/probe10 [get_nets [list acum_m_axis_tvalid]]
|
||||||
|
connect_debug_port u_ila_0/probe11 [get_nets [list adc_rst]]
|
||||||
|
connect_debug_port u_ila_0/probe12 [get_nets [list adc_start]]
|
||||||
|
connect_debug_port u_ila_0/probe13 [get_nets [list sampler_dut/enable]]
|
||||||
|
connect_debug_port u_ila_0/probe14 [get_nets [list finish]]
|
||||||
|
connect_debug_port u_ila_0/probe15 [get_nets [list sampler_dut/out_of_range_reg]]
|
||||||
|
connect_debug_port u_ila_0/probe16 [get_nets [list sample_req]]
|
||||||
|
connect_debug_port u_ila_1/clk [get_nets [list clk_wiz_ctrl_inst/inst/clk_out1]]
|
||||||
|
connect_debug_port u_ila_1/probe0 [get_nets [list {generator_inst/pulse_num_reg[0]} {generator_inst/pulse_num_reg[1]} {generator_inst/pulse_num_reg[2]} {generator_inst/pulse_num_reg[3]} {generator_inst/pulse_num_reg[4]} {generator_inst/pulse_num_reg[5]} {generator_inst/pulse_num_reg[6]} {generator_inst/pulse_num_reg[7]} {generator_inst/pulse_num_reg[8]} {generator_inst/pulse_num_reg[9]} {generator_inst/pulse_num_reg[10]} {generator_inst/pulse_num_reg[11]} {generator_inst/pulse_num_reg[12]} {generator_inst/pulse_num_reg[13]} {generator_inst/pulse_num_reg[14]} {generator_inst/pulse_num_reg[15]}]]
|
||||||
|
connect_debug_port u_ila_1/probe1 [get_nets [list {dac_pulse_num[0]} {dac_pulse_num[1]} {dac_pulse_num[2]} {dac_pulse_num[3]} {dac_pulse_num[4]} {dac_pulse_num[5]} {dac_pulse_num[6]} {dac_pulse_num[7]} {dac_pulse_num[8]} {dac_pulse_num[9]} {dac_pulse_num[10]} {dac_pulse_num[11]} {dac_pulse_num[12]} {dac_pulse_num[13]} {dac_pulse_num[14]} {dac_pulse_num[15]}]]
|
||||||
|
connect_debug_port u_ila_1/probe2 [get_nets [list {dac_pulse_period[0]} {dac_pulse_period[1]} {dac_pulse_period[2]} {dac_pulse_period[3]} {dac_pulse_period[4]} {dac_pulse_period[5]} {dac_pulse_period[6]} {dac_pulse_period[7]} {dac_pulse_period[8]} {dac_pulse_period[9]} {dac_pulse_period[10]} {dac_pulse_period[11]} {dac_pulse_period[12]} {dac_pulse_period[13]} {dac_pulse_period[14]} {dac_pulse_period[15]} {dac_pulse_period[16]} {dac_pulse_period[17]} {dac_pulse_period[18]} {dac_pulse_period[19]} {dac_pulse_period[20]} {dac_pulse_period[21]} {dac_pulse_period[22]} {dac_pulse_period[23]} {dac_pulse_period[24]} {dac_pulse_period[25]} {dac_pulse_period[26]} {dac_pulse_period[27]} {dac_pulse_period[28]} {dac_pulse_period[29]} {dac_pulse_period[30]} {dac_pulse_period[31]}]]
|
||||||
|
connect_debug_port u_ila_1/probe3 [get_nets [list {dac_pulse_width[0]} {dac_pulse_width[1]} {dac_pulse_width[2]} {dac_pulse_width[3]} {dac_pulse_width[4]} {dac_pulse_width[5]} {dac_pulse_width[6]} {dac_pulse_width[7]} {dac_pulse_width[8]} {dac_pulse_width[9]} {dac_pulse_width[10]} {dac_pulse_width[11]} {dac_pulse_width[12]} {dac_pulse_width[13]} {dac_pulse_width[14]} {dac_pulse_width[15]} {dac_pulse_width[16]} {dac_pulse_width[17]} {dac_pulse_width[18]} {dac_pulse_width[19]} {dac_pulse_width[20]} {dac_pulse_width[21]} {dac_pulse_width[22]} {dac_pulse_width[23]} {dac_pulse_width[24]} {dac_pulse_width[25]} {dac_pulse_width[26]} {dac_pulse_width[27]} {dac_pulse_width[28]} {dac_pulse_width[29]} {dac_pulse_width[30]} {dac_pulse_width[31]}]]
|
||||||
|
connect_debug_port u_ila_1/probe4 [get_nets [list {generator_inst/cnt_pulse_num[0]} {generator_inst/cnt_pulse_num[1]} {generator_inst/cnt_pulse_num[2]} {generator_inst/cnt_pulse_num[3]} {generator_inst/cnt_pulse_num[4]} {generator_inst/cnt_pulse_num[5]} {generator_inst/cnt_pulse_num[6]} {generator_inst/cnt_pulse_num[7]} {generator_inst/cnt_pulse_num[8]} {generator_inst/cnt_pulse_num[9]} {generator_inst/cnt_pulse_num[10]} {generator_inst/cnt_pulse_num[11]} {generator_inst/cnt_pulse_num[12]} {generator_inst/cnt_pulse_num[13]} {generator_inst/cnt_pulse_num[14]} {generator_inst/cnt_pulse_num[15]}]]
|
||||||
|
connect_debug_port u_ila_1/probe5 [get_nets [list {generator_inst/pulse_width_reg[0]} {generator_inst/pulse_width_reg[1]} {generator_inst/pulse_width_reg[2]} {generator_inst/pulse_width_reg[3]} {generator_inst/pulse_width_reg[4]} {generator_inst/pulse_width_reg[5]} {generator_inst/pulse_width_reg[6]} {generator_inst/pulse_width_reg[7]} {generator_inst/pulse_width_reg[8]} {generator_inst/pulse_width_reg[9]} {generator_inst/pulse_width_reg[10]} {generator_inst/pulse_width_reg[11]} {generator_inst/pulse_width_reg[12]} {generator_inst/pulse_width_reg[13]} {generator_inst/pulse_width_reg[14]} {generator_inst/pulse_width_reg[15]} {generator_inst/pulse_width_reg[16]} {generator_inst/pulse_width_reg[17]} {generator_inst/pulse_width_reg[18]} {generator_inst/pulse_width_reg[19]} {generator_inst/pulse_width_reg[20]} {generator_inst/pulse_width_reg[21]} {generator_inst/pulse_width_reg[22]} {generator_inst/pulse_width_reg[23]} {generator_inst/pulse_width_reg[24]} {generator_inst/pulse_width_reg[25]} {generator_inst/pulse_width_reg[26]} {generator_inst/pulse_width_reg[27]} {generator_inst/pulse_width_reg[28]} {generator_inst/pulse_width_reg[29]} {generator_inst/pulse_width_reg[30]} {generator_inst/pulse_width_reg[31]}]]
|
||||||
|
connect_debug_port u_ila_1/probe6 [get_nets [list {generator_inst/pulse_period_reg[0]} {generator_inst/pulse_period_reg[1]} {generator_inst/pulse_period_reg[2]} {generator_inst/pulse_period_reg[3]} {generator_inst/pulse_period_reg[4]} {generator_inst/pulse_period_reg[5]} {generator_inst/pulse_period_reg[6]} {generator_inst/pulse_period_reg[7]} {generator_inst/pulse_period_reg[8]} {generator_inst/pulse_period_reg[9]} {generator_inst/pulse_period_reg[10]} {generator_inst/pulse_period_reg[11]} {generator_inst/pulse_period_reg[12]} {generator_inst/pulse_period_reg[13]} {generator_inst/pulse_period_reg[14]} {generator_inst/pulse_period_reg[15]} {generator_inst/pulse_period_reg[16]} {generator_inst/pulse_period_reg[17]} {generator_inst/pulse_period_reg[18]} {generator_inst/pulse_period_reg[19]} {generator_inst/pulse_period_reg[20]} {generator_inst/pulse_period_reg[21]} {generator_inst/pulse_period_reg[22]} {generator_inst/pulse_period_reg[23]} {generator_inst/pulse_period_reg[24]} {generator_inst/pulse_period_reg[25]} {generator_inst/pulse_period_reg[26]} {generator_inst/pulse_period_reg[27]} {generator_inst/pulse_period_reg[28]} {generator_inst/pulse_period_reg[29]} {generator_inst/pulse_period_reg[30]} {generator_inst/pulse_period_reg[31]}]]
|
||||||
|
connect_debug_port u_ila_1/probe7 [get_nets [list {generator_inst/cnt_period[0]} {generator_inst/cnt_period[1]} {generator_inst/cnt_period[2]} {generator_inst/cnt_period[3]} {generator_inst/cnt_period[4]} {generator_inst/cnt_period[5]} {generator_inst/cnt_period[6]} {generator_inst/cnt_period[7]} {generator_inst/cnt_period[8]} {generator_inst/cnt_period[9]} {generator_inst/cnt_period[10]} {generator_inst/cnt_period[11]} {generator_inst/cnt_period[12]} {generator_inst/cnt_period[13]} {generator_inst/cnt_period[14]} {generator_inst/cnt_period[15]} {generator_inst/cnt_period[16]} {generator_inst/cnt_period[17]} {generator_inst/cnt_period[18]} {generator_inst/cnt_period[19]} {generator_inst/cnt_period[20]} {generator_inst/cnt_period[21]} {generator_inst/cnt_period[22]} {generator_inst/cnt_period[23]} {generator_inst/cnt_period[24]} {generator_inst/cnt_period[25]} {generator_inst/cnt_period[26]} {generator_inst/cnt_period[27]} {generator_inst/cnt_period[28]} {generator_inst/cnt_period[29]} {generator_inst/cnt_period[30]} {generator_inst/cnt_period[31]}]]
|
||||||
|
connect_debug_port u_ila_1/probe8 [get_nets [list dac_rst]]
|
||||||
|
connect_debug_port u_ila_1/probe9 [get_nets [list dac_start]]
|
||||||
|
connect_debug_port u_ila_1/probe10 [get_nets [list debug_dac_OBUF]]
|
||||||
|
connect_debug_port u_ila_1/probe11 [get_nets [list generator_inst/enable]]
|
||||||
|
connect_debug_port u_ila_1/probe12 [get_nets [list sample_done]]
|
||||||
|
connect_debug_port u_ila_2/clk [get_nets [list rgmii_rxc_IBUF_BUFG]]
|
||||||
|
connect_debug_port u_ila_2/probe0 [get_nets [list {accumulator_top_dut/output_async_fifo/rd_state[0]} {accumulator_top_dut/output_async_fifo/rd_state[1]} {accumulator_top_dut/output_async_fifo/rd_state[2]}]]
|
||||||
|
connect_debug_port dbg_hub/clk [get_nets rgmii_rxc_IBUF_BUFG]
|
||||||
|
|
||||||
|
create_debug_core u_ila_0 ila
|
||||||
|
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
||||||
|
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
||||||
|
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_0]
|
||||||
|
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0]
|
||||||
|
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0]
|
||||||
|
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
|
||||||
|
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
||||||
|
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/clk]
|
||||||
|
connect_debug_port u_ila_0/clk [get_nets [list reflectometer_inst/clk_wiz_ctrl_inst/inst/clk_out2]]
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
||||||
|
set_property port_width 4 [get_debug_ports u_ila_0/probe0]
|
||||||
|
connect_debug_port u_ila_0/probe0 [get_nets [list {reflectometer_inst/accumulator_top_dut/accum_main/wr_state[0]} {reflectometer_inst/accumulator_top_dut/accum_main/wr_state[1]} {reflectometer_inst/accumulator_top_dut/accum_main/wr_state[2]} {reflectometer_inst/accumulator_top_dut/accum_main/wr_state[3]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
||||||
|
set_property port_width 3 [get_debug_ports u_ila_0/probe1]
|
||||||
|
connect_debug_port u_ila_0/probe1 [get_nets [list {reflectometer_inst/accumulator_top_dut/output_async_fifo/wr_state[0]} {reflectometer_inst/accumulator_top_dut/output_async_fifo/wr_state[1]} {reflectometer_inst/accumulator_top_dut/output_async_fifo/wr_state[2]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
||||||
|
set_property port_width 32 [get_debug_ports u_ila_0/probe2]
|
||||||
|
connect_debug_port u_ila_0/probe2 [get_nets [list {reflectometer_inst/sampler_dut/cnt_smp_num[0]} {reflectometer_inst/sampler_dut/cnt_smp_num[1]} {reflectometer_inst/sampler_dut/cnt_smp_num[2]} {reflectometer_inst/sampler_dut/cnt_smp_num[3]} {reflectometer_inst/sampler_dut/cnt_smp_num[4]} {reflectometer_inst/sampler_dut/cnt_smp_num[5]} {reflectometer_inst/sampler_dut/cnt_smp_num[6]} {reflectometer_inst/sampler_dut/cnt_smp_num[7]} {reflectometer_inst/sampler_dut/cnt_smp_num[8]} {reflectometer_inst/sampler_dut/cnt_smp_num[9]} {reflectometer_inst/sampler_dut/cnt_smp_num[10]} {reflectometer_inst/sampler_dut/cnt_smp_num[11]} {reflectometer_inst/sampler_dut/cnt_smp_num[12]} {reflectometer_inst/sampler_dut/cnt_smp_num[13]} {reflectometer_inst/sampler_dut/cnt_smp_num[14]} {reflectometer_inst/sampler_dut/cnt_smp_num[15]} {reflectometer_inst/sampler_dut/cnt_smp_num[16]} {reflectometer_inst/sampler_dut/cnt_smp_num[17]} {reflectometer_inst/sampler_dut/cnt_smp_num[18]} {reflectometer_inst/sampler_dut/cnt_smp_num[19]} {reflectometer_inst/sampler_dut/cnt_smp_num[20]} {reflectometer_inst/sampler_dut/cnt_smp_num[21]} {reflectometer_inst/sampler_dut/cnt_smp_num[22]} {reflectometer_inst/sampler_dut/cnt_smp_num[23]} {reflectometer_inst/sampler_dut/cnt_smp_num[24]} {reflectometer_inst/sampler_dut/cnt_smp_num[25]} {reflectometer_inst/sampler_dut/cnt_smp_num[26]} {reflectometer_inst/sampler_dut/cnt_smp_num[27]} {reflectometer_inst/sampler_dut/cnt_smp_num[28]} {reflectometer_inst/sampler_dut/cnt_smp_num[29]} {reflectometer_inst/sampler_dut/cnt_smp_num[30]} {reflectometer_inst/sampler_dut/cnt_smp_num[31]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
||||||
|
set_property port_width 12 [get_debug_ports u_ila_0/probe3]
|
||||||
|
connect_debug_port u_ila_0/probe3 [get_nets [list {reflectometer_inst/sampler_dut/data_converted[0]} {reflectometer_inst/sampler_dut/data_converted[1]} {reflectometer_inst/sampler_dut/data_converted[2]} {reflectometer_inst/sampler_dut/data_converted[3]} {reflectometer_inst/sampler_dut/data_converted[4]} {reflectometer_inst/sampler_dut/data_converted[5]} {reflectometer_inst/sampler_dut/data_converted[6]} {reflectometer_inst/sampler_dut/data_converted[7]} {reflectometer_inst/sampler_dut/data_converted[8]} {reflectometer_inst/sampler_dut/data_converted[9]} {reflectometer_inst/sampler_dut/data_converted[10]} {reflectometer_inst/sampler_dut/data_converted[11]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
||||||
|
set_property port_width 32 [get_debug_ports u_ila_0/probe4]
|
||||||
|
connect_debug_port u_ila_0/probe4 [get_nets [list {reflectometer_inst/sampler_dut/smp_num_reg[0]} {reflectometer_inst/sampler_dut/smp_num_reg[1]} {reflectometer_inst/sampler_dut/smp_num_reg[2]} {reflectometer_inst/sampler_dut/smp_num_reg[3]} {reflectometer_inst/sampler_dut/smp_num_reg[4]} {reflectometer_inst/sampler_dut/smp_num_reg[5]} {reflectometer_inst/sampler_dut/smp_num_reg[6]} {reflectometer_inst/sampler_dut/smp_num_reg[7]} {reflectometer_inst/sampler_dut/smp_num_reg[8]} {reflectometer_inst/sampler_dut/smp_num_reg[9]} {reflectometer_inst/sampler_dut/smp_num_reg[10]} {reflectometer_inst/sampler_dut/smp_num_reg[11]} {reflectometer_inst/sampler_dut/smp_num_reg[12]} {reflectometer_inst/sampler_dut/smp_num_reg[13]} {reflectometer_inst/sampler_dut/smp_num_reg[14]} {reflectometer_inst/sampler_dut/smp_num_reg[15]} {reflectometer_inst/sampler_dut/smp_num_reg[16]} {reflectometer_inst/sampler_dut/smp_num_reg[17]} {reflectometer_inst/sampler_dut/smp_num_reg[18]} {reflectometer_inst/sampler_dut/smp_num_reg[19]} {reflectometer_inst/sampler_dut/smp_num_reg[20]} {reflectometer_inst/sampler_dut/smp_num_reg[21]} {reflectometer_inst/sampler_dut/smp_num_reg[22]} {reflectometer_inst/sampler_dut/smp_num_reg[23]} {reflectometer_inst/sampler_dut/smp_num_reg[24]} {reflectometer_inst/sampler_dut/smp_num_reg[25]} {reflectometer_inst/sampler_dut/smp_num_reg[26]} {reflectometer_inst/sampler_dut/smp_num_reg[27]} {reflectometer_inst/sampler_dut/smp_num_reg[28]} {reflectometer_inst/sampler_dut/smp_num_reg[29]} {reflectometer_inst/sampler_dut/smp_num_reg[30]} {reflectometer_inst/sampler_dut/smp_num_reg[31]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
||||||
|
set_property port_width 12 [get_debug_ports u_ila_0/probe5]
|
||||||
|
connect_debug_port u_ila_0/probe5 [get_nets [list {reflectometer_inst/accum_m_axis_tdata[0]} {reflectometer_inst/accum_m_axis_tdata[1]} {reflectometer_inst/accum_m_axis_tdata[2]} {reflectometer_inst/accum_m_axis_tdata[3]} {reflectometer_inst/accum_m_axis_tdata[4]} {reflectometer_inst/accum_m_axis_tdata[5]} {reflectometer_inst/accum_m_axis_tdata[6]} {reflectometer_inst/accum_m_axis_tdata[7]} {reflectometer_inst/accum_m_axis_tdata[8]} {reflectometer_inst/accum_m_axis_tdata[9]} {reflectometer_inst/accum_m_axis_tdata[10]} {reflectometer_inst/accum_m_axis_tdata[11]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
||||||
|
set_property port_width 16 [get_debug_ports u_ila_0/probe6]
|
||||||
|
connect_debug_port u_ila_0/probe6 [get_nets [list {reflectometer_inst/adc_pulse_num[0]} {reflectometer_inst/adc_pulse_num[1]} {reflectometer_inst/adc_pulse_num[2]} {reflectometer_inst/adc_pulse_num[3]} {reflectometer_inst/adc_pulse_num[4]} {reflectometer_inst/adc_pulse_num[5]} {reflectometer_inst/adc_pulse_num[6]} {reflectometer_inst/adc_pulse_num[7]} {reflectometer_inst/adc_pulse_num[8]} {reflectometer_inst/adc_pulse_num[9]} {reflectometer_inst/adc_pulse_num[10]} {reflectometer_inst/adc_pulse_num[11]} {reflectometer_inst/adc_pulse_num[12]} {reflectometer_inst/adc_pulse_num[13]} {reflectometer_inst/adc_pulse_num[14]} {reflectometer_inst/adc_pulse_num[15]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
|
||||||
|
set_property port_width 32 [get_debug_ports u_ila_0/probe7]
|
||||||
|
connect_debug_port u_ila_0/probe7 [get_nets [list {reflectometer_inst/adc_pulse_period[0]} {reflectometer_inst/adc_pulse_period[1]} {reflectometer_inst/adc_pulse_period[2]} {reflectometer_inst/adc_pulse_period[3]} {reflectometer_inst/adc_pulse_period[4]} {reflectometer_inst/adc_pulse_period[5]} {reflectometer_inst/adc_pulse_period[6]} {reflectometer_inst/adc_pulse_period[7]} {reflectometer_inst/adc_pulse_period[8]} {reflectometer_inst/adc_pulse_period[9]} {reflectometer_inst/adc_pulse_period[10]} {reflectometer_inst/adc_pulse_period[11]} {reflectometer_inst/adc_pulse_period[12]} {reflectometer_inst/adc_pulse_period[13]} {reflectometer_inst/adc_pulse_period[14]} {reflectometer_inst/adc_pulse_period[15]} {reflectometer_inst/adc_pulse_period[16]} {reflectometer_inst/adc_pulse_period[17]} {reflectometer_inst/adc_pulse_period[18]} {reflectometer_inst/adc_pulse_period[19]} {reflectometer_inst/adc_pulse_period[20]} {reflectometer_inst/adc_pulse_period[21]} {reflectometer_inst/adc_pulse_period[22]} {reflectometer_inst/adc_pulse_period[23]} {reflectometer_inst/adc_pulse_period[24]} {reflectometer_inst/adc_pulse_period[25]} {reflectometer_inst/adc_pulse_period[26]} {reflectometer_inst/adc_pulse_period[27]} {reflectometer_inst/adc_pulse_period[28]} {reflectometer_inst/adc_pulse_period[29]} {reflectometer_inst/adc_pulse_period[30]} {reflectometer_inst/adc_pulse_period[31]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
|
||||||
|
set_property port_width 12 [get_debug_ports u_ila_0/probe8]
|
||||||
|
connect_debug_port u_ila_0/probe8 [get_nets [list {ch2_data_IBUF[0]} {ch2_data_IBUF[1]} {ch2_data_IBUF[2]} {ch2_data_IBUF[3]} {ch2_data_IBUF[4]} {ch2_data_IBUF[5]} {ch2_data_IBUF[6]} {ch2_data_IBUF[7]} {ch2_data_IBUF[8]} {ch2_data_IBUF[9]} {ch2_data_IBUF[10]} {ch2_data_IBUF[11]}]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/probe9]
|
||||||
|
connect_debug_port u_ila_0/probe9 [get_nets [list reflectometer_inst/acum_m_axis_tvalid]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/probe10]
|
||||||
|
connect_debug_port u_ila_0/probe10 [get_nets [list reflectometer_inst/adc_rst]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/probe11]
|
||||||
|
connect_debug_port u_ila_0/probe11 [get_nets [list reflectometer_inst/adc_start]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/probe12]
|
||||||
|
connect_debug_port u_ila_0/probe12 [get_nets [list reflectometer_inst/sampler_dut/buffer_ready]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/probe13]
|
||||||
|
connect_debug_port u_ila_0/probe13 [get_nets [list reflectometer_inst/sampler_dut/enable]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/probe14]
|
||||||
|
connect_debug_port u_ila_0/probe14 [get_nets [list reflectometer_inst/finish]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/probe15]
|
||||||
|
connect_debug_port u_ila_0/probe15 [get_nets [list reflectometer_inst/sampler_dut/out_of_range_reg]]
|
||||||
|
create_debug_port u_ila_0 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_0/probe16]
|
||||||
|
connect_debug_port u_ila_0/probe16 [get_nets [list reflectometer_inst/sample_req]]
|
||||||
|
create_debug_core u_ila_1 ila
|
||||||
|
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_1]
|
||||||
|
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_1]
|
||||||
|
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_1]
|
||||||
|
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_1]
|
||||||
|
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_1]
|
||||||
|
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_1]
|
||||||
|
set_property C_TRIGIN_EN false [get_debug_cores u_ila_1]
|
||||||
|
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_1]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_1/clk]
|
||||||
|
connect_debug_port u_ila_1/clk [get_nets [list reflectometer_inst/clk_wiz_ctrl_inst/inst/clk_out1]]
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe0]
|
||||||
|
set_property port_width 32 [get_debug_ports u_ila_1/probe0]
|
||||||
|
connect_debug_port u_ila_1/probe0 [get_nets [list {reflectometer_inst/generator_inst/cnt_period[0]} {reflectometer_inst/generator_inst/cnt_period[1]} {reflectometer_inst/generator_inst/cnt_period[2]} {reflectometer_inst/generator_inst/cnt_period[3]} {reflectometer_inst/generator_inst/cnt_period[4]} {reflectometer_inst/generator_inst/cnt_period[5]} {reflectometer_inst/generator_inst/cnt_period[6]} {reflectometer_inst/generator_inst/cnt_period[7]} {reflectometer_inst/generator_inst/cnt_period[8]} {reflectometer_inst/generator_inst/cnt_period[9]} {reflectometer_inst/generator_inst/cnt_period[10]} {reflectometer_inst/generator_inst/cnt_period[11]} {reflectometer_inst/generator_inst/cnt_period[12]} {reflectometer_inst/generator_inst/cnt_period[13]} {reflectometer_inst/generator_inst/cnt_period[14]} {reflectometer_inst/generator_inst/cnt_period[15]} {reflectometer_inst/generator_inst/cnt_period[16]} {reflectometer_inst/generator_inst/cnt_period[17]} {reflectometer_inst/generator_inst/cnt_period[18]} {reflectometer_inst/generator_inst/cnt_period[19]} {reflectometer_inst/generator_inst/cnt_period[20]} {reflectometer_inst/generator_inst/cnt_period[21]} {reflectometer_inst/generator_inst/cnt_period[22]} {reflectometer_inst/generator_inst/cnt_period[23]} {reflectometer_inst/generator_inst/cnt_period[24]} {reflectometer_inst/generator_inst/cnt_period[25]} {reflectometer_inst/generator_inst/cnt_period[26]} {reflectometer_inst/generator_inst/cnt_period[27]} {reflectometer_inst/generator_inst/cnt_period[28]} {reflectometer_inst/generator_inst/cnt_period[29]} {reflectometer_inst/generator_inst/cnt_period[30]} {reflectometer_inst/generator_inst/cnt_period[31]}]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe1]
|
||||||
|
set_property port_width 16 [get_debug_ports u_ila_1/probe1]
|
||||||
|
connect_debug_port u_ila_1/probe1 [get_nets [list {reflectometer_inst/generator_inst/cnt_pulse_num[0]} {reflectometer_inst/generator_inst/cnt_pulse_num[1]} {reflectometer_inst/generator_inst/cnt_pulse_num[2]} {reflectometer_inst/generator_inst/cnt_pulse_num[3]} {reflectometer_inst/generator_inst/cnt_pulse_num[4]} {reflectometer_inst/generator_inst/cnt_pulse_num[5]} {reflectometer_inst/generator_inst/cnt_pulse_num[6]} {reflectometer_inst/generator_inst/cnt_pulse_num[7]} {reflectometer_inst/generator_inst/cnt_pulse_num[8]} {reflectometer_inst/generator_inst/cnt_pulse_num[9]} {reflectometer_inst/generator_inst/cnt_pulse_num[10]} {reflectometer_inst/generator_inst/cnt_pulse_num[11]} {reflectometer_inst/generator_inst/cnt_pulse_num[12]} {reflectometer_inst/generator_inst/cnt_pulse_num[13]} {reflectometer_inst/generator_inst/cnt_pulse_num[14]} {reflectometer_inst/generator_inst/cnt_pulse_num[15]}]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe2]
|
||||||
|
set_property port_width 14 [get_debug_ports u_ila_1/probe2]
|
||||||
|
connect_debug_port u_ila_1/probe2 [get_nets [list {reflectometer_inst/dac_pulse_height[0]} {reflectometer_inst/dac_pulse_height[1]} {reflectometer_inst/dac_pulse_height[2]} {reflectometer_inst/dac_pulse_height[3]} {reflectometer_inst/dac_pulse_height[4]} {reflectometer_inst/dac_pulse_height[5]} {reflectometer_inst/dac_pulse_height[6]} {reflectometer_inst/dac_pulse_height[7]} {reflectometer_inst/dac_pulse_height[8]} {reflectometer_inst/dac_pulse_height[9]} {reflectometer_inst/dac_pulse_height[10]} {reflectometer_inst/dac_pulse_height[11]} {reflectometer_inst/dac_pulse_height[12]} {reflectometer_inst/dac_pulse_height[13]}]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe3]
|
||||||
|
set_property port_width 32 [get_debug_ports u_ila_1/probe3]
|
||||||
|
connect_debug_port u_ila_1/probe3 [get_nets [list {reflectometer_inst/dac_pulse_width[0]} {reflectometer_inst/dac_pulse_width[1]} {reflectometer_inst/dac_pulse_width[2]} {reflectometer_inst/dac_pulse_width[3]} {reflectometer_inst/dac_pulse_width[4]} {reflectometer_inst/dac_pulse_width[5]} {reflectometer_inst/dac_pulse_width[6]} {reflectometer_inst/dac_pulse_width[7]} {reflectometer_inst/dac_pulse_width[8]} {reflectometer_inst/dac_pulse_width[9]} {reflectometer_inst/dac_pulse_width[10]} {reflectometer_inst/dac_pulse_width[11]} {reflectometer_inst/dac_pulse_width[12]} {reflectometer_inst/dac_pulse_width[13]} {reflectometer_inst/dac_pulse_width[14]} {reflectometer_inst/dac_pulse_width[15]} {reflectometer_inst/dac_pulse_width[16]} {reflectometer_inst/dac_pulse_width[17]} {reflectometer_inst/dac_pulse_width[18]} {reflectometer_inst/dac_pulse_width[19]} {reflectometer_inst/dac_pulse_width[20]} {reflectometer_inst/dac_pulse_width[21]} {reflectometer_inst/dac_pulse_width[22]} {reflectometer_inst/dac_pulse_width[23]} {reflectometer_inst/dac_pulse_width[24]} {reflectometer_inst/dac_pulse_width[25]} {reflectometer_inst/dac_pulse_width[26]} {reflectometer_inst/dac_pulse_width[27]} {reflectometer_inst/dac_pulse_width[28]} {reflectometer_inst/dac_pulse_width[29]} {reflectometer_inst/dac_pulse_width[30]} {reflectometer_inst/dac_pulse_width[31]}]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe4]
|
||||||
|
set_property port_width 16 [get_debug_ports u_ila_1/probe4]
|
||||||
|
connect_debug_port u_ila_1/probe4 [get_nets [list {reflectometer_inst/dac_pulse_num[0]} {reflectometer_inst/dac_pulse_num[1]} {reflectometer_inst/dac_pulse_num[2]} {reflectometer_inst/dac_pulse_num[3]} {reflectometer_inst/dac_pulse_num[4]} {reflectometer_inst/dac_pulse_num[5]} {reflectometer_inst/dac_pulse_num[6]} {reflectometer_inst/dac_pulse_num[7]} {reflectometer_inst/dac_pulse_num[8]} {reflectometer_inst/dac_pulse_num[9]} {reflectometer_inst/dac_pulse_num[10]} {reflectometer_inst/dac_pulse_num[11]} {reflectometer_inst/dac_pulse_num[12]} {reflectometer_inst/dac_pulse_num[13]} {reflectometer_inst/dac_pulse_num[14]} {reflectometer_inst/dac_pulse_num[15]}]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe5]
|
||||||
|
set_property port_width 32 [get_debug_ports u_ila_1/probe5]
|
||||||
|
connect_debug_port u_ila_1/probe5 [get_nets [list {reflectometer_inst/dac_pulse_period[0]} {reflectometer_inst/dac_pulse_period[1]} {reflectometer_inst/dac_pulse_period[2]} {reflectometer_inst/dac_pulse_period[3]} {reflectometer_inst/dac_pulse_period[4]} {reflectometer_inst/dac_pulse_period[5]} {reflectometer_inst/dac_pulse_period[6]} {reflectometer_inst/dac_pulse_period[7]} {reflectometer_inst/dac_pulse_period[8]} {reflectometer_inst/dac_pulse_period[9]} {reflectometer_inst/dac_pulse_period[10]} {reflectometer_inst/dac_pulse_period[11]} {reflectometer_inst/dac_pulse_period[12]} {reflectometer_inst/dac_pulse_period[13]} {reflectometer_inst/dac_pulse_period[14]} {reflectometer_inst/dac_pulse_period[15]} {reflectometer_inst/dac_pulse_period[16]} {reflectometer_inst/dac_pulse_period[17]} {reflectometer_inst/dac_pulse_period[18]} {reflectometer_inst/dac_pulse_period[19]} {reflectometer_inst/dac_pulse_period[20]} {reflectometer_inst/dac_pulse_period[21]} {reflectometer_inst/dac_pulse_period[22]} {reflectometer_inst/dac_pulse_period[23]} {reflectometer_inst/dac_pulse_period[24]} {reflectometer_inst/dac_pulse_period[25]} {reflectometer_inst/dac_pulse_period[26]} {reflectometer_inst/dac_pulse_period[27]} {reflectometer_inst/dac_pulse_period[28]} {reflectometer_inst/dac_pulse_period[29]} {reflectometer_inst/dac_pulse_period[30]} {reflectometer_inst/dac_pulse_period[31]}]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe6]
|
||||||
|
set_property port_width 14 [get_debug_ports u_ila_1/probe6]
|
||||||
|
connect_debug_port u_ila_1/probe6 [get_nets [list {reflectometer_inst/p2_data[0]} {reflectometer_inst/p2_data[1]} {reflectometer_inst/p2_data[2]} {reflectometer_inst/p2_data[3]} {reflectometer_inst/p2_data[4]} {reflectometer_inst/p2_data[5]} {reflectometer_inst/p2_data[6]} {reflectometer_inst/p2_data[7]} {reflectometer_inst/p2_data[8]} {reflectometer_inst/p2_data[9]} {reflectometer_inst/p2_data[10]} {reflectometer_inst/p2_data[11]} {reflectometer_inst/p2_data[12]} {reflectometer_inst/p2_data[13]}]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe7]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_1/probe7]
|
||||||
|
connect_debug_port u_ila_1/probe7 [get_nets [list reflectometer_inst/dac_rst]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe8]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_1/probe8]
|
||||||
|
connect_debug_port u_ila_1/probe8 [get_nets [list reflectometer_inst/dac_start]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe9]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_1/probe9]
|
||||||
|
connect_debug_port u_ila_1/probe9 [get_nets [list reflectometer_inst/generator_inst/enable]]
|
||||||
|
create_debug_port u_ila_1 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_1/probe10]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_1/probe10]
|
||||||
|
connect_debug_port u_ila_1/probe10 [get_nets [list reflectometer_inst/sample_done]]
|
||||||
|
create_debug_core u_ila_2 ila
|
||||||
|
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_2]
|
||||||
|
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_2]
|
||||||
|
set_property C_ADV_TRIGGER false [get_debug_cores u_ila_2]
|
||||||
|
set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_2]
|
||||||
|
set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_2]
|
||||||
|
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_2]
|
||||||
|
set_property C_TRIGIN_EN false [get_debug_cores u_ila_2]
|
||||||
|
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_2]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/clk]
|
||||||
|
connect_debug_port u_ila_2/clk [get_nets [list e_gtxc_OBUF_BUFG]]
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe0]
|
||||||
|
set_property port_width 8 [get_debug_ports u_ila_2/probe0]
|
||||||
|
connect_debug_port u_ila_2/probe0 [get_nets [list {m_axis_rx_tdata[0]} {m_axis_rx_tdata[1]} {m_axis_rx_tdata[2]} {m_axis_rx_tdata[3]} {m_axis_rx_tdata[4]} {m_axis_rx_tdata[5]} {m_axis_rx_tdata[6]} {m_axis_rx_tdata[7]}]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe1]
|
||||||
|
set_property port_width 8 [get_debug_ports u_ila_2/probe1]
|
||||||
|
connect_debug_port u_ila_2/probe1 [get_nets [list {s_axis_tx_tdata[0]} {s_axis_tx_tdata[1]} {s_axis_tx_tdata[2]} {s_axis_tx_tdata[3]} {s_axis_tx_tdata[4]} {s_axis_tx_tdata[5]} {s_axis_tx_tdata[6]} {s_axis_tx_tdata[7]}]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe2]
|
||||||
|
set_property port_width 3 [get_debug_ports u_ila_2/probe2]
|
||||||
|
connect_debug_port u_ila_2/probe2 [get_nets [list {reflectometer_inst/accumulator_top_dut/output_async_fifo/rd_state[0]} {reflectometer_inst/accumulator_top_dut/output_async_fifo/rd_state[1]} {reflectometer_inst/accumulator_top_dut/output_async_fifo/rd_state[2]}]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe3]
|
||||||
|
set_property port_width 3 [get_debug_ports u_ila_2/probe3]
|
||||||
|
connect_debug_port u_ila_2/probe3 [get_nets [list {reflectometer_inst/udp_ctrl_inst/eth_state[0]} {reflectometer_inst/udp_ctrl_inst/eth_state[1]} {reflectometer_inst/udp_ctrl_inst/eth_state[2]}]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe4]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe4]
|
||||||
|
connect_debug_port u_ila_2/probe4 [get_nets [list reflectometer_inst/udp_ctrl_inst/busy_flag_eth]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe5]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe5]
|
||||||
|
connect_debug_port u_ila_2/probe5 [get_nets [list m_axis_rx_tlast]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe6]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe6]
|
||||||
|
connect_debug_port u_ila_2/probe6 [get_nets [list m_axis_rx_tready]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe7]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe7]
|
||||||
|
connect_debug_port u_ila_2/probe7 [get_nets [list m_axis_rx_tvalid]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe8]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe8]
|
||||||
|
connect_debug_port u_ila_2/probe8 [get_nets [list req_ready]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe9]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe9]
|
||||||
|
connect_debug_port u_ila_2/probe9 [get_nets [list s_axis_tx_tlast]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe10]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe10]
|
||||||
|
connect_debug_port u_ila_2/probe10 [get_nets [list s_axis_tx_tready]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe11]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe11]
|
||||||
|
connect_debug_port u_ila_2/probe11 [get_nets [list s_axis_tx_tvalid]]
|
||||||
|
create_debug_port u_ila_2 probe
|
||||||
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_2/probe12]
|
||||||
|
set_property port_width 1 [get_debug_ports u_ila_2/probe12]
|
||||||
|
connect_debug_port u_ila_2/probe12 [get_nets [list send_req]]
|
||||||
|
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
|
||||||
|
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
|
||||||
|
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
|
||||||
|
connect_debug_port dbg_hub/clk [get_nets e_gtxc_OBUF_BUFG]
|
||||||
@ -4,7 +4,7 @@
|
|||||||
"xci_name": "clk_wiz_ctrl_inst",
|
"xci_name": "clk_wiz_ctrl_inst",
|
||||||
"component_reference": "xilinx.com:ip:clk_wiz:6.0",
|
"component_reference": "xilinx.com:ip:clk_wiz:6.0",
|
||||||
"ip_revision": "16",
|
"ip_revision": "16",
|
||||||
"gen_directory": "../../../../eth_ctrl_debug_top.gen/sources_1/ip/clk_wiz_ctrl_inst",
|
"gen_directory": "../../../../eth_generator_top.gen/sources_1/ip/clk_wiz_ctrl_inst",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"component_parameters": {
|
"component_parameters": {
|
||||||
"Component_Name": [ { "value": "clk_wiz_ctrl_inst", "resolve_type": "user", "usage": "all" } ],
|
"Component_Name": [ { "value": "clk_wiz_ctrl_inst", "resolve_type": "user", "usage": "all" } ],
|
||||||
@ -84,7 +84,7 @@
|
|||||||
"PSEN_PORT": [ { "value": "psen", "resolve_type": "user", "usage": "all" } ],
|
"PSEN_PORT": [ { "value": "psen", "resolve_type": "user", "usage": "all" } ],
|
||||||
"PSINCDEC_PORT": [ { "value": "psincdec", "resolve_type": "user", "usage": "all" } ],
|
"PSINCDEC_PORT": [ { "value": "psincdec", "resolve_type": "user", "usage": "all" } ],
|
||||||
"PSDONE_PORT": [ { "value": "psdone", "resolve_type": "user", "usage": "all" } ],
|
"PSDONE_PORT": [ { "value": "psdone", "resolve_type": "user", "usage": "all" } ],
|
||||||
"CLKOUT1_REQUESTED_OUT_FREQ": [ { "value": "130.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT1_REQUESTED_OUT_FREQ": [ { "value": "125", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT1_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT1_REQUESTED_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT1_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT1_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT2_REQUESTED_OUT_FREQ": [ { "value": "65.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT2_REQUESTED_OUT_FREQ": [ { "value": "65.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
@ -154,9 +154,9 @@
|
|||||||
"SS_MOD_TIME": [ { "value": "0.004", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"SS_MOD_TIME": [ { "value": "0.004", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"OVERRIDE_MMCM": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
"OVERRIDE_MMCM": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
||||||
"MMCM_NOTES": [ { "value": "None", "resolve_type": "user", "usage": "all" } ],
|
"MMCM_NOTES": [ { "value": "None", "resolve_type": "user", "usage": "all" } ],
|
||||||
"MMCM_DIVCLK_DIVIDE": [ { "value": "1", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ],
|
"MMCM_DIVCLK_DIVIDE": [ { "value": "4", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ],
|
||||||
"MMCM_BANDWIDTH": [ { "value": "OPTIMIZED", "resolve_type": "user", "usage": "all" } ],
|
"MMCM_BANDWIDTH": [ { "value": "OPTIMIZED", "resolve_type": "user", "usage": "all" } ],
|
||||||
"MMCM_CLKFBOUT_MULT_F": [ { "value": "4.875", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_CLKFBOUT_MULT_F": [ { "value": "16.875", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_CLKFBOUT_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_CLKFBOUT_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_CLKFBOUT_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
"MMCM_CLKFBOUT_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
||||||
"MMCM_CLKIN1_PERIOD": [ { "value": "5.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_CLKIN1_PERIOD": [ { "value": "5.000", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
@ -167,11 +167,11 @@
|
|||||||
"MMCM_REF_JITTER1": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_REF_JITTER1": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_REF_JITTER2": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_REF_JITTER2": [ { "value": "0.010", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_STARTUP_WAIT": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
"MMCM_STARTUP_WAIT": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
||||||
"MMCM_CLKOUT0_DIVIDE_F": [ { "value": "7.500", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_CLKOUT0_DIVIDE_F": [ { "value": "6.750", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_CLKOUT0_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_CLKOUT0_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_CLKOUT0_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_CLKOUT0_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_CLKOUT0_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
"MMCM_CLKOUT0_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
||||||
"MMCM_CLKOUT1_DIVIDE": [ { "value": "15", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ],
|
"MMCM_CLKOUT1_DIVIDE": [ { "value": "13", "value_src": "user", "resolve_type": "user", "format": "long", "usage": "all" } ],
|
||||||
"MMCM_CLKOUT1_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_CLKOUT1_DUTY_CYCLE": [ { "value": "0.500", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"MMCM_CLKOUT1_PHASE": [ { "value": "0.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"MMCM_CLKOUT1_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
"MMCM_CLKOUT1_USE_FINE_PS": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
||||||
@ -245,10 +245,10 @@
|
|||||||
"CDDCREQ_PORT": [ { "value": "cddcreq", "resolve_type": "user", "usage": "all" } ],
|
"CDDCREQ_PORT": [ { "value": "cddcreq", "resolve_type": "user", "usage": "all" } ],
|
||||||
"ENABLE_CLKOUTPHY": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
"ENABLE_CLKOUTPHY": [ { "value": "false", "resolve_type": "user", "format": "bool", "usage": "all" } ],
|
||||||
"CLKOUTPHY_REQUESTED_FREQ": [ { "value": "600.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUTPHY_REQUESTED_FREQ": [ { "value": "600.000", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT1_JITTER": [ { "value": "102.676", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT1_JITTER": [ { "value": "162.582", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT1_PHASE_ERROR": [ { "value": "87.159", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT1_PHASE_ERROR": [ { "value": "137.238", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT2_JITTER": [ { "value": "117.878", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT2_JITTER": [ { "value": "185.296", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT2_PHASE_ERROR": [ { "value": "87.159", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT2_PHASE_ERROR": [ { "value": "137.238", "value_src": "user", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT3_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT3_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT3_PHASE_ERROR": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT3_PHASE_ERROR": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
"CLKOUT4_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
"CLKOUT4_JITTER": [ { "value": "0.0", "resolve_type": "user", "format": "float", "usage": "all" } ],
|
||||||
@ -338,14 +338,14 @@
|
|||||||
"C_INCLK_SUM_ROW2": [ { "value": "no_secondary_input_clock ", "resolve_type": "generated", "usage": "all" } ],
|
"C_INCLK_SUM_ROW2": [ { "value": "no_secondary_input_clock ", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW0A": [ { "value": " Output Output Phase Duty Cycle Pk-to-Pk Phase", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW0A": [ { "value": " Output Output Phase Duty Cycle Pk-to-Pk Phase", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW0B": [ { "value": " Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps)", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW0B": [ { "value": " Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps)", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW1": [ { "value": "clk_out1__130.00000______0.000______50.0______102.676_____87.159", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW1": [ { "value": "clk_out1__125.00000______0.000______50.0______162.582____137.238", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW2": [ { "value": "clk_out2__65.00000______0.000______50.0______117.878_____87.159", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW2": [ { "value": "clk_out2__64.90385______0.000______50.0______185.296____137.238", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW3": [ { "value": "no_CLK_OUT3_output", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW3": [ { "value": "no_CLK_OUT3_output", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW4": [ { "value": "no_CLK_OUT4_output", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW4": [ { "value": "no_CLK_OUT4_output", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW5": [ { "value": "no_CLK_OUT5_output", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW5": [ { "value": "no_CLK_OUT5_output", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW6": [ { "value": "no_CLK_OUT6_output", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW6": [ { "value": "no_CLK_OUT6_output", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_OUTCLK_SUM_ROW7": [ { "value": "no_CLK_OUT7_output", "resolve_type": "generated", "usage": "all" } ],
|
"C_OUTCLK_SUM_ROW7": [ { "value": "no_CLK_OUT7_output", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_CLKOUT1_REQUESTED_OUT_FREQ": [ { "value": "130.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT1_REQUESTED_OUT_FREQ": [ { "value": "125", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT2_REQUESTED_OUT_FREQ": [ { "value": "65.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT2_REQUESTED_OUT_FREQ": [ { "value": "65.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT3_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT3_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT4_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT4_REQUESTED_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
@ -366,8 +366,8 @@
|
|||||||
"C_CLKOUT5_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT5_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT6_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT6_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT7_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT7_REQUESTED_DUTY_CYCLE": [ { "value": "50.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT1_OUT_FREQ": [ { "value": "130.00000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT1_OUT_FREQ": [ { "value": "125.00000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT2_OUT_FREQ": [ { "value": "65.00000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT2_OUT_FREQ": [ { "value": "64.90385", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT3_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT3_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT4_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT4_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_CLKOUT5_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_CLKOUT5_OUT_FREQ": [ { "value": "100.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
@ -398,18 +398,18 @@
|
|||||||
"C_CLKOUT7_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
"C_CLKOUT7_SEQUENCE_NUMBER": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
||||||
"C_MMCM_NOTES": [ { "value": "None", "resolve_type": "generated", "usage": "all" } ],
|
"C_MMCM_NOTES": [ { "value": "None", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_MMCM_BANDWIDTH": [ { "value": "OPTIMIZED", "resolve_type": "generated", "usage": "all" } ],
|
"C_MMCM_BANDWIDTH": [ { "value": "OPTIMIZED", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_MMCM_CLKFBOUT_MULT_F": [ { "value": "4.875", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_MMCM_CLKFBOUT_MULT_F": [ { "value": "16.875", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_MMCM_CLKIN1_PERIOD": [ { "value": "5.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_MMCM_CLKIN1_PERIOD": [ { "value": "5.000", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_MMCM_CLKIN2_PERIOD": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_MMCM_CLKIN2_PERIOD": [ { "value": "10.0", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_MMCM_CLKOUT4_CASCADE": [ { "value": "FALSE", "resolve_type": "generated", "format": "bool", "usage": "all" } ],
|
"C_MMCM_CLKOUT4_CASCADE": [ { "value": "FALSE", "resolve_type": "generated", "format": "bool", "usage": "all" } ],
|
||||||
"C_MMCM_CLOCK_HOLD": [ { "value": "FALSE", "resolve_type": "generated", "format": "bool", "usage": "all" } ],
|
"C_MMCM_CLOCK_HOLD": [ { "value": "FALSE", "resolve_type": "generated", "format": "bool", "usage": "all" } ],
|
||||||
"C_MMCM_COMPENSATION": [ { "value": "ZHOLD", "resolve_type": "generated", "usage": "all" } ],
|
"C_MMCM_COMPENSATION": [ { "value": "ZHOLD", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_MMCM_DIVCLK_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
"C_MMCM_DIVCLK_DIVIDE": [ { "value": "4", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
||||||
"C_MMCM_REF_JITTER1": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_MMCM_REF_JITTER1": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_MMCM_REF_JITTER2": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_MMCM_REF_JITTER2": [ { "value": "0.010", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_MMCM_STARTUP_WAIT": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
|
"C_MMCM_STARTUP_WAIT": [ { "value": "FALSE", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_MMCM_CLKOUT0_DIVIDE_F": [ { "value": "7.500", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
"C_MMCM_CLKOUT0_DIVIDE_F": [ { "value": "6.750", "resolve_type": "generated", "format": "float", "usage": "all" } ],
|
||||||
"C_MMCM_CLKOUT1_DIVIDE": [ { "value": "15", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
"C_MMCM_CLKOUT1_DIVIDE": [ { "value": "13", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
||||||
"C_MMCM_CLKOUT2_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
"C_MMCM_CLKOUT2_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
||||||
"C_MMCM_CLKOUT3_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
"C_MMCM_CLKOUT3_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
||||||
"C_MMCM_CLKOUT4_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
"C_MMCM_CLKOUT4_DIVIDE": [ { "value": "1", "resolve_type": "generated", "format": "long", "usage": "all" } ],
|
||||||
@ -540,12 +540,12 @@
|
|||||||
"C_FILTER_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ],
|
"C_FILTER_1": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_FILTER_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ],
|
"C_FILTER_2": [ { "value": "0000", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_DIVIDE1_AUTO": [ { "value": "1", "resolve_type": "generated", "usage": "all" } ],
|
"C_DIVIDE1_AUTO": [ { "value": "1", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_DIVIDE2_AUTO": [ { "value": "2.0", "resolve_type": "generated", "usage": "all" } ],
|
"C_DIVIDE2_AUTO": [ { "value": "1.9259259259259258", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_DIVIDE3_AUTO": [ { "value": "0.13333333333333333", "resolve_type": "generated", "usage": "all" } ],
|
"C_DIVIDE3_AUTO": [ { "value": "0.14814814814814814", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_DIVIDE4_AUTO": [ { "value": "0.13333333333333333", "resolve_type": "generated", "usage": "all" } ],
|
"C_DIVIDE4_AUTO": [ { "value": "0.14814814814814814", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_DIVIDE5_AUTO": [ { "value": "0.13333333333333333", "resolve_type": "generated", "usage": "all" } ],
|
"C_DIVIDE5_AUTO": [ { "value": "0.14814814814814814", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_DIVIDE6_AUTO": [ { "value": "0.13333333333333333", "resolve_type": "generated", "usage": "all" } ],
|
"C_DIVIDE6_AUTO": [ { "value": "0.14814814814814814", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_DIVIDE7_AUTO": [ { "value": "0.13333333333333333", "resolve_type": "generated", "usage": "all" } ],
|
"C_DIVIDE7_AUTO": [ { "value": "0.14814814814814814", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_PLLBUFGCEDIV": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
"C_PLLBUFGCEDIV": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_MMCMBUFGCEDIV": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
"C_MMCMBUFGCEDIV": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_PLLBUFGCEDIV1": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
"C_PLLBUFGCEDIV1": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
||||||
@ -566,8 +566,8 @@
|
|||||||
"C_CLKOUT5_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
"C_CLKOUT5_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_CLKOUT6_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
"C_CLKOUT6_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_CLKOUT7_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
"C_CLKOUT7_MATCHED_ROUTING": [ { "value": "false", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_CLKOUT0_ACTUAL_FREQ": [ { "value": "130.00000", "resolve_type": "generated", "usage": "all" } ],
|
"C_CLKOUT0_ACTUAL_FREQ": [ { "value": "125.00000", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_CLKOUT1_ACTUAL_FREQ": [ { "value": "65.00000", "resolve_type": "generated", "usage": "all" } ],
|
"C_CLKOUT1_ACTUAL_FREQ": [ { "value": "64.90385", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_CLKOUT2_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ],
|
"C_CLKOUT2_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_CLKOUT3_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ],
|
"C_CLKOUT3_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ],
|
||||||
"C_CLKOUT4_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ],
|
"C_CLKOUT4_ACTUAL_FREQ": [ { "value": "100.000", "resolve_type": "generated", "usage": "all" } ],
|
||||||
@ -599,7 +599,7 @@
|
|||||||
"IPCONTEXT": [ { "value": "IP_Flow" } ],
|
"IPCONTEXT": [ { "value": "IP_Flow" } ],
|
||||||
"IPREVISION": [ { "value": "16" } ],
|
"IPREVISION": [ { "value": "16" } ],
|
||||||
"MANAGED": [ { "value": "TRUE" } ],
|
"MANAGED": [ { "value": "TRUE" } ],
|
||||||
"OUTPUTDIR": [ { "value": "../../../../eth_ctrl_debug_top.gen/sources_1/ip/clk_wiz_ctrl_inst" } ],
|
"OUTPUTDIR": [ { "value": "../../../../eth_generator_top.gen/sources_1/ip/clk_wiz_ctrl_inst" } ],
|
||||||
"SELECTEDSIMMODEL": [ { "value": "" } ],
|
"SELECTEDSIMMODEL": [ { "value": "" } ],
|
||||||
"SHAREDDIR": [ { "value": "." } ],
|
"SHAREDDIR": [ { "value": "." } ],
|
||||||
"SWVERSION": [ { "value": "2025.1" } ],
|
"SWVERSION": [ { "value": "2025.1" } ],
|
||||||
174
designs/reflectometer_prototype/prototype.sv
Normal file
174
designs/reflectometer_prototype/prototype.sv
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
`timescale 1 ns / 1 ns
|
||||||
|
|
||||||
|
module prototype_top #(
|
||||||
|
parameter int unsigned DAC_DATA_WIDTH = 14,
|
||||||
|
parameter int unsigned ADC_DATA_WIDTH = 12,
|
||||||
|
parameter PACK_FACTOR = 1,
|
||||||
|
parameter PROCESS_MODE = 0,
|
||||||
|
parameter ZERO_LEVEL = 8192,
|
||||||
|
parameter ACCUM_WIDTH = 32,
|
||||||
|
parameter N_MAX = 4096,
|
||||||
|
parameter WINDOW_SIZE = 65,
|
||||||
|
parameter PACKET_SIZE = 1024
|
||||||
|
)(
|
||||||
|
input sys_clk_p, // system clock positive
|
||||||
|
input sys_clk_n, // system clock negative
|
||||||
|
input rst_n, // reset ,low active
|
||||||
|
output [3:0] led, // display network rate status
|
||||||
|
output e_reset, // phy reset
|
||||||
|
output e_mdc, // phy emdio clock
|
||||||
|
inout e_mdio, // phy emdio data
|
||||||
|
input e_rxc, // 125Mhz ethernet gmii rx clock
|
||||||
|
input e_rxdv, // GMII recieving data valid
|
||||||
|
input e_rxer, // GMII recieving data error
|
||||||
|
input [7:0] e_rxd, // GMII recieving data
|
||||||
|
|
||||||
|
input e_txc, // 25Mhz ethernet mii tx clock
|
||||||
|
output e_gtxc, // 125Mhz ethernet gmii tx clock
|
||||||
|
output e_txen, // GMII sending data valid
|
||||||
|
output e_txer, // GMII sending data error
|
||||||
|
output[7:0] e_txd, // GMII sending data
|
||||||
|
|
||||||
|
// analog
|
||||||
|
output da2_clk,
|
||||||
|
output da2_wrt,
|
||||||
|
output [DAC_DATA_WIDTH-1:0] da2_data,
|
||||||
|
|
||||||
|
output ch2_clk,
|
||||||
|
input ch2_otr,
|
||||||
|
input [ADC_DATA_WIDTH-1:0] ch2_data
|
||||||
|
);
|
||||||
|
|
||||||
|
wire sys_clk; //single end clock
|
||||||
|
wire [31:0] pack_total_len ; //package length
|
||||||
|
wire [1:0] speed ; //net speed select
|
||||||
|
wire link ; //link status
|
||||||
|
wire erxdv ;
|
||||||
|
wire [7:0] erxd ;
|
||||||
|
wire e_tx_en ;
|
||||||
|
wire [7:0] etxd ;
|
||||||
|
wire e_rst_n ;
|
||||||
|
assign e_gtxc = e_rxc;
|
||||||
|
assign e_reset = 1'b1;
|
||||||
|
|
||||||
|
// generate single end clock
|
||||||
|
|
||||||
|
IBUFDS sys_clk_ibufgds
|
||||||
|
(
|
||||||
|
.O (sys_clk ),
|
||||||
|
.I (sys_clk_p ),
|
||||||
|
.IB (sys_clk_n )
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Different conversion of GMII data according to different network speeds
|
||||||
|
gmii_arbi arbi_inst
|
||||||
|
(
|
||||||
|
.clk (e_gtxc ),
|
||||||
|
.rst_n (rst_n ),
|
||||||
|
.speed (2'b10 ),
|
||||||
|
.link (1'b1 ),
|
||||||
|
.pack_total_len (pack_total_len ),
|
||||||
|
.e_rst_n (e_rst_n ),
|
||||||
|
.gmii_rx_dv (e_rxdv ),
|
||||||
|
.gmii_rxd (e_rxd ),
|
||||||
|
.gmii_tx_en (e_tx_en ),
|
||||||
|
.gmii_txd (etxd ),
|
||||||
|
.e_rx_dv (erxdv ),
|
||||||
|
.e_rxd (erxd ),
|
||||||
|
.e_tx_en (e_txen ),
|
||||||
|
.e_txd (e_txd )
|
||||||
|
);
|
||||||
|
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
// axis_mac interface
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
wire req_ready;
|
||||||
|
|
||||||
|
wire send_req;
|
||||||
|
|
||||||
|
wire [7:0] s_axis_tx_tdata;
|
||||||
|
wire s_axis_tx_tvalid;
|
||||||
|
wire s_axis_tx_tready;
|
||||||
|
wire s_axis_tx_tlast;
|
||||||
|
|
||||||
|
wire [7:0] m_axis_rx_tdata;
|
||||||
|
wire m_axis_rx_tvalid;
|
||||||
|
wire m_axis_rx_tready;
|
||||||
|
wire m_axis_rx_tlast;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
// axis_mac
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
axis_mac axis_mac0
|
||||||
|
(
|
||||||
|
.gmii_tx_clk (e_gtxc),
|
||||||
|
.gmii_rx_clk (e_rxc),
|
||||||
|
.rst_n (e_rst_n),
|
||||||
|
|
||||||
|
.gmii_rx_dv (erxdv),
|
||||||
|
.gmii_rxd (erxd),
|
||||||
|
.gmii_tx_en (e_tx_en),
|
||||||
|
.gmii_txd (etxd),
|
||||||
|
|
||||||
|
.send_req (send_req),
|
||||||
|
.data_length (PACKET_SIZE),
|
||||||
|
.req_ready (req_ready),
|
||||||
|
|
||||||
|
.s_axis_tx_tdata (s_axis_tx_tdata),
|
||||||
|
.s_axis_tx_tvalid (s_axis_tx_tvalid),
|
||||||
|
.s_axis_tx_tready (s_axis_tx_tready),
|
||||||
|
.s_axis_tx_tlast (s_axis_tx_tlast),
|
||||||
|
|
||||||
|
.m_axis_rx_tdata (m_axis_rx_tdata),
|
||||||
|
.m_axis_rx_tvalid (m_axis_rx_tvalid),
|
||||||
|
.m_axis_rx_tready (m_axis_rx_tready),
|
||||||
|
.m_axis_rx_tlast (m_axis_rx_tlast)
|
||||||
|
);
|
||||||
|
|
||||||
|
// reflectometer base module
|
||||||
|
reflectometer_top #(
|
||||||
|
.PROCESS_MODE(PROCESS_MODE),
|
||||||
|
.PACK_FACTOR(PACK_FACTOR),
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH),
|
||||||
|
.N_MAX(N_MAX),
|
||||||
|
.ZERO_LEVEL(ZERO_LEVEL),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.PACKET_SIZE(PACKET_SIZE),
|
||||||
|
.ADC_DATA_WIDTH(ADC_DATA_WIDTH),
|
||||||
|
.DAC_DATA_WIDTH(DAC_DATA_WIDTH)
|
||||||
|
) reflectometer_inst (
|
||||||
|
.sys_clk (sys_clk),
|
||||||
|
.rst_n (rst_n),
|
||||||
|
|
||||||
|
.led(led),
|
||||||
|
|
||||||
|
.gmii_tx_clk (e_gtxc),
|
||||||
|
.gmii_rx_clk (e_rxc),
|
||||||
|
|
||||||
|
.s_axis_tx_tdata (s_axis_tx_tdata),
|
||||||
|
.s_axis_tx_tvalid (s_axis_tx_tvalid),
|
||||||
|
.s_axis_tx_tready (s_axis_tx_tready),
|
||||||
|
.s_axis_tx_tlast (s_axis_tx_tlast),
|
||||||
|
|
||||||
|
.m_axis_rx_tdata (m_axis_rx_tdata),
|
||||||
|
.m_axis_rx_tvalid (m_axis_rx_tvalid),
|
||||||
|
.m_axis_rx_tready (m_axis_rx_tready),
|
||||||
|
.m_axis_rx_tlast (m_axis_rx_tlast),
|
||||||
|
|
||||||
|
// axis_mac
|
||||||
|
.req_ready(req_ready),
|
||||||
|
.send_req(send_req),
|
||||||
|
|
||||||
|
// DAC
|
||||||
|
.p2_clk(da2_clk),
|
||||||
|
.p2_data(da2_data),
|
||||||
|
.p2_wrt(da2_wrt),
|
||||||
|
|
||||||
|
// ADC
|
||||||
|
.ch2_clk(ch2_clk),
|
||||||
|
.ch2_data(ch2_data),
|
||||||
|
.ch2_otr(ch2_otr)
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
||||||
@ -1 +0,0 @@
|
|||||||
# Блок Sampler
|
|
||||||
39
rtl/accum/README.md
Normal file
39
rtl/accum/README.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# Аккумулятор
|
||||||
|
Модуль аккумуляции данных для последующего усреднения. Принимает данные с входного потока АХI-Stream фиксированной ширины (задается параметрически), суммируя их сначала по окнам, а затем со значениями из предыдущей последовательности.
|
||||||
|
|
||||||
|
## Список парамтеров:
|
||||||
|
- DATA_WIDTH - ширина входных данных, получаемых с АЦП
|
||||||
|
- ACCUM_WIDTH - размер данных для аккумуляции, должен быть степенью числа 2. По умолчанию - 32
|
||||||
|
- N_MAX - максимальное число окон в последовательности. Должно быть степенью числа 2. Влияет на размер используемой памяти.
|
||||||
|
- WINDOW_SIZE - размер окна усреднения
|
||||||
|
- PACKET_SIZE - размер выходного пакета
|
||||||
|
|
||||||
|
## Иерархия:
|
||||||
|
```
|
||||||
|
├── accum_top - полная сборка аккумулятора
|
||||||
|
│ ├── accum - основная логика аккумуляции по окнам и последовательностям
|
||||||
|
│ │ ├── adder - модуль сложения по окнам
|
||||||
|
│ ├── out_axis_fifo - модуль для выдачи данных наружу в другом частотном домене
|
||||||
|
```
|
||||||
|
## Список входных портов:
|
||||||
|
- clk_in - частота входных данных
|
||||||
|
- rst - сброс всего
|
||||||
|
- [DATA_WIDTH-1:0] s_axis_tdata - входные данные
|
||||||
|
- s_axis_tvalid - валидность входных данных
|
||||||
|
- start - начало аккумуляции
|
||||||
|
- [31:0] smp_num - число сэмплов (должно быть кратно WINDOW_SIZE)
|
||||||
|
- [15:0] seq_num - число последовательностей аккумуляции
|
||||||
|
- eth_clk_in - частота для выходных данных на ethernet
|
||||||
|
- req_ready - готовность отправителя начать принимать данные
|
||||||
|
- m_axis_tready - готовность выходного axis
|
||||||
|
|
||||||
|
|
||||||
|
## Список выходных портов:
|
||||||
|
- send_req - сигнал начала отправки данных
|
||||||
|
- [7:0] m_axis_tdata - данные выходного axis
|
||||||
|
- m_axis_tvalid - валидность выходного axis
|
||||||
|
- m_axis_tlast - последний пакет в axis
|
||||||
|
- finish - конец отправки всех данных, полный цикл работы завершен
|
||||||
|
|
||||||
|
## Логика работы:
|
||||||
|
Модуль начинает работу при получении сигнала start. Сразу после начала работы можно подавать данные на входной axis, они будут суммироваться по WINDOW_SIZE штук и отправляться на хранение. Так будет сделано для последовательности длиной smp_num чисел, затем начинается новая последовательность - всего таких будет seq_num штук. Каждая последующая последовательность также суммируется по окнам, а затем полученные значения прибавляются к тем же значениям предыдущей последовательности. Таким образом, выполняется суммирование по двум осям, и из исходных данных seq_num по smp_num чисел остается вектор длиной 1 x (smp_num / WINDOW_SIZE). После накопления всех данных начинается выдача. Выдача осуществляется на выходной AXI stream, работающий в домене eth_clk, и имеющий ширину 8 бит - предполагается, что выдача пойдет на ethernet-udp. Когда поднят сигнал req_ready, модуль будет отправлять send_req (запрос отправки пакета), и по готовности m_axis_tready начнет выдавать пакет размер PACKET_SIZE байт. Если данные нельзя ровно разложить по пакетам, то в последнем пакете могут быть отправлены рандомные данные из памяти. После окончания отправки всех пакетов будет поднят сигнал finish.
|
||||||
271
rtl/accum/src/accum.sv
Normal file
271
rtl/accum/src/accum.sv
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module accumulator
|
||||||
|
#(
|
||||||
|
parameter DATA_WIDTH = 12,
|
||||||
|
parameter ACCUM_WIDTH = 32,
|
||||||
|
parameter N_MAX = 4096,
|
||||||
|
parameter WINDOW_SIZE = 4,
|
||||||
|
parameter PACKET_SIZE = 8,
|
||||||
|
parameter READ_BATCH_SIZE =(PACKET_SIZE*8)/(ACCUM_WIDTH)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
input clk_in,
|
||||||
|
input rst,
|
||||||
|
input [DATA_WIDTH-1:0] s_axis_tdata,
|
||||||
|
input s_axis_tvalid,
|
||||||
|
input start,
|
||||||
|
input [31:0] smp_num,
|
||||||
|
input [15:0] seq_num,
|
||||||
|
|
||||||
|
output [ACCUM_WIDTH-1:0] out_data,
|
||||||
|
output out_valid,
|
||||||
|
output readout_begin,
|
||||||
|
input batch_req,
|
||||||
|
input finish
|
||||||
|
);
|
||||||
|
|
||||||
|
logic [31:0] smp_num_reg, cnt_smp_num;
|
||||||
|
logic [15:0] seq_num_reg, cnt_seq_num;
|
||||||
|
logic [15:0] cnt_addr, addra, addrb;
|
||||||
|
|
||||||
|
logic [ACCUM_WIDTH-1:0] data;
|
||||||
|
logic valid_data;
|
||||||
|
logic [ACCUM_WIDTH-1:0] data_bram_in, data_bram_out;
|
||||||
|
logic wea, enb;
|
||||||
|
|
||||||
|
logic readout_begin_reg;
|
||||||
|
logic [ACCUM_WIDTH-1:0] out_data_reg;
|
||||||
|
logic out_valid_reg;
|
||||||
|
logic finish_reg, finish_buf;
|
||||||
|
|
||||||
|
// registers for port b data request
|
||||||
|
reg req_data_b;
|
||||||
|
reg [15:0] req_addr_b;
|
||||||
|
|
||||||
|
typedef enum logic [3:0] {
|
||||||
|
IDLE,
|
||||||
|
INIT_MEM,
|
||||||
|
BEGIN_SEQ,
|
||||||
|
REQ_WORD_B,
|
||||||
|
ACCUM,
|
||||||
|
READOUT_START,
|
||||||
|
READOUT_AWAIT,
|
||||||
|
READOUT_DELAY,
|
||||||
|
READOUT_PUT,
|
||||||
|
READOUT_LAST,
|
||||||
|
FINISH
|
||||||
|
} wr_state_t;
|
||||||
|
(* MARK_DEBUG="true" *) wr_state_t wr_state;
|
||||||
|
|
||||||
|
always @(posedge clk_in) begin
|
||||||
|
if (rst) begin
|
||||||
|
smp_num_reg <= '0;
|
||||||
|
cnt_smp_num <= '0;
|
||||||
|
seq_num_reg <= '0;
|
||||||
|
cnt_seq_num <= '0;
|
||||||
|
cnt_addr <= '0;
|
||||||
|
wea <= 0;
|
||||||
|
enb <= 0;
|
||||||
|
wr_state <= IDLE;
|
||||||
|
finish_reg <= 0;
|
||||||
|
out_valid_reg <= 0;
|
||||||
|
end else begin
|
||||||
|
finish_buf <= finish;
|
||||||
|
|
||||||
|
// FSM
|
||||||
|
case(wr_state)
|
||||||
|
|
||||||
|
IDLE: begin
|
||||||
|
// wait for start signal
|
||||||
|
wea <= 0;
|
||||||
|
enb <= 0;
|
||||||
|
readout_begin_reg <= 0;
|
||||||
|
finish_reg <= 0;
|
||||||
|
out_valid_reg <= 0;
|
||||||
|
if (start) begin
|
||||||
|
smp_num_reg <= smp_num;
|
||||||
|
seq_num_reg <= seq_num;
|
||||||
|
wr_state <= INIT_MEM;
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
INIT_MEM: begin
|
||||||
|
// first run to initialize memory with first batch of values
|
||||||
|
wea <= 0;
|
||||||
|
if (valid_data) begin
|
||||||
|
data_bram_in <= data;
|
||||||
|
addra <= cnt_addr;
|
||||||
|
wea <= 1;
|
||||||
|
cnt_addr <= cnt_addr + 1;
|
||||||
|
cnt_smp_num <= cnt_smp_num + WINDOW_SIZE;
|
||||||
|
|
||||||
|
end
|
||||||
|
if (cnt_smp_num >= smp_num_reg) begin
|
||||||
|
wr_state <= BEGIN_SEQ;
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
BEGIN_SEQ: begin
|
||||||
|
// start new acc seq
|
||||||
|
wea <= 0;
|
||||||
|
enb <= 0;
|
||||||
|
if (cnt_seq_num == seq_num_reg - 1) begin
|
||||||
|
cnt_seq_num <= '0;
|
||||||
|
cnt_smp_num <= '0;
|
||||||
|
cnt_addr <= '0;
|
||||||
|
wr_state <= READOUT_START;
|
||||||
|
addrb <= '0;
|
||||||
|
enb <= 0;
|
||||||
|
end else begin
|
||||||
|
// beginning of new data sequence
|
||||||
|
cnt_seq_num <= cnt_seq_num + 1;
|
||||||
|
cnt_smp_num <= '0;
|
||||||
|
cnt_addr <= '0;
|
||||||
|
wea <= 0;
|
||||||
|
addrb <= 0;
|
||||||
|
wr_state <= REQ_WORD_B;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
REQ_WORD_B: begin
|
||||||
|
// pre-request data for port b
|
||||||
|
wea <= 0;
|
||||||
|
enb <= 1;
|
||||||
|
addrb <= cnt_addr;
|
||||||
|
wr_state <= ACCUM;
|
||||||
|
end
|
||||||
|
|
||||||
|
ACCUM: begin
|
||||||
|
// sum mem+input
|
||||||
|
enb <= 0;
|
||||||
|
if (valid_data) begin
|
||||||
|
addra <= cnt_addr;
|
||||||
|
wea <= 1;
|
||||||
|
data_bram_in <= data + data_bram_out;
|
||||||
|
cnt_smp_num <= cnt_smp_num + WINDOW_SIZE;
|
||||||
|
if (cnt_smp_num + WINDOW_SIZE >= smp_num_reg) begin
|
||||||
|
wr_state <= BEGIN_SEQ;
|
||||||
|
end else begin
|
||||||
|
cnt_addr <= cnt_addr + 1;
|
||||||
|
wr_state <= REQ_WORD_B;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
READOUT_START: begin
|
||||||
|
readout_begin_reg <= 1'b1;
|
||||||
|
wr_state <= READOUT_AWAIT;
|
||||||
|
enb <= 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
READOUT_AWAIT: begin
|
||||||
|
// req await + delay for every-clock readout.
|
||||||
|
if (batch_req) begin
|
||||||
|
enb <= 1;
|
||||||
|
wr_state <= READOUT_DELAY;
|
||||||
|
end else if (finish_buf) begin
|
||||||
|
wr_state <= FINISH;
|
||||||
|
end else begin
|
||||||
|
enb <= 0;
|
||||||
|
out_valid_reg <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
READOUT_DELAY: begin
|
||||||
|
// wait for mem latency
|
||||||
|
addrb <= addrb + 1;
|
||||||
|
wr_state <= READOUT_PUT;
|
||||||
|
end
|
||||||
|
|
||||||
|
READOUT_PUT: begin
|
||||||
|
// main data output
|
||||||
|
if ((addrb % READ_BATCH_SIZE) == 0) begin
|
||||||
|
wr_state <= READOUT_LAST;
|
||||||
|
enb <= 0;
|
||||||
|
end else addrb <= addrb + 1;
|
||||||
|
|
||||||
|
out_valid_reg <= 1;
|
||||||
|
out_data_reg <= data_bram_out;
|
||||||
|
end
|
||||||
|
|
||||||
|
READOUT_LAST: begin
|
||||||
|
// last word of packet
|
||||||
|
out_valid_reg <= 0;
|
||||||
|
out_data_reg <= data_bram_out;
|
||||||
|
wr_state <= READOUT_START;
|
||||||
|
end
|
||||||
|
|
||||||
|
FINISH: begin
|
||||||
|
out_valid_reg <= 0;
|
||||||
|
enb <= 0;
|
||||||
|
wr_state <= IDLE;
|
||||||
|
end
|
||||||
|
|
||||||
|
default: wr_state <= IDLE;
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
adder
|
||||||
|
#(
|
||||||
|
.DATA_WIDTH(DATA_WIDTH),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH)
|
||||||
|
) adder_dut
|
||||||
|
(
|
||||||
|
.clk_in(clk_in),
|
||||||
|
.rst(rst),
|
||||||
|
.s_axis_tdata(s_axis_tdata),
|
||||||
|
.s_axis_tvalid(s_axis_tvalid),
|
||||||
|
.sum_data(data),
|
||||||
|
.sum_valid(valid_data)
|
||||||
|
);
|
||||||
|
|
||||||
|
xpm_memory_sdpram #(
|
||||||
|
.ADDR_WIDTH_A(16), // DECIMAL
|
||||||
|
.ADDR_WIDTH_B(16), // DECIMAL
|
||||||
|
.AUTO_SLEEP_TIME(0), // DECIMAL
|
||||||
|
.BYTE_WRITE_WIDTH_A(ACCUM_WIDTH), // DECIMAL
|
||||||
|
.CASCADE_HEIGHT(0), // DECIMAL
|
||||||
|
.CLOCKING_MODE("common_clock"), // String
|
||||||
|
.ECC_MODE("no_ecc"), // String
|
||||||
|
.MEMORY_INIT_FILE("none"), // String
|
||||||
|
.MEMORY_INIT_PARAM("0"), // String
|
||||||
|
.MEMORY_OPTIMIZATION("true"), // String
|
||||||
|
.MEMORY_PRIMITIVE("auto"), // String
|
||||||
|
.MEMORY_SIZE(N_MAX*ACCUM_WIDTH), // DECIMAL
|
||||||
|
.MESSAGE_CONTROL(0), // DECIMAL
|
||||||
|
.READ_DATA_WIDTH_B(ACCUM_WIDTH), // DECIMAL
|
||||||
|
.READ_LATENCY_B(1), // DECIMAL
|
||||||
|
.READ_RESET_VALUE_B("0"), // String
|
||||||
|
.RST_MODE_A("SYNC"), // String
|
||||||
|
.RST_MODE_B("SYNC"), // String
|
||||||
|
.SIM_ASSERT_CHK(0), // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
|
||||||
|
.USE_EMBEDDED_CONSTRAINT(0), // DECIMAL
|
||||||
|
.USE_MEM_INIT(1), // DECIMAL
|
||||||
|
.USE_MEM_INIT_MMI(0), // DECIMAL
|
||||||
|
.WAKEUP_TIME("disable_sleep"), // String
|
||||||
|
.WRITE_DATA_WIDTH_A(ACCUM_WIDTH), // DECIMAL
|
||||||
|
.WRITE_MODE_B("no_change"), // String
|
||||||
|
.WRITE_PROTECT(1) // DECIMAL
|
||||||
|
)
|
||||||
|
xpm_memory_sdpram_inst (
|
||||||
|
|
||||||
|
.doutb(data_bram_out),
|
||||||
|
|
||||||
|
.addra(addra),
|
||||||
|
.addrb(addrb),
|
||||||
|
.clka(clk_in),
|
||||||
|
.clkb(clk_in),
|
||||||
|
.dina(data_bram_in),
|
||||||
|
.ena(1'b1),
|
||||||
|
.enb(enb),
|
||||||
|
.wea(wea)
|
||||||
|
);
|
||||||
|
|
||||||
|
assign readout_begin = readout_begin_reg;
|
||||||
|
assign out_data = out_data_reg;
|
||||||
|
assign out_valid = out_valid_reg;
|
||||||
|
|
||||||
|
endmodule
|
||||||
92
rtl/accum/src/accum_top.sv
Normal file
92
rtl/accum/src/accum_top.sv
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module accumulator_top
|
||||||
|
#(
|
||||||
|
parameter DATA_WIDTH = 12,
|
||||||
|
parameter ACCUM_WIDTH = 32,
|
||||||
|
parameter N_MAX = 4096,
|
||||||
|
parameter WINDOW_SIZE = 65,
|
||||||
|
parameter PACKET_SIZE = 1024,
|
||||||
|
parameter READ_BATCH_SIZE =(PACKET_SIZE*8)/(ACCUM_WIDTH)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
// main clk
|
||||||
|
input clk_in,
|
||||||
|
input rst,
|
||||||
|
|
||||||
|
// input data
|
||||||
|
input [DATA_WIDTH-1:0] s_axis_tdata,
|
||||||
|
input s_axis_tvalid,
|
||||||
|
|
||||||
|
// parameters
|
||||||
|
input start,
|
||||||
|
input [31:0] smp_num,
|
||||||
|
input [15:0] seq_num,
|
||||||
|
|
||||||
|
// eth signals
|
||||||
|
input eth_clk_in,
|
||||||
|
input req_ready,
|
||||||
|
output send_req,
|
||||||
|
|
||||||
|
// output axis
|
||||||
|
output logic [7:0] m_axis_tdata,
|
||||||
|
output logic m_axis_tvalid,
|
||||||
|
input logic m_axis_tready,
|
||||||
|
output logic m_axis_tlast,
|
||||||
|
|
||||||
|
output logic finish
|
||||||
|
);
|
||||||
|
|
||||||
|
wire [ACCUM_WIDTH-1:0] out_data;
|
||||||
|
wire out_valid;
|
||||||
|
wire readout_begin;
|
||||||
|
wire batch_req;
|
||||||
|
|
||||||
|
accumulator #(
|
||||||
|
.DATA_WIDTH(DATA_WIDTH),
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH),
|
||||||
|
.N_MAX(N_MAX),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.PACKET_SIZE(PACKET_SIZE)
|
||||||
|
) accum_main (
|
||||||
|
.clk_in(clk_in),
|
||||||
|
.rst(rst),
|
||||||
|
.s_axis_tdata(s_axis_tdata),
|
||||||
|
.s_axis_tvalid(s_axis_tvalid),
|
||||||
|
.start(start),
|
||||||
|
.smp_num(smp_num),
|
||||||
|
.seq_num(seq_num),
|
||||||
|
.out_data(out_data),
|
||||||
|
.out_valid(out_valid),
|
||||||
|
.readout_begin(readout_begin),
|
||||||
|
.batch_req(batch_req),
|
||||||
|
.finish(finish)
|
||||||
|
);
|
||||||
|
|
||||||
|
out_axis_fifo #(
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.PACKET_SIZE(PACKET_SIZE)
|
||||||
|
) output_async_fifo (
|
||||||
|
.eth_clk_in (eth_clk_in),
|
||||||
|
.acc_clk_in (clk_in),
|
||||||
|
.rst (rst),
|
||||||
|
.smp_num (smp_num),
|
||||||
|
|
||||||
|
.m_axis_tdata (m_axis_tdata),
|
||||||
|
.m_axis_tvalid (m_axis_tvalid),
|
||||||
|
.m_axis_tready (m_axis_tready),
|
||||||
|
.m_axis_tlast (m_axis_tlast),
|
||||||
|
|
||||||
|
.acc_din (out_data),
|
||||||
|
.din_valid (out_valid),
|
||||||
|
|
||||||
|
.readout_begin (readout_begin),
|
||||||
|
|
||||||
|
.req_ready (req_ready),
|
||||||
|
.send_req (send_req),
|
||||||
|
|
||||||
|
.batch_req (batch_req),
|
||||||
|
.finish (finish)
|
||||||
|
);
|
||||||
|
endmodule
|
||||||
52
rtl/accum/src/adder.sv
Normal file
52
rtl/accum/src/adder.sv
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
|
||||||
|
module adder
|
||||||
|
#(
|
||||||
|
parameter DATA_WIDTH = 12,
|
||||||
|
parameter WINDOW_SIZE = 4,
|
||||||
|
parameter ACCUM_WIDTH = 32
|
||||||
|
)
|
||||||
|
(
|
||||||
|
input clk_in,
|
||||||
|
input rst,
|
||||||
|
input [DATA_WIDTH-1:0] s_axis_tdata,
|
||||||
|
input s_axis_tvalid,
|
||||||
|
|
||||||
|
output [ACCUM_WIDTH-1:0] sum_data,
|
||||||
|
output sum_valid
|
||||||
|
);
|
||||||
|
|
||||||
|
logic [ACCUM_WIDTH-1:0] accum, res;
|
||||||
|
logic [DATA_WIDTH-1:0] axis_data;
|
||||||
|
logic res_valid, axis_valid;
|
||||||
|
(* MARK_DEBUG = "TRUE" *) logic [15:0] cnt;
|
||||||
|
|
||||||
|
always @(posedge clk_in) begin
|
||||||
|
if (rst) begin
|
||||||
|
accum <= '0;
|
||||||
|
cnt <= '0;
|
||||||
|
res <= '0;
|
||||||
|
res_valid <= 0;
|
||||||
|
end else begin
|
||||||
|
res_valid <= 0;
|
||||||
|
axis_data <= s_axis_tdata;
|
||||||
|
axis_valid <= s_axis_tvalid;
|
||||||
|
if ( axis_valid) begin
|
||||||
|
if (cnt == WINDOW_SIZE-1) begin
|
||||||
|
res <= accum + axis_data;
|
||||||
|
res_valid <= 1;
|
||||||
|
accum <= '0;
|
||||||
|
cnt <= '0;
|
||||||
|
end else begin
|
||||||
|
accum <= accum + axis_data;
|
||||||
|
cnt <= cnt + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assign sum_valid = res_valid;
|
||||||
|
assign sum_data = res;
|
||||||
|
|
||||||
|
endmodule
|
||||||
324
rtl/accum/src/out_axis_fifo.sv
Normal file
324
rtl/accum/src/out_axis_fifo.sv
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
module out_axis_fifo #(
|
||||||
|
parameter ACCUM_WIDTH = 32,
|
||||||
|
parameter WINDOW_SIZE = 65,
|
||||||
|
parameter PACKET_SIZE = 1024
|
||||||
|
) (
|
||||||
|
input logic eth_clk_in,
|
||||||
|
input logic acc_clk_in,
|
||||||
|
input logic rst,
|
||||||
|
input logic [31:0] smp_num,
|
||||||
|
|
||||||
|
// AXI stream master for output, eth_clk_in domain
|
||||||
|
output logic [7:0] m_axis_tdata,
|
||||||
|
output logic m_axis_tvalid,
|
||||||
|
input logic m_axis_tready,
|
||||||
|
output logic m_axis_tlast,
|
||||||
|
// eth handshake
|
||||||
|
input logic req_ready,
|
||||||
|
output logic send_req,
|
||||||
|
output logic [15:0] udp_data_length,
|
||||||
|
|
||||||
|
// data from acc
|
||||||
|
input logic [ACCUM_WIDTH-1:0] acc_din,
|
||||||
|
input logic din_valid,
|
||||||
|
|
||||||
|
// input pulse
|
||||||
|
input logic readout_begin,
|
||||||
|
|
||||||
|
// output pulses
|
||||||
|
output logic batch_req,
|
||||||
|
output logic finish
|
||||||
|
);
|
||||||
|
// sync reset
|
||||||
|
reg [1:0] rst_sync_ff;
|
||||||
|
reg rst_eth;
|
||||||
|
|
||||||
|
always @(posedge acc_clk_in or posedge rst) begin
|
||||||
|
if (rst) begin
|
||||||
|
rst_sync_ff <= 2'b11;
|
||||||
|
end else begin
|
||||||
|
rst_sync_ff <= {rst_sync_ff[0], 1'b0};
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assign rst_eth = rst_sync_ff[1];
|
||||||
|
|
||||||
|
logic [1:0] rst_acc_ff;
|
||||||
|
logic rst_acc;
|
||||||
|
|
||||||
|
always_ff @(posedge acc_clk_in or posedge rst) begin
|
||||||
|
if (rst)
|
||||||
|
rst_acc_ff <= 2'b11;
|
||||||
|
else
|
||||||
|
rst_acc_ff <= {rst_acc_ff[0], 1'b0};
|
||||||
|
end
|
||||||
|
|
||||||
|
assign rst_acc = rst_acc_ff[1];
|
||||||
|
|
||||||
|
|
||||||
|
// fifo params calc
|
||||||
|
// round up to be enough for 2xPACKET_SIZE storage
|
||||||
|
localparam int MIN_BYTES = 2 * PACKET_SIZE;
|
||||||
|
localparam int MIN_BITS = MIN_BYTES * 8;
|
||||||
|
localparam int MIN_WR_WORDS = (MIN_BITS + ACCUM_WIDTH - 1) / ACCUM_WIDTH; // ceil div
|
||||||
|
localparam int WDEPTH_BITS = $clog2(MIN_WR_WORDS);
|
||||||
|
localparam int FIFO_WDEPTH = 1 << WDEPTH_BITS;
|
||||||
|
|
||||||
|
localparam int FIFO_RDEPTH = FIFO_WDEPTH * ACCUM_WIDTH / 8;
|
||||||
|
localparam int RDEPTH_BITS = $clog2(FIFO_RDEPTH) + 1;
|
||||||
|
|
||||||
|
wire wr_unavail;
|
||||||
|
wire wr_rst_busy;
|
||||||
|
reg rd_en;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum logic [2:0] {
|
||||||
|
WR_IDLE = 3'd0,
|
||||||
|
WR_CHECK = 3'd1,
|
||||||
|
WR_RUN = 3'd2,
|
||||||
|
WR_END = 3'd3
|
||||||
|
} wr_state_t;
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) wr_state_t wr_state;
|
||||||
|
|
||||||
|
// Write FSM
|
||||||
|
reg [31:0] wr_cnt; // current BIT mem ptr
|
||||||
|
reg [31:0] wr_batch_tgt; // next 'target' that should be written from batch
|
||||||
|
reg [31:0] wr_total; // total BITS to be sent!
|
||||||
|
|
||||||
|
wire empty;
|
||||||
|
|
||||||
|
wire [WDEPTH_BITS:0] wr_data_count;
|
||||||
|
|
||||||
|
// NOTE:
|
||||||
|
// each written "acc_din" ACCUM_WIDTH word
|
||||||
|
// is counted as WINDOWS_SIZE samples actually
|
||||||
|
// because hw division for counters is painful
|
||||||
|
// so we just increased the counter sizes
|
||||||
|
|
||||||
|
always_ff @(posedge acc_clk_in) begin
|
||||||
|
if (rst_acc) begin
|
||||||
|
wr_state <= WR_IDLE;
|
||||||
|
wr_cnt <= 32'b0;
|
||||||
|
wr_batch_tgt <= 32'b0;
|
||||||
|
wr_total <= 32'b0;
|
||||||
|
batch_req <= 0;
|
||||||
|
finish <= 0;
|
||||||
|
|
||||||
|
end else begin
|
||||||
|
|
||||||
|
case (wr_state)
|
||||||
|
// wait until readout is requested
|
||||||
|
WR_IDLE: begin
|
||||||
|
if (readout_begin) begin
|
||||||
|
wr_cnt <= 32'b0;
|
||||||
|
wr_state <= WR_CHECK;
|
||||||
|
wr_total <= smp_num * ACCUM_WIDTH;
|
||||||
|
wr_batch_tgt <= 32'b0;
|
||||||
|
batch_req <= 0;
|
||||||
|
finish <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// wait until we can request a word
|
||||||
|
// depends on prog_full signal
|
||||||
|
WR_CHECK: begin
|
||||||
|
if ((wr_data_count < (FIFO_WDEPTH - (PACKET_SIZE / (ACCUM_WIDTH / 8)))) && ~wr_rst_busy) begin
|
||||||
|
batch_req <= 1;
|
||||||
|
// should give us exactly PACKET_SIZE * 8 bits
|
||||||
|
// multiplied by WINDOW_SIZE, because we count
|
||||||
|
// each given ACCUM_WIDTH word as WINDOWS_SIZE samples !!!
|
||||||
|
wr_batch_tgt <= wr_batch_tgt + (8 * WINDOW_SIZE * PACKET_SIZE);
|
||||||
|
wr_state <= WR_RUN;
|
||||||
|
end else begin
|
||||||
|
batch_req <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// wait until all requested packet is written
|
||||||
|
WR_RUN: begin
|
||||||
|
batch_req <= 0;
|
||||||
|
if (wr_cnt == wr_batch_tgt) begin
|
||||||
|
// got enough words
|
||||||
|
wr_state <= WR_END;
|
||||||
|
end else if (wr_cnt > wr_batch_tgt) begin
|
||||||
|
// weird case when accum gave us too much words
|
||||||
|
// block resets
|
||||||
|
wr_cnt <= 32'hffffffff; // sort of signal for sim/ila
|
||||||
|
wr_state <= WR_END;
|
||||||
|
end
|
||||||
|
|
||||||
|
if (din_valid) begin
|
||||||
|
// data supplied
|
||||||
|
// count as we got WINDOW_SIZE samples
|
||||||
|
wr_cnt <= wr_cnt + ACCUM_WIDTH * WINDOW_SIZE;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// check if this was last data batch
|
||||||
|
WR_END: begin
|
||||||
|
// here we check that we sent enough data
|
||||||
|
// wr_cnt should be by design PACKET_SIZE-aligned
|
||||||
|
if (wr_cnt >= wr_total) begin
|
||||||
|
// wait until all data is sent
|
||||||
|
if (empty) begin
|
||||||
|
finish <= 1;
|
||||||
|
wr_state <= WR_IDLE;
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
// next word
|
||||||
|
wr_state <= WR_CHECK;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// Readout FSM with ethernet request
|
||||||
|
|
||||||
|
assign udp_data_length = PACKET_SIZE; // fixed packet size
|
||||||
|
reg [15:0] sent_cnt;
|
||||||
|
|
||||||
|
typedef enum logic [2:0] {
|
||||||
|
RD_IDLE = 3'd0,
|
||||||
|
RD_CHECK = 3'd1,
|
||||||
|
RD_SEND = 3'd2
|
||||||
|
} rd_state_t;
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) rd_state_t rd_state;
|
||||||
|
|
||||||
|
wire rd_valid;
|
||||||
|
wire [RDEPTH_BITS-1:0] rd_data_count;
|
||||||
|
|
||||||
|
always_ff @(posedge eth_clk_in) begin
|
||||||
|
if (rst_eth) begin
|
||||||
|
rd_state <= RD_IDLE;
|
||||||
|
send_req <= 1'b0;
|
||||||
|
sent_cnt <= 16'd0;
|
||||||
|
m_axis_tlast <= 1'b0;
|
||||||
|
m_axis_tvalid <= 1'b0;
|
||||||
|
rd_en <= 1'b0;
|
||||||
|
|
||||||
|
end else begin
|
||||||
|
|
||||||
|
case (rd_state)
|
||||||
|
// wait until fifo has enough data to send
|
||||||
|
RD_IDLE: begin
|
||||||
|
if (rd_data_count == PACKET_SIZE) begin
|
||||||
|
// enough data to send packet, begin
|
||||||
|
rd_state <= RD_CHECK;
|
||||||
|
end
|
||||||
|
send_req <= 1'b0;
|
||||||
|
sent_cnt <= 16'd0;
|
||||||
|
rd_en <= 1'b0;
|
||||||
|
m_axis_tlast <= 1'b0;
|
||||||
|
m_axis_tvalid <= 1'b0;
|
||||||
|
end
|
||||||
|
|
||||||
|
// await udp ready
|
||||||
|
RD_CHECK: begin
|
||||||
|
if (req_ready) begin
|
||||||
|
send_req <= 1'b1;
|
||||||
|
rd_state <= RD_SEND;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// send data
|
||||||
|
RD_SEND: begin
|
||||||
|
// udp is ready and fifo is ready = sent
|
||||||
|
send_req <= 1'b0;
|
||||||
|
if (m_axis_tready && rd_valid) begin
|
||||||
|
rd_en <= 1'b1;
|
||||||
|
m_axis_tvalid <= 1'b1;
|
||||||
|
sent_cnt <= sent_cnt + 1;
|
||||||
|
// final packet of the batch
|
||||||
|
if (sent_cnt == PACKET_SIZE - 1) begin
|
||||||
|
rd_state <= RD_IDLE;
|
||||||
|
m_axis_tlast <= 1'b1;
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
rd_en <= 1'b0;
|
||||||
|
m_axis_tvalid <= 1'b0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
logic [ACCUM_WIDTH-1:0] fifo_din_r, acc_din_reg, din_valid_reg;
|
||||||
|
logic fifo_wr_en_r;
|
||||||
|
|
||||||
|
always_ff @(posedge acc_clk_in) begin
|
||||||
|
if (rst_acc) begin
|
||||||
|
fifo_din_r <= '0;
|
||||||
|
fifo_wr_en_r <= 1'b0;
|
||||||
|
|
||||||
|
din_valid_reg <= 1'b0;
|
||||||
|
end else begin
|
||||||
|
fifo_wr_en_r <= 1'b0;
|
||||||
|
acc_din_reg <= acc_din;
|
||||||
|
|
||||||
|
if (!wr_rst_busy && din_valid_reg) begin
|
||||||
|
fifo_din_r <= acc_din_reg;
|
||||||
|
fifo_wr_en_r <= 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
|
din_valid_reg <= din_valid;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// xpm_fifo_async: Asynchronous FIFO
|
||||||
|
// Xilinx Parameterized Macro, version 2025.1
|
||||||
|
|
||||||
|
xpm_fifo_async #(
|
||||||
|
.DOUT_RESET_VALUE("0"), // String
|
||||||
|
.FIFO_READ_LATENCY(1), // DECIMAL
|
||||||
|
.FIFO_WRITE_DEPTH(FIFO_WDEPTH),
|
||||||
|
.FULL_RESET_VALUE(0),
|
||||||
|
.PROG_EMPTY_THRESH(PACKET_SIZE),
|
||||||
|
.PROG_FULL_THRESH(PACKET_SIZE / (ACCUM_WIDTH / 8)),
|
||||||
|
.RD_DATA_COUNT_WIDTH(RDEPTH_BITS),
|
||||||
|
.READ_DATA_WIDTH(8), // always 8 bit for eth
|
||||||
|
.READ_MODE("fwft"),
|
||||||
|
.SIM_ASSERT_CHK(1), // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
|
||||||
|
.USE_ADV_FEATURES("1616"), // String
|
||||||
|
.WRITE_DATA_WIDTH(ACCUM_WIDTH),
|
||||||
|
.WR_DATA_COUNT_WIDTH(WDEPTH_BITS+1)
|
||||||
|
)
|
||||||
|
xpm_fifo_async_inst (
|
||||||
|
|
||||||
|
.data_valid(rd_valid), // 1-bit output: Read Data Valid: When asserted, this signal indicates that valid data is available on the
|
||||||
|
// output bus (dout).
|
||||||
|
|
||||||
|
.dout(m_axis_tdata),
|
||||||
|
.empty(empty),
|
||||||
|
|
||||||
|
.full( ),
|
||||||
|
|
||||||
|
.prog_full(wr_unavail), // 1-bit output: Programmable Full: This signal is asserted when the number of words in the FIFO is greater than
|
||||||
|
// or equal to the programmable full threshold value. It is de-asserted when the number of words in the FIFO is
|
||||||
|
// less than the programmable full threshold value.
|
||||||
|
|
||||||
|
.rd_data_count(rd_data_count), // RD_DATA_COUNT_WIDTH-bit output: Read Data Count: This bus indicates the number of words read from the FIFO.
|
||||||
|
|
||||||
|
.wr_data_count(wr_data_count), // WR_DATA_COUNT_WIDTH-bit output: Write Data Count: This bus indicates the number of words written into the
|
||||||
|
// FIFO.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.rd_clk(eth_clk_in), // 1-bit input: Read clock: Used for read operation. rd_clk must be a free running clock.
|
||||||
|
.rd_en(rd_en), // 1-bit input: Read Enable: If the FIFO is not empty, asserting this signal causes data (on dout) to be read
|
||||||
|
// from the FIFO. Must be held active-low when rd_rst_busy is active high.
|
||||||
|
|
||||||
|
.rst(rst),
|
||||||
|
|
||||||
|
.din(fifo_din_r), // WRITE_DATA_WIDTH-bit input: Write Data: The input data bus used when writing the FIFO.
|
||||||
|
.wr_clk(acc_clk_in), // 1-bit input: Write clock: Used for write operation. wr_clk must be a free running clock.
|
||||||
|
.wr_en(fifo_wr_en_r),
|
||||||
|
|
||||||
|
.wr_rst_busy(wr_rst_busy)
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
||||||
53
rtl/accum/tests/Makefile
Normal file
53
rtl/accum/tests/Makefile
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
#
|
||||||
|
# Copyright (c) 2025 FPGA Ninja, LLC
|
||||||
|
#
|
||||||
|
# Authors:
|
||||||
|
# - Alex Forencich
|
||||||
|
#
|
||||||
|
|
||||||
|
# FPGA settings
|
||||||
|
FPGA_PART = xc7a35tfgg484-1
|
||||||
|
FPGA_TOP = accumulator_top
|
||||||
|
FPGA_ARCH = artix7
|
||||||
|
|
||||||
|
RTL_DIR = ../src
|
||||||
|
|
||||||
|
|
||||||
|
include ../../../scripts/vivado.mk
|
||||||
|
|
||||||
|
SYN_FILES += $(sort $(shell find ../src -type f \( -name '*.v' -o -name '*.sv' \)))
|
||||||
|
|
||||||
|
XCI_FILES = $(sort $(shell find ../src -type f -name '*.xci'))
|
||||||
|
|
||||||
|
XDC_FILES += ../../../constraints/ax7a035b.xdc
|
||||||
|
XDC_FILES += test_timing.xdc
|
||||||
|
|
||||||
|
SYN_FILES += out_axis_fifo_tb.sv
|
||||||
|
SYN_FILES += accum_full_tb.sv
|
||||||
|
SIM_TOP = tb_accumulator_top
|
||||||
|
|
||||||
|
|
||||||
|
program: $(PROJECT).bit
|
||||||
|
echo "open_hw_manager" > program.tcl
|
||||||
|
echo "connect_hw_server" >> program.tcl
|
||||||
|
echo "open_hw_target" >> program.tcl
|
||||||
|
echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl
|
||||||
|
echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl
|
||||||
|
echo "set_property PROGRAM.FILE {$(PROJECT).bit} [current_hw_device]" >> program.tcl
|
||||||
|
echo "program_hw_devices [current_hw_device]" >> program.tcl
|
||||||
|
echo "exit" >> program.tcl
|
||||||
|
vivado -nojournal -nolog -mode batch -source program.tcl
|
||||||
|
|
||||||
|
$(PROJECT).mcs $(PROJECT).prm: $(PROJECT).bit
|
||||||
|
echo "write_cfgmem -force -format mcs -size 16 -interface SPIx4 -loadbit {up 0x0000000 $*.bit} -checksum -file $*.mcs" > generate_mcs.tcl
|
||||||
|
echo "exit" >> generate_mcs.tcl
|
||||||
|
vivado -nojournal -nolog -mode batch -source generate_mcs.tcl
|
||||||
|
mkdir -p rev
|
||||||
|
COUNT=100; \
|
||||||
|
while [ -e rev/$*_rev$$COUNT.bit ]; \
|
||||||
|
do COUNT=$$((COUNT+1)); done; \
|
||||||
|
COUNT=$$((COUNT-1)); \
|
||||||
|
for x in .mcs .prm; \
|
||||||
|
do cp $*$$x rev/$*_rev$$COUNT$$x; \
|
||||||
|
echo "Output: rev/$*_rev$$COUNT$$x"; done;
|
||||||
348
rtl/accum/tests/accum_full_tb.sv
Normal file
348
rtl/accum/tests/accum_full_tb.sv
Normal file
@ -0,0 +1,348 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module tb_accumulator_top;
|
||||||
|
|
||||||
|
localparam DATA_WIDTH = 12;
|
||||||
|
localparam ACCUM_WIDTH = 32;
|
||||||
|
localparam N_MAX = 4096;
|
||||||
|
localparam WINDOW_SIZE = 65;
|
||||||
|
localparam PACKET_SIZE = 1024;
|
||||||
|
localparam READ_BATCH_SIZE = (PACKET_SIZE*8)/ACCUM_WIDTH;
|
||||||
|
localparam MAX_WORDS = N_MAX;
|
||||||
|
localparam MAX_SEQ_NUM = 256;
|
||||||
|
|
||||||
|
logic clk_in;
|
||||||
|
logic eth_clk_in;
|
||||||
|
logic rst;
|
||||||
|
|
||||||
|
logic [DATA_WIDTH-1:0] s_axis_tdata;
|
||||||
|
logic s_axis_tvalid;
|
||||||
|
logic start;
|
||||||
|
logic [31:0] smp_num;
|
||||||
|
logic [15:0] seq_num;
|
||||||
|
|
||||||
|
logic req_ready;
|
||||||
|
wire send_req;
|
||||||
|
|
||||||
|
wire [7:0] m_axis_tdata;
|
||||||
|
wire m_axis_tvalid;
|
||||||
|
logic m_axis_tready;
|
||||||
|
wire m_axis_tlast;
|
||||||
|
|
||||||
|
wire finish;
|
||||||
|
|
||||||
|
integer seed;
|
||||||
|
integer total_errors;
|
||||||
|
integer tests_total;
|
||||||
|
integer tests_failed;
|
||||||
|
integer tests_passed;
|
||||||
|
|
||||||
|
integer packets_seen;
|
||||||
|
integer current_packet_byte_count;
|
||||||
|
integer total_words_captured;
|
||||||
|
|
||||||
|
byte packet_bytes [0:PACKET_SIZE-1];
|
||||||
|
logic [ACCUM_WIDTH-1:0] expected_words [0:MAX_WORDS-1];
|
||||||
|
logic [ACCUM_WIDTH-1:0] captured_words_le[0:MAX_WORDS-1];
|
||||||
|
logic [ACCUM_WIDTH-1:0] captured_words_be[0:MAX_WORDS-1];
|
||||||
|
|
||||||
|
accumulator_top #(
|
||||||
|
.DATA_WIDTH(DATA_WIDTH),
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH),
|
||||||
|
.N_MAX(N_MAX),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.PACKET_SIZE(PACKET_SIZE)
|
||||||
|
) dut (
|
||||||
|
.clk_in(clk_in),
|
||||||
|
.rst(rst),
|
||||||
|
.s_axis_tdata(s_axis_tdata),
|
||||||
|
.s_axis_tvalid(s_axis_tvalid),
|
||||||
|
.start(start),
|
||||||
|
.smp_num(smp_num),
|
||||||
|
.seq_num(seq_num),
|
||||||
|
.eth_clk_in(eth_clk_in),
|
||||||
|
.req_ready(req_ready),
|
||||||
|
.send_req(send_req),
|
||||||
|
.m_axis_tdata(m_axis_tdata),
|
||||||
|
.m_axis_tvalid(m_axis_tvalid),
|
||||||
|
.m_axis_tready(m_axis_tready),
|
||||||
|
.m_axis_tlast(m_axis_tlast),
|
||||||
|
.finish(finish)
|
||||||
|
);
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
clk_in = 1'b0;
|
||||||
|
forever #5 clk_in = ~clk_in;
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
eth_clk_in = 1'b0;
|
||||||
|
forever #4 eth_clk_in = ~eth_clk_in;
|
||||||
|
end
|
||||||
|
|
||||||
|
task automatic clear_scoreboard;
|
||||||
|
integer i;
|
||||||
|
begin
|
||||||
|
packets_seen = 0;
|
||||||
|
current_packet_byte_count = 0;
|
||||||
|
total_words_captured = 0;
|
||||||
|
for (i = 0; i < MAX_WORDS; i = i + 1) begin
|
||||||
|
expected_words[i] = '0;
|
||||||
|
captured_words_le[i] = '0;
|
||||||
|
captured_words_be[i] = '0;
|
||||||
|
end
|
||||||
|
for (i = 0; i < PACKET_SIZE; i = i + 1)
|
||||||
|
packet_bytes[i] = 8'h00;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic reset_dut;
|
||||||
|
begin
|
||||||
|
rst = 1'b1;
|
||||||
|
start = 1'b0;
|
||||||
|
s_axis_tdata = '0;
|
||||||
|
s_axis_tvalid = 1'b0;
|
||||||
|
smp_num = '0;
|
||||||
|
seq_num = '0;
|
||||||
|
req_ready = 1'b0;
|
||||||
|
m_axis_tready = 1'b1;
|
||||||
|
clear_scoreboard();
|
||||||
|
|
||||||
|
repeat(12) @(posedge clk_in);
|
||||||
|
rst = 1'b0;
|
||||||
|
repeat(8) @(posedge clk_in);
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic pulse_start;
|
||||||
|
begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
start <= 1'b1;
|
||||||
|
@(posedge clk_in);
|
||||||
|
start <= 1'b0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic send_one_sample(input logic [DATA_WIDTH-1:0] val);
|
||||||
|
begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
s_axis_tdata <= val;
|
||||||
|
s_axis_tvalid <= 1'b1;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic stop_stream;
|
||||||
|
begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
s_axis_tdata <= '0;
|
||||||
|
s_axis_tvalid <= 1'b0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic run_test(
|
||||||
|
input integer test_id,
|
||||||
|
input integer seq_num_i,
|
||||||
|
input integer smp_num_i,
|
||||||
|
input bit randomize_data,
|
||||||
|
input integer base_value,
|
||||||
|
input string test_name
|
||||||
|
);
|
||||||
|
logic [DATA_WIDTH-1:0] sample_mem [0:MAX_SEQ_NUM-1][0:(N_MAX*WINDOW_SIZE)-1];
|
||||||
|
integer seq_idx;
|
||||||
|
integer sample_idx;
|
||||||
|
integer word_idx;
|
||||||
|
integer k;
|
||||||
|
integer exp_word_count;
|
||||||
|
integer exp_packet_count;
|
||||||
|
integer sample_value;
|
||||||
|
integer local_sum;
|
||||||
|
integer timeout_cnt;
|
||||||
|
bit le_ok;
|
||||||
|
bit be_ok;
|
||||||
|
integer errors_before;
|
||||||
|
integer i;
|
||||||
|
begin
|
||||||
|
tests_total = tests_total + 1;
|
||||||
|
errors_before = total_errors;
|
||||||
|
|
||||||
|
if (smp_num_i <= 0 || smp_num_i > N_MAX * WINDOW_SIZE || (smp_num_i % WINDOW_SIZE) != 0)
|
||||||
|
$fatal(1, "[%0s] invalid smp_num=%0d", test_name, smp_num_i);
|
||||||
|
if (seq_num_i <= 0 || seq_num_i > MAX_SEQ_NUM)
|
||||||
|
$fatal(1, "[%0s] invalid seq_num=%0d", test_name, seq_num_i);
|
||||||
|
|
||||||
|
$display("\n========================================");
|
||||||
|
$display("TEST %0d: %0s", test_id, test_name);
|
||||||
|
$display("seq_num=%0d smp_num=%0d randomize=%0d", seq_num_i, smp_num_i, randomize_data);
|
||||||
|
$display("========================================");
|
||||||
|
|
||||||
|
reset_dut();
|
||||||
|
smp_num = smp_num_i;
|
||||||
|
seq_num = seq_num_i;
|
||||||
|
req_ready = 1'b1; // приемник готов заранее
|
||||||
|
|
||||||
|
exp_word_count = smp_num_i / WINDOW_SIZE;
|
||||||
|
exp_packet_count = (exp_word_count + READ_BATCH_SIZE - 1) / READ_BATCH_SIZE;
|
||||||
|
|
||||||
|
for (seq_idx = 0; seq_idx < seq_num_i; seq_idx = seq_idx + 1) begin
|
||||||
|
for (sample_idx = 0; sample_idx < smp_num_i; sample_idx = sample_idx + 1) begin
|
||||||
|
if (randomize_data)
|
||||||
|
sample_value = $unsigned($random(seed)) % (1 << DATA_WIDTH);
|
||||||
|
else
|
||||||
|
sample_value = (base_value + seq_idx * smp_num_i + sample_idx) % (1 << DATA_WIDTH);
|
||||||
|
sample_mem[seq_idx][sample_idx] = sample_value[DATA_WIDTH-1:0];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for (word_idx = 0; word_idx < exp_word_count; word_idx = word_idx + 1) begin
|
||||||
|
local_sum = 0;
|
||||||
|
for (seq_idx = 0; seq_idx < seq_num_i; seq_idx = seq_idx + 1) begin
|
||||||
|
for (k = 0; k < WINDOW_SIZE; k = k + 1)
|
||||||
|
local_sum = local_sum + sample_mem[seq_idx][word_idx * WINDOW_SIZE + k];
|
||||||
|
end
|
||||||
|
expected_words[word_idx] = local_sum[ACCUM_WIDTH-1:0];
|
||||||
|
$display(" expected[%0d] = %0d (0x%08x)", word_idx, expected_words[word_idx], expected_words[word_idx]);
|
||||||
|
end
|
||||||
|
|
||||||
|
pulse_start();
|
||||||
|
|
||||||
|
for (seq_idx = 0; seq_idx < seq_num_i; seq_idx = seq_idx + 1) begin
|
||||||
|
for (sample_idx = 0; sample_idx < smp_num_i; sample_idx = sample_idx + 1)
|
||||||
|
send_one_sample(sample_mem[seq_idx][sample_idx]);
|
||||||
|
stop_stream();
|
||||||
|
repeat(2) @(posedge clk_in);
|
||||||
|
end
|
||||||
|
|
||||||
|
timeout_cnt = 0;
|
||||||
|
while (packets_seen < exp_packet_count && timeout_cnt < 50 * PACKET_SIZE) begin
|
||||||
|
@(posedge eth_clk_in);
|
||||||
|
timeout_cnt = timeout_cnt + 1;
|
||||||
|
end
|
||||||
|
if (packets_seen < exp_packet_count) begin
|
||||||
|
$display("[%0s] ERROR: timeout waiting packets, got=%0d exp=%0d",
|
||||||
|
test_name, packets_seen, exp_packet_count);
|
||||||
|
total_errors = total_errors + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
timeout_cnt = 0;
|
||||||
|
while (finish !== 1'b1 && timeout_cnt < 30000) begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
timeout_cnt = timeout_cnt + 1;
|
||||||
|
end
|
||||||
|
if (finish !== 1'b1) begin
|
||||||
|
$display("[%0s] ERROR: timeout waiting finish", test_name);
|
||||||
|
total_errors = total_errors + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
le_ok = 1'b1;
|
||||||
|
be_ok = 1'b1;
|
||||||
|
for (i = 0; i < exp_word_count; i = i + 1) begin
|
||||||
|
if (captured_words_le[i] !== expected_words[i]) le_ok = 1'b0;
|
||||||
|
if (captured_words_be[i] !== expected_words[i]) be_ok = 1'b0;
|
||||||
|
end
|
||||||
|
|
||||||
|
if (!le_ok && !be_ok) begin
|
||||||
|
$display("[%0s] ERROR: payload mismatch", test_name);
|
||||||
|
for (i = 0; i < exp_word_count; i = i + 1)
|
||||||
|
$display(" idx=%0d exp=0x%08x le=0x%08x be=0x%08x",
|
||||||
|
i, expected_words[i], captured_words_le[i], captured_words_be[i]);
|
||||||
|
total_errors = total_errors + 1;
|
||||||
|
end else if (le_ok) begin
|
||||||
|
$display("[%0s] payload check passed in little-endian", test_name);
|
||||||
|
end else begin
|
||||||
|
$display("[%0s] payload check passed in big-endian", test_name);
|
||||||
|
end
|
||||||
|
|
||||||
|
if (total_errors == errors_before) begin
|
||||||
|
tests_passed = tests_passed + 1;
|
||||||
|
$display("TEST %0d PASSED: %0s", test_id, test_name);
|
||||||
|
end else begin
|
||||||
|
tests_failed = tests_failed + 1;
|
||||||
|
$display("TEST %0d FAILED: %0s", test_id, test_name);
|
||||||
|
end
|
||||||
|
|
||||||
|
req_ready = 1'b0;
|
||||||
|
repeat(10) @(posedge clk_in);
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
always @(posedge eth_clk_in) begin : CAPTURE_AXIS
|
||||||
|
integer idx;
|
||||||
|
logic [31:0] tmp_le;
|
||||||
|
logic [31:0] tmp_be;
|
||||||
|
if (rst) begin
|
||||||
|
current_packet_byte_count = 0;
|
||||||
|
end else if (m_axis_tvalid && m_axis_tready) begin
|
||||||
|
if (current_packet_byte_count < PACKET_SIZE)
|
||||||
|
packet_bytes[current_packet_byte_count] = m_axis_tdata;
|
||||||
|
current_packet_byte_count = current_packet_byte_count + 1;
|
||||||
|
|
||||||
|
if (m_axis_tlast) begin
|
||||||
|
packets_seen = packets_seen + 1;
|
||||||
|
|
||||||
|
if (current_packet_byte_count != PACKET_SIZE) begin
|
||||||
|
$display("[packet] ERROR: packet size=%0d expected=%0d", current_packet_byte_count, PACKET_SIZE);
|
||||||
|
total_errors = total_errors + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
for (idx = 0; idx < READ_BATCH_SIZE; idx = idx + 1) begin
|
||||||
|
tmp_le = {
|
||||||
|
packet_bytes[idx*4 + 3],
|
||||||
|
packet_bytes[idx*4 + 2],
|
||||||
|
packet_bytes[idx*4 + 1],
|
||||||
|
packet_bytes[idx*4 + 0]
|
||||||
|
};
|
||||||
|
tmp_be = {
|
||||||
|
packet_bytes[idx*4 + 0],
|
||||||
|
packet_bytes[idx*4 + 1],
|
||||||
|
packet_bytes[idx*4 + 2],
|
||||||
|
packet_bytes[idx*4 + 3]
|
||||||
|
};
|
||||||
|
if (total_words_captured + idx < MAX_WORDS) begin
|
||||||
|
captured_words_le[total_words_captured + idx] = tmp_le;
|
||||||
|
captured_words_be[total_words_captured + idx] = tmp_be;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
total_words_captured = total_words_captured + READ_BATCH_SIZE;
|
||||||
|
current_packet_byte_count = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
seed = 32'h1badf00d;
|
||||||
|
total_errors = 0;
|
||||||
|
tests_total = 0;
|
||||||
|
tests_failed = 0;
|
||||||
|
tests_passed = 0;
|
||||||
|
|
||||||
|
reset_dut();
|
||||||
|
|
||||||
|
run_test(1, 1, 1 * WINDOW_SIZE, 1'b0, 1, "deterministic_small");
|
||||||
|
// $finish;
|
||||||
|
run_test(2, 2, 1 * WINDOW_SIZE, 1'b1, 0, "random_seq3_smp8");
|
||||||
|
run_test(3, 1, 16 * WINDOW_SIZE, 1'b1, 0, "random_seq5_smp16_multi_packet");
|
||||||
|
run_test(4, 2, 12 * WINDOW_SIZE, 1'b1, 0, "random_seq7_smp12");
|
||||||
|
run_test(5, 4, 256 * WINDOW_SIZE, 1'b1, 0, "random_max_smpnum");
|
||||||
|
run_test(6, 2, 1500 * WINDOW_SIZE, 1'b1, 0, "random_max_smpnum2");
|
||||||
|
run_test(7, 20, 1 * WINDOW_SIZE, 1'b1, 0, "random_20seq");
|
||||||
|
run_test(8, 20, 3 * WINDOW_SIZE, 1'b1, 0, "random_20seqx3");
|
||||||
|
run_test(9, 200, 1 * WINDOW_SIZE, 1'b1, 0, "random_200seq");
|
||||||
|
|
||||||
|
$display("\n========================================");
|
||||||
|
$display("ALL TESTS COMPLETED");
|
||||||
|
$display("tests_total = %0d", tests_total);
|
||||||
|
$display("tests_passed = %0d", tests_passed);
|
||||||
|
$display("tests_failed = %0d", tests_failed);
|
||||||
|
$display("total_errors = %0d", total_errors);
|
||||||
|
$display("========================================");
|
||||||
|
|
||||||
|
if (total_errors != 0)
|
||||||
|
$fatal(1, "TB FAILED with %0d error(s)", total_errors);
|
||||||
|
else
|
||||||
|
$display("TB PASSED");
|
||||||
|
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
183
rtl/accum/tests/accum_tb.sv
Normal file
183
rtl/accum/tests/accum_tb.sv
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module tb_accumulator;
|
||||||
|
|
||||||
|
localparam DATA_WIDTH = 12;
|
||||||
|
localparam ACCUM_WIDTH = 32;
|
||||||
|
localparam N_MAX = 64;
|
||||||
|
localparam WINDOW_SIZE = 4;
|
||||||
|
localparam PACKET_SIZE = 8; // bytes
|
||||||
|
localparam READ_BATCH_SIZE = (PACKET_SIZE*8)/ACCUM_WIDTH; // = 2
|
||||||
|
|
||||||
|
reg clk_in;
|
||||||
|
reg rst;
|
||||||
|
reg [DATA_WIDTH-1:0] s_axis_tdata;
|
||||||
|
reg s_axis_tvalid;
|
||||||
|
reg start;
|
||||||
|
reg [31:0] smp_num;
|
||||||
|
reg [15:0] seq_num;
|
||||||
|
wire [ACCUM_WIDTH-1:0] out_data;
|
||||||
|
wire out_valid;
|
||||||
|
wire readout_begin;
|
||||||
|
reg batch_req;
|
||||||
|
reg finish;
|
||||||
|
|
||||||
|
integer i;
|
||||||
|
integer out_count;
|
||||||
|
|
||||||
|
reg [ACCUM_WIDTH-1:0] expected [0:READ_BATCH_SIZE-1];
|
||||||
|
reg [ACCUM_WIDTH-1:0] got [0:READ_BATCH_SIZE-1];
|
||||||
|
|
||||||
|
accumulator #(
|
||||||
|
.DATA_WIDTH(DATA_WIDTH),
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH),
|
||||||
|
.N_MAX(N_MAX),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.PACKET_SIZE(PACKET_SIZE)
|
||||||
|
) dut (
|
||||||
|
.clk_in(clk_in),
|
||||||
|
.rst(rst),
|
||||||
|
.s_axis_tdata(s_axis_tdata),
|
||||||
|
.s_axis_tvalid(s_axis_tvalid),
|
||||||
|
.start(start),
|
||||||
|
.smp_num(smp_num),
|
||||||
|
.seq_num(seq_num),
|
||||||
|
.out_data(out_data),
|
||||||
|
.out_valid(out_valid),
|
||||||
|
.readout_begin(readout_begin),
|
||||||
|
.batch_req(batch_req),
|
||||||
|
.finish(finish)
|
||||||
|
);
|
||||||
|
|
||||||
|
// clock 100 MHz
|
||||||
|
initial begin
|
||||||
|
clk_in = 0;
|
||||||
|
forever #5 clk_in = ~clk_in;
|
||||||
|
end
|
||||||
|
|
||||||
|
// send one sample
|
||||||
|
task send_sample(input [DATA_WIDTH-1:0] val);
|
||||||
|
begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
s_axis_tdata <= val;
|
||||||
|
s_axis_tvalid <= 1'b1;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// one idle cycle after valid stream
|
||||||
|
task end_stream;
|
||||||
|
begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
s_axis_tvalid <= 1'b0;
|
||||||
|
s_axis_tdata <= '0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// pulse start
|
||||||
|
task pulse_start;
|
||||||
|
begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
start <= 1'b1;
|
||||||
|
@(posedge clk_in);
|
||||||
|
start <= 1'b0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// pulse batch request
|
||||||
|
task pulse_batch_req;
|
||||||
|
begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
batch_req <= 1'b1;
|
||||||
|
@(posedge clk_in);
|
||||||
|
batch_req <= 1'b0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
repeat(100) @(posedge clk_in);
|
||||||
|
// init
|
||||||
|
rst = 1'b1;
|
||||||
|
s_axis_tdata = '0;
|
||||||
|
s_axis_tvalid= 1'b0;
|
||||||
|
start = 1'b0;
|
||||||
|
smp_num = 32'd8;
|
||||||
|
seq_num = 16'd2;
|
||||||
|
batch_req = 1'b0;
|
||||||
|
finish = 1'b0;
|
||||||
|
|
||||||
|
expected[0] = 32'd60;
|
||||||
|
expected[1] = 32'd92;
|
||||||
|
|
||||||
|
repeat(50) @(posedge clk_in);
|
||||||
|
rst = 1'b0;
|
||||||
|
repeat(50) @(posedge clk_in);
|
||||||
|
|
||||||
|
$display("=== TEST START ===");
|
||||||
|
|
||||||
|
pulse_start();
|
||||||
|
|
||||||
|
// seq 0: [1..8]
|
||||||
|
send_sample(12'd1);
|
||||||
|
send_sample(12'd2);
|
||||||
|
send_sample(12'd3);
|
||||||
|
send_sample(12'd4);
|
||||||
|
send_sample(12'd5);
|
||||||
|
send_sample(12'd6);
|
||||||
|
send_sample(12'd7);
|
||||||
|
send_sample(12'd8);
|
||||||
|
end_stream();
|
||||||
|
|
||||||
|
// небольшой зазор
|
||||||
|
repeat(5) @(posedge clk_in);
|
||||||
|
|
||||||
|
// seq 1: [11..18]
|
||||||
|
send_sample(12'd11);
|
||||||
|
send_sample(12'd12);
|
||||||
|
send_sample(12'd13);
|
||||||
|
send_sample(12'd14);
|
||||||
|
send_sample(12'd15);
|
||||||
|
send_sample(12'd16);
|
||||||
|
send_sample(12'd17);
|
||||||
|
send_sample(12'd18);
|
||||||
|
end_stream();
|
||||||
|
|
||||||
|
$display("[%0t] all input data sent, waiting readout_begin...", $time);
|
||||||
|
|
||||||
|
wait(readout_begin == 1'b1);
|
||||||
|
$display("[%0t] readout_begin asserted", $time);
|
||||||
|
repeat(22) @(posedge clk_in);
|
||||||
|
pulse_batch_req();
|
||||||
|
|
||||||
|
out_count = 0;
|
||||||
|
|
||||||
|
// ждём два слова
|
||||||
|
while (out_count < READ_BATCH_SIZE) begin
|
||||||
|
@(posedge clk_in);
|
||||||
|
if (out_valid) begin
|
||||||
|
got[out_count] = out_data;
|
||||||
|
$display("[%0t] out_valid: got[%0d] = %0d", $time, out_count, out_data);
|
||||||
|
out_count = out_count + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// проверка
|
||||||
|
for (i = 0; i < READ_BATCH_SIZE; i = i + 1) begin
|
||||||
|
if (got[i] !== expected[i]) begin
|
||||||
|
$error("Mismatch at index %0d: got=%0d expected=%0d", i, got[i], expected[i]);
|
||||||
|
end else begin
|
||||||
|
$display("OK index %0d: %0d", i, got[i]);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// завершаем readout
|
||||||
|
@(posedge clk_in);
|
||||||
|
finish <= 1'b1;
|
||||||
|
|
||||||
|
|
||||||
|
repeat(10) @(posedge clk_in);
|
||||||
|
|
||||||
|
$display("=== TEST PASSED ===");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
290
rtl/accum/tests/out_axis_fifo_tb.sv
Normal file
290
rtl/accum/tests/out_axis_fifo_tb.sv
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
`timescale 1ns/1ps
|
||||||
|
|
||||||
|
module tb_out_axis_fifo;
|
||||||
|
|
||||||
|
localparam int ACCUM_WIDTH = 32;
|
||||||
|
localparam int WINDOW_SIZE = 65;
|
||||||
|
localparam int PACKET_SIZE = 8;
|
||||||
|
localparam int BYTES_PER_WORD = ACCUM_WIDTH / 8;
|
||||||
|
localparam int WORDS_PER_BATCH = PACKET_SIZE / BYTES_PER_WORD; // 1024 / 4 = 256 слов
|
||||||
|
|
||||||
|
logic eth_clk_in;
|
||||||
|
logic acc_clk_in;
|
||||||
|
logic rst;
|
||||||
|
|
||||||
|
logic [31:0] smp_num;
|
||||||
|
|
||||||
|
logic [7:0] m_axis_tdata;
|
||||||
|
logic m_axis_tvalid;
|
||||||
|
logic m_axis_tready;
|
||||||
|
logic m_axis_tlast;
|
||||||
|
|
||||||
|
logic [ACCUM_WIDTH-1:0] acc_din;
|
||||||
|
logic din_valid;
|
||||||
|
|
||||||
|
logic send_req;
|
||||||
|
logic req_ready;
|
||||||
|
|
||||||
|
logic readout_begin;
|
||||||
|
|
||||||
|
logic batch_req;
|
||||||
|
logic finish;
|
||||||
|
|
||||||
|
out_axis_fifo #(
|
||||||
|
.ACCUM_WIDTH(ACCUM_WIDTH),
|
||||||
|
.WINDOW_SIZE(WINDOW_SIZE),
|
||||||
|
.PACKET_SIZE(PACKET_SIZE)
|
||||||
|
) dut (
|
||||||
|
.eth_clk_in (eth_clk_in),
|
||||||
|
.acc_clk_in (acc_clk_in),
|
||||||
|
.rst (rst),
|
||||||
|
.smp_num (smp_num),
|
||||||
|
|
||||||
|
.m_axis_tdata (m_axis_tdata),
|
||||||
|
.m_axis_tvalid (m_axis_tvalid),
|
||||||
|
.m_axis_tready (m_axis_tready),
|
||||||
|
.m_axis_tlast (m_axis_tlast),
|
||||||
|
|
||||||
|
.acc_din (acc_din),
|
||||||
|
.din_valid (din_valid),
|
||||||
|
|
||||||
|
.readout_begin (readout_begin),
|
||||||
|
|
||||||
|
.req_ready (req_ready),
|
||||||
|
.send_req (send_req),
|
||||||
|
|
||||||
|
.batch_req (batch_req),
|
||||||
|
.finish (finish)
|
||||||
|
);
|
||||||
|
|
||||||
|
// clocks
|
||||||
|
initial begin
|
||||||
|
eth_clk_in = 0;
|
||||||
|
forever #6 eth_clk_in = ~eth_clk_in; // 125
|
||||||
|
end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
acc_clk_in = 0;
|
||||||
|
forever #7.692307692 acc_clk_in = ~acc_clk_in; // 65
|
||||||
|
end
|
||||||
|
|
||||||
|
// scoreboard
|
||||||
|
byte expected_bytes[$];
|
||||||
|
int unsigned compared_bytes;
|
||||||
|
int unsigned mismatch_count;
|
||||||
|
int unsigned total_pushed_words;
|
||||||
|
|
||||||
|
task automatic scoreboard_reset();
|
||||||
|
begin
|
||||||
|
expected_bytes.delete();
|
||||||
|
compared_bytes = 0;
|
||||||
|
mismatch_count = 0;
|
||||||
|
total_pushed_words = 0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic push_expected_word(input logic [ACCUM_WIDTH-1:0] word);
|
||||||
|
begin
|
||||||
|
// queue push
|
||||||
|
expected_bytes.push_back(word[7:0]);
|
||||||
|
expected_bytes.push_back(word[15:8]);
|
||||||
|
expected_bytes.push_back(word[23:16]);
|
||||||
|
expected_bytes.push_back(word[31:24]);
|
||||||
|
total_pushed_words++;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic check_expected_empty(string case_name);
|
||||||
|
begin
|
||||||
|
if (expected_bytes.size() != 0) begin
|
||||||
|
$error("[%0t] %s: expected_bytes is not empty, remaining=%0d",
|
||||||
|
$time, case_name, expected_bytes.size());
|
||||||
|
end else begin
|
||||||
|
$display("[%0t] %s: scoreboard queue empty, all expected bytes were transmitted",
|
||||||
|
$time, case_name);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// axis check
|
||||||
|
always_ff @(posedge eth_clk_in or posedge rst) begin
|
||||||
|
byte exp_byte;
|
||||||
|
if (rst) begin
|
||||||
|
compared_bytes <= 0;
|
||||||
|
mismatch_count <= 0;
|
||||||
|
end else begin
|
||||||
|
if (m_axis_tvalid && m_axis_tready) begin
|
||||||
|
if (expected_bytes.size() == 0) begin
|
||||||
|
$error("[%0t] AXIS produced unexpected byte 0x%02x: expected queue is empty",
|
||||||
|
$time, m_axis_tdata);
|
||||||
|
mismatch_count <= mismatch_count + 1;
|
||||||
|
end else begin
|
||||||
|
exp_byte = expected_bytes.pop_front();
|
||||||
|
compared_bytes <= compared_bytes + 1;
|
||||||
|
|
||||||
|
if (m_axis_tdata !== exp_byte) begin
|
||||||
|
$error("[%0t] AXIS mismatch at byte #%0d: got=0x%02x expected=0x%02x",
|
||||||
|
$time, compared_bytes, m_axis_tdata, exp_byte);
|
||||||
|
mismatch_count <= mismatch_count + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// helpers
|
||||||
|
task automatic do_reset();
|
||||||
|
begin
|
||||||
|
rst = 1'b1;
|
||||||
|
readout_begin = 1'b0;
|
||||||
|
din_valid = 1'b0;
|
||||||
|
acc_din = '0;
|
||||||
|
smp_num = '0;
|
||||||
|
|
||||||
|
scoreboard_reset();
|
||||||
|
|
||||||
|
repeat (10) @(posedge acc_clk_in);
|
||||||
|
rst = 1'b0;
|
||||||
|
|
||||||
|
repeat (10) @(posedge acc_clk_in);
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic pulse_readout_begin(input logic [31:0] smp_num_i);
|
||||||
|
begin
|
||||||
|
smp_num = smp_num_i;
|
||||||
|
@(posedge acc_clk_in);
|
||||||
|
readout_begin <= 1'b1;
|
||||||
|
@(posedge acc_clk_in);
|
||||||
|
readout_begin <= 1'b0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic send_random_words(input int unsigned n_words);
|
||||||
|
int unsigned i;
|
||||||
|
logic [ACCUM_WIDTH-1:0] rand_word;
|
||||||
|
begin
|
||||||
|
for (i = 0; i < n_words; i++) begin
|
||||||
|
rand_word = $urandom;
|
||||||
|
|
||||||
|
@(posedge acc_clk_in);
|
||||||
|
din_valid <= 1'b1;
|
||||||
|
acc_din <= rand_word;
|
||||||
|
|
||||||
|
// expected result
|
||||||
|
push_expected_word(rand_word);
|
||||||
|
end
|
||||||
|
|
||||||
|
@(posedge acc_clk_in);
|
||||||
|
din_valid <= 1'b0;
|
||||||
|
acc_din <= '0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
|
||||||
|
// 1. set smp_num
|
||||||
|
// 2. pulse readout_begon
|
||||||
|
// 3. send 1KB (PACKET_SIZE) after each batch_req pulse
|
||||||
|
// 4. wait for finish
|
||||||
|
// 5. compare axis result
|
||||||
|
task automatic run_case(input logic [31:0] smp_num_i);
|
||||||
|
int batch_count;
|
||||||
|
string case_name;
|
||||||
|
begin
|
||||||
|
batch_count = 0;
|
||||||
|
case_name = $sformatf("run_case(smp_num=%0d)", smp_num_i);
|
||||||
|
|
||||||
|
$display("[%0t] %s start", $time, case_name);
|
||||||
|
|
||||||
|
pulse_readout_begin(smp_num_i);
|
||||||
|
|
||||||
|
while (finish !== 1'b1) begin
|
||||||
|
@(posedge acc_clk_in);
|
||||||
|
|
||||||
|
if (batch_req) begin
|
||||||
|
batch_count++;
|
||||||
|
$display("[%0t] %s: batch_req #%0d -> send %0d words",
|
||||||
|
$time, case_name, batch_count, WORDS_PER_BATCH);
|
||||||
|
|
||||||
|
send_random_words(WORDS_PER_BATCH);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
repeat (200) @(posedge eth_clk_in);
|
||||||
|
|
||||||
|
$display("[%0t] %s done: batches=%0d, pushed_words=%0d, compared_bytes=%0d, mismatches=%0d, wr_cnt=%0d, wr_total=%0d",
|
||||||
|
$time, case_name, batch_count, total_pushed_words, compared_bytes, mismatch_count,
|
||||||
|
dut.wr_cnt, dut.wr_total);
|
||||||
|
|
||||||
|
check_expected_empty(case_name);
|
||||||
|
|
||||||
|
if (mismatch_count != 0) begin
|
||||||
|
$fatal(1, "[%0t] %s FAILED: mismatches=%0d", $time, case_name, mismatch_count);
|
||||||
|
end else begin
|
||||||
|
$display("[%0t] %s PASSED", $time, case_name);
|
||||||
|
end
|
||||||
|
|
||||||
|
@(posedge acc_clk_in);
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// eth beh simulator
|
||||||
|
int axis_byte_count;
|
||||||
|
|
||||||
|
always_ff @(posedge eth_clk_in or posedge rst) begin
|
||||||
|
if (rst) begin
|
||||||
|
axis_byte_count <= 0;
|
||||||
|
req_ready <= 0;
|
||||||
|
m_axis_tready <= 1'b0;
|
||||||
|
end else begin
|
||||||
|
req_ready <= 1;
|
||||||
|
|
||||||
|
// request send
|
||||||
|
if (send_req) begin
|
||||||
|
m_axis_tready <= 1'b1;
|
||||||
|
req_ready <= 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
if (m_axis_tvalid && m_axis_tready) begin
|
||||||
|
axis_byte_count <= axis_byte_count + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
// main
|
||||||
|
initial begin
|
||||||
|
// init
|
||||||
|
rst = 1'b0;
|
||||||
|
readout_begin = 1'b0;
|
||||||
|
din_valid = 1'b0;
|
||||||
|
acc_din = '0;
|
||||||
|
smp_num = '0;
|
||||||
|
|
||||||
|
repeat (500) @(posedge acc_clk_in);
|
||||||
|
|
||||||
|
// 1
|
||||||
|
do_reset();
|
||||||
|
repeat (500) @(posedge acc_clk_in);
|
||||||
|
run_case(32'd17);
|
||||||
|
repeat (20) @(posedge acc_clk_in);
|
||||||
|
|
||||||
|
// 2
|
||||||
|
do_reset();
|
||||||
|
run_case(32'd1024);
|
||||||
|
repeat (20) @(posedge acc_clk_in);
|
||||||
|
|
||||||
|
// 3
|
||||||
|
do_reset();
|
||||||
|
run_case(32'd77777);
|
||||||
|
repeat (20) @(posedge acc_clk_in);
|
||||||
|
|
||||||
|
do_reset();
|
||||||
|
repeat (20) @(posedge acc_clk_in);
|
||||||
|
|
||||||
|
$display("[%0t] ALL TESTS DONE", $time);
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
183
rtl/accum/tests/tb_accumulator_top_behav.wcfg
Normal file
183
rtl/accum/tests/tb_accumulator_top_behav.wcfg
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<wave_config>
|
||||||
|
<wave_state>
|
||||||
|
</wave_state>
|
||||||
|
<db_ref_list>
|
||||||
|
<db_ref path="tb_accumulator_top_behav.wdb" id="1">
|
||||||
|
<top_modules>
|
||||||
|
<top_module name="glbl" />
|
||||||
|
<top_module name="tb_accumulator_top" />
|
||||||
|
</top_modules>
|
||||||
|
</db_ref>
|
||||||
|
</db_ref_list>
|
||||||
|
<zoom_setting>
|
||||||
|
<ZoomStartTime time="2,748,541.000 ns"></ZoomStartTime>
|
||||||
|
<ZoomEndTime time="2,749,382.001 ns"></ZoomEndTime>
|
||||||
|
<Cursor1Time time="2,749,045.000 ns"></Cursor1Time>
|
||||||
|
</zoom_setting>
|
||||||
|
<column_width_setting>
|
||||||
|
<NameColumnWidth column_width="556"></NameColumnWidth>
|
||||||
|
<ValueColumnWidth column_width="107"></ValueColumnWidth>
|
||||||
|
</column_width_setting>
|
||||||
|
<WVObjectSize size="18" />
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/clk_in">
|
||||||
|
<obj_property name="ElementShortName">clk_in</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">clk_in</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/eth_clk_in">
|
||||||
|
<obj_property name="ElementShortName">eth_clk_in</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">eth_clk_in</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/rst">
|
||||||
|
<obj_property name="ElementShortName">rst</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rst</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/s_axis_tdata">
|
||||||
|
<obj_property name="ElementShortName">s_axis_tdata[11:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_axis_tdata[11:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/s_axis_tvalid">
|
||||||
|
<obj_property name="ElementShortName">s_axis_tvalid</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_axis_tvalid</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/start">
|
||||||
|
<obj_property name="ElementShortName">start</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">start</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/smp_num">
|
||||||
|
<obj_property name="ElementShortName">smp_num[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">smp_num[31:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/seq_num">
|
||||||
|
<obj_property name="ElementShortName">seq_num[15:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">seq_num[15:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/req_ready">
|
||||||
|
<obj_property name="ElementShortName">req_ready</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">req_ready</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#E0FFFF</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/send_req">
|
||||||
|
<obj_property name="ElementShortName">send_req</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">send_req</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#E0FFFF</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/m_axis_tdata">
|
||||||
|
<obj_property name="ElementShortName">m_axis_tdata[7:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">m_axis_tdata[7:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#008080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/m_axis_tready">
|
||||||
|
<obj_property name="ElementShortName">m_axis_tready</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">m_axis_tready</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#00FFFF</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/m_axis_tlast">
|
||||||
|
<obj_property name="ElementShortName">m_axis_tlast</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">m_axis_tlast</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#008080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/finish">
|
||||||
|
<obj_property name="ElementShortName">finish</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">finish</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FAAFBE</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/batch_req">
|
||||||
|
<obj_property name="ElementShortName">batch_req</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">batch_req</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#00FFFF</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/readout_begin">
|
||||||
|
<obj_property name="ElementShortName">readout_begin</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">readout_begin</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#00FFFF</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="group" fp_name="group25">
|
||||||
|
<obj_property name="label">acc</obj_property>
|
||||||
|
<obj_property name="DisplayName">label</obj_property>
|
||||||
|
<obj_property name="isExpanded"></obj_property>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/accum_main/PACKET_SIZE">
|
||||||
|
<obj_property name="ElementShortName">PACKET_SIZE[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">PACKET_SIZE[31:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/accum_main/READ_BATCH_SIZE">
|
||||||
|
<obj_property name="ElementShortName">READ_BATCH_SIZE[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">READ_BATCH_SIZE[31:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/accum_main/addrb">
|
||||||
|
<obj_property name="ElementShortName">addrb[15:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">addrb[15:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/accum_main/wr_state">
|
||||||
|
<obj_property name="ElementShortName">wr_state[3:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_state[3:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="group" fp_name="group27">
|
||||||
|
<obj_property name="label">fifo</obj_property>
|
||||||
|
<obj_property name="DisplayName">label</obj_property>
|
||||||
|
<obj_property name="isExpanded"></obj_property>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/acc_din">
|
||||||
|
<obj_property name="ElementShortName">acc_din[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">acc_din[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FF0080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/din_valid">
|
||||||
|
<obj_property name="ElementShortName">din_valid</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">din_valid</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FF0080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/batch_req">
|
||||||
|
<obj_property name="ElementShortName">batch_req</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">batch_req</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_state">
|
||||||
|
<obj_property name="ElementShortName">wr_state[2:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_state[2:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/rd_state">
|
||||||
|
<obj_property name="ElementShortName">rd_state[2:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rd_state[2:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_unavail">
|
||||||
|
<obj_property name="ElementShortName">wr_unavail</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_unavail</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFFF00</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/wr_rst_busy">
|
||||||
|
<obj_property name="ElementShortName">wr_rst_busy</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_rst_busy</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFFF00</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/empty">
|
||||||
|
<obj_property name="ElementShortName">empty</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">empty</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/PROG_FULL_THRESH">
|
||||||
|
<obj_property name="ElementShortName">PROG_FULL_THRESH[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">PROG_FULL_THRESH[31:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/wr_data_count">
|
||||||
|
<obj_property name="ElementShortName">wr_data_count[9:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_data_count[9:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_accumulator_top/dut/output_async_fifo/xpm_fifo_async_inst/rd_data_count">
|
||||||
|
<obj_property name="ElementShortName">rd_data_count[11:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rd_data_count[11:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
</wvobject>
|
||||||
|
</wave_config>
|
||||||
196
rtl/accum/tests/tb_out_axis_fifo_behav.wcfg
Normal file
196
rtl/accum/tests/tb_out_axis_fifo_behav.wcfg
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<wave_config>
|
||||||
|
<wave_state>
|
||||||
|
</wave_state>
|
||||||
|
<db_ref_list>
|
||||||
|
<db_ref path="tb_out_axis_fifo_behav.wdb" id="1">
|
||||||
|
<top_modules>
|
||||||
|
<top_module name="glbl" />
|
||||||
|
<top_module name="tb_out_axis_fifo" />
|
||||||
|
</top_modules>
|
||||||
|
</db_ref>
|
||||||
|
</db_ref_list>
|
||||||
|
<zoom_setting>
|
||||||
|
<ZoomStartTime time="18,433.000 ns"></ZoomStartTime>
|
||||||
|
<ZoomEndTime time="24,238.001 ns"></ZoomEndTime>
|
||||||
|
<Cursor1Time time="21,618.000 ns"></Cursor1Time>
|
||||||
|
</zoom_setting>
|
||||||
|
<column_width_setting>
|
||||||
|
<NameColumnWidth column_width="196"></NameColumnWidth>
|
||||||
|
<ValueColumnWidth column_width="147"></ValueColumnWidth>
|
||||||
|
</column_width_setting>
|
||||||
|
<WVObjectSize size="37" />
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/eth_clk_in">
|
||||||
|
<obj_property name="ElementShortName">eth_clk_in</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">eth_clk_in</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/acc_clk_in">
|
||||||
|
<obj_property name="ElementShortName">acc_clk_in</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">acc_clk_in</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/rst">
|
||||||
|
<obj_property name="ElementShortName">rst</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rst</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/smp_num">
|
||||||
|
<obj_property name="ElementShortName">smp_num[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">smp_num[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/acc_din">
|
||||||
|
<obj_property name="ElementShortName">acc_din[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">acc_din[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FF0080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/din_valid">
|
||||||
|
<obj_property name="ElementShortName">din_valid</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">din_valid</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FF0080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/fifo_din_r">
|
||||||
|
<obj_property name="ElementShortName">fifo_din_r[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">fifo_din_r[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/fifo_wr_en_r">
|
||||||
|
<obj_property name="ElementShortName">fifo_wr_en_r</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">fifo_wr_en_r</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/readout_begin">
|
||||||
|
<obj_property name="ElementShortName">readout_begin</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">readout_begin</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFFF00</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/batch_req">
|
||||||
|
<obj_property name="ElementShortName">batch_req</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">batch_req</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/finish">
|
||||||
|
<obj_property name="ElementShortName">finish</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">finish</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#00FFFF</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/m_axis_tdata">
|
||||||
|
<obj_property name="ElementShortName">m_axis_tdata[7:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">m_axis_tdata[7:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/m_axis_tvalid">
|
||||||
|
<obj_property name="ElementShortName">m_axis_tvalid</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">m_axis_tvalid</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/m_axis_tready">
|
||||||
|
<obj_property name="ElementShortName">m_axis_tready</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">m_axis_tready</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/m_axis_tlast">
|
||||||
|
<obj_property name="ElementShortName">m_axis_tlast</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">m_axis_tlast</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/axis_byte_count">
|
||||||
|
<obj_property name="ElementShortName">axis_byte_count[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">axis_byte_count[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/ACCUM_WIDTH">
|
||||||
|
<obj_property name="ElementShortName">ACCUM_WIDTH[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">ACCUM_WIDTH[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/WINDOW_SIZE">
|
||||||
|
<obj_property name="ElementShortName">WINDOW_SIZE[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">WINDOW_SIZE[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/PACKET_SIZE">
|
||||||
|
<obj_property name="ElementShortName">PACKET_SIZE[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">PACKET_SIZE[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/wr_state">
|
||||||
|
<obj_property name="ElementShortName">wr_state[2:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_state[2:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/wr_cnt">
|
||||||
|
<obj_property name="ElementShortName">wr_cnt[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_cnt[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/wr_batch_tgt">
|
||||||
|
<obj_property name="ElementShortName">wr_batch_tgt[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_batch_tgt[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/wr_total">
|
||||||
|
<obj_property name="ElementShortName">wr_total[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_total[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/xpm_fifo_async_inst/prog_empty">
|
||||||
|
<obj_property name="ElementShortName">prog_empty</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">prog_empty</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/xpm_fifo_async_inst/prog_full">
|
||||||
|
<obj_property name="ElementShortName">prog_full</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">prog_full</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/xpm_fifo_async_inst/wr_ack">
|
||||||
|
<obj_property name="ElementShortName">wr_ack</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_ack</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/xpm_fifo_async_inst/wr_data_count">
|
||||||
|
<obj_property name="ElementShortName">wr_data_count[2:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_data_count[2:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/xpm_fifo_async_inst/wr_data_count">
|
||||||
|
<obj_property name="ElementShortName">wr_data_count[2:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_data_count[2:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/xpm_fifo_async_inst/rd_data_count">
|
||||||
|
<obj_property name="ElementShortName">rd_data_count[4:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rd_data_count[4:0]</obj_property>
|
||||||
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/rst_sync_ff">
|
||||||
|
<obj_property name="ElementShortName">rst_sync_ff[1:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rst_sync_ff[1:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_out_axis_fifo/dut/rd_state">
|
||||||
|
<obj_property name="ElementShortName">rd_state[2:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rd_state[2:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/rd_en">
|
||||||
|
<obj_property name="ElementShortName">rd_en</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rd_en</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/rd_valid">
|
||||||
|
<obj_property name="ElementShortName">rd_valid</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rd_valid</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/xpm_fifo_async_inst/overflow">
|
||||||
|
<obj_property name="ElementShortName">overflow</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">overflow</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/dut/xpm_fifo_async_inst/wr_rst_busy">
|
||||||
|
<obj_property name="ElementShortName">wr_rst_busy</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">wr_rst_busy</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/send_req">
|
||||||
|
<obj_property name="ElementShortName">send_req</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">send_req</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_out_axis_fifo/req_ready">
|
||||||
|
<obj_property name="ElementShortName">req_ready</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">req_ready</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
</wave_config>
|
||||||
10
rtl/accum/tests/test_timing.xdc
Normal file
10
rtl/accum/tests/test_timing.xdc
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Primary clocks
|
||||||
|
create_clock -name eth_clk -period 8.000 [get_ports eth_clk_in]
|
||||||
|
create_clock -name acc_clk -period 15.385 [get_ports clk_in]
|
||||||
|
|
||||||
|
|
||||||
|
# Asynchronous clock groups
|
||||||
|
|
||||||
|
set_clock_groups -name ASYNC_ETH_ACC -asynchronous \
|
||||||
|
-group [get_clocks eth_clk] \
|
||||||
|
-group [get_clocks acc_clk]
|
||||||
@ -41,14 +41,15 @@
|
|||||||
|
|
||||||
*start* отправляет пульс start на dac_start и adc_start в их доменах. при этом после этого блок перестает быть ready и ждет, пока не придет пульс finish, после этого он возвращается снова в *idle* состояние
|
*start* отправляет пульс start на dac_start и adc_start в их доменах. при этом после этого блок перестает быть ready и ждет, пока не придет пульс finish, после этого он возвращается снова в *idle* состояние
|
||||||
|
|
||||||
*set_data* значит, что следующие 96 бит = 12*8 байт, пришедшии по axis - это конфигурационная информация и ее нужно записать в внутренний регистр на 96 бит.
|
*set_data* значит, что следующие 128 бит = 16*8 байт, пришедшии по axis - это конфигурационная информация и ее нужно записать в внутренний регистр на 128 бит.
|
||||||
|
|
||||||
конфигурационный регистр на 96 бит делится так:
|
конфигурационный регистр на 128 бит делится так:
|
||||||
```
|
```
|
||||||
reg[31:0] - pulse_width
|
reg[31:0] - pulse_width
|
||||||
reg[63:32] - pulse_period
|
reg[63:32] - pulse_period
|
||||||
reg[79:64] - pulse_num
|
reg[79:64] - pulse_num
|
||||||
reg[79+dac_data_width:80] - pulse_height
|
reg[79+dac_data_width:80] - pulse_height
|
||||||
|
reg[127:96] - pulse_period_adc
|
||||||
```
|
```
|
||||||
|
|
||||||
соотвественно эти записанные значения выставляются на соотвествующие выходные сигналы в доменах dac_clk и adc_clk. выходы обновляются каждый раз, когда происходит set_data, и сигналы сохраняют своё значение до следующего set_data.
|
соотвественно эти записанные значения выставляются на соотвествующие выходные сигналы в доменах dac_clk и adc_clk. выходы обновляются каждый раз, когда происходит set_data, и сигналы сохраняют своё значение до следующего set_data.
|
||||||
|
|||||||
@ -109,9 +109,11 @@ module control #(
|
|||||||
// [63:32] pulse_period
|
// [63:32] pulse_period
|
||||||
// [79:64] pulse_num
|
// [79:64] pulse_num
|
||||||
// [95:80] pulse_height_raw[15:0]
|
// [95:80] pulse_height_raw[15:0]
|
||||||
|
// [127:96] pulse_period_ADC
|
||||||
|
//
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
(* MARK_DEBUG="true" *) logic [95:0] cfg_bus_eth;
|
(* MARK_DEBUG="true" *) logic [127:0] cfg_bus_eth;
|
||||||
logic [95:0] cfg_shift_eth;
|
logic [127:0] cfg_shift_eth;
|
||||||
|
|
||||||
// ETH-domain parser and control
|
// ETH-domain parser and control
|
||||||
typedef enum logic [2:0] {
|
typedef enum logic [2:0] {
|
||||||
@ -278,10 +280,10 @@ module control #(
|
|||||||
// little endian packing
|
// little endian packing
|
||||||
cfg_shift_eth[cfg_byte_cnt*8 +: 8] <= s_axis_tdata;
|
cfg_shift_eth[cfg_byte_cnt*8 +: 8] <= s_axis_tdata;
|
||||||
|
|
||||||
if (cfg_byte_cnt == 4'd11) begin
|
if (cfg_byte_cnt == 4'd15) begin
|
||||||
// this must be the final payload byte
|
// this must be the final payload byte
|
||||||
if (s_axis_tlast) begin
|
if (s_axis_tlast) begin
|
||||||
cfg_bus_eth <= {s_axis_tdata, cfg_shift_eth[87:0]};
|
cfg_bus_eth <= {s_axis_tdata, cfg_shift_eth[119:0]};
|
||||||
cfg_req_toggle_dac_eth <= ~cfg_req_toggle_dac_eth;
|
cfg_req_toggle_dac_eth <= ~cfg_req_toggle_dac_eth;
|
||||||
cfg_req_toggle_adc_eth <= ~cfg_req_toggle_adc_eth;
|
cfg_req_toggle_adc_eth <= ~cfg_req_toggle_adc_eth;
|
||||||
cfg_wait_dac_ack <= 1'b1;
|
cfg_wait_dac_ack <= 1'b1;
|
||||||
@ -451,7 +453,7 @@ module control #(
|
|||||||
cfg_req_sync_adc_d <= cfg_req_sync_adc;
|
cfg_req_sync_adc_d <= cfg_req_sync_adc;
|
||||||
|
|
||||||
if (cfg_req_pulse_adc) begin
|
if (cfg_req_pulse_adc) begin
|
||||||
adc_pulse_period <= cfg_bus_eth[63:32];
|
adc_pulse_period <= cfg_bus_eth[127:96];
|
||||||
adc_pulse_num <= cfg_bus_eth[79:64];
|
adc_pulse_num <= cfg_bus_eth[79:64];
|
||||||
|
|
||||||
cfg_ack_toggle_adc <= ~cfg_ack_toggle_adc;
|
cfg_ack_toggle_adc <= ~cfg_ack_toggle_adc;
|
||||||
|
|||||||
@ -139,9 +139,10 @@ module tb_control;
|
|||||||
input logic [31:0] pulse_width,
|
input logic [31:0] pulse_width,
|
||||||
input logic [31:0] pulse_period,
|
input logic [31:0] pulse_period,
|
||||||
input logic [15:0] pulse_num,
|
input logic [15:0] pulse_num,
|
||||||
input logic [15:0] pulse_height_raw
|
input logic [15:0] pulse_height_raw,
|
||||||
|
input logic [31:0] pulse_period_adc
|
||||||
);
|
);
|
||||||
logic [95:0] payload;
|
logic [127:0] payload;
|
||||||
int i;
|
int i;
|
||||||
begin
|
begin
|
||||||
// little-endian payload layout:
|
// little-endian payload layout:
|
||||||
@ -149,12 +150,14 @@ module tb_control;
|
|||||||
// [63:32] pulse_period
|
// [63:32] pulse_period
|
||||||
// [79:64] pulse_num
|
// [79:64] pulse_num
|
||||||
// [95:80] pulse_height_raw
|
// [95:80] pulse_height_raw
|
||||||
payload = {pulse_height_raw, pulse_num, pulse_period, pulse_width};
|
// [127:96] pulse_period_ADC
|
||||||
|
|
||||||
|
payload = {pulse_period_adc, pulse_height_raw, pulse_num, pulse_period, pulse_width};
|
||||||
|
|
||||||
axis_send_byte(8'h88, 1'b0); // CMD_SET_DATA
|
axis_send_byte(8'h88, 1'b0); // CMD_SET_DATA
|
||||||
|
|
||||||
for (i = 0; i < 12; i++) begin
|
for (i = 0; i < 16; i++) begin
|
||||||
axis_send_byte(payload[i*8 +: 8], (i == 11));
|
axis_send_byte(payload[i*8 +: 8], (i == 15));
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
endtask
|
endtask
|
||||||
@ -219,6 +222,7 @@ module tb_control;
|
|||||||
input logic [31:0] exp_pulse_period,
|
input logic [31:0] exp_pulse_period,
|
||||||
input logic [15:0] exp_pulse_num,
|
input logic [15:0] exp_pulse_num,
|
||||||
input logic [15:0] exp_pulse_height_raw,
|
input logic [15:0] exp_pulse_height_raw,
|
||||||
|
input logic [31:0] exp_pulse_period_adc,
|
||||||
input int max_cycles = 200
|
input int max_cycles = 200
|
||||||
);
|
);
|
||||||
logic [DAC_DATA_WIDTH-1:0] exp_dac_height;
|
logic [DAC_DATA_WIDTH-1:0] exp_dac_height;
|
||||||
@ -232,7 +236,7 @@ module tb_control;
|
|||||||
(dac_pulse_period === exp_pulse_period) &&
|
(dac_pulse_period === exp_pulse_period) &&
|
||||||
(dac_pulse_num === exp_pulse_num ) &&
|
(dac_pulse_num === exp_pulse_num ) &&
|
||||||
(dac_pulse_height === exp_dac_height ) &&
|
(dac_pulse_height === exp_dac_height ) &&
|
||||||
(adc_pulse_period === exp_pulse_period) &&
|
(adc_pulse_period === exp_pulse_period_adc) &&
|
||||||
(adc_pulse_num === exp_pulse_num )) begin
|
(adc_pulse_num === exp_pulse_num )) begin
|
||||||
return;
|
return;
|
||||||
end
|
end
|
||||||
@ -252,6 +256,7 @@ module tb_control;
|
|||||||
logic [31:0] test_pulse_period;
|
logic [31:0] test_pulse_period;
|
||||||
logic [15:0] test_pulse_num;
|
logic [15:0] test_pulse_num;
|
||||||
logic [15:0] test_pulse_height_raw;
|
logic [15:0] test_pulse_height_raw;
|
||||||
|
logic [31:0] test_pulse_period_adc;
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
// defaults
|
// defaults
|
||||||
@ -265,6 +270,7 @@ module tb_control;
|
|||||||
test_pulse_period = 32'h55667788;
|
test_pulse_period = 32'h55667788;
|
||||||
test_pulse_num = 16'hA1B2;
|
test_pulse_num = 16'hA1B2;
|
||||||
test_pulse_height_raw = 16'h0CDE; // for DAC_DATA_WIDTH=12 => 12'hCDE
|
test_pulse_height_raw = 16'h0CDE; // for DAC_DATA_WIDTH=12 => 12'hCDE
|
||||||
|
test_pulse_period_adc = 32'h50607080;
|
||||||
|
|
||||||
repeat (10) @(posedge eth_clk_in);
|
repeat (10) @(posedge eth_clk_in);
|
||||||
rst_n = 1'b1;
|
rst_n = 1'b1;
|
||||||
@ -291,14 +297,16 @@ module tb_control;
|
|||||||
test_pulse_width,
|
test_pulse_width,
|
||||||
test_pulse_period,
|
test_pulse_period,
|
||||||
test_pulse_num,
|
test_pulse_num,
|
||||||
test_pulse_height_raw
|
test_pulse_height_raw,
|
||||||
|
test_pulse_period_adc
|
||||||
);
|
);
|
||||||
|
|
||||||
wait_cfg_applied(
|
wait_cfg_applied(
|
||||||
test_pulse_width,
|
test_pulse_width,
|
||||||
test_pulse_period,
|
test_pulse_period,
|
||||||
test_pulse_num,
|
test_pulse_num,
|
||||||
test_pulse_height_raw
|
test_pulse_height_raw,
|
||||||
|
test_pulse_period_adc
|
||||||
);
|
);
|
||||||
|
|
||||||
if (dac_pulse_width !== 32'h11223344) begin
|
if (dac_pulse_width !== 32'h11223344) begin
|
||||||
@ -313,8 +321,8 @@ module tb_control;
|
|||||||
if (dac_pulse_height !== 12'hCDE) begin
|
if (dac_pulse_height !== 12'hCDE) begin
|
||||||
$fatal(1, "dac_pulse_height mismatch: got %h expected %h", dac_pulse_height, 12'hCDE);
|
$fatal(1, "dac_pulse_height mismatch: got %h expected %h", dac_pulse_height, 12'hCDE);
|
||||||
end
|
end
|
||||||
if (adc_pulse_period !== 32'h55667788) begin
|
if (adc_pulse_period !== 32'h50607080) begin
|
||||||
$fatal(1, "adc_pulse_period mismatch: got %h expected %h", adc_pulse_period, 32'h55667788);
|
$fatal(1, "adc_pulse_period mismatch: got %h expected %h", adc_pulse_period, 32'h50607080);
|
||||||
end
|
end
|
||||||
if (adc_pulse_num !== 16'hA1B2) begin
|
if (adc_pulse_num !== 16'hA1B2) begin
|
||||||
$fatal(1, "adc_pulse_num mismatch: got %h expected %h", adc_pulse_num, 16'hA1B2);
|
$fatal(1, "adc_pulse_num mismatch: got %h expected %h", adc_pulse_num, 16'hA1B2);
|
||||||
|
|||||||
197
rtl/controller/tests/tb_control_behav.wcfg
Normal file
197
rtl/controller/tests/tb_control_behav.wcfg
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<wave_config>
|
||||||
|
<wave_state>
|
||||||
|
</wave_state>
|
||||||
|
<db_ref_list>
|
||||||
|
<db_ref path="tb_control_behav.wdb" id="1">
|
||||||
|
<top_modules>
|
||||||
|
<top_module name="glbl" />
|
||||||
|
<top_module name="tb_control" />
|
||||||
|
</top_modules>
|
||||||
|
</db_ref>
|
||||||
|
</db_ref_list>
|
||||||
|
<zoom_setting>
|
||||||
|
<ZoomStartTime time="0.676 ns"></ZoomStartTime>
|
||||||
|
<ZoomEndTime time="645.677 ns"></ZoomEndTime>
|
||||||
|
<Cursor1Time time="349.676 ns"></Cursor1Time>
|
||||||
|
</zoom_setting>
|
||||||
|
<column_width_setting>
|
||||||
|
<NameColumnWidth column_width="558"></NameColumnWidth>
|
||||||
|
<ValueColumnWidth column_width="61"></ValueColumnWidth>
|
||||||
|
</column_width_setting>
|
||||||
|
<WVObjectSize size="23" />
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/eth_clk_in">
|
||||||
|
<obj_property name="ElementShortName">eth_clk_in</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">eth_clk_in</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#008080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/dac_clk_in">
|
||||||
|
<obj_property name="ElementShortName">dac_clk_in</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_clk_in</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/adc_clk_in">
|
||||||
|
<obj_property name="ElementShortName">adc_clk_in</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">adc_clk_in</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/rst_n">
|
||||||
|
<obj_property name="ElementShortName">rst_n</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">rst_n</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#800080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/s_axis_tdata">
|
||||||
|
<obj_property name="ElementShortName">s_axis_tdata[7:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_axis_tdata[7:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#008080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
<obj_property name="Radix">BINARYRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/s_axis_tvalid">
|
||||||
|
<obj_property name="ElementShortName">s_axis_tvalid</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_axis_tvalid</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#008080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/s_axis_tready">
|
||||||
|
<obj_property name="ElementShortName">s_axis_tready</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_axis_tready</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#008080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/s_axis_tlast">
|
||||||
|
<obj_property name="ElementShortName">s_axis_tlast</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_axis_tlast</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#008080</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/finish">
|
||||||
|
<obj_property name="ElementShortName">finish</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">finish</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FAAFBE</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/dac_pulse_width">
|
||||||
|
<obj_property name="ElementShortName">dac_pulse_width[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_pulse_width[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/dac_pulse_period">
|
||||||
|
<obj_property name="ElementShortName">dac_pulse_period[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_pulse_period[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/dac_pulse_height">
|
||||||
|
<obj_property name="ElementShortName">dac_pulse_height[11:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_pulse_height[11:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/dac_pulse_num">
|
||||||
|
<obj_property name="ElementShortName">dac_pulse_num[15:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_pulse_num[15:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/adc_pulse_period">
|
||||||
|
<obj_property name="ElementShortName">adc_pulse_period[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">adc_pulse_period[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/adc_pulse_num">
|
||||||
|
<obj_property name="ElementShortName">adc_pulse_num[15:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">adc_pulse_num[15:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/dac_start">
|
||||||
|
<obj_property name="ElementShortName">dac_start</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_start</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/adc_start">
|
||||||
|
<obj_property name="ElementShortName">adc_start</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">adc_start</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/dac_rst">
|
||||||
|
<obj_property name="ElementShortName">dac_rst</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_rst</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#FFA500</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/adc_rst">
|
||||||
|
<obj_property name="ElementShortName">adc_rst</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">adc_rst</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="group" fp_name="group499">
|
||||||
|
<obj_property name="label">tb signals</obj_property>
|
||||||
|
<obj_property name="DisplayName">label</obj_property>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/dac_rst_count">
|
||||||
|
<obj_property name="ElementShortName">dac_rst_count[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_rst_count[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/adc_rst_count">
|
||||||
|
<obj_property name="ElementShortName">adc_rst_count[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">adc_rst_count[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/dac_start_count">
|
||||||
|
<obj_property name="ElementShortName">dac_start_count[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">dac_start_count[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/adc_start_count">
|
||||||
|
<obj_property name="ElementShortName">adc_start_count[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">adc_start_count[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/test_pulse_width">
|
||||||
|
<obj_property name="ElementShortName">test_pulse_width[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">test_pulse_width[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/test_pulse_period">
|
||||||
|
<obj_property name="ElementShortName">test_pulse_period[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">test_pulse_period[31:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/test_pulse_num">
|
||||||
|
<obj_property name="ElementShortName">test_pulse_num[15:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">test_pulse_num[15:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/test_pulse_height_raw">
|
||||||
|
<obj_property name="ElementShortName">test_pulse_height_raw[15:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">test_pulse_height_raw[15:0]</obj_property>
|
||||||
|
<obj_property name="CustomSignalColor">#F0E68C</obj_property>
|
||||||
|
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="array" fp_name="/tb_control/DAC_DATA_WIDTH">
|
||||||
|
<obj_property name="ElementShortName">DAC_DATA_WIDTH[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">DAC_DATA_WIDTH[31:0]</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/dut/cfg_ack_toggle_adc">
|
||||||
|
<obj_property name="ElementShortName">cfg_ack_toggle_adc</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">cfg_ack_toggle_adc</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject type="logic" fp_name="/tb_control/dut/cfg_ack_toggle_dac">
|
||||||
|
<obj_property name="ElementShortName">cfg_ack_toggle_dac</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">cfg_ack_toggle_dac</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
</wave_config>
|
||||||
@ -283,6 +283,8 @@ module axis_mac
|
|||||||
reg [31:0] arp_delay;
|
reg [31:0] arp_delay;
|
||||||
reg arp_cached;
|
reg arp_cached;
|
||||||
|
|
||||||
|
reg write_en_flag;
|
||||||
|
|
||||||
always @(posedge gmii_tx_clk or negedge rst_n) begin
|
always @(posedge gmii_tx_clk or negedge rst_n) begin
|
||||||
if (!rst_n) begin
|
if (!rst_n) begin
|
||||||
tx_state <= TX_IDLE;
|
tx_state <= TX_IDLE;
|
||||||
@ -293,8 +295,8 @@ module axis_mac
|
|||||||
udp_send_data_length <= 16'd0;
|
udp_send_data_length <= 16'd0;
|
||||||
udp_tx_req <= 1'b0;
|
udp_tx_req <= 1'b0;
|
||||||
arp_delay <= 32'b0;
|
arp_delay <= 32'b0;
|
||||||
|
write_en_flag <= 1'b0;
|
||||||
|
|
||||||
s_axis_tx_tready <= 1'b0;
|
|
||||||
req_ready <= 1'b0;
|
req_ready <= 1'b0;
|
||||||
|
|
||||||
tx_req_len <= 16'd0;
|
tx_req_len <= 16'd0;
|
||||||
@ -309,8 +311,8 @@ module axis_mac
|
|||||||
case (tx_state)
|
case (tx_state)
|
||||||
// Ready to accept a new packet request
|
// Ready to accept a new packet request
|
||||||
TX_IDLE: begin
|
TX_IDLE: begin
|
||||||
|
write_en_flag <= 1'b0;
|
||||||
udp_tx_req <= 1'b0;
|
udp_tx_req <= 1'b0;
|
||||||
s_axis_tx_tready <= 1'b0;
|
|
||||||
tx_bytes_written <= 16'd0;
|
tx_bytes_written <= 16'd0;
|
||||||
tx_req_inflight <= 1'b0;
|
tx_req_inflight <= 1'b0;
|
||||||
|
|
||||||
@ -340,7 +342,6 @@ module axis_mac
|
|||||||
// Pulse ARP request
|
// Pulse ARP request
|
||||||
TX_ARP_REQ: begin
|
TX_ARP_REQ: begin
|
||||||
req_ready <= 1'b0;
|
req_ready <= 1'b0;
|
||||||
s_axis_tx_tready <= 1'b0;
|
|
||||||
udp_tx_req <= 1'b0;
|
udp_tx_req <= 1'b0;
|
||||||
|
|
||||||
arp_delay <= 32'ha000000;
|
arp_delay <= 32'ha000000;
|
||||||
@ -350,7 +351,6 @@ module axis_mac
|
|||||||
// Wait until ARP is resolved
|
// Wait until ARP is resolved
|
||||||
TX_ARP_SEND: begin
|
TX_ARP_SEND: begin
|
||||||
req_ready <= 1'b0;
|
req_ready <= 1'b0;
|
||||||
s_axis_tx_tready <= 1'b0;
|
|
||||||
udp_tx_req <= 1'b0;
|
udp_tx_req <= 1'b0;
|
||||||
|
|
||||||
// sent
|
// sent
|
||||||
@ -383,7 +383,7 @@ module axis_mac
|
|||||||
|
|
||||||
if (udp_ram_data_req) begin
|
if (udp_ram_data_req) begin
|
||||||
udp_tx_req <= 1'b0;
|
udp_tx_req <= 1'b0;
|
||||||
s_axis_tx_tready <= 1'b1;
|
write_en_flag <= 1'b1;
|
||||||
tx_state <= TX_STREAM;
|
tx_state <= TX_STREAM;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -394,7 +394,6 @@ module axis_mac
|
|||||||
udp_tx_req <= 1'b0;
|
udp_tx_req <= 1'b0;
|
||||||
|
|
||||||
// keep ready high while receiving payload bytes
|
// keep ready high while receiving payload bytes
|
||||||
s_axis_tx_tready <= (tx_bytes_written < tx_req_len);
|
|
||||||
|
|
||||||
if (s_axis_tx_tvalid && s_axis_tx_tready) begin
|
if (s_axis_tx_tvalid && s_axis_tx_tready) begin
|
||||||
tx_ram_wr_data <= s_axis_tx_tdata;
|
tx_ram_wr_data <= s_axis_tx_tdata;
|
||||||
@ -403,7 +402,6 @@ module axis_mac
|
|||||||
tx_bytes_written <= tx_bytes_written + 1'b1;
|
tx_bytes_written <= tx_bytes_written + 1'b1;
|
||||||
|
|
||||||
if (tx_bytes_written + 1'b1 >= tx_req_len) begin
|
if (tx_bytes_written + 1'b1 >= tx_req_len) begin
|
||||||
s_axis_tx_tready <= 1'b0;
|
|
||||||
tx_state <= TX_WAIT_DRAIN;
|
tx_state <= TX_WAIT_DRAIN;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -413,7 +411,8 @@ module axis_mac
|
|||||||
// Wait until TX RAM starts draining enough to allow
|
// Wait until TX RAM starts draining enough to allow
|
||||||
// the next request.
|
// the next request.
|
||||||
TX_WAIT_DRAIN: begin
|
TX_WAIT_DRAIN: begin
|
||||||
s_axis_tx_tready <= 1'b0;
|
// s_axis_tx_tready <= 1'b0;
|
||||||
|
write_en_flag <= 1'b0;
|
||||||
udp_tx_req <= 1'b0;
|
udp_tx_req <= 1'b0;
|
||||||
|
|
||||||
if (udp_ram_data_count <= tx_release_threshold)
|
if (udp_ram_data_count <= tx_release_threshold)
|
||||||
@ -425,11 +424,13 @@ module axis_mac
|
|||||||
tx_state <= TX_IDLE;
|
tx_state <= TX_IDLE;
|
||||||
tx_ram_wr_en <= 1'b0;
|
tx_ram_wr_en <= 1'b0;
|
||||||
udp_tx_req <= 1'b0;
|
udp_tx_req <= 1'b0;
|
||||||
s_axis_tx_tready <= 1'b0;
|
|
||||||
req_ready <= 1'b0;
|
req_ready <= 1'b0;
|
||||||
|
write_en_flag <= 1'b0;
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assign s_axis_tx_tready = write_en_flag || udp_ram_data_req;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
@ -4,7 +4,7 @@
|
|||||||
//Description :
|
//Description :
|
||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
`define TEST_SPEED
|
//`define TEST_SPEED
|
||||||
`timescale 1 ns/1 ns
|
`timescale 1 ns/1 ns
|
||||||
module mac_test
|
module mac_test
|
||||||
(
|
(
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# FPGA settings
|
# FPGA settings
|
||||||
FPGA_PART = xc7a35tfgg484-1
|
FPGA_PART = xc7a100tfgg484-2
|
||||||
FPGA_TOP = ethernet_axis_echo
|
FPGA_TOP = ethernet_axis_echo
|
||||||
FPGA_ARCH = artix7
|
FPGA_ARCH = artix7
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ SYN_FILES += $(sort $(shell find ../../src -type f \( -name '*.v' -o -name '*.sv
|
|||||||
XCI_FILES = $(sort $(shell find ../../src -type f -name '*.xci'))
|
XCI_FILES = $(sort $(shell find ../../src -type f -name '*.xci'))
|
||||||
|
|
||||||
XDC_FILES += debug.xdc
|
XDC_FILES += debug.xdc
|
||||||
XDC_FILES += ../../../../constraints/ax7a035b.xdc
|
XDC_FILES += ../../../../constraints/ax7102.xdc
|
||||||
|
|
||||||
SIM_TOP = tb_mac_test
|
SIM_TOP = tb_mac_test
|
||||||
TB_FILES = test_axis_mac_rx.sv
|
TB_FILES = test_axis_mac_rx.sv
|
||||||
|
|||||||
@ -1,5 +1,36 @@
|
|||||||
# debug ila
|
# debug ila
|
||||||
|
|
||||||
|
connect_debug_port u_ila_0/clk [get_nets [list rgmii_rxc_IBUF_BUFG]]
|
||||||
|
connect_debug_port u_ila_0/probe9 [get_nets [list {axis_mac0/udp_rec_data_length[0]} {axis_mac0/udp_rec_data_length[1]} {axis_mac0/udp_rec_data_length[2]} {axis_mac0/udp_rec_data_length[3]} {axis_mac0/udp_rec_data_length[4]} {axis_mac0/udp_rec_data_length[5]} {axis_mac0/udp_rec_data_length[6]} {axis_mac0/udp_rec_data_length[7]} {axis_mac0/udp_rec_data_length[8]} {axis_mac0/udp_rec_data_length[9]} {axis_mac0/udp_rec_data_length[10]} {axis_mac0/udp_rec_data_length[11]} {axis_mac0/udp_rec_data_length[12]} {axis_mac0/udp_rec_data_length[13]} {axis_mac0/udp_rec_data_length[14]} {axis_mac0/udp_rec_data_length[15]}]]
|
||||||
|
connect_debug_port dbg_hub/clk [get_nets rgmii_rxc_IBUF_BUFG]
|
||||||
|
|
||||||
|
connect_debug_port u_ila_0/probe22 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[0]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[1]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[2]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[3]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[4]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[5]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[6]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[7]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[8]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[9]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[10]}]]
|
||||||
|
connect_debug_port u_ila_0/probe23 [get_nets [list {mac_test0/mac_top0/mac_rx0/mac_rx_datain[0]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[1]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[2]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[3]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[4]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[5]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[6]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[7]}]]
|
||||||
|
connect_debug_port u_ila_0/probe24 [get_nets [list {mac_test0/mac_top0/mac_rx0/ip_total_data_length[0]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[1]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[2]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[3]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[4]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[5]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[6]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[7]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[8]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[9]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[10]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[11]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[12]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[13]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[14]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[15]}]]
|
||||||
|
connect_debug_port u_ila_0/probe25 [get_nets [list {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[0]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[1]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[2]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[3]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[4]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[5]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[6]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[7]}]]
|
||||||
|
connect_debug_port u_ila_0/probe26 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[7]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[8]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[9]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[10]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[11]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[12]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[13]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[14]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[15]}]]
|
||||||
|
connect_debug_port u_ila_0/probe27 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[7]}]]
|
||||||
|
connect_debug_port u_ila_0/probe28 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[7]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[8]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[9]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[10]}]]
|
||||||
|
connect_debug_port u_ila_0/probe29 [get_nets [list {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[0]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[1]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[2]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[3]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[4]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[5]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[6]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[7]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[8]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[9]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[10]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[11]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[12]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[13]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[14]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[15]}]]
|
||||||
|
connect_debug_port u_ila_0/probe30 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/ck_state[0]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[1]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[2]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[3]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[4]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[5]}]]
|
||||||
|
connect_debug_port u_ila_0/probe31 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/state[0]} {mac_test0/mac_top0/mac_tx0/udp0/state[1]} {mac_test0/mac_top0/mac_tx0/udp0/state[2]} {mac_test0/mac_top0/mac_tx0/udp0/state[3]} {mac_test0/mac_top0/mac_tx0/udp0/state[4]} {mac_test0/mac_top0/mac_tx0/udp0/state[5]}]]
|
||||||
|
connect_debug_port u_ila_0/probe32 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/usedw[0]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[1]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[2]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[3]}]]
|
||||||
|
connect_debug_port u_ila_0/probe33 [get_nets [list {mac_test0/mac_top0/mac_tx0/mac_tx_data[0]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[1]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[2]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[3]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[4]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[5]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[6]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[7]}]]
|
||||||
|
connect_debug_port u_ila_0/probe34 [get_nets [list {mac_test0/mac_top0/mac_tx0/ram_wr_data[0]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[1]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[2]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[3]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[4]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[5]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[6]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[7]}]]
|
||||||
|
connect_debug_port u_ila_0/probe35 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[0]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[1]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[2]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[3]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[4]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[5]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[6]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[7]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[8]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[9]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[10]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[11]}]]
|
||||||
|
connect_debug_port u_ila_0/probe36 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp_send_data_length[0]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[1]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[2]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[3]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[4]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[5]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[6]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[7]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[8]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[9]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[10]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[11]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[12]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[13]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[14]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[15]}]]
|
||||||
|
connect_debug_port u_ila_0/probe37 [get_nets [list {mac_test0/state[0]} {mac_test0/state[1]} {mac_test0/state[2]} {mac_test0/state[3]} {mac_test0/state[4]} {mac_test0/state[5]} {mac_test0/state[6]} {mac_test0/state[7]} {mac_test0/state[8]}]]
|
||||||
|
connect_debug_port u_ila_0/probe39 [get_nets [list mac_test0/mac_top0/mac_tx0/almost_full]]
|
||||||
|
connect_debug_port u_ila_0/probe45 [get_nets [list mac_test0/mac_top0/mac_tx0/mac_data_valid]]
|
||||||
|
connect_debug_port u_ila_0/probe47 [get_nets [list mac_test0/mac_top0/mac_tx0/mac_send_end]]
|
||||||
|
connect_debug_port u_ila_0/probe48 [get_nets [list mac_test0/mac_top0/mac_tx0/ram_wr_en]]
|
||||||
|
connect_debug_port u_ila_0/probe50 [get_nets [list mac_test0/mac_top0/mac_rx0/udp0/ram_wr_en]]
|
||||||
|
connect_debug_port u_ila_0/probe59 [get_nets [list mac_test0/mac_top0/mac_tx0/udp_ram_data_req]]
|
||||||
|
connect_debug_port u_ila_0/probe62 [get_nets [list mac_test0/mac_top0/mac_rx0/udp_rec_data_valid]]
|
||||||
|
connect_debug_port u_ila_0/probe64 [get_nets [list mac_test0/mac_top0/mac_tx0/udp_tx_end]]
|
||||||
|
connect_debug_port u_ila_0/probe66 [get_nets [list mac_test0/mac_top0/mac_tx0/udp_tx_req]]
|
||||||
|
connect_debug_port u_ila_0/probe68 [get_nets [list mac_test0/mac_top0/mac_tx0/upper_data_req]]
|
||||||
|
|
||||||
create_debug_core u_ila_0 ila
|
create_debug_core u_ila_0 ila
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
||||||
@ -10,251 +41,179 @@ set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
|
|||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/clk]
|
set_property port_width 1 [get_debug_ports u_ila_0/clk]
|
||||||
connect_debug_port u_ila_0/clk [get_nets [list rgmii_rxc_IBUF_BUFG]]
|
connect_debug_port u_ila_0/clk [get_nets [list e_gtxc_OBUF_BUFG]]
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe0]
|
set_property port_width 6 [get_debug_ports u_ila_0/probe0]
|
||||||
connect_debug_port u_ila_0/probe0 [get_nets [list {arbi_inst/rx_buffer_inst/e10_100_rxd[0]} {arbi_inst/rx_buffer_inst/e10_100_rxd[1]} {arbi_inst/rx_buffer_inst/e10_100_rxd[2]} {arbi_inst/rx_buffer_inst/e10_100_rxd[3]} {arbi_inst/rx_buffer_inst/e10_100_rxd[4]} {arbi_inst/rx_buffer_inst/e10_100_rxd[5]} {arbi_inst/rx_buffer_inst/e10_100_rxd[6]} {arbi_inst/rx_buffer_inst/e10_100_rxd[7]}]]
|
connect_debug_port u_ila_0/probe0 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp0/state[0]} {axis_mac0/mac_top0/mac_tx0/udp0/state[1]} {axis_mac0/mac_top0/mac_tx0/udp0/state[2]} {axis_mac0/mac_top0/mac_tx0/udp0/state[3]} {axis_mac0/mac_top0/mac_tx0/udp0/state[4]} {axis_mac0/mac_top0/mac_tx0/udp0/state[5]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe1]
|
set_property port_width 6 [get_debug_ports u_ila_0/probe1]
|
||||||
connect_debug_port u_ila_0/probe1 [get_nets [list {arbi_inst/gmii_rxd[0]} {arbi_inst/gmii_rxd[1]} {arbi_inst/gmii_rxd[2]} {arbi_inst/gmii_rxd[3]} {arbi_inst/gmii_rxd[4]} {arbi_inst/gmii_rxd[5]} {arbi_inst/gmii_rxd[6]} {arbi_inst/gmii_rxd[7]}]]
|
connect_debug_port u_ila_0/probe1 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[0]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[1]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[2]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[3]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[4]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[5]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe2]
|
set_property port_width 4 [get_debug_ports u_ila_0/probe2]
|
||||||
connect_debug_port u_ila_0/probe2 [get_nets [list {arbi_inst/gmii_txd[0]} {arbi_inst/gmii_txd[1]} {arbi_inst/gmii_txd[2]} {arbi_inst/gmii_txd[3]} {arbi_inst/gmii_txd[4]} {arbi_inst/gmii_txd[5]} {arbi_inst/gmii_txd[6]} {arbi_inst/gmii_txd[7]}]]
|
connect_debug_port u_ila_0/probe2 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp0/usedw[0]} {axis_mac0/mac_top0/mac_tx0/udp0/usedw[1]} {axis_mac0/mac_top0/mac_tx0/udp0/usedw[2]} {axis_mac0/mac_top0/mac_tx0/udp0/usedw[3]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe3]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe3]
|
||||||
connect_debug_port u_ila_0/probe3 [get_nets [list {arbi_inst/e_txd[0]} {arbi_inst/e_txd[1]} {arbi_inst/e_txd[2]} {arbi_inst/e_txd[3]} {arbi_inst/e_txd[4]} {arbi_inst/e_txd[5]} {arbi_inst/e_txd[6]} {arbi_inst/e_txd[7]}]]
|
connect_debug_port u_ila_0/probe3 [get_nets [list {axis_mac0/s_axis_tx_tdata[0]} {axis_mac0/s_axis_tx_tdata[1]} {axis_mac0/s_axis_tx_tdata[2]} {axis_mac0/s_axis_tx_tdata[3]} {axis_mac0/s_axis_tx_tdata[4]} {axis_mac0/s_axis_tx_tdata[5]} {axis_mac0/s_axis_tx_tdata[6]} {axis_mac0/s_axis_tx_tdata[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe4]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe4]
|
||||||
connect_debug_port u_ila_0/probe4 [get_nets [list {arbi_inst/e_rxd[0]} {arbi_inst/e_rxd[1]} {arbi_inst/e_rxd[2]} {arbi_inst/e_rxd[3]} {arbi_inst/e_rxd[4]} {arbi_inst/e_rxd[5]} {arbi_inst/e_rxd[6]} {arbi_inst/e_rxd[7]}]]
|
connect_debug_port u_ila_0/probe4 [get_nets [list {axis_mac0/rx_payload_len[0]} {axis_mac0/rx_payload_len[1]} {axis_mac0/rx_payload_len[2]} {axis_mac0/rx_payload_len[3]} {axis_mac0/rx_payload_len[4]} {axis_mac0/rx_payload_len[5]} {axis_mac0/rx_payload_len[6]} {axis_mac0/rx_payload_len[7]} {axis_mac0/rx_payload_len[8]} {axis_mac0/rx_payload_len[9]} {axis_mac0/rx_payload_len[10]} {axis_mac0/rx_payload_len[11]} {axis_mac0/rx_payload_len[12]} {axis_mac0/rx_payload_len[13]} {axis_mac0/rx_payload_len[14]} {axis_mac0/rx_payload_len[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe5]
|
set_property port_width 2 [get_debug_ports u_ila_0/probe5]
|
||||||
connect_debug_port u_ila_0/probe5 [get_nets [list {arbi_inst/tx_buffer_inst/tx_data_cnt[0]} {arbi_inst/tx_buffer_inst/tx_data_cnt[1]} {arbi_inst/tx_buffer_inst/tx_data_cnt[2]} {arbi_inst/tx_buffer_inst/tx_data_cnt[3]} {arbi_inst/tx_buffer_inst/tx_data_cnt[4]} {arbi_inst/tx_buffer_inst/tx_data_cnt[5]} {arbi_inst/tx_buffer_inst/tx_data_cnt[6]} {arbi_inst/tx_buffer_inst/tx_data_cnt[7]} {arbi_inst/tx_buffer_inst/tx_data_cnt[8]} {arbi_inst/tx_buffer_inst/tx_data_cnt[9]} {arbi_inst/tx_buffer_inst/tx_data_cnt[10]} {arbi_inst/tx_buffer_inst/tx_data_cnt[11]} {arbi_inst/tx_buffer_inst/tx_data_cnt[12]} {arbi_inst/tx_buffer_inst/tx_data_cnt[13]} {arbi_inst/tx_buffer_inst/tx_data_cnt[14]} {arbi_inst/tx_buffer_inst/tx_data_cnt[15]}]]
|
connect_debug_port u_ila_0/probe5 [get_nets [list {axis_mac0/rx_state[0]} {axis_mac0/rx_state[1]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe6]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe6]
|
||||||
connect_debug_port u_ila_0/probe6 [get_nets [list {arbi_inst/tx_buffer_inst/tx_rdata[0]} {arbi_inst/tx_buffer_inst/tx_rdata[1]} {arbi_inst/tx_buffer_inst/tx_rdata[2]} {arbi_inst/tx_buffer_inst/tx_rdata[3]} {arbi_inst/tx_buffer_inst/tx_rdata[4]} {arbi_inst/tx_buffer_inst/tx_rdata[5]} {arbi_inst/tx_buffer_inst/tx_rdata[6]} {arbi_inst/tx_buffer_inst/tx_rdata[7]}]]
|
connect_debug_port u_ila_0/probe6 [get_nets [list {axis_mac0/m_axis_rx_tdata[0]} {axis_mac0/m_axis_rx_tdata[1]} {axis_mac0/m_axis_rx_tdata[2]} {axis_mac0/m_axis_rx_tdata[3]} {axis_mac0/m_axis_rx_tdata[4]} {axis_mac0/m_axis_rx_tdata[5]} {axis_mac0/m_axis_rx_tdata[6]} {axis_mac0/m_axis_rx_tdata[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe7]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe7]
|
||||||
connect_debug_port u_ila_0/probe7 [get_nets [list {arbi_inst/tx_buffer_inst/tx_wdata[0]} {arbi_inst/tx_buffer_inst/tx_wdata[1]} {arbi_inst/tx_buffer_inst/tx_wdata[2]} {arbi_inst/tx_buffer_inst/tx_wdata[3]} {arbi_inst/tx_buffer_inst/tx_wdata[4]} {arbi_inst/tx_buffer_inst/tx_wdata[5]} {arbi_inst/tx_buffer_inst/tx_wdata[6]} {arbi_inst/tx_buffer_inst/tx_wdata[7]}]]
|
connect_debug_port u_ila_0/probe7 [get_nets [list {axis_mac0/rx_index[0]} {axis_mac0/rx_index[1]} {axis_mac0/rx_index[2]} {axis_mac0/rx_index[3]} {axis_mac0/rx_index[4]} {axis_mac0/rx_index[5]} {axis_mac0/rx_index[6]} {axis_mac0/rx_index[7]} {axis_mac0/rx_index[8]} {axis_mac0/rx_index[9]} {axis_mac0/rx_index[10]} {axis_mac0/rx_index[11]} {axis_mac0/rx_index[12]} {axis_mac0/rx_index[13]} {axis_mac0/rx_index[14]} {axis_mac0/rx_index[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
|
||||||
set_property port_width 6 [get_debug_ports u_ila_0/probe8]
|
set_property port_width 3 [get_debug_ports u_ila_0/probe8]
|
||||||
connect_debug_port u_ila_0/probe8 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[0]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[1]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[2]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[3]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[4]} {axis_mac0/mac_top0/mac_tx0/udp0/ck_state[5]}]]
|
connect_debug_port u_ila_0/probe8 [get_nets [list {axis_mac0/tx_state[0]} {axis_mac0/tx_state[1]} {axis_mac0/tx_state[2]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe9]
|
set_property port_width 2 [get_debug_ports u_ila_0/probe9]
|
||||||
connect_debug_port u_ila_0/probe9 [get_nets [list {axis_mac0/udp_rec_data_length[0]} {axis_mac0/udp_rec_data_length[1]} {axis_mac0/udp_rec_data_length[2]} {axis_mac0/udp_rec_data_length[3]} {axis_mac0/udp_rec_data_length[4]} {axis_mac0/udp_rec_data_length[5]} {axis_mac0/udp_rec_data_length[6]} {axis_mac0/udp_rec_data_length[7]} {axis_mac0/udp_rec_data_length[8]} {axis_mac0/udp_rec_data_length[9]} {axis_mac0/udp_rec_data_length[10]} {axis_mac0/udp_rec_data_length[11]} {axis_mac0/udp_rec_data_length[12]} {axis_mac0/udp_rec_data_length[13]} {axis_mac0/udp_rec_data_length[14]} {axis_mac0/udp_rec_data_length[15]}]]
|
connect_debug_port u_ila_0/probe9 [get_nets [list {test_state[0]} {test_state[1]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
|
||||||
set_property port_width 3 [get_debug_ports u_ila_0/probe10]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe10]
|
||||||
connect_debug_port u_ila_0/probe10 [get_nets [list {axis_mac0/tx_state[0]} {axis_mac0/tx_state[1]} {axis_mac0/tx_state[2]}]]
|
connect_debug_port u_ila_0/probe10 [get_nets [list {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[0]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[1]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[2]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[3]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[4]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[5]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[6]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[7]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[8]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[9]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[10]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[11]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[12]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[13]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[14]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe11]
|
set_property port_width 11 [get_debug_ports u_ila_0/probe11]
|
||||||
connect_debug_port u_ila_0/probe11 [get_nets [list {axis_mac0/s_axis_tx_tdata[0]} {axis_mac0/s_axis_tx_tdata[1]} {axis_mac0/s_axis_tx_tdata[2]} {axis_mac0/s_axis_tx_tdata[3]} {axis_mac0/s_axis_tx_tdata[4]} {axis_mac0/s_axis_tx_tdata[5]} {axis_mac0/s_axis_tx_tdata[6]} {axis_mac0/s_axis_tx_tdata[7]}]]
|
connect_debug_port u_ila_0/probe11 [get_nets [list {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[0]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[1]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[2]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[3]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[4]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[5]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[6]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[7]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[8]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[9]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[10]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
|
||||||
set_property port_width 2 [get_debug_ports u_ila_0/probe12]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe12]
|
||||||
connect_debug_port u_ila_0/probe12 [get_nets [list {axis_mac0/rx_state[0]} {axis_mac0/rx_state[1]}]]
|
connect_debug_port u_ila_0/probe12 [get_nets [list {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[0]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[1]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[2]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[3]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[4]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[5]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[6]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe13]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe13]
|
||||||
connect_debug_port u_ila_0/probe13 [get_nets [list {axis_mac0/rx_payload_len[0]} {axis_mac0/rx_payload_len[1]} {axis_mac0/rx_payload_len[2]} {axis_mac0/rx_payload_len[3]} {axis_mac0/rx_payload_len[4]} {axis_mac0/rx_payload_len[5]} {axis_mac0/rx_payload_len[6]} {axis_mac0/rx_payload_len[7]} {axis_mac0/rx_payload_len[8]} {axis_mac0/rx_payload_len[9]} {axis_mac0/rx_payload_len[10]} {axis_mac0/rx_payload_len[11]} {axis_mac0/rx_payload_len[12]} {axis_mac0/rx_payload_len[13]} {axis_mac0/rx_payload_len[14]} {axis_mac0/rx_payload_len[15]}]]
|
connect_debug_port u_ila_0/probe13 [get_nets [list {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[0]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[1]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[2]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[3]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[4]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[5]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[6]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[7]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[8]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[9]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[10]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[11]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[12]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[13]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[14]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe14]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe14]
|
||||||
connect_debug_port u_ila_0/probe14 [get_nets [list {axis_mac0/rx_index[0]} {axis_mac0/rx_index[1]} {axis_mac0/rx_index[2]} {axis_mac0/rx_index[3]} {axis_mac0/rx_index[4]} {axis_mac0/rx_index[5]} {axis_mac0/rx_index[6]} {axis_mac0/rx_index[7]} {axis_mac0/rx_index[8]} {axis_mac0/rx_index[9]} {axis_mac0/rx_index[10]} {axis_mac0/rx_index[11]} {axis_mac0/rx_index[12]} {axis_mac0/rx_index[13]} {axis_mac0/rx_index[14]} {axis_mac0/rx_index[15]}]]
|
connect_debug_port u_ila_0/probe14 [get_nets [list {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[0]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[1]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[2]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[3]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[4]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[5]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[6]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe15]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe15]
|
||||||
connect_debug_port u_ila_0/probe15 [get_nets [list {axis_mac0/m_axis_rx_tdata[0]} {axis_mac0/m_axis_rx_tdata[1]} {axis_mac0/m_axis_rx_tdata[2]} {axis_mac0/m_axis_rx_tdata[3]} {axis_mac0/m_axis_rx_tdata[4]} {axis_mac0/m_axis_rx_tdata[5]} {axis_mac0/m_axis_rx_tdata[6]} {axis_mac0/m_axis_rx_tdata[7]}]]
|
connect_debug_port u_ila_0/probe15 [get_nets [list {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[0]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[1]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[2]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[3]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[4]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[5]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[6]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[7]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[8]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[9]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[10]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[11]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[12]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[13]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[14]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe16]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe16]
|
||||||
connect_debug_port u_ila_0/probe16 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[0]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[1]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[2]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[3]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[4]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[5]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[6]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[7]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[8]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[9]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[10]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[11]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[12]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[13]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[14]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[15]}]]
|
connect_debug_port u_ila_0/probe16 [get_nets [list {axis_mac0/mac_top0/mac_tx0/mac_tx_data[0]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[1]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[2]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[3]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[4]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[5]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[6]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17]
|
||||||
set_property port_width 12 [get_debug_ports u_ila_0/probe17]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe17]
|
||||||
connect_debug_port u_ila_0/probe17 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[0]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[1]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[2]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[3]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[4]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[5]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[6]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[7]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[8]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[9]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[10]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[11]}]]
|
connect_debug_port u_ila_0/probe17 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[0]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[1]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[2]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[3]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[4]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[5]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[6]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[7]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[8]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[9]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[10]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[11]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[12]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[13]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[14]} {axis_mac0/mac_top0/mac_tx0/udp_send_data_length[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe18]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe18]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe18]
|
set_property port_width 12 [get_debug_ports u_ila_0/probe18]
|
||||||
connect_debug_port u_ila_0/probe18 [get_nets [list {axis_mac0/mac_top0/mac_tx0/ram_wr_data[0]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[1]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[2]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[3]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[4]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[5]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[6]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[7]}]]
|
connect_debug_port u_ila_0/probe18 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[0]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[1]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[2]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[3]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[4]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[5]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[6]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[7]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[8]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[9]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[10]} {axis_mac0/mac_top0/mac_tx0/udp_ram_data_count[11]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe19]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe19]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe19]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe19]
|
||||||
connect_debug_port u_ila_0/probe19 [get_nets [list {axis_mac0/mac_top0/mac_tx0/mac_tx_data[0]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[1]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[2]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[3]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[4]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[5]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[6]} {axis_mac0/mac_top0/mac_tx0/mac_tx_data[7]}]]
|
connect_debug_port u_ila_0/probe19 [get_nets [list {axis_mac0/mac_top0/mac_tx0/ram_wr_data[0]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[1]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[2]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[3]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[4]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[5]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[6]} {axis_mac0/mac_top0/mac_tx0/ram_wr_data[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe20]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe20]
|
||||||
set_property port_width 4 [get_debug_ports u_ila_0/probe20]
|
set_property port_width 11 [get_debug_ports u_ila_0/probe20]
|
||||||
connect_debug_port u_ila_0/probe20 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp0/usedw[0]} {axis_mac0/mac_top0/mac_tx0/udp0/usedw[1]} {axis_mac0/mac_top0/mac_tx0/udp0/usedw[2]} {axis_mac0/mac_top0/mac_tx0/udp0/usedw[3]}]]
|
connect_debug_port u_ila_0/probe20 [get_nets [list {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[0]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[1]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[2]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[3]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[4]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[5]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[6]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[7]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[8]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[9]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[10]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe21]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe21]
|
||||||
set_property port_width 6 [get_debug_ports u_ila_0/probe21]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe21]
|
||||||
connect_debug_port u_ila_0/probe21 [get_nets [list {axis_mac0/mac_top0/mac_tx0/udp0/state[0]} {axis_mac0/mac_top0/mac_tx0/udp0/state[1]} {axis_mac0/mac_top0/mac_tx0/udp0/state[2]} {axis_mac0/mac_top0/mac_tx0/udp0/state[3]} {axis_mac0/mac_top0/mac_tx0/udp0/state[4]} {axis_mac0/mac_top0/mac_tx0/udp0/state[5]}]]
|
connect_debug_port u_ila_0/probe21 [get_nets [list {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[0]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[1]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[2]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[3]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[4]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[5]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[6]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe22]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe22]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe22]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe22]
|
||||||
connect_debug_port u_ila_0/probe22 [get_nets [list {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[0]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[1]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[2]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[3]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[4]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[5]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[6]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[7]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[8]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[9]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[10]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[11]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[12]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[13]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[14]} {axis_mac0/mac_top0/mac_rx0/upper_layer_data_length[15]}]]
|
connect_debug_port u_ila_0/probe22 [get_nets [list axis_mac0/mac_top0/mac_tx0/almost_full]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe23]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe23]
|
||||||
set_property port_width 11 [get_debug_ports u_ila_0/probe23]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe23]
|
||||||
connect_debug_port u_ila_0/probe23 [get_nets [list {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[0]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[1]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[2]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[3]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[4]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[5]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[6]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[7]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[8]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[9]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_read_addr[10]}]]
|
connect_debug_port u_ila_0/probe23 [get_nets [list axis_mac0/arp_found]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe24]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe24]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe24]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe24]
|
||||||
connect_debug_port u_ila_0/probe24 [get_nets [list {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[0]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[1]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[2]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[3]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[4]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[5]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[6]} {axis_mac0/mac_top0/mac_rx0/udp_rec_ram_rdata[7]}]]
|
connect_debug_port u_ila_0/probe24 [get_nets [list axis_mac0/m_axis_rx_tlast]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe25]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe25]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe25]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe25]
|
||||||
connect_debug_port u_ila_0/probe25 [get_nets [list {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[0]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[1]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[2]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[3]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[4]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[5]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[6]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[7]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[8]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[9]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[10]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[11]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[12]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[13]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[14]} {axis_mac0/mac_top0/mac_rx0/udp_rec_data_length[15]}]]
|
connect_debug_port u_ila_0/probe25 [get_nets [list axis_mac0/m_axis_rx_tready]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe26]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe26]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe26]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe26]
|
||||||
connect_debug_port u_ila_0/probe26 [get_nets [list {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[0]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[1]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[2]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[3]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[4]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[5]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[6]} {axis_mac0/mac_top0/mac_rx0/mac_rx_dataout[7]}]]
|
connect_debug_port u_ila_0/probe26 [get_nets [list axis_mac0/m_axis_rx_tvalid]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe27]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe27]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe27]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe27]
|
||||||
connect_debug_port u_ila_0/probe27 [get_nets [list {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[0]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[1]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[2]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[3]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[4]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[5]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[6]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[7]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[8]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[9]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[10]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[11]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[12]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[13]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[14]} {axis_mac0/mac_top0/mac_rx0/ip_total_data_length[15]}]]
|
connect_debug_port u_ila_0/probe27 [get_nets [list axis_mac0/mac_top0/mac_tx0/mac_data_valid]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe28]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe28]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe28]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe28]
|
||||||
connect_debug_port u_ila_0/probe28 [get_nets [list {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[0]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[1]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[2]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[3]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[4]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[5]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[6]} {axis_mac0/mac_top0/mac_rx0/mac_rx_datain[7]}]]
|
connect_debug_port u_ila_0/probe28 [get_nets [list axis_mac0/mac_top0/mac_tx0/mac_send_end]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe29]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe29]
|
||||||
set_property port_width 11 [get_debug_ports u_ila_0/probe29]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe29]
|
||||||
connect_debug_port u_ila_0/probe29 [get_nets [list {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[0]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[1]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[2]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[3]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[4]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[5]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[6]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[7]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[8]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[9]} {axis_mac0/mac_top0/mac_rx0/udp0/ram_write_addr[10]}]]
|
connect_debug_port u_ila_0/probe29 [get_nets [list axis_mac0/mac_top0/mac_rx0/udp0/ram_wr_en]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe30]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe30]
|
||||||
set_property port_width 2 [get_debug_ports u_ila_0/probe30]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe30]
|
||||||
connect_debug_port u_ila_0/probe30 [get_nets [list {test_state[0]} {test_state[1]}]]
|
connect_debug_port u_ila_0/probe30 [get_nets [list axis_mac0/mac_top0/mac_tx0/ram_wr_en]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe31]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe31]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe31]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe31]
|
||||||
connect_debug_port u_ila_0/probe31 [get_nets [list axis_mac0/mac_top0/mac_tx0/almost_full]]
|
connect_debug_port u_ila_0/probe31 [get_nets [list req_ready]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe32]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe32]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe32]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe32]
|
||||||
connect_debug_port u_ila_0/probe32 [get_nets [list axis_mac0/arp_found]]
|
connect_debug_port u_ila_0/probe32 [get_nets [list axis_mac0/req_ready]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe33]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe33]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe33]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe33]
|
||||||
connect_debug_port u_ila_0/probe33 [get_nets [list arbi_inst/rx_buffer_inst/e10_100_rx_dv]]
|
connect_debug_port u_ila_0/probe33 [get_nets [list axis_mac0/s_axis_tx_tlast]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe34]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe34]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe34]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe34]
|
||||||
connect_debug_port u_ila_0/probe34 [get_nets [list arbi_inst/e_rx_dv]]
|
connect_debug_port u_ila_0/probe34 [get_nets [list axis_mac0/s_axis_tx_tready]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe35]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe35]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe35]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe35]
|
||||||
connect_debug_port u_ila_0/probe35 [get_nets [list arbi_inst/e_tx_en]]
|
connect_debug_port u_ila_0/probe35 [get_nets [list axis_mac0/s_axis_tx_tvalid]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe36]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe36]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe36]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe36]
|
||||||
connect_debug_port u_ila_0/probe36 [get_nets [list arbi_inst/gmii_rx_dv]]
|
connect_debug_port u_ila_0/probe36 [get_nets [list send_req]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe37]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe37]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe37]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe37]
|
||||||
connect_debug_port u_ila_0/probe37 [get_nets [list arbi_inst/rx_buffer_inst/gmii_rx_dv_d0]]
|
connect_debug_port u_ila_0/probe37 [get_nets [list axis_mac0/send_req]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe38]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe38]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe38]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe38]
|
||||||
connect_debug_port u_ila_0/probe38 [get_nets [list arbi_inst/rx_buffer_inst/gmii_rx_dv_d1]]
|
connect_debug_port u_ila_0/probe38 [get_nets [list axis_mac0/mac_top0/mac_tx0/udp_ram_data_req]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe39]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe39]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe39]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe39]
|
||||||
connect_debug_port u_ila_0/probe39 [get_nets [list arbi_inst/gmii_tx_en]]
|
connect_debug_port u_ila_0/probe39 [get_nets [list axis_mac0/mac_top0/mac_rx0/udp_rec_data_valid]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe40]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe40]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe40]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe40]
|
||||||
connect_debug_port u_ila_0/probe40 [get_nets [list axis_mac0/m_axis_rx_tlast]]
|
connect_debug_port u_ila_0/probe40 [get_nets [list axis_mac0/mac_top0/mac_tx0/udp_tx_end]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe41]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe41]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe41]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe41]
|
||||||
connect_debug_port u_ila_0/probe41 [get_nets [list axis_mac0/m_axis_rx_tready]]
|
connect_debug_port u_ila_0/probe41 [get_nets [list axis_mac0/mac_top0/mac_tx0/udp_tx_req]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe42]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe42]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe42]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe42]
|
||||||
connect_debug_port u_ila_0/probe42 [get_nets [list axis_mac0/m_axis_rx_tvalid]]
|
connect_debug_port u_ila_0/probe42 [get_nets [list axis_mac0/mac_top0/mac_tx0/upper_data_req]]
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe43]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe43]
|
|
||||||
connect_debug_port u_ila_0/probe43 [get_nets [list axis_mac0/mac_top0/mac_tx0/mac_data_valid]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe44]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe44]
|
|
||||||
connect_debug_port u_ila_0/probe44 [get_nets [list axis_mac0/mac_top0/mac_tx0/mac_send_end]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe45]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe45]
|
|
||||||
connect_debug_port u_ila_0/probe45 [get_nets [list axis_mac0/mac_top0/mac_rx0/udp0/ram_wr_en]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe46]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe46]
|
|
||||||
connect_debug_port u_ila_0/probe46 [get_nets [list axis_mac0/mac_top0/mac_tx0/ram_wr_en]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe47]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe47]
|
|
||||||
connect_debug_port u_ila_0/probe47 [get_nets [list req_ready]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe48]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe48]
|
|
||||||
connect_debug_port u_ila_0/probe48 [get_nets [list axis_mac0/req_ready]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe49]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe49]
|
|
||||||
connect_debug_port u_ila_0/probe49 [get_nets [list axis_mac0/s_axis_tx_tlast]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe50]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe50]
|
|
||||||
connect_debug_port u_ila_0/probe50 [get_nets [list axis_mac0/s_axis_tx_tready]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe51]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe51]
|
|
||||||
connect_debug_port u_ila_0/probe51 [get_nets [list axis_mac0/s_axis_tx_tvalid]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe52]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe52]
|
|
||||||
connect_debug_port u_ila_0/probe52 [get_nets [list axis_mac0/send_req]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe53]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe53]
|
|
||||||
connect_debug_port u_ila_0/probe53 [get_nets [list send_req]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe54]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe54]
|
|
||||||
connect_debug_port u_ila_0/probe54 [get_nets [list arbi_inst/tx_buffer_inst/tx_rden]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe55]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe55]
|
|
||||||
connect_debug_port u_ila_0/probe55 [get_nets [list arbi_inst/tx_buffer_inst/tx_wren]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe56]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe56]
|
|
||||||
connect_debug_port u_ila_0/probe56 [get_nets [list axis_mac0/mac_top0/mac_tx0/udp_ram_data_req]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe57]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe57]
|
|
||||||
connect_debug_port u_ila_0/probe57 [get_nets [list axis_mac0/mac_top0/mac_rx0/udp_rec_data_valid]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe58]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe58]
|
|
||||||
connect_debug_port u_ila_0/probe58 [get_nets [list axis_mac0/mac_top0/mac_tx0/udp_tx_end]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe59]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe59]
|
|
||||||
connect_debug_port u_ila_0/probe59 [get_nets [list axis_mac0/mac_top0/mac_tx0/udp_tx_req]]
|
|
||||||
create_debug_port u_ila_0 probe
|
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe60]
|
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe60]
|
|
||||||
connect_debug_port u_ila_0/probe60 [get_nets [list axis_mac0/mac_top0/mac_tx0/upper_data_req]]
|
|
||||||
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
|
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
|
||||||
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
|
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
|
||||||
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
|
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
|
||||||
connect_debug_port dbg_hub/clk [get_nets rgmii_rxc_IBUF_BUFG]
|
connect_debug_port dbg_hub/clk [get_nets e_gtxc_OBUF_BUFG]
|
||||||
|
|||||||
@ -7,51 +7,38 @@
|
|||||||
|
|
||||||
module ethernet_axis_echo
|
module ethernet_axis_echo
|
||||||
(
|
(
|
||||||
input sys_clk_p,
|
input sys_clk_p, // system clock positive
|
||||||
input sys_clk_n,
|
input sys_clk_n, // system clock negative
|
||||||
input rst_n,
|
input rst_n, // reset ,low active
|
||||||
output [3:0] led,
|
output [3:0] led, // display network rate status
|
||||||
output e_reset,
|
output e_reset, // phy reset
|
||||||
output e_mdc,
|
output e_mdc, // phy emdio clock
|
||||||
inout e_mdio,
|
inout e_mdio, // phy emdio data
|
||||||
output [3:0] rgmii_txd,
|
input e_rxc, // 125Mhz ethernet gmii rx clock
|
||||||
output rgmii_txctl,
|
input e_rxdv, // GMII recieving data valid
|
||||||
output rgmii_txc,
|
input e_rxer, // GMII recieving data error
|
||||||
input [3:0] rgmii_rxd,
|
input [7:0] e_rxd, // GMII recieving data
|
||||||
input rgmii_rxctl,
|
|
||||||
input rgmii_rxc
|
input e_txc, // 25Mhz ethernet mii tx clock
|
||||||
|
output e_gtxc, // 125Mhz ethernet gmii tx clock
|
||||||
|
output e_txen, // GMII sending data valid
|
||||||
|
output e_txer, // GMII sending data error
|
||||||
|
output[7:0] e_txd // GMII sending data
|
||||||
);
|
);
|
||||||
|
wire sys_clk; //single end clock
|
||||||
// ------------------------------------------------------------
|
wire [31:0] pack_total_len ; //package length
|
||||||
// Internal GMII-side signals
|
wire [1:0] speed ; //net speed select
|
||||||
// ------------------------------------------------------------
|
wire link ; //link status
|
||||||
wire [7:0] gmii_txd;
|
wire erxdv ;
|
||||||
wire gmii_tx_en;
|
wire [7:0] erxd ;
|
||||||
wire gmii_tx_er;
|
|
||||||
wire gmii_tx_clk;
|
|
||||||
wire gmii_crs;
|
|
||||||
wire gmii_col;
|
|
||||||
wire [7:0] gmii_rxd_i;
|
|
||||||
wire gmii_rx_dv;
|
|
||||||
wire gmii_rx_er;
|
|
||||||
wire gmii_rx_clk;
|
|
||||||
|
|
||||||
wire [31:0] pack_total_len;
|
|
||||||
|
|
||||||
wire e_rx_dv;
|
|
||||||
wire [7:0] e_rxd;
|
|
||||||
wire e_tx_en ;
|
wire e_tx_en ;
|
||||||
wire [7:0] e_txd;
|
wire [7:0] etxd ;
|
||||||
wire e_rst_n ;
|
wire e_rst_n ;
|
||||||
wire sys_clk;
|
assign e_gtxc = e_rxc;
|
||||||
|
assign e_reset = 1'b1;
|
||||||
|
|
||||||
wire duplex_mode;
|
// generate single end clock
|
||||||
|
|
||||||
assign duplex_mode = 1'b1;
|
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
|
||||||
// System clock buffer
|
|
||||||
// ------------------------------------------------------------
|
|
||||||
IBUFDS sys_clk_ibufgds
|
IBUFDS sys_clk_ibufgds
|
||||||
(
|
(
|
||||||
.O (sys_clk ),
|
.O (sys_clk ),
|
||||||
@ -59,60 +46,23 @@ module ethernet_axis_echo
|
|||||||
.IB (sys_clk_n )
|
.IB (sys_clk_n )
|
||||||
);
|
);
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
|
||||||
// IDELAYCTRL
|
|
||||||
// ------------------------------------------------------------
|
|
||||||
(* IODELAY_GROUP = "rgmii_idelay_group" *)
|
|
||||||
IDELAYCTRL IDELAYCTRL_inst (
|
|
||||||
.RDY(),
|
|
||||||
.REFCLK(sys_clk),
|
|
||||||
.RST(1'b0)
|
|
||||||
);
|
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// Different conversion of GMII data according to different network speeds
|
||||||
// GMII <-> RGMII conversion
|
|
||||||
// ------------------------------------------------------------
|
|
||||||
util_gmii_to_rgmii util_gmii_to_rgmii_m0
|
|
||||||
(
|
|
||||||
.reset (1'b0),
|
|
||||||
.rgmii_td (rgmii_txd),
|
|
||||||
.rgmii_tx_ctl (rgmii_txctl),
|
|
||||||
.rgmii_txc (rgmii_txc),
|
|
||||||
.rgmii_rd (rgmii_rxd),
|
|
||||||
.rgmii_rx_ctl (rgmii_rxctl),
|
|
||||||
.gmii_rx_clk (gmii_rx_clk),
|
|
||||||
.gmii_txd (e_txd),
|
|
||||||
.gmii_tx_en (e_tx_en),
|
|
||||||
.gmii_tx_er (1'b0),
|
|
||||||
.gmii_tx_clk (gmii_tx_clk),
|
|
||||||
.gmii_crs (gmii_crs),
|
|
||||||
.gmii_col (gmii_col),
|
|
||||||
.gmii_rxd (gmii_rxd_i),
|
|
||||||
.rgmii_rxc (rgmii_rxc),
|
|
||||||
.gmii_rx_dv (gmii_rx_dv),
|
|
||||||
.gmii_rx_er (gmii_rx_er),
|
|
||||||
.speed_selection (2'b10),
|
|
||||||
.duplex_mode (duplex_mode)
|
|
||||||
);
|
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
|
||||||
// GMII arbitration / adaptation
|
|
||||||
// ------------------------------------------------------------
|
|
||||||
gmii_arbi arbi_inst
|
gmii_arbi arbi_inst
|
||||||
(
|
(
|
||||||
.clk (gmii_tx_clk),
|
.clk (e_gtxc ),
|
||||||
.rst_n (rst_n ),
|
.rst_n (rst_n ),
|
||||||
.speed (2'b10 ),
|
.speed (2'b10 ),
|
||||||
.link (1'b1 ),
|
.link (1'b1 ),
|
||||||
.pack_total_len (pack_total_len ),
|
.pack_total_len (pack_total_len ),
|
||||||
.e_rst_n (e_rst_n ),
|
.e_rst_n (e_rst_n ),
|
||||||
.gmii_rx_dv (gmii_rx_dv),
|
.gmii_rx_dv (e_rxdv ),
|
||||||
.gmii_rxd (gmii_rxd_i),
|
.gmii_rxd (e_rxd ),
|
||||||
.gmii_tx_en (gmii_tx_en),
|
.gmii_tx_en (e_tx_en ),
|
||||||
.gmii_txd (gmii_txd),
|
.gmii_txd (etxd ),
|
||||||
.e_rx_dv (e_rx_dv),
|
.e_rx_dv (erxdv ),
|
||||||
.e_rxd (e_rxd),
|
.e_rxd (erxd ),
|
||||||
.e_tx_en (e_tx_en),
|
.e_tx_en (e_txen ),
|
||||||
.e_txd (e_txd )
|
.e_txd (e_txd )
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -139,14 +89,14 @@ module ethernet_axis_echo
|
|||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
axis_mac axis_mac0
|
axis_mac axis_mac0
|
||||||
(
|
(
|
||||||
.gmii_tx_clk (gmii_tx_clk),
|
.gmii_tx_clk (e_gtxc),
|
||||||
.gmii_rx_clk (gmii_rx_clk),
|
.gmii_rx_clk (e_rxc),
|
||||||
.rst_n (e_rst_n),
|
.rst_n (e_rst_n),
|
||||||
|
|
||||||
.gmii_rx_dv (e_rx_dv),
|
.gmii_rx_dv (erxdv),
|
||||||
.gmii_rxd (e_rxd),
|
.gmii_rxd (erxd),
|
||||||
.gmii_tx_en (gmii_tx_en),
|
.gmii_tx_en (e_tx_en),
|
||||||
.gmii_txd (gmii_txd),
|
.gmii_txd (etxd),
|
||||||
|
|
||||||
.send_req (send_req),
|
.send_req (send_req),
|
||||||
.data_length (data_length),
|
.data_length (data_length),
|
||||||
@ -184,7 +134,7 @@ module ethernet_axis_echo
|
|||||||
|
|
||||||
assign tx_done_pulse_rx = tx_done_toggle_rx_d1 ^ tx_done_toggle_rx_d0;
|
assign tx_done_pulse_rx = tx_done_toggle_rx_d1 ^ tx_done_toggle_rx_d0;
|
||||||
|
|
||||||
always @(posedge gmii_rx_clk or negedge e_rst_n) begin
|
always @(posedge e_rxc or negedge e_rst_n) begin
|
||||||
if (!e_rst_n) begin
|
if (!e_rst_n) begin
|
||||||
tx_done_toggle_rx_d0 <= 1'b0;
|
tx_done_toggle_rx_d0 <= 1'b0;
|
||||||
tx_done_toggle_rx_d1 <= 1'b0;
|
tx_done_toggle_rx_d1 <= 1'b0;
|
||||||
@ -194,7 +144,7 @@ module ethernet_axis_echo
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
always @(posedge gmii_rx_clk or negedge e_rst_n) begin
|
always @(posedge e_rxc or negedge e_rst_n) begin
|
||||||
if (!e_rst_n) begin
|
if (!e_rst_n) begin
|
||||||
rx_wr_ptr <= 16'd0;
|
rx_wr_ptr <= 16'd0;
|
||||||
rx_pkt_len <= 16'd0;
|
rx_pkt_len <= 16'd0;
|
||||||
@ -227,7 +177,7 @@ module ethernet_axis_echo
|
|||||||
// sync RX pendind to TX domain
|
// sync RX pendind to TX domain
|
||||||
reg rx_pkt_pending_tx_d0, rx_pkt_pending_tx_d1;
|
reg rx_pkt_pending_tx_d0, rx_pkt_pending_tx_d1;
|
||||||
|
|
||||||
always @(posedge gmii_tx_clk or negedge e_rst_n) begin
|
always @(posedge e_gtxc or negedge e_rst_n) begin
|
||||||
if (!e_rst_n) begin
|
if (!e_rst_n) begin
|
||||||
rx_pkt_pending_tx_d0 <= 1'b0;
|
rx_pkt_pending_tx_d0 <= 1'b0;
|
||||||
rx_pkt_pending_tx_d1 <= 1'b0;
|
rx_pkt_pending_tx_d1 <= 1'b0;
|
||||||
@ -253,7 +203,7 @@ module ethernet_axis_echo
|
|||||||
reg [15:0] tx_pkt_len;
|
reg [15:0] tx_pkt_len;
|
||||||
reg [15:0] tx_rd_ptr;
|
reg [15:0] tx_rd_ptr;
|
||||||
|
|
||||||
always @(posedge gmii_tx_clk or negedge e_rst_n) begin
|
always @(posedge e_gtxc or negedge e_rst_n) begin
|
||||||
if (!e_rst_n) begin
|
if (!e_rst_n) begin
|
||||||
test_state <= TX_IDLE;
|
test_state <= TX_IDLE;
|
||||||
tx_busy <= 1'b0;
|
tx_busy <= 1'b0;
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# FPGA settings
|
# FPGA settings
|
||||||
FPGA_PART = xc7a35tfgg484-1
|
FPGA_PART = xc7a100tfgg484-2
|
||||||
FPGA_TOP = ethernet_test_minimal
|
FPGA_TOP = ethernet_test_minimal
|
||||||
FPGA_ARCH = artix7
|
FPGA_ARCH = artix7
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ SYN_FILES += $(sort $(shell find ../../src -type f \( -name '*.v' -o -name '*.sv
|
|||||||
XCI_FILES = $(sort $(shell find ../../src -type f -name '*.xci'))
|
XCI_FILES = $(sort $(shell find ../../src -type f -name '*.xci'))
|
||||||
|
|
||||||
XDC_FILES += debug.xdc
|
XDC_FILES += debug.xdc
|
||||||
XDC_FILES += ../../../../constraints/ax7a035b.xdc
|
XDC_FILES += ../../../../constraints/ax7102.xdc
|
||||||
|
|
||||||
program: $(PROJECT).bit
|
program: $(PROJECT).bit
|
||||||
echo "open_hw_manager" > program.tcl
|
echo "open_hw_manager" > program.tcl
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
# debug ILA
|
# debug ILA
|
||||||
|
|
||||||
|
connect_debug_port u_ila_0/clk [get_nets [list rgmii_rxc_IBUF_BUFG]]
|
||||||
|
connect_debug_port dbg_hub/clk [get_nets rgmii_rxc_IBUF_BUFG]
|
||||||
|
|
||||||
create_debug_core u_ila_0 ila
|
create_debug_core u_ila_0 ila
|
||||||
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
|
||||||
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0]
|
||||||
@ -10,102 +13,102 @@ set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
|
|||||||
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
|
||||||
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/clk]
|
set_property port_width 1 [get_debug_ports u_ila_0/clk]
|
||||||
connect_debug_port u_ila_0/clk [get_nets [list rgmii_rxc_IBUF_BUFG]]
|
connect_debug_port u_ila_0/clk [get_nets [list e_gtxc_OBUF_BUFG]]
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0]
|
||||||
set_property port_width 9 [get_debug_ports u_ila_0/probe0]
|
set_property port_width 11 [get_debug_ports u_ila_0/probe0]
|
||||||
connect_debug_port u_ila_0/probe0 [get_nets [list {mac_test0/state[0]} {mac_test0/state[1]} {mac_test0/state[2]} {mac_test0/state[3]} {mac_test0/state[4]} {mac_test0/state[5]} {mac_test0/state[6]} {mac_test0/state[7]} {mac_test0/state[8]}]]
|
connect_debug_port u_ila_0/probe0 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[0]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[1]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[2]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[3]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[4]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[5]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[6]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[7]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[8]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[9]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[10]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe1]
|
set_property port_width 4 [get_debug_ports u_ila_0/probe1]
|
||||||
connect_debug_port u_ila_0/probe1 [get_nets [list {arbi_inst/rx_buffer_inst/e10_100_rxd[0]} {arbi_inst/rx_buffer_inst/e10_100_rxd[1]} {arbi_inst/rx_buffer_inst/e10_100_rxd[2]} {arbi_inst/rx_buffer_inst/e10_100_rxd[3]} {arbi_inst/rx_buffer_inst/e10_100_rxd[4]} {arbi_inst/rx_buffer_inst/e10_100_rxd[5]} {arbi_inst/rx_buffer_inst/e10_100_rxd[6]} {arbi_inst/rx_buffer_inst/e10_100_rxd[7]}]]
|
connect_debug_port u_ila_0/probe1 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/usedw[0]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[1]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[2]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[3]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe2]
|
set_property port_width 6 [get_debug_ports u_ila_0/probe2]
|
||||||
connect_debug_port u_ila_0/probe2 [get_nets [list {arbi_inst/tx_buffer_inst/tx_wdata[0]} {arbi_inst/tx_buffer_inst/tx_wdata[1]} {arbi_inst/tx_buffer_inst/tx_wdata[2]} {arbi_inst/tx_buffer_inst/tx_wdata[3]} {arbi_inst/tx_buffer_inst/tx_wdata[4]} {arbi_inst/tx_buffer_inst/tx_wdata[5]} {arbi_inst/tx_buffer_inst/tx_wdata[6]} {arbi_inst/tx_buffer_inst/tx_wdata[7]}]]
|
connect_debug_port u_ila_0/probe2 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/state[0]} {mac_test0/mac_top0/mac_tx0/udp0/state[1]} {mac_test0/mac_top0/mac_tx0/udp0/state[2]} {mac_test0/mac_top0/mac_tx0/udp0/state[3]} {mac_test0/mac_top0/mac_tx0/udp0/state[4]} {mac_test0/mac_top0/mac_tx0/udp0/state[5]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe3]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe3]
|
set_property port_width 9 [get_debug_ports u_ila_0/probe3]
|
||||||
connect_debug_port u_ila_0/probe3 [get_nets [list {arbi_inst/tx_buffer_inst/tx_rdata[0]} {arbi_inst/tx_buffer_inst/tx_rdata[1]} {arbi_inst/tx_buffer_inst/tx_rdata[2]} {arbi_inst/tx_buffer_inst/tx_rdata[3]} {arbi_inst/tx_buffer_inst/tx_rdata[4]} {arbi_inst/tx_buffer_inst/tx_rdata[5]} {arbi_inst/tx_buffer_inst/tx_rdata[6]} {arbi_inst/tx_buffer_inst/tx_rdata[7]}]]
|
connect_debug_port u_ila_0/probe3 [get_nets [list {mac_test0/state[0]} {mac_test0/state[1]} {mac_test0/state[2]} {mac_test0/state[3]} {mac_test0/state[4]} {mac_test0/state[5]} {mac_test0/state[6]} {mac_test0/state[7]} {mac_test0/state[8]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe4]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe4]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe4]
|
||||||
connect_debug_port u_ila_0/probe4 [get_nets [list {arbi_inst/tx_buffer_inst/tx_data_cnt[0]} {arbi_inst/tx_buffer_inst/tx_data_cnt[1]} {arbi_inst/tx_buffer_inst/tx_data_cnt[2]} {arbi_inst/tx_buffer_inst/tx_data_cnt[3]} {arbi_inst/tx_buffer_inst/tx_data_cnt[4]} {arbi_inst/tx_buffer_inst/tx_data_cnt[5]} {arbi_inst/tx_buffer_inst/tx_data_cnt[6]} {arbi_inst/tx_buffer_inst/tx_data_cnt[7]} {arbi_inst/tx_buffer_inst/tx_data_cnt[8]} {arbi_inst/tx_buffer_inst/tx_data_cnt[9]} {arbi_inst/tx_buffer_inst/tx_data_cnt[10]} {arbi_inst/tx_buffer_inst/tx_data_cnt[11]} {arbi_inst/tx_buffer_inst/tx_data_cnt[12]} {arbi_inst/tx_buffer_inst/tx_data_cnt[13]} {arbi_inst/tx_buffer_inst/tx_data_cnt[14]} {arbi_inst/tx_buffer_inst/tx_data_cnt[15]}]]
|
connect_debug_port u_ila_0/probe4 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp_send_data_length[0]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[1]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[2]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[3]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[4]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[5]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[6]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[7]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[8]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[9]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[10]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[11]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[12]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[13]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[14]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe5]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe5]
|
set_property port_width 12 [get_debug_ports u_ila_0/probe5]
|
||||||
connect_debug_port u_ila_0/probe5 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp_send_data_length[0]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[1]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[2]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[3]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[4]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[5]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[6]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[7]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[8]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[9]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[10]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[11]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[12]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[13]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[14]} {mac_test0/mac_top0/mac_tx0/udp_send_data_length[15]}]]
|
connect_debug_port u_ila_0/probe5 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[0]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[1]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[2]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[3]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[4]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[5]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[6]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[7]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[8]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[9]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[10]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[11]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe6]
|
||||||
set_property port_width 12 [get_debug_ports u_ila_0/probe6]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe6]
|
||||||
connect_debug_port u_ila_0/probe6 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[0]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[1]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[2]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[3]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[4]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[5]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[6]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[7]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[8]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[9]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[10]} {mac_test0/mac_top0/mac_tx0/udp_ram_data_count[11]}]]
|
connect_debug_port u_ila_0/probe6 [get_nets [list {mac_test0/mac_top0/mac_tx0/ram_wr_data[0]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[1]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[2]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[3]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[4]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[5]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[6]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe7]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe7]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe7]
|
||||||
connect_debug_port u_ila_0/probe7 [get_nets [list {mac_test0/mac_top0/mac_tx0/ram_wr_data[0]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[1]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[2]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[3]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[4]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[5]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[6]} {mac_test0/mac_top0/mac_tx0/ram_wr_data[7]}]]
|
connect_debug_port u_ila_0/probe7 [get_nets [list {mac_test0/mac_top0/mac_tx0/mac_tx_data[0]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[1]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[2]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[3]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[4]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[5]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[6]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe8]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe8]
|
set_property port_width 6 [get_debug_ports u_ila_0/probe8]
|
||||||
connect_debug_port u_ila_0/probe8 [get_nets [list {mac_test0/mac_top0/mac_tx0/mac_tx_data[0]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[1]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[2]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[3]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[4]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[5]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[6]} {mac_test0/mac_top0/mac_tx0/mac_tx_data[7]}]]
|
connect_debug_port u_ila_0/probe8 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/ck_state[0]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[1]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[2]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[3]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[4]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[5]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe9]
|
||||||
set_property port_width 4 [get_debug_ports u_ila_0/probe9]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe9]
|
||||||
connect_debug_port u_ila_0/probe9 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/usedw[0]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[1]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[2]} {mac_test0/mac_top0/mac_tx0/udp0/usedw[3]}]]
|
connect_debug_port u_ila_0/probe9 [get_nets [list {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[0]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[1]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[2]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[3]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[4]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[5]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[6]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[7]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[8]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[9]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[10]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[11]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[12]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[13]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[14]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe10]
|
||||||
set_property port_width 6 [get_debug_ports u_ila_0/probe10]
|
set_property port_width 11 [get_debug_ports u_ila_0/probe10]
|
||||||
connect_debug_port u_ila_0/probe10 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/state[0]} {mac_test0/mac_top0/mac_tx0/udp0/state[1]} {mac_test0/mac_top0/mac_tx0/udp0/state[2]} {mac_test0/mac_top0/mac_tx0/udp0/state[3]} {mac_test0/mac_top0/mac_tx0/udp0/state[4]} {mac_test0/mac_top0/mac_tx0/udp0/state[5]}]]
|
connect_debug_port u_ila_0/probe10 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[7]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[8]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[9]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[10]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe11]
|
||||||
set_property port_width 6 [get_debug_ports u_ila_0/probe11]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe11]
|
||||||
connect_debug_port u_ila_0/probe11 [get_nets [list {mac_test0/mac_top0/mac_tx0/udp0/ck_state[0]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[1]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[2]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[3]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[4]} {mac_test0/mac_top0/mac_tx0/udp0/ck_state[5]}]]
|
connect_debug_port u_ila_0/probe11 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe12]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe12]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe12]
|
||||||
connect_debug_port u_ila_0/probe12 [get_nets [list {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[0]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[1]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[2]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[3]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[4]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[5]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[6]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[7]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[8]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[9]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[10]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[11]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[12]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[13]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[14]} {mac_test0/mac_top0/mac_rx0/upper_layer_data_length[15]}]]
|
connect_debug_port u_ila_0/probe12 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[7]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[8]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[9]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[10]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[11]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[12]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[13]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[14]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13]
|
||||||
set_property port_width 11 [get_debug_ports u_ila_0/probe13]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe13]
|
||||||
connect_debug_port u_ila_0/probe13 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[7]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[8]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[9]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_read_addr[10]}]]
|
connect_debug_port u_ila_0/probe13 [get_nets [list {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[0]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[1]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[2]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[3]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[4]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[5]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[6]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe14]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe14]
|
||||||
connect_debug_port u_ila_0/probe14 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_ram_rdata[7]}]]
|
connect_debug_port u_ila_0/probe14 [get_nets [list {mac_test0/mac_top0/mac_rx0/ip_total_data_length[0]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[1]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[2]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[3]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[4]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[5]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[6]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[7]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[8]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[9]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[10]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[11]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[12]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[13]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[14]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe15]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe15]
|
||||||
connect_debug_port u_ila_0/probe15 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[0]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[1]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[2]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[3]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[4]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[5]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[6]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[7]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[8]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[9]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[10]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[11]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[12]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[13]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[14]} {mac_test0/mac_top0/mac_rx0/udp_rec_data_length[15]}]]
|
connect_debug_port u_ila_0/probe15 [get_nets [list {mac_test0/mac_top0/mac_rx0/mac_rx_datain[0]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[1]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[2]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[3]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[4]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[5]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[6]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe16]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe16]
|
||||||
connect_debug_port u_ila_0/probe16 [get_nets [list {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[0]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[1]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[2]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[3]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[4]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[5]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[6]} {mac_test0/mac_top0/mac_rx0/mac_rx_dataout[7]}]]
|
connect_debug_port u_ila_0/probe16 [get_nets [list {arbi_inst/gmii_txd[0]} {arbi_inst/gmii_txd[1]} {arbi_inst/gmii_txd[2]} {arbi_inst/gmii_txd[3]} {arbi_inst/gmii_txd[4]} {arbi_inst/gmii_txd[5]} {arbi_inst/gmii_txd[6]} {arbi_inst/gmii_txd[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17]
|
||||||
set_property port_width 16 [get_debug_ports u_ila_0/probe17]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe17]
|
||||||
connect_debug_port u_ila_0/probe17 [get_nets [list {mac_test0/mac_top0/mac_rx0/ip_total_data_length[0]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[1]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[2]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[3]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[4]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[5]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[6]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[7]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[8]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[9]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[10]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[11]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[12]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[13]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[14]} {mac_test0/mac_top0/mac_rx0/ip_total_data_length[15]}]]
|
connect_debug_port u_ila_0/probe17 [get_nets [list {arbi_inst/gmii_rxd[0]} {arbi_inst/gmii_rxd[1]} {arbi_inst/gmii_rxd[2]} {arbi_inst/gmii_rxd[3]} {arbi_inst/gmii_rxd[4]} {arbi_inst/gmii_rxd[5]} {arbi_inst/gmii_rxd[6]} {arbi_inst/gmii_rxd[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe18]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe18]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe18]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe18]
|
||||||
connect_debug_port u_ila_0/probe18 [get_nets [list {mac_test0/mac_top0/mac_rx0/mac_rx_datain[0]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[1]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[2]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[3]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[4]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[5]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[6]} {mac_test0/mac_top0/mac_rx0/mac_rx_datain[7]}]]
|
connect_debug_port u_ila_0/probe18 [get_nets [list {arbi_inst/e_txd[0]} {arbi_inst/e_txd[1]} {arbi_inst/e_txd[2]} {arbi_inst/e_txd[3]} {arbi_inst/e_txd[4]} {arbi_inst/e_txd[5]} {arbi_inst/e_txd[6]} {arbi_inst/e_txd[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe19]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe19]
|
||||||
set_property port_width 11 [get_debug_ports u_ila_0/probe19]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe19]
|
||||||
connect_debug_port u_ila_0/probe19 [get_nets [list {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[0]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[1]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[2]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[3]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[4]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[5]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[6]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[7]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[8]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[9]} {mac_test0/mac_top0/mac_rx0/udp0/ram_write_addr[10]}]]
|
connect_debug_port u_ila_0/probe19 [get_nets [list {arbi_inst/e_rxd[0]} {arbi_inst/e_rxd[1]} {arbi_inst/e_rxd[2]} {arbi_inst/e_rxd[3]} {arbi_inst/e_rxd[4]} {arbi_inst/e_rxd[5]} {arbi_inst/e_rxd[6]} {arbi_inst/e_rxd[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe20]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe20]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe20]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe20]
|
||||||
connect_debug_port u_ila_0/probe20 [get_nets [list {arbi_inst/gmii_txd[0]} {arbi_inst/gmii_txd[1]} {arbi_inst/gmii_txd[2]} {arbi_inst/gmii_txd[3]} {arbi_inst/gmii_txd[4]} {arbi_inst/gmii_txd[5]} {arbi_inst/gmii_txd[6]} {arbi_inst/gmii_txd[7]}]]
|
connect_debug_port u_ila_0/probe20 [get_nets [list {arbi_inst/tx_buffer_inst/tx_wdata[0]} {arbi_inst/tx_buffer_inst/tx_wdata[1]} {arbi_inst/tx_buffer_inst/tx_wdata[2]} {arbi_inst/tx_buffer_inst/tx_wdata[3]} {arbi_inst/tx_buffer_inst/tx_wdata[4]} {arbi_inst/tx_buffer_inst/tx_wdata[5]} {arbi_inst/tx_buffer_inst/tx_wdata[6]} {arbi_inst/tx_buffer_inst/tx_wdata[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe21]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe21]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe21]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe21]
|
||||||
connect_debug_port u_ila_0/probe21 [get_nets [list {arbi_inst/gmii_rxd[0]} {arbi_inst/gmii_rxd[1]} {arbi_inst/gmii_rxd[2]} {arbi_inst/gmii_rxd[3]} {arbi_inst/gmii_rxd[4]} {arbi_inst/gmii_rxd[5]} {arbi_inst/gmii_rxd[6]} {arbi_inst/gmii_rxd[7]}]]
|
connect_debug_port u_ila_0/probe21 [get_nets [list {arbi_inst/tx_buffer_inst/tx_rdata[0]} {arbi_inst/tx_buffer_inst/tx_rdata[1]} {arbi_inst/tx_buffer_inst/tx_rdata[2]} {arbi_inst/tx_buffer_inst/tx_rdata[3]} {arbi_inst/tx_buffer_inst/tx_rdata[4]} {arbi_inst/tx_buffer_inst/tx_rdata[5]} {arbi_inst/tx_buffer_inst/tx_rdata[6]} {arbi_inst/tx_buffer_inst/tx_rdata[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe22]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe22]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe22]
|
set_property port_width 16 [get_debug_ports u_ila_0/probe22]
|
||||||
connect_debug_port u_ila_0/probe22 [get_nets [list {arbi_inst/e_txd[0]} {arbi_inst/e_txd[1]} {arbi_inst/e_txd[2]} {arbi_inst/e_txd[3]} {arbi_inst/e_txd[4]} {arbi_inst/e_txd[5]} {arbi_inst/e_txd[6]} {arbi_inst/e_txd[7]}]]
|
connect_debug_port u_ila_0/probe22 [get_nets [list {arbi_inst/tx_buffer_inst/tx_data_cnt[0]} {arbi_inst/tx_buffer_inst/tx_data_cnt[1]} {arbi_inst/tx_buffer_inst/tx_data_cnt[2]} {arbi_inst/tx_buffer_inst/tx_data_cnt[3]} {arbi_inst/tx_buffer_inst/tx_data_cnt[4]} {arbi_inst/tx_buffer_inst/tx_data_cnt[5]} {arbi_inst/tx_buffer_inst/tx_data_cnt[6]} {arbi_inst/tx_buffer_inst/tx_data_cnt[7]} {arbi_inst/tx_buffer_inst/tx_data_cnt[8]} {arbi_inst/tx_buffer_inst/tx_data_cnt[9]} {arbi_inst/tx_buffer_inst/tx_data_cnt[10]} {arbi_inst/tx_buffer_inst/tx_data_cnt[11]} {arbi_inst/tx_buffer_inst/tx_data_cnt[12]} {arbi_inst/tx_buffer_inst/tx_data_cnt[13]} {arbi_inst/tx_buffer_inst/tx_data_cnt[14]} {arbi_inst/tx_buffer_inst/tx_data_cnt[15]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe23]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe23]
|
||||||
set_property port_width 8 [get_debug_ports u_ila_0/probe23]
|
set_property port_width 8 [get_debug_ports u_ila_0/probe23]
|
||||||
connect_debug_port u_ila_0/probe23 [get_nets [list {arbi_inst/e_rxd[0]} {arbi_inst/e_rxd[1]} {arbi_inst/e_rxd[2]} {arbi_inst/e_rxd[3]} {arbi_inst/e_rxd[4]} {arbi_inst/e_rxd[5]} {arbi_inst/e_rxd[6]} {arbi_inst/e_rxd[7]}]]
|
connect_debug_port u_ila_0/probe23 [get_nets [list {arbi_inst/rx_buffer_inst/e10_100_rxd[0]} {arbi_inst/rx_buffer_inst/e10_100_rxd[1]} {arbi_inst/rx_buffer_inst/e10_100_rxd[2]} {arbi_inst/rx_buffer_inst/e10_100_rxd[3]} {arbi_inst/rx_buffer_inst/e10_100_rxd[4]} {arbi_inst/rx_buffer_inst/e10_100_rxd[5]} {arbi_inst/rx_buffer_inst/e10_100_rxd[6]} {arbi_inst/rx_buffer_inst/e10_100_rxd[7]}]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe24]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe24]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe24]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe24]
|
||||||
@ -149,11 +152,11 @@ connect_debug_port u_ila_0/probe33 [get_nets [list mac_test0/mac_top0/mac_tx0/ma
|
|||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe34]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe34]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe34]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe34]
|
||||||
connect_debug_port u_ila_0/probe34 [get_nets [list mac_test0/mac_top0/mac_rx0/udp0/ram_wr_en]]
|
connect_debug_port u_ila_0/probe34 [get_nets [list mac_test0/mac_top0/mac_tx0/ram_wr_en]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe35]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe35]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe35]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe35]
|
||||||
connect_debug_port u_ila_0/probe35 [get_nets [list mac_test0/mac_top0/mac_tx0/ram_wr_en]]
|
connect_debug_port u_ila_0/probe35 [get_nets [list mac_test0/mac_top0/mac_rx0/udp0/ram_wr_en]]
|
||||||
create_debug_port u_ila_0 probe
|
create_debug_port u_ila_0 probe
|
||||||
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe36]
|
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe36]
|
||||||
set_property port_width 1 [get_debug_ports u_ila_0/probe36]
|
set_property port_width 1 [get_debug_ports u_ila_0/probe36]
|
||||||
@ -185,4 +188,4 @@ connect_debug_port u_ila_0/probe42 [get_nets [list mac_test0/mac_top0/mac_tx0/up
|
|||||||
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
|
set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub]
|
||||||
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
|
set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
|
||||||
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
|
set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
|
||||||
connect_debug_port dbg_hub/clk [get_nets rgmii_rxc_IBUF_BUFG]
|
connect_debug_port dbg_hub/clk [get_nets e_gtxc_OBUF_BUFG]
|
||||||
|
|||||||
@ -1,4 +1,8 @@
|
|||||||
module ethernet_test_minimal
|
`timescale 1ns / 1ps
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Module Name: ethernet_test
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
module ethernet_test
|
||||||
(
|
(
|
||||||
input sys_clk_p, // system clock positive
|
input sys_clk_p, // system clock positive
|
||||||
input sys_clk_n, // system clock negative
|
input sys_clk_n, // system clock negative
|
||||||
@ -7,45 +11,31 @@ output [3:0] led, //display network rate stat
|
|||||||
output e_reset, // phy reset
|
output e_reset, // phy reset
|
||||||
output e_mdc, // phy emdio clock
|
output e_mdc, // phy emdio clock
|
||||||
inout e_mdio, // phy emdio data
|
inout e_mdio, // phy emdio data
|
||||||
output[3:0] rgmii_txd, //phy data send
|
input e_rxc, // 125Mhz ethernet gmii rx clock
|
||||||
output rgmii_txctl, //phy data send control
|
input e_rxdv, // GMII recieving data valid
|
||||||
output rgmii_txc, //Clock for sending data
|
input e_rxer, // GMII recieving data error
|
||||||
input[3:0] rgmii_rxd, //recieve data
|
input [7:0] e_rxd, // GMII recieving data
|
||||||
input rgmii_rxctl, //Control signal for receiving data
|
|
||||||
input rgmii_rxc //Clock for recieving data
|
input e_txc, // 25Mhz ethernet mii tx clock
|
||||||
|
output e_gtxc, // 125Mhz ethernet gmii tx clock
|
||||||
|
output e_txen, // GMII sending data valid
|
||||||
|
output e_txer, // GMII sending data error
|
||||||
|
output[7:0] e_txd // GMII sending data
|
||||||
);
|
);
|
||||||
wire [ 7:0] gmii_txd; //gmii data
|
wire sys_clk; //single end clock
|
||||||
wire gmii_tx_en; //gmii send enable
|
|
||||||
wire gmii_tx_er;
|
|
||||||
wire gmii_tx_clk; //gmii send clock
|
|
||||||
wire gmii_crs;
|
|
||||||
wire gmii_col;
|
|
||||||
wire [ 7:0] gmii_rxd; //gmii recieving data
|
|
||||||
wire gmii_rx_dv; //gmii recieving data valid
|
|
||||||
wire gmii_rx_er;
|
|
||||||
wire gmii_rx_clk; //gmii recieve clock
|
|
||||||
wire [ 1:0] speed_selection; // 1x gigabit, 01 100Mbps, 00 10mbps
|
|
||||||
wire duplex_mode; // 1 full, 0 half
|
|
||||||
wire rgmii_rxcpll;
|
|
||||||
|
|
||||||
wire [31:0] pack_total_len ; //package length
|
wire [31:0] pack_total_len ; //package length
|
||||||
|
|
||||||
wire [1:0] speed ; //net speed select
|
wire [1:0] speed ; //net speed select
|
||||||
wire link ; //link status
|
wire link ; //link status
|
||||||
wire e_rx_dv ;
|
wire erxdv ;
|
||||||
wire [7:0] e_rxd ;
|
wire [7:0] erxd ;
|
||||||
wire e_tx_en ;
|
wire e_tx_en ;
|
||||||
wire [7:0] e_txd ;
|
wire [7:0] etxd ;
|
||||||
wire e_rst_n ;
|
wire e_rst_n ;
|
||||||
wire sys_clk ;
|
assign e_gtxc = e_rxc;
|
||||||
|
assign e_reset = 1'b1;
|
||||||
|
|
||||||
|
// generate single end clock
|
||||||
|
|
||||||
assign duplex_mode = 1'b1;
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
generate single end clock
|
|
||||||
**************************************************************************/
|
|
||||||
IBUFDS sys_clk_ibufgds
|
IBUFDS sys_clk_ibufgds
|
||||||
(
|
(
|
||||||
.O (sys_clk ),
|
.O (sys_clk ),
|
||||||
@ -53,82 +43,35 @@ IBUFDS sys_clk_ibufgds
|
|||||||
.IB (sys_clk_n )
|
.IB (sys_clk_n )
|
||||||
);
|
);
|
||||||
|
|
||||||
(* IODELAY_GROUP = "rgmii_idelay_group" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
|
// Mac layer protocol test
|
||||||
|
mac_test mac_test0
|
||||||
IDELAYCTRL IDELAYCTRL_inst (
|
|
||||||
.RDY(), // 1-bit output: Ready output
|
|
||||||
.REFCLK(sys_clk), // 1-bit input: Reference clock input
|
|
||||||
.RST(1'b0) // 1-bit input: Active high reset input
|
|
||||||
);
|
|
||||||
/*************************************************************************
|
|
||||||
GMII and RGMII data conversion
|
|
||||||
****************************************************************************/
|
|
||||||
util_gmii_to_rgmii util_gmii_to_rgmii_m0
|
|
||||||
(
|
(
|
||||||
.reset (1'b0 ),
|
.gmii_tx_clk (e_gtxc ),
|
||||||
.rgmii_td (rgmii_txd ),
|
.gmii_rx_clk (e_rxc ) ,
|
||||||
.rgmii_tx_ctl (rgmii_txctl ),
|
.rst_n (e_rst_n ),
|
||||||
.rgmii_txc (rgmii_txc ),
|
.pack_total_len (pack_total_len ),
|
||||||
.rgmii_rd (rgmii_rxd ),
|
.gmii_rx_dv (erxdv ),
|
||||||
.rgmii_rx_ctl (rgmii_rxctl ),
|
.gmii_rxd (erxd ),
|
||||||
.gmii_rx_clk (gmii_rx_clk ),
|
|
||||||
.gmii_txd (e_txd ),
|
|
||||||
.gmii_tx_en (e_tx_en ),
|
.gmii_tx_en (e_tx_en ),
|
||||||
.gmii_tx_er (1'b0 ),
|
.gmii_txd (etxd )
|
||||||
.gmii_tx_clk (gmii_tx_clk ),
|
|
||||||
.gmii_crs (gmii_crs ),
|
|
||||||
.gmii_col (gmii_col ),
|
|
||||||
.gmii_rxd (gmii_rxd ),
|
|
||||||
.rgmii_rxc (rgmii_rxc ),//add
|
|
||||||
.gmii_rx_dv (gmii_rx_dv ),
|
|
||||||
.gmii_rx_er (gmii_rx_er ),
|
|
||||||
.speed_selection (2'b10 ),
|
|
||||||
.duplex_mode (duplex_mode )
|
|
||||||
);
|
);
|
||||||
/*************************************************************************
|
|
||||||
Different conversion of GMII data according to different network speeds
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
|
// Different conversion of GMII data according to different network speeds
|
||||||
gmii_arbi arbi_inst
|
gmii_arbi arbi_inst
|
||||||
(
|
(
|
||||||
.clk (gmii_tx_clk ),
|
.clk (e_gtxc ),
|
||||||
.rst_n (rst_n ),
|
.rst_n (rst_n ),
|
||||||
.speed (2'b10 ),
|
.speed (2'b10 ),
|
||||||
.link (1'b1 ),
|
.link (1'b1 ),
|
||||||
.pack_total_len (pack_total_len ),
|
.pack_total_len (pack_total_len ),
|
||||||
.e_rst_n (e_rst_n ),
|
.e_rst_n (e_rst_n ),
|
||||||
.gmii_rx_dv (gmii_rx_dv ),
|
.gmii_rx_dv (e_rxdv ),
|
||||||
.gmii_rxd (gmii_rxd ),
|
.gmii_rxd (e_rxd ),
|
||||||
.gmii_tx_en (gmii_tx_en ),
|
.gmii_tx_en (e_tx_en ),
|
||||||
.gmii_txd (gmii_txd ),
|
.gmii_txd (etxd ),
|
||||||
.e_rx_dv (e_rx_dv ),
|
.e_rx_dv (erxdv ),
|
||||||
.e_rxd (e_rxd ),
|
.e_rxd (erxd ),
|
||||||
.e_tx_en (e_tx_en ),
|
.e_tx_en (e_txen ),
|
||||||
.e_txd (e_txd )
|
.e_txd (e_txd )
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
Mac layer protocol test
|
|
||||||
****************************************************************************/
|
|
||||||
mac_test mac_test0
|
|
||||||
(
|
|
||||||
.gmii_tx_clk (gmii_tx_clk ),
|
|
||||||
.gmii_rx_clk (gmii_rx_clk ) ,
|
|
||||||
.rst_n (e_rst_n ),
|
|
||||||
.pack_total_len (pack_total_len ),
|
|
||||||
.gmii_rx_dv (e_rx_dv ),
|
|
||||||
.gmii_rxd (e_rxd ),
|
|
||||||
.gmii_tx_en (gmii_tx_en ),
|
|
||||||
.gmii_txd (gmii_txd )
|
|
||||||
);
|
|
||||||
/*************************************************************************
|
|
||||||
Generate PHY reset signal
|
|
||||||
****************************************************************************/
|
|
||||||
reset reset_m0
|
|
||||||
(
|
|
||||||
.clk (sys_clk ),
|
|
||||||
.key1 (rst_n ),
|
|
||||||
.rst_n (e_reset )
|
|
||||||
);
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
91
rtl/generator/README.md
Normal file
91
rtl/generator/README.md
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# Генератор
|
||||||
|
|
||||||
|
Модуль выполняет задачу формирования последовательности импульсов заданной амплитуды, длительности и периода.
|
||||||
|
Дополнительно реализован механизм синхронизации с модулем сэмплера через сигналы `request` и `done`, позволяющий запускать сбор данных для каждого импульса и ожидать подтверждения завершения выборки перед переходом к следующему импульсу.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Список параметров
|
||||||
|
|
||||||
|
### DATA_WIDTH
|
||||||
|
Ширина выходных данных генератора.
|
||||||
|
|
||||||
|
### ZERO_LEVEL
|
||||||
|
Уровень сигнала в состоянии отсутствия импульса (базовый уровень сигнала).
|
||||||
|
|
||||||
|
Типовые значения:
|
||||||
|
|
||||||
|
- `8192` — середина диапазона ЦАП
|
||||||
|
- `0` — нулевой уровень
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Список входных портов
|
||||||
|
|
||||||
|
### clk_dac
|
||||||
|
Сигнал тактирования модуля.
|
||||||
|
|
||||||
|
### rst
|
||||||
|
Сброс модуля и остановка генерации.
|
||||||
|
|
||||||
|
### start
|
||||||
|
Сигнал запуска последовательности импульсов.
|
||||||
|
|
||||||
|
При его активации модуль фиксирует все входные параметры и начинает генерацию.
|
||||||
|
|
||||||
|
Повторный запуск во время активной генерации блокируется с помощью внутреннего сигнала `enable`.
|
||||||
|
|
||||||
|
### [31:0] pulse_width
|
||||||
|
Длительность активной части импульса (в тактах).
|
||||||
|
|
||||||
|
### [31:0] pulse_period
|
||||||
|
Полный период импульса (в тактах).
|
||||||
|
|
||||||
|
### [DATA_WIDTH-1:0] pulse_height
|
||||||
|
Амплитуда импульса.
|
||||||
|
|
||||||
|
### [15:0] pulse_num
|
||||||
|
Количество импульсов, которое необходимо сгенерировать.
|
||||||
|
|
||||||
|
### request
|
||||||
|
Сигнал запроса на синхронизацию от сэмплера для текущего импульса.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Список выходных портов
|
||||||
|
|
||||||
|
### dac_wrt
|
||||||
|
Выходной сигнал разрешения записи сигнала
|
||||||
|
|
||||||
|
### [DATA_WIDTH-1:0] dac_out
|
||||||
|
Выходное значение амплитуды сигнала.
|
||||||
|
|
||||||
|
Во время активной части импульса равно `pulse_height`, вне импульса — `ZERO_LEVEL`.
|
||||||
|
|
||||||
|
### done
|
||||||
|
Сигнал запроса на запуск синхронизации с сэмплером для текущего импульса.
|
||||||
|
|
||||||
|
Поднимается в начале каждого нового импульса и снимается после получения `request`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Логика работы
|
||||||
|
|
||||||
|
После прихода сигнала `start` модуль:
|
||||||
|
|
||||||
|
- фиксирует входные параметры генерации
|
||||||
|
- поднимает `enable = 1`
|
||||||
|
- выполняет `pulse_num` циклов работы
|
||||||
|
- - типичный цикл состоит в ожидании синхронизации (`synced`), после чего запуск генерации импульса
|
||||||
|
|
||||||
|
Синхронизация представляет из себя простое рукопожатие с внешним модулем, имеющим сигналы `request`/`done` работающими в соответствии с этими сигналами генератора. Один из модулей, входит в ожидание и ставит на свой done активный уровень, после чего ждет, пока второй, запаздывающий модуль не войдет в свой режим ожидания, и не выставит для своего done активный уровень. Для каждого из модулей, на следующий такт после выставления активного уровня, производится проверка своего request. Так, при получении активного request (иными словами активного done от внешнего модуля), модуль незамедлительно опускает уровень своего done и начинает работать. Done подымается до активного уровня хотя-бы на один такт работы соответствующего модуля.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Симуляция
|
||||||
|
Тесты запускаются автоматически через make.
|
||||||
|
```
|
||||||
|
cd tests
|
||||||
|
make sim
|
||||||
|
```
|
||||||
|
При успешном завершении теста высвечивается "ALL PASSED".
|
||||||
@ -1,103 +1,87 @@
|
|||||||
`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
|
||||||
module generator
|
module generator
|
||||||
#(
|
#(
|
||||||
parameter DATA_WIDTH = 14
|
parameter DATA_WIDTH = 14,
|
||||||
|
parameter ZERO_LEVEL = 8192 // 8192 or 0
|
||||||
)
|
)
|
||||||
(
|
(
|
||||||
input clk_in,
|
input clk_dac,
|
||||||
input rst,
|
input rst,
|
||||||
input start,
|
input start,
|
||||||
input [31:0] pulse_width,
|
input [31:0] pulse_width,
|
||||||
input [31:0] pulse_period,
|
input [31:0] pulse_period,
|
||||||
input [DATA_WIDTH-1:0] pulse_height,
|
input [DATA_WIDTH-1:0] pulse_height,
|
||||||
input [15:0] pulse_num,
|
input [15:0] pulse_num,
|
||||||
|
input request,
|
||||||
|
|
||||||
output pulse,
|
output logic [DATA_WIDTH-1:0] dac_out,
|
||||||
output[DATA_WIDTH-1:0] pulse_height_out
|
output logic done
|
||||||
|
|
||||||
);
|
);
|
||||||
|
logic [DATA_WIDTH-1:0] pulse_height_reg;
|
||||||
logic [DATA_WIDTH-1:0] pulse_height_reg, pulse_height_out_reg;
|
|
||||||
logic pulse_reg;
|
|
||||||
|
|
||||||
logic [31:0] pulse_width_reg, pulse_period_reg;
|
logic [31:0] pulse_width_reg, pulse_period_reg;
|
||||||
logic [15:0] pulse_num_reg;
|
logic [15:0] pulse_num_reg;
|
||||||
|
|
||||||
logic enable;
|
|
||||||
logic [15:0] cnt_pulse_num;
|
logic [15:0] cnt_pulse_num;
|
||||||
logic [31:0] cnt_period;
|
logic [31:0] cnt_pulse_period;
|
||||||
|
|
||||||
logic start_d;
|
logic enable, synced;
|
||||||
|
|
||||||
always @(posedge clk_in) begin
|
always @(posedge clk_dac) begin
|
||||||
start_d <= start;
|
|
||||||
end
|
|
||||||
|
|
||||||
wire start_pulse = start & ~start_d;
|
|
||||||
|
|
||||||
|
|
||||||
always @(posedge clk_in) begin
|
|
||||||
if (rst) begin
|
if (rst) begin
|
||||||
pulse_reg <= '0;
|
pulse_height_reg <= ZERO_LEVEL;
|
||||||
pulse_height_reg <= 0;
|
pulse_width_reg <= 0;
|
||||||
pulse_height_out_reg <= '0;
|
pulse_period_reg <= 0;
|
||||||
|
pulse_num_reg <= 0;
|
||||||
pulse_width_reg <= '0;
|
cnt_pulse_num <= 0;
|
||||||
pulse_period_reg <= '0;
|
cnt_pulse_period <= 0;
|
||||||
pulse_num_reg <= '0;
|
dac_out <= ZERO_LEVEL;
|
||||||
|
done <= 0;
|
||||||
enable <= 0;
|
enable <= 0;
|
||||||
cnt_pulse_num <= '0;
|
synced <= 0;
|
||||||
cnt_period <= '0;
|
|
||||||
end else begin
|
|
||||||
if (start) begin
|
|
||||||
enable <= 1'b1;
|
|
||||||
// pulse_width_reg <= pulse_width;
|
|
||||||
// pulse_period_reg <= pulse_period;
|
|
||||||
// pulse_num_reg <= pulse_num;
|
|
||||||
// pulse_height_reg <= pulse_height;
|
|
||||||
|
|
||||||
cnt_pulse_num <= '0;
|
|
||||||
cnt_period <= '0;
|
|
||||||
end
|
end
|
||||||
if (enable) begin
|
else begin
|
||||||
pulse_reg <= 1;
|
// wait start for updating registers
|
||||||
|
if (start & !enable) begin
|
||||||
|
enable <= 1;
|
||||||
pulse_width_reg <= pulse_width;
|
pulse_width_reg <= pulse_width;
|
||||||
pulse_period_reg <= pulse_period;
|
pulse_period_reg <= pulse_period;
|
||||||
pulse_num_reg <= pulse_num;
|
pulse_num_reg <= pulse_num;
|
||||||
pulse_height_reg <= pulse_height;
|
pulse_height_reg <= pulse_height;
|
||||||
|
|
||||||
if (pulse_reg) begin
|
|
||||||
|
|
||||||
if (cnt_period < pulse_width_reg) begin
|
|
||||||
pulse_height_out_reg <= pulse_height_reg;
|
|
||||||
end else begin
|
|
||||||
pulse_height_out_reg <= '0;
|
|
||||||
end
|
end
|
||||||
if (cnt_period == pulse_period_reg - 1) begin
|
// main work cycle
|
||||||
cnt_period <= 0;
|
if (enable) begin
|
||||||
if (cnt_pulse_num == pulse_num_reg - 1) begin
|
if (cnt_pulse_num != pulse_num_reg) begin
|
||||||
|
// wait for synchronization with sampler
|
||||||
|
if (!synced) begin
|
||||||
|
if (request & done) begin
|
||||||
|
synced <= 1;
|
||||||
|
done <= 0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
done <= 1;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if (cnt_pulse_period != pulse_period_reg) begin
|
||||||
|
if (cnt_pulse_period < pulse_width_reg)
|
||||||
|
dac_out <= pulse_height_reg;
|
||||||
|
else
|
||||||
|
dac_out <= ZERO_LEVEL;
|
||||||
|
cnt_pulse_period++;
|
||||||
|
end
|
||||||
|
else if (cnt_pulse_period == pulse_period_reg) begin
|
||||||
|
cnt_pulse_num++;
|
||||||
|
cnt_pulse_period <= 0;
|
||||||
|
synced <= 0;
|
||||||
|
dac_out <= ZERO_LEVEL;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if (cnt_pulse_num == pulse_num_reg) begin
|
||||||
|
cnt_pulse_num <= 0;
|
||||||
enable <= 0;
|
enable <= 0;
|
||||||
pulse_reg <= 0;
|
|
||||||
end else begin
|
|
||||||
cnt_pulse_num <= cnt_pulse_num + 1;
|
|
||||||
end
|
|
||||||
end else begin
|
|
||||||
cnt_period <= cnt_period + 1;
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
OBUF OBUF_pulse_clk (
|
|
||||||
.I(clk_in),
|
|
||||||
.O(pulse)
|
|
||||||
);
|
|
||||||
|
|
||||||
assign pulse_height_out = pulse_height_out_reg;
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|||||||
@ -1,105 +1,360 @@
|
|||||||
`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
module generator_tb;
|
module generator_tb;
|
||||||
|
// === Параметры ===
|
||||||
|
localparam DATA_WIDTH = 14;
|
||||||
|
localparam LOGIC_ZERO_LEVEL = 0; // DAC -5V for logic zero
|
||||||
|
localparam VOLTAGE_ZERO_LEVEL = 2**(DATA_WIDTH-1); // DAC 0V for logic zero
|
||||||
|
localparam CLK_PERIOD = 8;
|
||||||
|
parameter string ZERO_LEVEL = "logic"; // "logic" VS "true"
|
||||||
|
|
||||||
parameter DATA_WIDTH = 14;
|
// === Сигналы ===
|
||||||
parameter CLK_PERIOD = 16;
|
// Системные сигналы
|
||||||
|
|
||||||
logic clk;
|
logic clk;
|
||||||
logic rst;
|
logic rst;
|
||||||
logic start;
|
logic start;
|
||||||
|
// Входные сигналы
|
||||||
|
logic [31:0] pulse_width; // config reg
|
||||||
|
logic [31:0] pulse_period; // config reg
|
||||||
|
logic [DATA_WIDTH-1:0] pulse_height; // config reg
|
||||||
|
logic [15:0] pulse_num; // config reg
|
||||||
|
logic sampler_done; // sampler request for synchronization
|
||||||
|
// Выходные сигналы
|
||||||
|
wire [DATA_WIDTH-1:0] dac_out; // DAC input logic signal
|
||||||
|
wire generator_done; // generator request for synchronization
|
||||||
|
|
||||||
logic [31:0] pulse_width;
|
// === Переменные ===
|
||||||
logic [31:0] pulse_period;
|
int current_zero_level;
|
||||||
logic [DATA_WIDTH-1:0] pulse_height;
|
initial begin
|
||||||
logic [15:0] pulse_num;
|
if (ZERO_LEVEL == "true")
|
||||||
|
current_zero_level = VOLTAGE_ZERO_LEVEL;
|
||||||
logic pulse;
|
else
|
||||||
logic [DATA_WIDTH-1:0] pulse_height_out;
|
current_zero_level = LOGIC_ZERO_LEVEL;
|
||||||
|
end
|
||||||
|
|
||||||
// DUT
|
// DUT
|
||||||
|
generate
|
||||||
|
if (ZERO_LEVEL == "true") begin : gen_dut_true
|
||||||
generator #(
|
generator #(
|
||||||
.DATA_WIDTH(DATA_WIDTH)
|
.DATA_WIDTH(DATA_WIDTH),
|
||||||
|
.ZERO_LEVEL(VOLTAGE_ZERO_LEVEL)
|
||||||
) dut (
|
) dut (
|
||||||
.clk_in(clk),
|
.clk_dac(clk),
|
||||||
.rst(rst),
|
.rst(rst),
|
||||||
.start(start),
|
.start(start),
|
||||||
.pulse_width(pulse_width),
|
.pulse_width(pulse_width),
|
||||||
.pulse_period(pulse_period),
|
.pulse_period(pulse_period),
|
||||||
.pulse_height(pulse_height),
|
.pulse_height(pulse_height),
|
||||||
.pulse_num(pulse_num),
|
.pulse_num(pulse_num),
|
||||||
.pulse(pulse),
|
.dac_out(dac_out),
|
||||||
.pulse_height_out(pulse_height_out)
|
.done(generator_done),
|
||||||
|
.request(sampler_done)
|
||||||
);
|
);
|
||||||
|
initial $display("[TB] Generator compiled. ZERO_LEVEL: TRUE");
|
||||||
|
end
|
||||||
|
else if (ZERO_LEVEL == "logic") begin : gen_dut_logic
|
||||||
|
generator #(
|
||||||
|
.DATA_WIDTH(DATA_WIDTH),
|
||||||
|
.ZERO_LEVEL(LOGIC_ZERO_LEVEL)
|
||||||
|
) dut (
|
||||||
|
.clk_dac(clk),
|
||||||
|
.rst(rst),
|
||||||
|
.start(start),
|
||||||
|
.pulse_width(pulse_width),
|
||||||
|
.pulse_period(pulse_period),
|
||||||
|
.pulse_height(pulse_height),
|
||||||
|
.pulse_num(pulse_num),
|
||||||
|
.dac_out(dac_out),
|
||||||
|
.done(generator_done),
|
||||||
|
.request(sampler_done)
|
||||||
|
);
|
||||||
|
initial $display("[TB] Generator compiled. ZERO_LEVEL: LOGIC");
|
||||||
|
end
|
||||||
|
else begin : gen_dut_error
|
||||||
|
// Защита от дурака
|
||||||
|
initial begin
|
||||||
|
$display("[ERROR] Unknown value ZERO_LEVEL: %s", ZERO_LEVEL);
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
// Clock
|
// Тактовые сигналы
|
||||||
initial begin
|
initial begin
|
||||||
clk = 0;
|
clk = 0;
|
||||||
forever #(CLK_PERIOD/2) clk = ~clk;
|
forever #(CLK_PERIOD/2) clk = ~clk;
|
||||||
end
|
end
|
||||||
|
|
||||||
initial begin
|
// === Таски для тестипрования ===
|
||||||
$display("\n=== GENERATOR TEST ===\n");
|
// Таска синхронизации, одно рукопожатие
|
||||||
|
task automatic synchronize(
|
||||||
|
input bit sampler_first, // 1 - выставить sampler_done ДО генератора, 0 - ПОСЛЕ
|
||||||
|
input int delay_before_ack, // Если sampler_first=0: задержка ПОСЛЕ gen_done. Если 1: задержка от НАЧАЛА цикла.
|
||||||
|
input int ack_duration // сколько тактов удерживать sampler_done после встречи сигналов
|
||||||
|
);
|
||||||
|
if (sampler_first) begin
|
||||||
|
// --- сэмплер готов до генератора ---
|
||||||
|
repeat(delay_before_ack) @(posedge clk);
|
||||||
|
sampler_done <= 1;
|
||||||
|
wait(generator_done == 1);
|
||||||
|
repeat(ack_duration) @(posedge clk);
|
||||||
|
sampler_done <= 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
// --- генератора готов до сэмплер ---
|
||||||
|
wait(generator_done == 1);
|
||||||
|
repeat(delay_before_ack) @(posedge clk);
|
||||||
|
sampler_done <= 1;
|
||||||
|
repeat(ack_duration) @(posedge clk);
|
||||||
|
sampler_done <= 0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// Таска сброса DUT
|
||||||
|
task automatic reset_dut(
|
||||||
|
input int rst_duration // сколько тактов держать сброс
|
||||||
|
);
|
||||||
|
rst <= 1;
|
||||||
|
repeat(rst_duration) @(posedge clk);
|
||||||
|
rst <= 0;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// Таска запуска DUT
|
||||||
|
task automatic start_dut(
|
||||||
|
input int start_duration // сколько тактов держать импульс
|
||||||
|
);
|
||||||
|
start <= 1;
|
||||||
|
repeat(start_duration) @(posedge clk);
|
||||||
|
start <= 0;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// Таска конфигурации DUT
|
||||||
|
task automatic set_config(
|
||||||
|
input logic [31:0] w, // ширина импульса
|
||||||
|
input logic [31:0] p, // период импульса
|
||||||
|
input logic [15:0] n, // количество импульсов
|
||||||
|
input logic [DATA_WIDTH-1:0] h // высота импульса
|
||||||
|
);
|
||||||
|
// Задаем конфигурационные регистры
|
||||||
|
@(posedge clk);
|
||||||
|
pulse_width <= w;
|
||||||
|
pulse_period <= p;
|
||||||
|
pulse_num <= n;
|
||||||
|
pulse_height <= h;
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// Таска проверки устойчивости к долгим управляющим импульсам
|
||||||
|
task automatic check_impulses;
|
||||||
|
// Локальные переменные для хранения случайных параметров
|
||||||
|
int rand_start_duration;
|
||||||
|
int rand_delay;
|
||||||
|
int rand_ack;
|
||||||
|
bit rand_first;
|
||||||
|
int total_impulse_cycles = 0;
|
||||||
|
|
||||||
|
int pulse_w = 11;
|
||||||
|
int pulse_p = 31;
|
||||||
|
int pulse_n = 5;
|
||||||
|
int pulse_h = 1024;
|
||||||
|
|
||||||
|
$display("[TB] -check_impulses- Check system stability under random latencies");
|
||||||
|
|
||||||
|
// Установка конфигурации
|
||||||
|
set_config(
|
||||||
|
.w(pulse_w),
|
||||||
|
.p(pulse_p),
|
||||||
|
.n(pulse_n),
|
||||||
|
.h(pulse_h)
|
||||||
|
);
|
||||||
|
|
||||||
|
reset_dut(5);
|
||||||
|
repeat(2) @(posedge clk);
|
||||||
|
|
||||||
|
// Старт норме 1 такт. Сделаем случайным от 5 до 25 тактов.
|
||||||
|
rand_start_duration = $urandom_range(5, 25);
|
||||||
|
$display("[TB] Long start: %0d clocks", rand_start_duration);
|
||||||
|
|
||||||
|
// Фоновый процесс подсчета тактов импульса
|
||||||
|
fork
|
||||||
|
begin : counter_proc
|
||||||
|
forever begin
|
||||||
|
@(negedge clk); // 180 deg. phase shift for "DAC strobing signal"
|
||||||
|
if (dac_out == pulse_h) begin
|
||||||
|
total_impulse_cycles++;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
join_none
|
||||||
|
|
||||||
|
// Параллельный запуск длинного старта и обработки синхронизации
|
||||||
|
fork
|
||||||
|
// Поток 1: Удерживаем старт аномально долго
|
||||||
|
begin
|
||||||
|
start_dut(rand_start_duration);
|
||||||
|
end
|
||||||
|
// Поток 2: Обслуживаем n=4 циклов синхронизации со случайными задержками
|
||||||
|
begin
|
||||||
|
repeat(pulse_n) begin
|
||||||
|
// Рандомизируем параметры для каждого из 4-х рукопожатий
|
||||||
|
rand_first = $urandom; // Случайно: Самплер первый (1) или Генератор первый (0)
|
||||||
|
rand_delay = $urandom_range(1, 8); // Случайная задержка ожидания (1..8 тактов)
|
||||||
|
rand_ack = $urandom_range(5, 10); // Аномально долгий удерживаемый импульс sampler_done (10..30 тактов)
|
||||||
|
|
||||||
|
synchronize(
|
||||||
|
.sampler_first(rand_first),
|
||||||
|
.delay_before_ack(rand_delay),
|
||||||
|
.ack_duration(rand_ack)
|
||||||
|
);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
join
|
||||||
|
repeat(pulse_p+5) @(posedge clk);
|
||||||
|
disable counter_proc;
|
||||||
|
// Ожидание завершения переходных процессов
|
||||||
|
repeat(10) @(posedge clk);
|
||||||
|
if (total_impulse_cycles == pulse_w*pulse_n)
|
||||||
|
$display("[TB] -check_impulses- Pulse generation CORRECT");
|
||||||
|
else begin
|
||||||
|
$display("[ERROR] -check_impulses- Pulse generation INCORRECT. Total number of pulses: %d, must be: %d", total_impulse_cycles, pulse_w*pulse_n);
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
$display("[TB] -check_impulses- Done");
|
||||||
|
endtask
|
||||||
|
|
||||||
|
task automatic run_test_case(
|
||||||
|
input int pulse_w,
|
||||||
|
input int pulse_p,
|
||||||
|
input int pulse_n,
|
||||||
|
input int pulse_h,
|
||||||
|
input bit skip_reset, // skip reset sequence on demand
|
||||||
|
input bit count_level // count ticks of amplitude == pulse_h or amplitude != pulse_h
|
||||||
|
);
|
||||||
|
int total_impulse_cycles = 0;
|
||||||
|
|
||||||
|
if (!skip_reset) begin
|
||||||
|
reset_dut(1);
|
||||||
|
@(posedge clk);
|
||||||
|
end
|
||||||
|
|
||||||
|
set_config(
|
||||||
|
.w(pulse_w),
|
||||||
|
.p(pulse_p),
|
||||||
|
.n(pulse_n),
|
||||||
|
.h(pulse_h)
|
||||||
|
);
|
||||||
|
@(posedge clk);
|
||||||
|
|
||||||
|
start_dut(1);
|
||||||
|
|
||||||
|
// Фоновый процесс подсчета тактов импульса
|
||||||
|
fork
|
||||||
|
begin : counter_proc
|
||||||
|
forever begin
|
||||||
|
@(negedge clk); // 180 deg. phase shift for "DAC strobing signal"
|
||||||
|
if (count_level) begin
|
||||||
|
if (dac_out == pulse_h) begin
|
||||||
|
total_impulse_cycles++;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if (dac_out != current_zero_level) begin
|
||||||
|
total_impulse_cycles++;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
join_none
|
||||||
|
|
||||||
|
repeat(pulse_n) begin
|
||||||
|
synchronize(
|
||||||
|
.sampler_first(0),
|
||||||
|
.delay_before_ack(1),
|
||||||
|
.ack_duration(2)
|
||||||
|
);
|
||||||
|
end
|
||||||
|
repeat(pulse_p+5) @(posedge clk);
|
||||||
|
disable counter_proc;
|
||||||
|
repeat(10) @(posedge clk);
|
||||||
|
|
||||||
|
if (count_level) begin
|
||||||
|
if (total_impulse_cycles == pulse_w*pulse_n)
|
||||||
|
$display("[TB] -run_test_case- Pulse generation CORRECT");
|
||||||
|
else begin
|
||||||
|
$display("[ERROR] -run_test_case- Pulse generation INCORRECT. Total number of pulses: %d, must be: %d", total_impulse_cycles, pulse_w*pulse_n);
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if (total_impulse_cycles == 0)
|
||||||
|
$display("[TB] -run_test_case- Pulse generation CORRECT");
|
||||||
|
else begin
|
||||||
|
$display("[ERROR] -run_test_case- Pulse generation INCORRECT. Total number of pulses: %d, must be: %d", total_impulse_cycles, 0);
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// --- ОСНОВНОЙ ПРОЦЕСС ТЕСТИРОВАНИЯ ---
|
||||||
|
initial begin
|
||||||
|
$display("[TB] Tests start");
|
||||||
|
|
||||||
|
// Инициализация
|
||||||
rst = 1;
|
rst = 1;
|
||||||
start = 0;
|
start = 0;
|
||||||
|
|
||||||
pulse_width = 0;
|
pulse_width = 0;
|
||||||
pulse_period = 0;
|
pulse_period = 0;
|
||||||
pulse_height = 0;
|
pulse_height = 0;
|
||||||
pulse_num = 0;
|
pulse_num = 0;
|
||||||
|
sampler_done = 0;
|
||||||
|
|
||||||
repeat(5) @(posedge clk);
|
$display("[TB] Test 1. Random latency for control signals");
|
||||||
rst = 0;
|
check_impulses();
|
||||||
|
$display("[TB] Test 1 complete");
|
||||||
|
|
||||||
// --- Test 1 ---
|
$display("[TB] Test 2. Random configs");
|
||||||
// 3 clk 1, 5 clk 0, 4 pulses
|
for (int i = 0; i < 25; i++) begin
|
||||||
repeat(2) @(posedge clk);
|
int r_w, r_p, r_n, r_h;
|
||||||
pulse_width = 3;
|
bit r_skip;
|
||||||
pulse_period = 8;
|
|
||||||
pulse_num = 4;
|
|
||||||
pulse_height = 14'h3FF;
|
|
||||||
start = 1;
|
|
||||||
|
|
||||||
repeat(1) @(posedge clk);
|
// Генерируем параметры
|
||||||
start = 0;
|
r_p = $urandom_range(5, 50); // Период от 5 до 50
|
||||||
|
r_w = $urandom_range(0, r_p); // Ширина не больше периода
|
||||||
|
r_n = $urandom_range(1, 10); // Количество импульсов
|
||||||
|
r_h = $urandom_range(1, 2**DATA_WIDTH-1); // Высота (для 14 бит)
|
||||||
|
r_skip = $urandom_range(0, 1); // Случайный сброс (0 - сброс, 1 - пропуск)
|
||||||
|
|
||||||
repeat(50) @(posedge clk);
|
// Защита от "нулевого" импульса. Невозможно проверить длительность.
|
||||||
|
if (r_h == current_zero_level) begin
|
||||||
|
r_h += $urandom_range(1, 10);
|
||||||
|
end
|
||||||
|
|
||||||
// --- Test 2 ---
|
$display("[TB] --- Test #%0d (Config: W=%0d, P=%0d, N=%0d, H=%0d, SkipReset=%0b) ---",
|
||||||
$display("\n--- SECOND RUN ---\n");
|
i+1, r_w, r_p, r_n, r_h, r_skip);
|
||||||
|
|
||||||
@(posedge clk);
|
run_test_case(
|
||||||
pulse_width = 2;
|
.pulse_w(r_w),
|
||||||
pulse_period = 5;
|
.pulse_p(r_p),
|
||||||
pulse_num = 3;
|
.pulse_n(r_n),
|
||||||
pulse_height = 14'h155;
|
.pulse_h(r_h),
|
||||||
start = 1;
|
.skip_reset(r_skip),
|
||||||
|
.count_level(1)
|
||||||
|
);
|
||||||
|
end
|
||||||
|
$display("[TB] Test 2 complete");
|
||||||
|
|
||||||
@(posedge clk);
|
$display("[TB] Test 3. Zero level of pulse height");
|
||||||
start = 0;
|
run_test_case(
|
||||||
|
.pulse_w(77),
|
||||||
|
.pulse_p(131),
|
||||||
|
.pulse_n(13),
|
||||||
|
.pulse_h(current_zero_level),
|
||||||
|
.skip_reset(0),
|
||||||
|
.count_level(0)
|
||||||
|
);
|
||||||
|
$display("[TB] Test 3 complete");
|
||||||
|
|
||||||
repeat(40) @(posedge clk);
|
$display("[TB] ALL PASSED");
|
||||||
|
|
||||||
pulse_width = 3;
|
|
||||||
pulse_period = 8;
|
|
||||||
pulse_num = 4;
|
|
||||||
pulse_height = 14'h3FF;
|
|
||||||
start = 1;
|
|
||||||
|
|
||||||
repeat(1) @(posedge clk);
|
|
||||||
start = 0;
|
|
||||||
|
|
||||||
repeat(50) @(posedge clk);
|
|
||||||
|
|
||||||
$display("\n=== TEST FINISHED ===");
|
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
|
|
||||||
// Display
|
|
||||||
always @(posedge clk) begin
|
|
||||||
$display("t=%0t | pulse=%0b | height=%h",
|
|
||||||
$time, pulse, pulse_height_out);
|
|
||||||
end
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
144
rtl/sampler/README.md
Normal file
144
rtl/sampler/README.md
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
# Сэмплер
|
||||||
|
|
||||||
|
Модуль выполняет задачу сбора данных с выхода АЦП, их обработки, упаковки и передачи дальше с помощью AXI Stream интерфейса.
|
||||||
|
Дополнительно реализован механизм синхронизации с внешним генератором через сигналы `request` и `done`, позволяющий запускать сбор строго по запросу и подтверждать завершение выборки.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Список параметров
|
||||||
|
|
||||||
|
DATA_WIDTH
|
||||||
|
Ширина входных данных, получаемых с АЦП.
|
||||||
|
|
||||||
|
PACK_FACTOR
|
||||||
|
Количество отсчетов, собираемых в один выходной пакет.
|
||||||
|
|
||||||
|
PROCESS_MODE
|
||||||
|
Режим интерпретации входного кода:
|
||||||
|
|
||||||
|
- `0` — прямой код
|
||||||
|
- `1` — дополнительный код
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Список входных портов
|
||||||
|
|
||||||
|
clk_in
|
||||||
|
Сигнал тактирования выходного интерфейса.
|
||||||
|
|
||||||
|
rst
|
||||||
|
Сброс модуля и остановка работы.
|
||||||
|
|
||||||
|
[DATA_WIDTH-1:0] data_in
|
||||||
|
Входной сигнал с АЦП.
|
||||||
|
|
||||||
|
out_of_range
|
||||||
|
Флаг выхода значений данных за допустимый диапазон:
|
||||||
|
|
||||||
|
- `0` — данные валидны
|
||||||
|
- `1` — данные невалидны и игнорируются
|
||||||
|
|
||||||
|
[31:0] smp_num
|
||||||
|
Количество валидных отсчетов, которое необходимо собрать после получения запроса на выборку.
|
||||||
|
|
||||||
|
request
|
||||||
|
Сигнал запроса на синхронизацию от генератора для текущего импульса.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Список выходных портов
|
||||||
|
|
||||||
|
[DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata
|
||||||
|
Урезанный AXI Stream формат, выходные данные.
|
||||||
|
Ширина шины определяется как произведение битности данных и фактора упаковки.
|
||||||
|
|
||||||
|
m_axis_tvalid
|
||||||
|
Урезанный AXI Stream формат, сигнал валидности выходных данных.
|
||||||
|
Формируется при готовности очередного пакета.
|
||||||
|
|
||||||
|
done
|
||||||
|
Сигнал запроса на запуск синхронизации с генератором для текущего импульса.
|
||||||
|
|
||||||
|
Поднимается в начале каждого нового импульса и снимается после получения `request`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Логика работы
|
||||||
|
|
||||||
|
На каждом такте принимаются:
|
||||||
|
|
||||||
|
- `data_in` — значение АЦП
|
||||||
|
- `out_of_range` — флаг допустимости значения
|
||||||
|
|
||||||
|
Если `out_of_range = 1`, данные считаются невалидными, игнорируются и не попадают во внутренний буфер.
|
||||||
|
|
||||||
|
Если `out_of_range = 0`, данные считаются корректными и используются для дальнейшей обработки.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Преобразование данных
|
||||||
|
|
||||||
|
Если `PROCESS_MODE = 1`, входные данные интерпретируются как дополнительный код и преобразуются перед упаковкой.
|
||||||
|
|
||||||
|
Если `PROCESS_MODE = 0`, данные передаются без преобразования (прямой код).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Запуск выборки
|
||||||
|
|
||||||
|
Сбор данных начинается только после прихода сигнала `request`.
|
||||||
|
|
||||||
|
При этом:
|
||||||
|
|
||||||
|
- фиксируется значение `smp_num`
|
||||||
|
- внутренний счетчик собранных отсчетов обнуляется
|
||||||
|
- модуль переходит в активное состояние (`enable = 1`)
|
||||||
|
|
||||||
|
Пока `enable = 1`, модуль принимает только валидные отсчеты.
|
||||||
|
|
||||||
|
Синхронизация представляет из себя простое рукопожатие с внешним модулем, имеющим сигналы `request`/`done` работающими в соответствии с этими сигналами сэмплера. Один из модулей, входит в ожидание и ставит на свой done активный уровень, после чего ждет, пока второй, запаздывающий модуль не войдет в свой режим ожидания, и не выставит для своего done активный уровень. Для каждого из модулей, на следующий такт после выставления активного уровня, производится проверка своего request. Так, при получении активного request (иными словами активного done от внешнего модуля), модуль незамедлительно опускает уровень своего done и начинает работать. Done подымается до активного уровня хотя-бы на один такт работы соответствующего модуля.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Упаковка данных
|
||||||
|
|
||||||
|
Внутренний буфер заполняется до количества данных, равного `PACK_FACTOR`.
|
||||||
|
|
||||||
|
#### Если `PACK_FACTOR = 1`
|
||||||
|
|
||||||
|
Каждый валидный отсчет сразу формирует выходной пакет:
|
||||||
|
|
||||||
|
- данные передаются в `m_axis_tdata`
|
||||||
|
- формируется импульс `m_axis_tvalid`
|
||||||
|
|
||||||
|
#### Если `PACK_FACTOR > 1`
|
||||||
|
|
||||||
|
Данные последовательно накапливаются во внутреннем сдвиговом буфере.
|
||||||
|
|
||||||
|
Когда буфер полностью заполнен:
|
||||||
|
|
||||||
|
- формируется пакет упакованных данных
|
||||||
|
- поднимается `m_axis_tvalid`
|
||||||
|
|
||||||
|
После этого начинается сбор следующего пакета.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Завершение выборки
|
||||||
|
|
||||||
|
Когда количество собранных валидных отсчетов достигает значения `smp_num`:
|
||||||
|
|
||||||
|
- внутренние счетчики сбрасываются
|
||||||
|
- буфер очищается
|
||||||
|
- `enable` сбрасывается в `0`
|
||||||
|
|
||||||
|
Это означает полное завершение текущего цикла выборки.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Симуляция
|
||||||
|
Тесты запускаются автоматически через make.
|
||||||
|
```
|
||||||
|
cd tests
|
||||||
|
make sim
|
||||||
|
```
|
||||||
@ -1,62 +1,132 @@
|
|||||||
`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module sampler
|
module sampler
|
||||||
#(
|
#(
|
||||||
parameter DATA_WIDTH = 12,
|
parameter DATA_WIDTH = 12,
|
||||||
parameter PACK_FACTOR = 3,
|
parameter PACK_FACTOR = 1,
|
||||||
parameter PROCESS_MODE = 1
|
parameter PROCESS_MODE = 0
|
||||||
)
|
)
|
||||||
(
|
(
|
||||||
input clk_in,
|
input clk_in,
|
||||||
input rst,
|
input rst,
|
||||||
input [DATA_WIDTH-1:0] data_in,
|
input [DATA_WIDTH-1:0] data_in,
|
||||||
input out_of_range,
|
input out_of_range,
|
||||||
|
input [31:0] smp_num,
|
||||||
|
input done,
|
||||||
|
|
||||||
output logic [DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata,
|
output logic [DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata,
|
||||||
output logic m_axis_tvalid
|
output logic m_axis_tvalid,
|
||||||
|
output logic request
|
||||||
);
|
);
|
||||||
logic [DATA_WIDTH-1:0] data_converted;
|
(* MARK_DEBUG="true" *) logic [DATA_WIDTH-1:0] data_converted;
|
||||||
logic out_of_range_reg;
|
(* MARK_DEBUG="true" *) logic out_of_range_reg;
|
||||||
|
(* MARK_DEBUG="true" *) logic [31:0] smp_num_reg, cnt_smp_num;
|
||||||
|
(* MARK_DEBUG="true" *) logic enable, enable_d;
|
||||||
|
|
||||||
|
generate
|
||||||
|
if (PROCESS_MODE) begin
|
||||||
|
|
||||||
always @(posedge clk_in) begin
|
always @(posedge clk_in) begin
|
||||||
if (rst) begin
|
if (rst) begin
|
||||||
data_converted <= '0;
|
data_converted <= '0;
|
||||||
end else begin
|
out_of_range_reg <= 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
out_of_range_reg <= out_of_range;
|
out_of_range_reg <= out_of_range;
|
||||||
if (PROCESS_MODE) begin
|
if (data_in == {1'b1, {(DATA_WIDTH-1){1'b0}}})
|
||||||
if (data_in == 12'b100000000000) begin
|
|
||||||
data_converted <= data_in;
|
data_converted <= data_in;
|
||||||
end else begin
|
else
|
||||||
data_converted <= data_in[DATA_WIDTH-1] ?{1'b1, (~data_in[DATA_WIDTH-2:0] + 1'b1)}:data_in;
|
data_converted <= data_in[DATA_WIDTH-1] ?{1'b1, (~data_in[DATA_WIDTH-2:0] + 1'b1)}:data_in;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end else begin
|
end else begin
|
||||||
|
always @(posedge clk_in) begin
|
||||||
|
if (rst) begin
|
||||||
|
data_converted <= '0;
|
||||||
|
out_of_range_reg <= 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
out_of_range_reg <= out_of_range;
|
||||||
data_converted <= data_in;
|
data_converted <= data_in;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
(* MARK_DEBUG="true" *) logic [DATA_WIDTH*PACK_FACTOR-1:0] buffer;
|
||||||
logic [DATA_WIDTH*PACK_FACTOR-1:0] buffer;
|
(* MARK_DEBUG="true" *) logic buffer_ready;
|
||||||
logic buffer_ready;
|
|
||||||
|
|
||||||
logic [$clog2(PACK_FACTOR):0] cnt;
|
logic [$clog2(PACK_FACTOR):0] cnt;
|
||||||
|
|
||||||
|
generate
|
||||||
|
if (PACK_FACTOR == 1) begin
|
||||||
always @(posedge clk_in) begin
|
always @(posedge clk_in) begin
|
||||||
if (rst) begin
|
if (rst) begin
|
||||||
buffer <= '0;
|
buffer <= '0;
|
||||||
cnt <= -1; //
|
|
||||||
buffer_ready <= 0;
|
buffer_ready <= 0;
|
||||||
|
cnt_smp_num <= '0;
|
||||||
|
smp_num_reg <= '0;
|
||||||
|
enable <= 0;
|
||||||
|
request <= 0;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
buffer_ready <= 0;
|
buffer_ready <= 0;
|
||||||
|
if (!enable) begin
|
||||||
|
if (request && done) begin
|
||||||
|
enable <= 1;
|
||||||
|
request <= 0;
|
||||||
|
cnt_smp_num <= 0;
|
||||||
|
smp_num_reg <= smp_num;
|
||||||
|
end else begin
|
||||||
|
request <= 1;
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
if (cnt_smp_num != smp_num_reg) begin
|
||||||
|
cnt_smp_num <= cnt_smp_num +1;
|
||||||
|
buffer_ready <= 1;
|
||||||
|
if (!out_of_range_reg) begin
|
||||||
|
buffer <= data_converted;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
cnt_smp_num <= '0;
|
||||||
|
buffer_ready <= 0;
|
||||||
|
enable <= 0;
|
||||||
|
buffer <= '0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
always @(posedge clk_in) begin
|
||||||
|
if (rst) begin
|
||||||
|
buffer <= '0;
|
||||||
|
cnt <= '0; //
|
||||||
|
buffer_ready <= 0;
|
||||||
|
cnt_smp_num <= '0;
|
||||||
|
smp_num_reg <= '0;
|
||||||
|
enable <= 0;
|
||||||
|
request <= 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
buffer_ready <= 0;
|
||||||
|
if (!enable) begin
|
||||||
|
if (request && done) begin
|
||||||
|
enable <= 1;
|
||||||
|
request <= 0;
|
||||||
|
cnt_smp_num <= 0;
|
||||||
|
smp_num_reg <= smp_num;
|
||||||
|
end else begin
|
||||||
|
request <= 1;
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
if (cnt_smp_num != smp_num_reg) begin
|
||||||
|
cnt_smp_num <= cnt_smp_num +1;
|
||||||
|
buffer_ready <= 1;
|
||||||
if (!out_of_range_reg) begin
|
if (!out_of_range_reg) begin
|
||||||
buffer <= {buffer[DATA_WIDTH*(PACK_FACTOR-1)-1:0], data_converted};
|
buffer <= {buffer[DATA_WIDTH*(PACK_FACTOR-1)-1:0], data_converted};
|
||||||
if (cnt == PACK_FACTOR-1) begin
|
if (cnt == PACK_FACTOR-1) begin
|
||||||
cnt <= 0;
|
cnt <= 0;
|
||||||
buffer_ready <= 1;
|
|
||||||
buffer <= {buffer[DATA_WIDTH*(PACK_FACTOR-1)-1:0], data_converted};
|
buffer <= {buffer[DATA_WIDTH*(PACK_FACTOR-1)-1:0], data_converted};
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
@ -64,7 +134,17 @@ module sampler
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
else begin
|
||||||
|
cnt_smp_num <= '0;
|
||||||
|
buffer_ready <= 0;
|
||||||
|
enable <= 0;
|
||||||
|
cnt <= 0;
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
assign m_axis_tdata = buffer;
|
assign m_axis_tdata = buffer;
|
||||||
assign m_axis_tvalid = buffer_ready;
|
assign m_axis_tvalid = buffer_ready;
|
||||||
|
|||||||
194
rtl/sampler/tests/sampler_tb.sv
Normal file
194
rtl/sampler/tests/sampler_tb.sv
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
module sampler_tb;
|
||||||
|
|
||||||
|
localparam DATA_WIDTH = 12;
|
||||||
|
localparam PACK_FACTOR = 1;
|
||||||
|
localparam PROCESS_MODE = 0;
|
||||||
|
localparam CLK_PERIOD = 15.3846;
|
||||||
|
|
||||||
|
logic clk;
|
||||||
|
logic rst;
|
||||||
|
|
||||||
|
logic [DATA_WIDTH-1:0] data_in;
|
||||||
|
logic out_of_range;
|
||||||
|
|
||||||
|
logic [31:0] smp_num;
|
||||||
|
|
||||||
|
logic done;
|
||||||
|
logic request;
|
||||||
|
|
||||||
|
logic [DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata;
|
||||||
|
logic m_axis_tvalid;
|
||||||
|
|
||||||
|
int received_count;
|
||||||
|
|
||||||
|
sampler #(
|
||||||
|
.DATA_WIDTH (DATA_WIDTH),
|
||||||
|
.PACK_FACTOR (PACK_FACTOR),
|
||||||
|
.PROCESS_MODE(PROCESS_MODE)
|
||||||
|
) dut (
|
||||||
|
.clk_in (clk),
|
||||||
|
.rst (rst),
|
||||||
|
|
||||||
|
.data_in (data_in),
|
||||||
|
.out_of_range (out_of_range),
|
||||||
|
|
||||||
|
.smp_num (smp_num),
|
||||||
|
.done (done),
|
||||||
|
|
||||||
|
.m_axis_tdata (m_axis_tdata),
|
||||||
|
.m_axis_tvalid(m_axis_tvalid),
|
||||||
|
|
||||||
|
.request (request)
|
||||||
|
);
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// CLOCK
|
||||||
|
// =====================================================
|
||||||
|
initial begin
|
||||||
|
clk = 0;
|
||||||
|
forever #(CLK_PERIOD/2) clk = ~clk;
|
||||||
|
end
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// RESET
|
||||||
|
// =====================================================
|
||||||
|
initial begin
|
||||||
|
rst = 1;
|
||||||
|
data_in = 0;
|
||||||
|
out_of_range = 0;
|
||||||
|
done = 0;
|
||||||
|
smp_num = 0;
|
||||||
|
|
||||||
|
repeat(5) @(posedge clk);
|
||||||
|
rst = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// OUTPUT COUNTER
|
||||||
|
// =====================================================
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (m_axis_tvalid)
|
||||||
|
received_count++;
|
||||||
|
end
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// FEED DATA
|
||||||
|
// =====================================================
|
||||||
|
task automatic feed_data_stream(
|
||||||
|
input int num_words,
|
||||||
|
input bit random_data,
|
||||||
|
input bit random_out_of_range
|
||||||
|
);
|
||||||
|
logic [DATA_WIDTH-1:0] value;
|
||||||
|
bit oor;
|
||||||
|
begin
|
||||||
|
value = 1;
|
||||||
|
|
||||||
|
for (int i = 0; i < num_words; i++) begin
|
||||||
|
|
||||||
|
if (random_data)
|
||||||
|
value = $urandom_range(1, (1<<DATA_WIDTH)-1);
|
||||||
|
else
|
||||||
|
value = value + 1;
|
||||||
|
|
||||||
|
if (random_out_of_range)
|
||||||
|
oor = ($urandom_range(0,3) == 0);
|
||||||
|
else
|
||||||
|
oor = 0;
|
||||||
|
|
||||||
|
data_in = value;
|
||||||
|
out_of_range = oor;
|
||||||
|
|
||||||
|
@(posedge clk);
|
||||||
|
end
|
||||||
|
|
||||||
|
out_of_range = 0;
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// TEST CASE
|
||||||
|
// =====================================================
|
||||||
|
task automatic run_test_case(
|
||||||
|
input int n,
|
||||||
|
input bit random_data,
|
||||||
|
input bit random_out_of_range
|
||||||
|
);
|
||||||
|
begin
|
||||||
|
received_count = 0;
|
||||||
|
|
||||||
|
data_in = 0;
|
||||||
|
out_of_range = 0;
|
||||||
|
done = 0;
|
||||||
|
|
||||||
|
smp_num = n;
|
||||||
|
|
||||||
|
// handshake
|
||||||
|
@(posedge clk);
|
||||||
|
done <= 1'b1;
|
||||||
|
wait(request == 1'b1);
|
||||||
|
@(posedge clk);
|
||||||
|
done <= 1'b0;
|
||||||
|
|
||||||
|
// wait enable
|
||||||
|
wait(dut.enable == 1'b1);
|
||||||
|
|
||||||
|
// feed data
|
||||||
|
feed_data_stream(n + 10, random_data, random_out_of_range);
|
||||||
|
|
||||||
|
// wait completion
|
||||||
|
wait(dut.enable == 1'b0);
|
||||||
|
|
||||||
|
$display("Expected smp_num=%0d Received=%0d", smp_num, received_count);
|
||||||
|
|
||||||
|
if (received_count == smp_num)
|
||||||
|
$display("[OK]");
|
||||||
|
else
|
||||||
|
$display("[ERROR]");
|
||||||
|
|
||||||
|
repeat(10) @(posedge clk);
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// RANDOM TESTS
|
||||||
|
// =====================================================
|
||||||
|
task automatic random_stress_test;
|
||||||
|
int n;
|
||||||
|
begin
|
||||||
|
for (int i = 0; i < 20; i++) begin
|
||||||
|
n = $urandom_range(5,20);
|
||||||
|
|
||||||
|
$display("\n--- TEST %0d --- n=%0d", i, n);
|
||||||
|
|
||||||
|
run_test_case(
|
||||||
|
n,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endtask
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// MAIN
|
||||||
|
// =====================================================
|
||||||
|
initial begin
|
||||||
|
|
||||||
|
$display("\n=== BASIC TEST ===");
|
||||||
|
run_test_case(10, 0, 0);
|
||||||
|
|
||||||
|
$display("\n=== OUT_OF_RANGE TEST ===");
|
||||||
|
run_test_case(20, 1, 1);
|
||||||
|
|
||||||
|
$display("\n=== RANDOM STRESS TEST ===");
|
||||||
|
random_stress_test();
|
||||||
|
|
||||||
|
$display("\n=== TEST FINISHED ===");
|
||||||
|
$finish;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
@ -1,120 +0,0 @@
|
|||||||
`timescale 1ns / 1ps
|
|
||||||
|
|
||||||
module sampler_tb;
|
|
||||||
|
|
||||||
parameter DATA_WIDTH = 12;
|
|
||||||
parameter PACK_FACTOR = 3;
|
|
||||||
parameter PROCESS_MODE = 1;
|
|
||||||
parameter CLK_PERIOD = 15.3846; // 65 MHz
|
|
||||||
|
|
||||||
logic clk;
|
|
||||||
logic rst;
|
|
||||||
logic [DATA_WIDTH-1:0] data_in;
|
|
||||||
logic out_of_range;
|
|
||||||
logic [DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata;
|
|
||||||
logic m_axis_tvalid;
|
|
||||||
|
|
||||||
sampler #(
|
|
||||||
.DATA_WIDTH(DATA_WIDTH),
|
|
||||||
.PACK_FACTOR(PACK_FACTOR),
|
|
||||||
.PROCESS_MODE(PROCESS_MODE)
|
|
||||||
) dut (
|
|
||||||
.clk_in(clk),
|
|
||||||
.rst(rst),
|
|
||||||
.data_in(data_in),
|
|
||||||
.out_of_range(out_of_range),
|
|
||||||
.m_axis_tdata(m_axis_tdata),
|
|
||||||
.m_axis_tvalid(m_axis_tvalid)
|
|
||||||
);
|
|
||||||
|
|
||||||
initial begin
|
|
||||||
clk = 0;
|
|
||||||
forever #(CLK_PERIOD/2) clk = ~clk;
|
|
||||||
end
|
|
||||||
|
|
||||||
task send(input [DATA_WIDTH-1:0] word, input bit oor);
|
|
||||||
@(posedge clk);
|
|
||||||
data_in <= word;
|
|
||||||
out_of_range <= oor;
|
|
||||||
$display("Send: %h (%0d) OOR=%b", word, word, oor);
|
|
||||||
endtask
|
|
||||||
|
|
||||||
initial begin
|
|
||||||
$display("\n=== SAMPLER TEST (MODE=%0d) ===\n", PROCESS_MODE);
|
|
||||||
|
|
||||||
// Reset
|
|
||||||
rst = 1;
|
|
||||||
out_of_range = 0;
|
|
||||||
data_in = 0;
|
|
||||||
// send(12'h001, 0);
|
|
||||||
repeat(5) @(posedge clk);
|
|
||||||
rst = 0;
|
|
||||||
send(12'h001, 0);
|
|
||||||
repeat(1) @(posedge clk);
|
|
||||||
|
|
||||||
// 1. Positive
|
|
||||||
$display("\n--- Positive numbers ---");
|
|
||||||
// send(12'h001, 0);
|
|
||||||
send(12'h002, 0);
|
|
||||||
send(12'h003, 0);
|
|
||||||
|
|
||||||
send(12'h004, 0);
|
|
||||||
send(12'h005, 0);
|
|
||||||
send(12'h806, 0);
|
|
||||||
|
|
||||||
// 2. Negative
|
|
||||||
$display("\n--- Negative numbers ---");
|
|
||||||
send(12'hFFF, 0); // -1
|
|
||||||
send(12'hFFE, 0); // -2
|
|
||||||
send(12'hFFD, 0); // -3
|
|
||||||
|
|
||||||
send(12'h800, 0); // -2048
|
|
||||||
send(12'h801, 0); // -2047
|
|
||||||
send(12'h802, 0); // -2046
|
|
||||||
|
|
||||||
// 3. Boundary
|
|
||||||
$display("\n--- Boundary values ---");
|
|
||||||
send(12'h000, 0); // 0
|
|
||||||
send(12'h001, 0); // 1
|
|
||||||
send(12'h7FF, 0); // 2047 (max positive)
|
|
||||||
|
|
||||||
send(12'h7FE, 0); // 2046
|
|
||||||
send(12'h800, 0); // -2048 (min negative)
|
|
||||||
send(12'hFFF, 0); // -1
|
|
||||||
|
|
||||||
// 4. Out of range tests
|
|
||||||
$display("\n--- Out of range tests ---");
|
|
||||||
|
|
||||||
|
|
||||||
send(12'h00A, 0);
|
|
||||||
send(12'h00B, 1); //
|
|
||||||
send(12'h00C, 0);
|
|
||||||
send(12'h00D, 0);
|
|
||||||
send(12'h00E, 0);
|
|
||||||
send(12'h00F, 0);
|
|
||||||
|
|
||||||
send(12'h010, 0);
|
|
||||||
send(12'h011, 0);
|
|
||||||
send(12'h012, 1); //
|
|
||||||
|
|
||||||
send(12'h013, 0);
|
|
||||||
send(12'h014, 0);
|
|
||||||
send(12'h015, 0);
|
|
||||||
|
|
||||||
repeat(10) @(posedge clk);
|
|
||||||
$display("\n=== TEST FINISHED ===");
|
|
||||||
$finish;
|
|
||||||
end
|
|
||||||
|
|
||||||
// Results
|
|
||||||
always @(posedge clk) begin
|
|
||||||
if (m_axis_tvalid) begin
|
|
||||||
$display("\n>>> PACKET RECEIVED at %0t ns:", $time);
|
|
||||||
$display(" Full: %h", m_axis_tdata);
|
|
||||||
$display(" Word0: %h", m_axis_tdata[11:0]);
|
|
||||||
$display(" Word1: %h", m_axis_tdata[23:12]);
|
|
||||||
$display(" Word2: %h\n", m_axis_tdata[35:24]);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
endmodule
|
|
||||||
@ -1,67 +0,0 @@
|
|||||||
`timescale 1ns / 1ps
|
|
||||||
|
|
||||||
module sampler_tb;
|
|
||||||
|
|
||||||
parameter DATA_WIDTH = 12;
|
|
||||||
parameter PACK_FACTOR = 3;
|
|
||||||
parameter PROCESS_MODE = 0;
|
|
||||||
|
|
||||||
parameter CLK_PERIOD = 15.3846;
|
|
||||||
|
|
||||||
logic clk;
|
|
||||||
logic rst;
|
|
||||||
logic [DATA_WIDTH-1:0] data_in;
|
|
||||||
logic out_of_range;
|
|
||||||
|
|
||||||
logic [DATA_WIDTH*PACK_FACTOR-1:0] m_axis_tdata;
|
|
||||||
logic m_axis_tvalid;
|
|
||||||
|
|
||||||
// DUT
|
|
||||||
sampler #(
|
|
||||||
.DATA_WIDTH(DATA_WIDTH),
|
|
||||||
.PACK_FACTOR(PACK_FACTOR),
|
|
||||||
.PROCESS_MODE(PROCESS_MODE)
|
|
||||||
) dut (
|
|
||||||
.clk_in(clk),
|
|
||||||
.rst(rst),
|
|
||||||
.data_in(data_in),
|
|
||||||
.out_of_range(out_of_range),
|
|
||||||
.m_axis_tdata(m_axis_tdata),
|
|
||||||
.m_axis_tvalid(m_axis_tvalid)
|
|
||||||
);
|
|
||||||
|
|
||||||
// clock
|
|
||||||
initial begin
|
|
||||||
clk = 0;
|
|
||||||
forever #(CLK_PERIOD/2) clk = ~clk;
|
|
||||||
end
|
|
||||||
|
|
||||||
integer i;
|
|
||||||
|
|
||||||
initial begin
|
|
||||||
clk = 0;
|
|
||||||
rst = 1;
|
|
||||||
data_in = 0;
|
|
||||||
out_of_range = 0;
|
|
||||||
|
|
||||||
#20;
|
|
||||||
rst = 0;
|
|
||||||
repeat(5) @(posedge clk);
|
|
||||||
|
|
||||||
for (i = 1; i < 20; i++) begin
|
|
||||||
@(posedge clk);
|
|
||||||
|
|
||||||
data_in <= i;
|
|
||||||
end
|
|
||||||
|
|
||||||
#50;
|
|
||||||
$finish;
|
|
||||||
end
|
|
||||||
|
|
||||||
always @(posedge clk) begin
|
|
||||||
if (m_axis_tvalid) begin
|
|
||||||
$display("TIME=%0t PACKED DATA = %h", $time, m_axis_tdata);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
endmodule
|
|
||||||
@ -1 +0,0 @@
|
|||||||
# mock
|
|
||||||
@ -109,7 +109,27 @@ create_project.tcl: Makefile $(XCI_FILES) $(IP_TCL_FILES)
|
|||||||
echo "add_files -fileset constrs_1 $(XDC_FILES)" >> $@
|
echo "add_files -fileset constrs_1 $(XDC_FILES)" >> $@
|
||||||
for x in $(XCI_FILES); do echo "import_ip $$x" >> $@; done
|
for x in $(XCI_FILES); do echo "import_ip $$x" >> $@; done
|
||||||
for x in $(IP_TCL_FILES); do echo "source $$x" >> $@; done
|
for x in $(IP_TCL_FILES); do echo "source $$x" >> $@; done
|
||||||
|
|
||||||
|
echo 'set ips [get_ips -quiet *]' >> $@
|
||||||
|
echo 'if {[llength $$ips] > 0} {' >> $@
|
||||||
|
echo ' puts "INFO: Checking IP status..."' >> $@
|
||||||
|
echo ' report_ip_status -file ip_status_before_upgrade.rpt' >> $@
|
||||||
|
echo ' set locked_ips [get_ips -quiet -filter {IS_LOCKED == 1}]' >> $@
|
||||||
|
echo ' if {[llength $$locked_ips] > 0} {' >> $@
|
||||||
|
echo ' puts "INFO: Upgrading locked IP cores: $$locked_ips"' >> $@
|
||||||
|
echo ' upgrade_ip $$locked_ips' >> $@
|
||||||
|
echo ' }' >> $@
|
||||||
|
echo ' set ip_files [get_files -quiet *.xci]' >> $@
|
||||||
|
echo ' if {[llength $$ip_files] > 0} {' >> $@
|
||||||
|
echo ' puts "INFO: Generating IP output products..."' >> $@
|
||||||
|
echo ' generate_target all $$ip_files' >> $@
|
||||||
|
echo ' export_ip_user_files -of_objects $$ip_files -no_script -sync -force -quiet' >> $@
|
||||||
|
echo ' }' >> $@
|
||||||
|
echo ' report_ip_status -file ip_status_after_upgrade.rpt' >> $@
|
||||||
|
echo '}' >> $@
|
||||||
|
|
||||||
for x in $(CONFIG_TCL_FILES); do echo "source $$x" >> $@; done
|
for x in $(CONFIG_TCL_FILES); do echo "source $$x" >> $@; done
|
||||||
|
|
||||||
if [ -n "$(TB_FILES)" ]; then \
|
if [ -n "$(TB_FILES)" ]; then \
|
||||||
echo "add_files -fileset sim_1 defines.v $(TB_FILES)" >> $@; \
|
echo "add_files -fileset sim_1 defines.v $(TB_FILES)" >> $@; \
|
||||||
echo "set_property top $(SIM_TOP) [get_filesets sim_1]" >> $@; \
|
echo "set_property top $(SIM_TOP) [get_filesets sim_1]" >> $@; \
|
||||||
@ -180,6 +200,8 @@ sim: $(PROJECT).xpr gen_ip
|
|||||||
echo "update_compile_order -fileset sources_1" >> run_sim.tcl
|
echo "update_compile_order -fileset sources_1" >> run_sim.tcl
|
||||||
echo "update_compile_order -fileset sim_1" >> run_sim.tcl
|
echo "update_compile_order -fileset sim_1" >> run_sim.tcl
|
||||||
echo "launch_simulation" >> run_sim.tcl
|
echo "launch_simulation" >> run_sim.tcl
|
||||||
|
echo "run 10000 us" >> run_sim.tcl
|
||||||
|
echo "quit" >> run_sim.tcl
|
||||||
vivado -mode batch -source run_sim.tcl
|
vivado -mode batch -source run_sim.tcl
|
||||||
|
|
||||||
simclean:
|
simclean:
|
||||||
|
|||||||
20
software/README.md
Normal file
20
software/README.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# Software
|
||||||
|
|
||||||
|
Просто скрипт на питоне, для отправки команд через ethernet и для приема и простой визуализации данных.
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
Справка:
|
||||||
|
|
||||||
|
```python3 --help```
|
||||||
|
|
||||||
|
Положительный импульс:
|
||||||
|
|
||||||
|
```python3 console.py --pulse_width 3500 --pulse_period 20000 --pulse_height 15000 --pulse_num 550 --dac-bits 14```
|
||||||
|
|
||||||
|
Отрицательный импульс:
|
||||||
|
|
||||||
|
```python3 console.py --pulse_width 15000 --pulse_period 20000 --pulse_height 1500 --pulse_num 550 --dac-bits 14```
|
||||||
|
|
||||||
|
## Ограничения
|
||||||
|
Максимальный pulse_period считается как аппаратный N_MAX * WINDOW_SIZE * adc_dac_ratio, в базовой конфигурации это 512000. Максимальный pulse_num зависит от подаваемых значений и от битности аккумулятора (по умолчанию - 32), с учетом усреднений по WINDOW_SIZE это получается что-то около 2^14 накоплений.
|
||||||
|
|
||||||
@ -1,5 +1,9 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import socket
|
import socket
|
||||||
|
import math
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
adc_dac_ratio = 0.52
|
||||||
|
|
||||||
|
|
||||||
def run_debug(args, sock):
|
def run_debug(args, sock):
|
||||||
@ -22,12 +26,16 @@ def run_debug(args, sock):
|
|||||||
|
|
||||||
|
|
||||||
def format_ctrl_data(pulse_width: int, pulse_period: int,
|
def format_ctrl_data(pulse_width: int, pulse_period: int,
|
||||||
pulse_height: int, pulse_num: int, dac_bits: int = 16) -> bytes:
|
pulse_height: int, pulse_num: int, args, dac_bits: int = 16) -> bytes:
|
||||||
"""Format data packet for set_data command."""
|
"""Format data packet for set_data command."""
|
||||||
output = bytearray()
|
output = bytearray()
|
||||||
|
|
||||||
output += 0b10001000.to_bytes(1, 'little')
|
output += 0b10001000.to_bytes(1, 'little')
|
||||||
|
|
||||||
|
pulse_period_adc = (int(pulse_period * adc_dac_ratio) //
|
||||||
|
args.window_size) * args.window_size
|
||||||
|
print(pulse_period_adc)
|
||||||
|
|
||||||
# no negative please
|
# no negative please
|
||||||
assert pulse_width > 0, "pulse_width should be positive"
|
assert pulse_width > 0, "pulse_width should be positive"
|
||||||
assert pulse_period > 0, "pulse_period should be positive"
|
assert pulse_period > 0, "pulse_period should be positive"
|
||||||
@ -44,8 +52,9 @@ def format_ctrl_data(pulse_width: int, pulse_period: int,
|
|||||||
output += pulse_period.to_bytes(4, 'little')
|
output += pulse_period.to_bytes(4, 'little')
|
||||||
output += pulse_num.to_bytes(2, 'little')
|
output += pulse_num.to_bytes(2, 'little')
|
||||||
output += pulse_height.to_bytes(2, 'little')
|
output += pulse_height.to_bytes(2, 'little')
|
||||||
|
output += pulse_period_adc.to_bytes(4, 'little')
|
||||||
|
|
||||||
assert len(output) == 13, "Config data should be 96 bits + 8 bit header"
|
assert len(output) == 17, "Config data should be 128 bits + 8 bit header"
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
@ -64,9 +73,53 @@ def verify_args(args):
|
|||||||
args.pulse_height = int(input("pulse_height: "))
|
args.pulse_height = int(input("pulse_height: "))
|
||||||
|
|
||||||
|
|
||||||
|
def recv_data(args, sock) -> list:
|
||||||
|
# calculate count & size
|
||||||
|
packet_count = math.ceil(
|
||||||
|
((adc_dac_ratio * args.pulse_period) / args.window_size * args.data_width) / args.packet_size)
|
||||||
|
print(packet_count)
|
||||||
|
|
||||||
|
recv_buf = []
|
||||||
|
|
||||||
|
try:
|
||||||
|
for pkt_cnt in range(packet_count):
|
||||||
|
try:
|
||||||
|
data, address = sock.recvfrom(65536)
|
||||||
|
|
||||||
|
if len(data) % args.data_width != 0:
|
||||||
|
print("invalid packet size!")
|
||||||
|
|
||||||
|
for i in range(0, len(data), args.data_width):
|
||||||
|
sample = int.from_bytes(
|
||||||
|
data[i:i+args.data_width], "little")
|
||||||
|
recv_buf.append(sample)
|
||||||
|
except socket.timeout:
|
||||||
|
print("socket timeout")
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print(f"recv: {pkt_cnt}")
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
print(f"err: {e}")
|
||||||
|
|
||||||
|
expected_length = math.ceil(
|
||||||
|
adc_dac_ratio * args.pulse_period / args.window_size)
|
||||||
|
if len(recv_buf) < expected_length:
|
||||||
|
print("data underflow")
|
||||||
|
return []
|
||||||
|
|
||||||
|
recv_buf = recv_buf[:expected_length-1]
|
||||||
|
print(f"collected {len(recv_buf)} samples")
|
||||||
|
# print(recv_buf)
|
||||||
|
return recv_buf
|
||||||
|
|
||||||
|
|
||||||
def run(args, sock):
|
def run(args, sock):
|
||||||
dest = (args.ip, args.send_port)
|
dest = (args.ip, args.send_port)
|
||||||
|
|
||||||
|
if args.pulse_period % args.window_size != 0:
|
||||||
|
print("Invalid pulse period (should be divisable by WINDOW_SIZE)")
|
||||||
|
return
|
||||||
|
|
||||||
# reset
|
# reset
|
||||||
sock.sendto(0x0f00.to_bytes(2), dest)
|
sock.sendto(0x0f00.to_bytes(2), dest)
|
||||||
|
|
||||||
@ -74,11 +127,15 @@ def run(args, sock):
|
|||||||
sock.sendto(format_ctrl_data(args.pulse_width,
|
sock.sendto(format_ctrl_data(args.pulse_width,
|
||||||
args.pulse_period,
|
args.pulse_period,
|
||||||
args.pulse_height,
|
args.pulse_height,
|
||||||
args.pulse_num,
|
args.pulse_num, args,
|
||||||
dac_bits=args.dac_bits), dest)
|
dac_bits=args.dac_bits), dest)
|
||||||
|
|
||||||
sock.sendto(0xf000.to_bytes(2), dest)
|
sock.sendto(0xf000.to_bytes(2), dest)
|
||||||
print("Sent start!")
|
print("Sent start!")
|
||||||
|
data = recv_data(args, sock)
|
||||||
|
print(min(data), max(data))
|
||||||
|
plt.plot(data)
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
@ -101,6 +158,15 @@ def main():
|
|||||||
parser.add_argument("--dac-bits", type=int, default=12,
|
parser.add_argument("--dac-bits", type=int, default=12,
|
||||||
help="Битность ЦАП (влияет на максимальный pulse_height)")
|
help="Битность ЦАП (влияет на максимальный pulse_height)")
|
||||||
|
|
||||||
|
parser.add_argument("--data-width", type=int,
|
||||||
|
default=4, help="Байтность получаемых данных, по умолчанию 4 (AKA int32)")
|
||||||
|
|
||||||
|
parser.add_argument("--window-size", type=int,
|
||||||
|
default=65, help="Размер окна для первого усреднения.")
|
||||||
|
|
||||||
|
parser.add_argument("--packet-size", type=int,
|
||||||
|
default=1024, help="Размер отправляемых пакетов.")
|
||||||
|
|
||||||
# передача параметров через аргументы
|
# передача параметров через аргументы
|
||||||
for arg in ("pulse_width", "pulse_period", "pulse_num", "pulse_height"):
|
for arg in ("pulse_width", "pulse_period", "pulse_num", "pulse_height"):
|
||||||
parser.add_argument(f"--{arg}", type=int,
|
parser.add_argument(f"--{arg}", type=int,
|
||||||
@ -109,6 +175,8 @@ def main():
|
|||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
|
sock.bind(("0.0.0.0", args.recv_port))
|
||||||
|
|
||||||
if args.debug:
|
if args.debug:
|
||||||
run_debug(args, sock)
|
run_debug(args, sock)
|
||||||
|
|||||||
Reference in New Issue
Block a user