Skip to content

Instantly share code, notes, and snippets.

@avesus
Last active November 2, 2023 05:39
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save avesus/4acc11a26e03c4ff79557bf9d3cfaf07 to your computer and use it in GitHub Desktop.
Save avesus/4acc11a26e03c4ff79557bf9d3cfaf07 to your computer and use it in GitHub Desktop.
Ethernet PHY and iCE40LP384 reprogrammer over UDP
#set_property DONT_TOUCH true [get_cells { evt1/mem1/srlatch_with_ands }]
#set_property DONT_TOUCH true [get_cells { evt1/pulse1/not1 }]
#set_property DONT_TOUCH true [get_cells { evt1/pulse1/xnor1 }]
#set_property DONT_TOUCH true [get_cells { evt1 }]
set_property SEVERITY {Warning} [get_drc_checks LUTLP-1]
#set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets evt1/feedback]
#set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets evt1/mem1/in0]
#set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets s1/evt1/mem1/OUTPUT_EDGE]
#set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets s2/evt1/mem1/OUTPUT_EDGE]
#set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets s1/evt2/mem1/OUTPUT_EDGE]
#set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets s2/evt2/mem1/OUTPUT_EDGE]
#set_property ALLOW_COMBINATORIAL_LOOPS TRUE [get_nets s1/m/A]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { GCLK100 }];
set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { CK_RST }];
set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { BTN0 }];
set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { BTN1 }];
set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { BTN2 }];
set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { BTN3 }];
set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { SW0 }];
set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { SW1 }];
set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { SW2 }];
set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { SW3 }];
set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { CK_IO39 }];
set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { CK_IO37 }];
set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { LED4 }];
set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { LED5 }];
set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { LED6 }];
set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { LED7 }];
set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { CK_IO0 }];
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { CK_IO1 }];
set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { CK_IO2 }];
set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CK_IO3 }];
set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { CK_IO4 }];
set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { CK_IO5 }];
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { GCLK100 }];
# create_clock -add -name eth_phy_clk_pin -period 40.00 -waveform {0 20} [get_ports { ETH_REF_CLK }];
create_clock -add -name eth_phy_clk_pin -period 40.00 -waveform {0 20} [get_ports { JA9 }];
#set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets ETH_REF_CLK_IBUF]
#set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets LED2_B_OBUF]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports LED4]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports LED4]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports LED5]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports LED5]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports LED6]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports LED6]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports LED7]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports LED7]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports CK_IO37]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports CK_IO37]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports CK_IO39]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports CK_IO39]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports CK_IO0]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports CK_IO0]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports CK_IO2]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports CK_IO2]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports CK_IO3]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports CK_IO3]
set_output_delay -clock [get_clocks sys_clk_pin] -min 10.0 [get_ports CK_IO5]
set_output_delay -clock [get_clocks sys_clk_pin] -max -10.0 [get_ports CK_IO5]
# set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { ETH_TX_CLK }];
set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { ETH_RX_DV }];
# set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ETH_RX_CLK }];
set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }];
set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD0 }];
set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRS_DV }];
set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD1 }];
# set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ETH_COL }];
set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }];
#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD2 }];
#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD3 }];
set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD3 }];
set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD1 }];
set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { ETH_TX_EN }];
set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }];
# set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }];
set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD2 }];
set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD0 }];
set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ETH_REF_CLK }];
set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { LED0_B }];
set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { LED0_R }];
set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { LED0_G }];
set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { LED1_B }];
set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { LED1_R }];
set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { LED1_G }];
set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { LED2_B }];
set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { LED2_R }];
set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { LED2_G }];
set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { LED3_B }];
set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { LED3_R }];
set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { LED3_G }];
set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { CK_IO26 }];
set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { CK_IO27 }];
set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { CK_IO28 }];
set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CK_IO29 }];
set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { CK_IO30 }];
set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { CK_IO31 }];
set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { CK_IO32 }];
set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CK_IO33 }];
set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { CK_IO34 }];
# SPI Flash
set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { JD2 }];
set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { JD3 }];
set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { JD4 }];
set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { JD8 }];
set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { JD9 }];
set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { JD10 }];
set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { JD7 }];
set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { JA1 }];
set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { JA2 }];
set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { JA3 }];
set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { JA4 }];
set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { JA7 }];
set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { JA8 }];
set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { JA9 }];
set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { JA10 }];
create_clock -add -name eth_phy_rmii_clk_pin -period 20.00 -waveform {0 10} [get_ports { JA9 }];
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets JA9_IBUF]
# ask Linux to show what crc32 of your packet should be
crc32 <(echo -ne '\xff\xff\xff\xff\xff\xff\xc8\xd9\xd2\x78\x13\x34\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xc8\xd9\xd2\x78\x13\x34\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
# 1 packet
arping -W 1 -D -I eno1 -c 1 192.168.254.54
# perf test
arping -W 0.001 -D -I eno1 -c 1500000 192.168.254.54
# capture everything in tcpdump
ethtool -k eno1
ethtool -K eno1 rx-checksum off
ethtool -K eno1 rx-all on
ethtool -K eno1 rx-fcs on
tcpdump -e -n -i eno1 -vv -XX -S -Q inout arp
tcpdump -e -n -i eno1 -vv -XX -S -Q inout udp
/*
Copyright (c) 2016-2018 Alex Forencich
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
// Language: Verilog 2001
`timescale 1ns / 1ps
/*
* Parametrizable combinatorial parallel LFSR/CRC
*/
module Lfsr #
(
// width of LFSR
parameter LFSR_WIDTH = 31,
// LFSR polynomial
parameter LFSR_POLY = 31'h10000001,
// LFSR configuration: "GALOIS", "FIBONACCI"
parameter LFSR_CONFIG = "FIBONACCI",
// LFSR feed forward enable
parameter LFSR_FEED_FORWARD = 0,
// bit-reverse input and output
parameter REVERSE = 0,
// width of data input
parameter DATA_WIDTH = 8,
// implementation style: "AUTO", "LOOP", "REDUCTION"
parameter STYLE = "AUTO"
)
(
input wire [DATA_WIDTH-1:0] data_in,
input wire [LFSR_WIDTH-1:0] state_in,
output wire [DATA_WIDTH-1:0] data_out,
output wire [LFSR_WIDTH-1:0] state_out
);
/*
Fully parametrizable combinatorial parallel LFSR/CRC module. Implements an unrolled LFSR
next state computation, shifting DATA_WIDTH bits per pass through the module. Input data
is XORed with LFSR feedback path, tie data_in to zero if this is not required.
Works in two parts: statically computes a set of bit masks, then uses these bit masks to
select bits for XORing to compute the next state.
Ports:
data_in
Data bits to be shifted through the LFSR (DATA_WIDTH bits)
state_in
LFSR/CRC current state input (LFSR_WIDTH bits)
data_out
Data bits shifted out of LFSR (DATA_WIDTH bits)
state_out
LFSR/CRC next state output (LFSR_WIDTH bits)
Parameters:
LFSR_WIDTH
Specify width of LFSR/CRC register
LFSR_POLY
Specify the LFSR/CRC polynomial in hex format. For example, the polynomial
x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
would be represented as
32'h04c11db7
Note that the largest term (x^32) is suppressed. This term is generated automatically based
on LFSR_WIDTH.
LFSR_CONFIG
Specify the LFSR configuration, either Fibonacci or Galois. Fibonacci is generally used
for linear-feedback shift registers (LFSR) for pseudorandom binary sequence (PRBS) generators,
scramblers, and descrambers, while Galois is generally used for cyclic redundancy check
generators and checkers.
Fibonacci style (example for 64b66b scrambler, 0x8000000001)
DIN (LSB first)
|
V
(+)<---------------------------(+)<-----------------------------.
| ^ |
| .----. .----. .----. | .----. .----. .----. |
+->| 0 |->| 1 |->...->| 38 |-+->| 39 |->...->| 56 |->| 57 |--'
| '----' '----' '----' '----' '----' '----'
V
DOUT
Galois style (example for CRC16, 0x8005)
,-------------------+-------------------------+----------(+)<-- DIN (MSB first)
| | | ^
| .----. .----. V .----. .----. V .----. |
`->| 0 |->| 1 |->(+)->| 2 |->...->| 14 |->(+)->| 15 |--+---> DOUT
'----' '----' '----' '----' '----'
LFSR_FEED_FORWARD
Generate feed forward instead of feed back LFSR. Enable this for PRBS checking and self-
synchronous descrambling.
Fibonacci feed-forward style (example for 64b66b descrambler, 0x8000000001)
DIN (LSB first)
|
| .----. .----. .----. .----. .----. .----.
+->| 0 |->| 1 |->...->| 38 |-+->| 39 |->...->| 56 |->| 57 |--.
| '----' '----' '----' | '----' '----' '----' |
| V |
(+)<---------------------------(+)------------------------------'
|
V
DOUT
Galois feed-forward style
,-------------------+-------------------------+------------+--- DIN (MSB first)
| | | |
| .----. .----. V .----. .----. V .----. V
`->| 0 |->| 1 |->(+)->| 2 |->...->| 14 |->(+)->| 15 |->(+)-> DOUT
'----' '----' '----' '----' '----'
REVERSE
Bit-reverse LFSR input and output. Shifts MSB first by default, set REVERSE for LSB first.
DATA_WIDTH
Specify width of input and output data bus. The module will perform one shift per input
data bit, so if the input data bus is not required tie data_in to zero and set DATA_WIDTH
to the required number of shifts per clock cycle.
STYLE
Specify implementation style. Can be "AUTO", "LOOP", or "REDUCTION". When "AUTO"
is selected, implemenation will be "LOOP" or "REDUCTION" based on synthesis translate
directives. "REDUCTION" and "LOOP" are functionally identical, however they simulate
and synthesize differently. "REDUCTION" is implemented with a loop over a Verilog
reduction operator. "LOOP" is implemented as a doubly-nested loop with no reduction
operator. "REDUCTION" is very fast for simulation in iverilog and synthesizes well in
Quartus but synthesizes poorly in ISE, likely due to large inferred XOR gates causing
problems with the optimizer. "LOOP" synthesizes will in both ISE and Quartus. "AUTO"
will default to "REDUCTION" when simulating and "LOOP" for synthesizers that obey
synthesis translate directives.
Settings for common LFSR/CRC implementations:
Name Configuration Length Polynomial Initial value Notes
CRC16-IBM Galois, bit-reverse 16 16'h8005 16'hffff
CRC16-CCITT Galois 16 16'h1021 16'h1d0f
CRC32 Galois, bit-reverse 32 32'h04c11db7 32'hffffffff Ethernet FCS; invert final output
PRBS6 Fibonacci 6 6'h21 any
PRBS7 Fibonacci 7 7'h41 any
PRBS9 Fibonacci 9 9'h021 any ITU V.52
PRBS10 Fibonacci 10 10'h081 any ITU
PRBS11 Fibonacci 11 11'h201 any ITU O.152
PRBS15 Fibonacci, inverted 15 15'h4001 any ITU O.152
PRBS17 Fibonacci 17 17'h04001 any
PRBS20 Fibonacci 20 20'h00009 any ITU V.57
PRBS23 Fibonacci, inverted 23 23'h040001 any ITU O.151
PRBS29 Fibonacci, inverted 29 29'h08000001 any
PRBS31 Fibonacci, inverted 31 31'h10000001 any
64b66b Fibonacci, bit-reverse 58 58'h8000000001 any 10G Ethernet
128b130b Galois, bit-reverse 23 23'h210125 any PCIe gen 3
*/
reg [LFSR_WIDTH-1:0] lfsr_mask_state[LFSR_WIDTH-1:0];
reg [DATA_WIDTH-1:0] lfsr_mask_data[LFSR_WIDTH-1:0];
reg [LFSR_WIDTH-1:0] output_mask_state[DATA_WIDTH-1:0];
reg [DATA_WIDTH-1:0] output_mask_data[DATA_WIDTH-1:0];
reg [LFSR_WIDTH-1:0] state_val = 0;
reg [DATA_WIDTH-1:0] data_val = 0;
integer i, j, k;
initial begin
// init bit masks
for (i = 0; i < LFSR_WIDTH; i = i + 1) begin
lfsr_mask_state[i] = {LFSR_WIDTH{1'b0}};
lfsr_mask_state[i][i] = 1'b1;
lfsr_mask_data[i] = {DATA_WIDTH{1'b0}};
end
for (i = 0; i < DATA_WIDTH; i = i + 1) begin
output_mask_state[i] = {LFSR_WIDTH{1'b0}};
if (i < LFSR_WIDTH) begin
output_mask_state[i][i] = 1'b1;
end
output_mask_data[i] = {DATA_WIDTH{1'b0}};
end
// simulate shift register
if (LFSR_CONFIG == "FIBONACCI") begin
// Fibonacci configuration
for (i = DATA_WIDTH-1; i >= 0; i = i - 1) begin
// determine shift in value
// current value in last FF, XOR with input data bit (MSB first)
state_val = lfsr_mask_state[LFSR_WIDTH-1];
data_val = lfsr_mask_data[LFSR_WIDTH-1];
data_val = data_val ^ (1 << i);
// add XOR inputs from correct indicies
for (j = 1; j < LFSR_WIDTH; j = j + 1) begin
if (LFSR_POLY & (1 << j)) begin
state_val = lfsr_mask_state[j-1] ^ state_val;
data_val = lfsr_mask_data[j-1] ^ data_val;
end
end
// shift
for (j = LFSR_WIDTH-1; j > 0; j = j - 1) begin
lfsr_mask_state[j] = lfsr_mask_state[j-1];
lfsr_mask_data[j] = lfsr_mask_data[j-1];
end
for (j = DATA_WIDTH-1; j > 0; j = j - 1) begin
output_mask_state[j] = output_mask_state[j-1];
output_mask_data[j] = output_mask_data[j-1];
end
output_mask_state[0] = state_val;
output_mask_data[0] = data_val;
if (LFSR_FEED_FORWARD) begin
// only shift in new input data
state_val = {LFSR_WIDTH{1'b0}};
data_val = 1 << i;
end
lfsr_mask_state[0] = state_val;
lfsr_mask_data[0] = data_val;
end
end else if (LFSR_CONFIG == "GALOIS") begin
// Galois configuration
for (i = DATA_WIDTH-1; i >= 0; i = i - 1) begin
// determine shift in value
// current value in last FF, XOR with input data bit (MSB first)
state_val = lfsr_mask_state[LFSR_WIDTH-1];
data_val = lfsr_mask_data[LFSR_WIDTH-1];
data_val = data_val ^ (1 << i);
// shift
for (j = LFSR_WIDTH-1; j > 0; j = j - 1) begin
lfsr_mask_state[j] = lfsr_mask_state[j-1];
lfsr_mask_data[j] = lfsr_mask_data[j-1];
end
for (j = DATA_WIDTH-1; j > 0; j = j - 1) begin
output_mask_state[j] = output_mask_state[j-1];
output_mask_data[j] = output_mask_data[j-1];
end
output_mask_state[0] = state_val;
output_mask_data[0] = data_val;
if (LFSR_FEED_FORWARD) begin
// only shift in new input data
state_val = {LFSR_WIDTH{1'b0}};
data_val = 1 << i;
end
lfsr_mask_state[0] = state_val;
lfsr_mask_data[0] = data_val;
// add XOR inputs at correct indicies
for (j = 1; j < LFSR_WIDTH; j = j + 1) begin
if (LFSR_POLY & (1 << j)) begin
lfsr_mask_state[j] = lfsr_mask_state[j] ^ state_val;
lfsr_mask_data[j] = lfsr_mask_data[j] ^ data_val;
end
end
end
end else begin
$error("Error: unknown configuration setting!");
$finish;
end
// reverse bits if selected
if (REVERSE) begin
// reverse order
for (i = 0; i < LFSR_WIDTH/2; i = i + 1) begin
state_val = lfsr_mask_state[i];
data_val = lfsr_mask_data[i];
lfsr_mask_state[i] = lfsr_mask_state[LFSR_WIDTH-i-1];
lfsr_mask_data[i] = lfsr_mask_data[LFSR_WIDTH-i-1];
lfsr_mask_state[LFSR_WIDTH-i-1] = state_val;
lfsr_mask_data[LFSR_WIDTH-i-1] = data_val;
end
for (i = 0; i < DATA_WIDTH/2; i = i + 1) begin
state_val = output_mask_state[i];
data_val = output_mask_data[i];
output_mask_state[i] = output_mask_state[DATA_WIDTH-i-1];
output_mask_data[i] = output_mask_data[DATA_WIDTH-i-1];
output_mask_state[DATA_WIDTH-i-1] = state_val;
output_mask_data[DATA_WIDTH-i-1] = data_val;
end
// reverse bits
for (i = 0; i < LFSR_WIDTH; i = i + 1) begin
state_val = 0;
for (j = 0; j < LFSR_WIDTH; j = j + 1) begin
state_val[j] = lfsr_mask_state[i][LFSR_WIDTH-j-1];
end
lfsr_mask_state[i] = state_val;
data_val = 0;
for (j = 0; j < DATA_WIDTH; j = j + 1) begin
data_val[j] = lfsr_mask_data[i][DATA_WIDTH-j-1];
end
lfsr_mask_data[i] = data_val;
end
for (i = 0; i < DATA_WIDTH; i = i + 1) begin
state_val = 0;
for (j = 0; j < LFSR_WIDTH; j = j + 1) begin
state_val[j] = output_mask_state[i][LFSR_WIDTH-j-1];
end
output_mask_state[i] = state_val;
data_val = 0;
for (j = 0; j < DATA_WIDTH; j = j + 1) begin
data_val[j] = output_mask_data[i][DATA_WIDTH-j-1];
end
output_mask_data[i] = data_val;
end
end
// for (i = 0; i < LFSR_WIDTH; i = i + 1) begin
// $display("%b %b", lfsr_mask_state[i], lfsr_mask_data[i]);
// end
end
// synthesis translate_off
`define SIMULATION
// synthesis translate_on
`ifdef SIMULATION
// "AUTO" style is "REDUCTION" for faster simulation
parameter STYLE_INT = (STYLE == "AUTO") ? "REDUCTION" : STYLE;
`else
// "AUTO" style is "LOOP" for better synthesis result
parameter STYLE_INT = (STYLE == "AUTO") ? "LOOP" : STYLE;
`endif
genvar n;
generate
if (STYLE_INT == "REDUCTION") begin
// use Verilog reduction operator
// fast in iverilog
// significantly larger than generated code with ISE (inferred wide XORs may be tripping up optimizer)
// slightly smaller than generated code with Quartus
// --> better for simulation
for (n = 0; n < LFSR_WIDTH; n = n + 1) begin : loop1
assign state_out[n] = ^{(state_in & lfsr_mask_state[n]), (data_in & lfsr_mask_data[n])};
end
for (n = 0; n < DATA_WIDTH; n = n + 1) begin : loop2
assign data_out[n] = ^{(state_in & output_mask_state[n]), (data_in & output_mask_data[n])};
end
end else if (STYLE_INT == "LOOP") begin
// use nested loops
// very slow in iverilog
// slightly smaller than generated code with ISE
// same size as generated code with Quartus
// --> better for synthesis
reg [LFSR_WIDTH-1:0] state_out_reg = 0;
reg [DATA_WIDTH-1:0] data_out_reg = 0;
assign state_out = state_out_reg;
assign data_out = data_out_reg;
always @* begin
for (i = 0; i < LFSR_WIDTH; i = i + 1) begin
state_out_reg[i] = 0;
for (j = 0; j < LFSR_WIDTH; j = j + 1) begin
if (lfsr_mask_state[i][j]) begin
state_out_reg[i] = state_out_reg[i] ^ state_in[j];
end
end
for (j = 0; j < DATA_WIDTH; j = j + 1) begin
if (lfsr_mask_data[i][j]) begin
state_out_reg[i] = state_out_reg[i] ^ data_in[j];
end
end
end
for (i = 0; i < DATA_WIDTH; i = i + 1) begin
data_out_reg[i] = 0;
for (j = 0; j < LFSR_WIDTH; j = j + 1) begin
if (output_mask_state[i][j]) begin
data_out_reg[i] = data_out_reg[i] ^ state_in[j];
end
end
for (j = 0; j < DATA_WIDTH; j = j + 1) begin
if (output_mask_data[i][j]) begin
data_out_reg[i] = data_out_reg[i] ^ data_in[j];
end
end
end
end
end else begin
initial begin
$error("Error: unknown style setting!");
$finish;
end
end
endgenerate
endmodule
`timescale 1ns / 1ps
module RamSource (
input wire i_clock,
input wire i_reset,
input wire i_enable,
input wire [17:0] i_address,
output wire o_data,
input wire [1:0] i_data,
input wire i_we
);
wire [7:0] block;
// 0
RamFile #(
/*
.INIT_00 (256'b0000000000000000000000000000000000000000000000000000000000000000100000001000000000000000100010000000000000000000010000010000101000000000010011101010110100000000010001100000000000000000010010011010000010000000100000001000101001111110100110010101010101111110),
.INIT_01 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_02 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_03 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_04 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_05 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_06 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_07 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_08 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_09 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0B (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0E (256'b0000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100000000000000),
.INIT_0F (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_10 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_11 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_12 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_13 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_14 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_15 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_16 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_17 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_18 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_19 (256'b0001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000000000001010000000000000000000000000000000000000000000000000000),
.INIT_1A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_1B (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_1C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_1D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_1E (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_1F (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_20 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_21 (256'b0000000000000000000000100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_22 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_23 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100001000000000000000000000000000000000000000000000000000000000),
.INIT_24 (256'b0000000000000000000000000000000000000000000000000001010000000000011010010101011010110100011000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_25 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000110100101111000000001000011010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_26 (256'b0000000000000000000100000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100011000000000000000000000000000000010000000000000000000010),
.INIT_27 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011101111100111101100011000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110100),
.INIT_28 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000111111110001111001000000110000000000000000000000000000000000000000000000000000),
.INIT_29 (256'b0000000000000000000000111011100000000000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001111010000000000000000000000000000000000000000000000),
.INIT_2A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_2B (256'b0000000000000000000000000000000000100011001100010111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110000000000000000000000000000000000010000000000111100000000000000000000),
.INIT_2C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011001100001110101001010000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_2D (256'b0000110011000100000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001100110001100000000000000001000000000000100000000000000000000000000000),
.INIT_2E (256'b0000000000000000000000011010010001011000101100001110000000000000000000000000001100111111001101100100000000000111000000000000000000111011110001111001011100000001000000000000000000100000001000100000000000000000000000000000000000000000000000000000000000000000),
.INIT_2F (256'b0010000001010000000000000000000000000000000110011001000000000001010000011110000000000000000000000110100110011100001111100110000000000000000000000000001100110000110110000111100000000000000000000001000000001111111111011010000000000011110000000000000000010101),
.INIT_30 (256'b0011010000000110100001110000000000000000001100110001011110100001000011010000000000000000000000000000000000000000000000000010000000000000000000000000000000000100000000000000110011010111100101111000101100000000000101000000000000110011011101100110000001100100),
.INIT_31 (256'b0000000000000000000000000000000000000000000001000000000000000010010110010110100001010001100000000000000011000000000010010110100111110010000001100000000000000011000000000000000000000000000000011000000000000000000010000000000000000010000000000000110011000011),
.INIT_32 (256'b0000001000000011000100000000011000000100000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000100101101101100000000010000000000000000000010000000000100101101101010000011100001011000000000000010000000000000000000000),
.INIT_33 (256'b0000000000000000000010000000011010010001000000000110001101000000000000000000000000000000111111100000000000001101000111000000000000000000000100000000001111000000000000000000000000000000000000000000000000000000000110100110110010101111100110110000000000000000),
.INIT_34 (256'b1000000000000000000000000000000100000000001000000000000000000000000000000000000000000000000000000000000011001101111000000111000111000000000000000000000100100000001100010000000001100000010000110000000000000000100000000000000000000000000000000000000000000000),
.INIT_35 (256'b0000000000000001000000000000000000000000000101100000001100110000000011000011110000000000000000000000100011001101110000000000000000000000000000000000000000000000001000000000100000110011010100000001010000111000000000000000000000000000000011100110000000000000),
.INIT_36 (256'b0000000000001000000110110000000000000000000000000000000000000000000000000000000000000000001000000000011100000000100000000000000011110100000000000001100000000000000000000000000000110011100100000000000000000000000000000000000000000000110000000000000000000000),
.INIT_37 (256'b0000000000000000000011100100000000010000101000000000000000000000000000000000000000000001010000101000000000000000000000000000000001000000000000110011000111001101000000000000000000000000000000000010000000110011100000110100000000000000000000000000000000000000),
.INIT_38 (256'b0000000000000000000000000000000010001000011011011010000110000001000000000000000000000010001000011101001000000000000000010000000000000000000010000000000000000000000000000000000000000000100000000000000000100000000000000011001100010111110000000010000000000000),
.INIT_39 (256'b0000000000000000000000000000000000000000000000001000000010000000100000001000100000000000000000000000000000000010000101011100000000000010110000000000000000000000000010000101110100000000000010000000000000000000000000000001000000000011100000000000000000000000),
.INIT_3A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3B (256'b0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3E (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000101010000000000000000000000000000000000000000000000000101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3F (256'b0000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000),
.INIT_40 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000),
.INIT_41 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000),
.INIT_42 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_43 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_44 (256'b0000000000000000000000000110000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000),
.INIT_45 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000),
.INIT_46 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_47 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_48 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_49 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4B (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4E (256'b0000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4F (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_50 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_51 (256'b0001000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_52 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000001101000000),
.INIT_53 (256'b0000000000000000000000000000000000000000000000000000000000000011110000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000001110000000000000000000000000000000000000000000000000000000000000000),
.INIT_54 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000110010000000000000000000000000000000),
.INIT_55 (256'b1000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001100111100000000000000000000000000000000000000000000000000),
.INIT_56 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000100101100101100000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111100000000000000000000000000000),
.INIT_57 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000010100000000000000000000000101001011000110010100000000110010000000000000000000000000000000000000000000000000000000000000000000000100000),
.INIT_58 (256'b0000000000000000000000100000001100000000100000000000000000010001100010010000000000101000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000101000000000000001000000000000010000000000101000000001100100),
.INIT_59 (256'b0000000000000000000000000000000000000000000000000000000000000000010010010110110100000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000),
.INIT_5A (256'b0000100011111111100101101100010000000000000000000000000000000000000000000000000000000000000000000000000000000110110000000000000000000010100001000001001110000000000000000000000001010000000000000000000000000000000110000000000000000001010000000000000000000000),
.INIT_5B (256'b0000000000000000000000010010000000111011000000100000000000000000000000000000000000111011110101111000100000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000100000000000000000001101011000001001000000000000000000000000),
.INIT_5C (256'b0001000000000000000000000010000000000000000000000000000000000000000000100000000000000000000000000000000110100111111000001111000011100000000000000000000001000000001101111000000000000011000000000000000000000000000001000000000010110000000000000000000000000000),
.INIT_5D (256'b1010110100000111100000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001101001010111110000000000000100000000000010000000011000000011101100000000000000),
.INIT_5E (256'b0000000011000000000000000000000000000000000000000000000000000000001010010110001110110011111000111000000000000000000000000000000000000000000001110000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000100101),
.INIT_5F (256'b0000000000000000000000000000000000000000100100000000000000000000001000000000000000000000000000000000000000000100000000000000000000000000000000100101101101100000010110011000000000000000000000000000000000000000000000000000011100000000000000000000000000000100),
.INIT_60 (256'b0000000000000000000000000000000000110011000101101000000100000000000000000100000000000000001000010001100000010100000000000000000000000000000000000100000000001100000000001010000000000000000000000000000000000000000000001001011011110010001001000111110000000000),
.INIT_61 (256'b0000001000000000000000000000000000001100111011100000000000000000000000000000000000000000000000000000000000000011001100010011000101000011100000000000000000000000100010000100010111101000000000000000000000000000000000100000000000000000000111000110110000000000),
.INIT_62 (256'b0000000000000000000011100111000000000000000001100010100000001111010000000000000000010000000000000000000000100011001101010000000001100000000000000000000000000000000000000000000000000000000000000000000001010001000000000000000000000000000000000011011100000000),
.INIT_63 (256'b1110111110011010010001100000000000000000001000000000000000000000000001000000110011100101101000000001000000000000000000000000000000000011001100000000000000100000000100000001000000100011111111000101101110111000000000000000000000000000000000000000000000000000),
.INIT_64 (256'b0000000000000000000010010110000111000000000001000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000110011000111111101000000001010000000000000100000000010000000111101000000000110011001010000000000110000000000),
.INIT_65 (256'b0000000000000000000000010000000000001000100101101011101110000000000001000000000001010000000000100101101111001000000000011110000000000001010000000000000000000000000000000000011001000000000001010000000000000000000000000000001001011011111000000000000011100000),
.INIT_66 (256'b1010110100000001000010000000000000000000000000000000000000000110000000000000000000000000000000000000000000000100001100110000010000000011000011110000010000000000000000001100110011010010000001000011110000000000000000000000000000000000000000000000000000000000),
.INIT_67 (256'b0000000000001101011000000000100010010000000000000000000000000000001100111000000000000000000000000000000000000000000001000000000011110000000000000000000000000000000000000000000000001000000011001100101100000001011000000100000000000000000000000000110011001111),
.INIT_68 (256'b0000000001000000000011000101000000000000000000000000000000000000000100000000001000000011010100000001010000000100000000000000000000001000000011000100000000000000000000000000000000000000001000000000000000000000000000000000000000000010000000000000000010000000),
.INIT_69 (256'b0000000001010000000000001000000011010100000001011000111000000000001000000000001000000000000000000110000000000000000000000000000000000000000000000000000000010010001001001000000100000000000000000100000000000000000000110111100000000000001111000000000000000000),
.INIT_6A (256'b0100000000010000000000000000100010000000000000001100111101000000000000001000000000000000000000000000000000110011100000000100001001000000000000000000000000000000000000000000000000001010000000001000000000000000000100000000000000100010000110110110100000000000),
.INIT_6B (256'b0011111011010110000000000000000000000000000000000100000000001101000100000000000000001000000000101100000000000000000000000011001110110000000111100000000000000000000000000000100000001100110000001000000000000000000000000000000000000000000000000000000000000000),
.INIT_6C (256'b0000000000001001011011111010100000000110000000000000000000000100000011001110010011011111000011100001000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000010010110110101000001110000100000000000000000000000000011001100),
.INIT_6D (256'b0000000000000000000000000000001000000000000000000000000000100000000000000000000000000011001100100110000000010000101100000000000000000000000011001100010111111000000000101000000000000000000000000000000000000000000000010000000000000000000000000000000000000000),
.INIT_6E (256'b1000110001000000000001000000000000110011100100101001111010100000000000000001000000000000010000000000100000000000000000000000000000000000000000010000000000000000110011000001000000000110000000000000000000000000000000001100110111011100000110011000000000000000),
.INIT_6F (256'b0000100000000000000000000000000000000001000000001000100101101111011000001100000001000000000000111000000000110011001001101001111110000001000000000010110000000010000000000000000000000000000000000000000000100000000000000000100000000000001001011000011000001001),
.INIT_70 (256'b0011000101000000010100001000000000000001010000000000000000000000000000000110000001000000000001010000000000000000000000000100001100110000010000001001000010000000000010000001000010001100110001111000001001100100000000000000000000000000000000000000000000000000),
.INIT_71 (256'b0000100000100001000011001111111111011111100011000000100000000000000000000011001110011010001011100011100000100000000000000000001111111110011110000001000011000000000000000000011001000000000000000000000011001100001110000010000001100100000000010101000000000011),
.INIT_72 (256'b0000000000000000000000000000000010000000100000000100000010001000000000000000000000000000000011001100101110100011011001101100000000000000000000000011001100100111101010010000111000000000000000000000000011101111000111101110000000000000000000000000000010000000),
.INIT_73 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000),
.INIT_74 (256'b0000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_75 (256'b0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_76 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_77 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000000000000),
.INIT_78 (256'b0000000000001000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_79 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_7A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_7B (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000000000010000000000000000000000000000011000000000000),
.INIT_7C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000001000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_7D (256'b0000000000000000000000000000000000000000000000000000000000000001110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000010000000000000010000001),
.INIT_7E (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000),
.INIT_7F (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
*/
) f0 (.i_clock (i_clock), .i_reset (i_reset), .i_enable (i_enable), .i_address (i_address[14:0]), .o_data (block[0]),
.i_data (i_data),
.i_we (i_we & ~i_address[15])
);
// 1
RamFile #(/*
.INIT_00 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_01 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000011010000011110000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_02 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111100000000000000000000000010010000000000000000000000000000000000000000000000000000000000),
.INIT_03 (256'b0000000000000000000000000000000010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_04 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_05 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_06 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_07 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_08 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000001100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_09 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001101000000011000000010100000000000000000000000000000000000000000000000000),
.INIT_0A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0B (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_0E (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000),
.INIT_0F (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_10 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_11 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_12 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_13 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_14 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_15 (256'b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110010000000000000000000000000000000000000000000101100110110101111000111101110000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_16 (256'b1111011010010000000000101000000000000001100000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000100010010010101111111100000000),
.INIT_17 (256'b0000000000000000000000000000000000000000000000000000000001111000000000000010100110100100000000000000000000000000000000000000010000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000010110000000000000100000000000111),
.INIT_18 (256'b0000000000000000000011011100110000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000110000000000001100100110011000000000001000000000000000110000000000001110011001100010000000000000000000000000000000000000000),
.INIT_19 (256'b0000000000000000000000111100001110011101101010000100010000000000000000000000101110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000010110000001000001100110000000110000000000000),
.INIT_1A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000010000000111011100001000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_1B (256'b1111111001010010000000000000000000000000000000000110110000111010011010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000010011000010000101000000000000000000000000000000111000010011010110100101),
.INIT_1C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000110111100000001000000000000110000000001010000000010000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000),
.INIT_1D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101111000000000000010000000000000000000010000000011100000000001000000000000000000000000000000000000000),
.INIT_1E (256'b0000000000000000000000000000000000010000000001101011000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111100000011010110000000100000000000000),
.INIT_1F (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000010000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_20 (256'b0010000111001001011010010000000000000000000000000101000110001001011001111101110000100000000000000000000000000000000000000000000000000000000000000010000000000010000000000000000000000000000000000000000000000000000000000000000000000011010000000000000000000000),
.INIT_21 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000001000000001111110110100100000000000000000000000000001000000010011110101111111100000000000000000000000000000000000000000000000000000000000000000001110100000000000000000000000000000100),
.INIT_22 (256'b0000000000000000000000100000000000000000000000000000000000000010010100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000110111001100001000000010100000000000000000011001000000000000000000000000000000000000000010011110),
.INIT_23 (256'b0000000000000111000000000000000000111100000000010110110110010110000000000001000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000111000000000000000100000000011010000001011110011000000000100),
.INIT_24 (256'b0000000000010000000000000000000000001110000000000000000000000000000000000000100000000000100000000000000000000001000000000000011011100101100000000000000000000000000000000010110000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_25 (256'b0111000011110000001110001100110000000001000000000000000000000010101111000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011010001100100000011100011001100000000000000000000000000011000000100000000),
.INIT_26 (256'b0000000000000000000000000000000000000000001100000000000000000000000000000000011000101000010010110110100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000110000),
.INIT_27 (256'b0000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101100010000000000100101101001000010000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_28 (256'b0000000000000000000000000000000000000000000000011010110110110111001100000010000000000000000000110100000000000100000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001001101011001100110000),
.INIT_29 (256'b0001110011001100000000000000000000000000000000000000000000101011111100000000000000000000000000000100001000100000000111000000000000001101001100110000000001000000000000000000000000010000011011110011000100000000000000000000000000000000000000011001111111000000),
.INIT_2A (256'b0000000000000010010011111011100101100000000000010000000000000000000000000000000000000000000100000000000000000100000000000000000000000000000000000000000000000010000000000000000000000000000000011000100100000010110011001100000000000000000000000000000000110000),
.INIT_2B (256'b0000000000000000100000001000000011000000100010000000000000000000000000000000000000000000110000001011111001011000000000000001000000000000000000000011010000000000100000000000000000000000000000000000000000000000000000000000000000000000100100000000000000000000),
.INIT_2C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_2D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_2E (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_2F (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_30 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001011000000000000000000000000000000),
.INIT_31 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_32 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000100),
.INIT_33 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_34 (256'b0000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_35 (256'b0000000000000000000000000000000000010000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000),
.INIT_36 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000100010000000000000000000000000000000000000000000000000101010000000000000000000000000000000000000000000000000000010000000000000000),
.INIT_37 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001),
.INIT_38 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_39 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3B (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3E (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_3F (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_40 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_41 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_42 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_43 (256'b0000011110001100110100000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100011001100000000000000000000000000000000000000000000000000000000),
.INIT_44 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000110000110100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000011100000000),
.INIT_45 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010110100001101001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_46 (256'b0000000000000000000000000000100000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001101000011110000000000000000000000000000000000),
.INIT_47 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000001011000000000101000000000010000000000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_48 (256'b0010000000001000001100110000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100000000000010000000000000000000000000000001000000000000000000000000000000000000000000000000),
.INIT_49 (256'b0000000000000000000000000000000000000000000000000000000000000000000010000000000100000111000011001100000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110100),
.INIT_4A (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000000001111100011111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4B (256'b0000000000000000000000000000000001000100000000000001100000000011000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000101000000000001111011111101110000000010),
.INIT_4C (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000000000001001000110000000011101000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4D (256'b0111100010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4E (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000011000100000000011111100000000000000000000000000000010110000000000001010101000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),
.INIT_4F (256'b0000000000010000000011110000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000010000000000000000100100000000000000101111000000010000000000000000001000100000000000000111101110000100010000000000000000000000),
.INIT_50 (256'b0000000000000000000000000000000100000000000000001000001100110100100001011000001000001010000000100000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000001001000000001111011110010010000010),
.INIT_51 (256'b1111101111001100000000000000000000000000000000000000000000000000000000000000000001000000000000000000000100000000101001100000000000101100001000010000000000000010000001010111100000000111011110001100110000000000000000000000000000000000000000000000000000000000),
.INIT_52 (256'b1110000001100011100000001101001100110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000010000010000000001110110110010000101000000000000000000001010110000000000),
.INIT_53 (256'b0000000000000000000000000000000000000000000000000000000000000000000000100000000011110001100100000011100011001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100),
.INIT_54 (256'b0000000000000010000000001010111001100001010110011001011000100000000000000000000000000000000000000000000000000000000000000011000000000000000000001000000000001100001000100110101000110011000000000000000000000100101100000000000000110010010110000000000000000000),
.INIT_55 (256'b1100000000100000000000000000000010000000001000000000000000100110101100110011000010000010000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000001111000000000000000000000000000000000000000000001011100000011001011001110011),
.INIT_56 (256'b1110001101100011001100000000000000000000000000000000000000000000000000000000000000000000000000000000000100110000000000000001100111100101111110110011000000000000110000000000000011100111100000000000000000000000000000000000000000000000000000000000001110000011),
.INIT_57 (256'b1000000100001001110110010001101101011010010000000000101000000000001001100000001001101011001100110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000100100001010110110100100000000000000000000000011110000),
.INIT_58 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001110100001011000110100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010),
.INIT_59 (256'b0100100000000000000000000000000000000000000000000011011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000000000000011110000101100101101001000000000000000000000000000000000000000000000000000000000000000000),
.INIT_5A (256'b0000000000000000000000000000000000000000000000000000000000001111001100101000100001010000000000000000000000000000000000000000101011000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110101011101000),
.INIT_5B (256'b0000011100000000110011000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000100000001000000000010000000000000000000000010000000000100000000011001110000000010100001000000000000000000000000000000000000),
.INIT_5C (256'b0000000000000000000000000100000000001100001100110000000000000010100000001001000000000000011000110000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000001111000000000000000000001000000000000000000000000),
.INIT_5D (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000000110000011001100000000000000010000000000000001100000000011101100000001000000000000000000000000000000000000000000000000000000000000000000100000000000),
.INIT_5E (256'b0110111001011000000000010000000000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000011100000000101010010110000000000000000000000000000000010000000000000000000000000000),
.INIT_5F (256'b0000000000000000000000000001000000000000000000000010000000110100001000000111110100110011000000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100001010111000010000111),
.INIT_60 (256'b0010000010000000000010101001101001000000000000000000000000000000000000000000000000000000000000000000000000000000100000000001000000000001100000011001101001110011000000000000000000000000010001100000000000000000000000000000000000000000000000000000000000000000),
.INIT_61 (256'b0000000100110000000001000001100010101101101001001100110000000010110000000000000101000000000001111011011010010000000000000000000000000000000000000000000000000000000000000000000000000000001100001000000011101000000000000011111110101100110000000000001000000000),
.INIT_62 (256'b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000011111000101100001111110110100100010000000000000001100000000001000000000011010110100100000000000000000000000000000000000000000000000000000000000000001000000000),
.INIT_63 (256'b0011111110100011001100001000000000000000000000110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000010110100000011110110011000011100101101101001000000010010100000000000000000011010000101110101101001),
.INIT_64 (256'b1000000001101010101101000100010000000000000000000000000000000000010100011001100110100111001100000000000000001000000000100110000001000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000001001000011),
.INIT_65 (256'b000000000000000000000000000000000000000000000000000000000000000001100000)
*/
) f1 (.i_clock (i_clock), .i_reset (i_reset), .i_enable (i_enable), .i_address (i_address[14:0]), .o_data (block[1]),
.i_data (i_data),
.i_we (i_we & i_address[15])
);
wire [2:0] block_address = i_address[17:15];
assign o_data = block[ block_address ];
endmodule
# full iCEstick pinout:
# http://www.pighixxx.com/test/portfolio-items/icestick/
# set_io io_13_9__1_led4 95
# set_io io_13_6__0_pmod4 81
# set_io io_13_6__0_pmod4 81
# TOP (bank 0)
set_io IOT_45 26 # (io 6 9 pad 0)
set_io IOT_47 27 # (io 5 9 pad 0)
set_io IOT_49_GBIN0 29 # GBUF0 (io 4 9 pad 0)
set_io IOT_50_GBIN1 30 # GBUF1 (io 3 9 pad 1)
set_io IOT_52 32 # (io 2 9 pad 1)
set_io IOT_53 31 # (io 2 9 pad 0)
# RIGHT (bank 1)
set_io IOR_34 18 # (io 7 4 pad 0)
set_io IOR_35_GBIN3 19 # GBUF3 (io 7 4 pad 1)
set_io IOR_36_GBIN2 20 # GBUF2 (io 7 5 pad 0)
set_io IOR_38 22 # (io 7 6 pad 0)
set_io IOR_39 23 # (io 7 6 pad 1)
# BOTTOM (bank 2)
set_io IOB_24_SPI_SDO 12 # (io 5 0 pad 0)
set_io IOB_25_SPI_SDI 13 # (io 5 0 pad 1)
set_io IOB_26_SPI_SCK 15 # (io 6 0 pad 0)
set_io IOB_27_SPI_SS_B 14 # (io 6 0 pad 1)
# LEFT (bank 3)
set_io IOL_2B 1 # D+ (io 0 7 pad 0)
set_io IOL_2A 2 # D- (io 0 7 pad 1)
set_io IOL_4A 5 # D- GBUF7 (io 0 5 pad 1)
set_io IOL_4B_GBIN7 6 # D+ GBUF7 (io 0 5 pad 0)
set_io IOL_5B 7 # D+ (io 0 4 pad 0)
set_io IOL_5A_GBIN6 8 # D- or GBUF6 (io 0 4 pad 1)
#include <cassert>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <EGL/egl.h>
using namespace std;
void error_fatal(const char* format, ...) {
printf("error: ");
va_list va;
va_start(va, format);
vprintf(format, va);
va_end(va);
printf("\n");
exit(1);
}
# define ERROR "ERROR"
# define OK(expr) (!(expr) ? (throw "ERROR##expr"), false : true)
void setup_egl(
EGLNativeWindowType native_window,
EGLDisplay* out_display,
EGLConfig* out_config,
EGLContext* out_context,
EGLSurface* out_window_surface) {
OK(eglBindAPI(EGL_OPENGL_ES_API));
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
OK(display != EGL_NO_DISPLAY);
EGLint ignore = 0;
OK(eglInitialize(display, &ignore, &ignore));
EGLint configs_size = 256;
EGLConfig* configs = new EGLConfig[configs_size];
EGLint num_configs = 0;
const EGLint egl_config_attribs[] = {
EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
EGL_BUFFER_SIZE, 32,
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_DEPTH_SIZE, 24,
EGL_STENCIL_SIZE, 8,
EGL_SAMPLE_BUFFERS, 0,
EGL_SAMPLES, 0,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE,
};
OK(eglChooseConfig(
display,
egl_config_attribs,
configs,
configs_size, // num requested configs
&num_configs)); // num returned configs
OK(num_configs);
EGLConfig config = configs[0];
delete [] configs;
const EGLint egl_context_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE,
};
EGLContext context = eglCreateContext(
display,
config,
EGL_NO_CONTEXT,
egl_context_attribs);
OK(context);
const EGLint egl_surface_attribs[] = {
EGL_RENDER_BUFFER,
EGL_BACK_BUFFER,
EGL_NONE,
};
EGLSurface surface = eglCreateWindowSurface(
display,
config,
native_window,
egl_surface_attribs);
OK(surface);
OK(eglMakeCurrent(display, surface, surface, context));
// Check if surface is double buffered.
EGLint render_buffer;
OK(eglQueryContext(
display,
context,
EGL_RENDER_BUFFER,
&render_buffer));
if (render_buffer == EGL_SINGLE_BUFFER) {
printf("warn: EGL surface is single buffered\n");
}
*out_display = display;
*out_config = config;
*out_context = context;
*out_window_surface = surface;
}
const fs = require('fs');
const srcFile = fs.readFileSync('./example-384.bin');
let files = ['', '', '', '', '', '', '', ''];
let index = 0;
let pos = 0;
let skip = 4;
let currentString = '';
let bitCounter = 0;
let rowCounter = 0;
const fileBinData = Buffer.alloc(7337);
let fileData = `\`timescale 1ns / 1ps
module RamSource (
input wire i_clock,
input wire i_reset,
input wire i_enable,
input wire [17:0] i_address,
output wire o_data,
input wire [1:0] i_data,
input wire i_we
);
wire [7:0] block;
// 0\n RamFile #(
`;
let fileCounter = 0;
if (srcFile[12] === 0x92) {
// 3 bytes: 92 00 20 (opcode 9 length 2 bytes payload 32 = "Enable warm boot"; for slave SPI should be 0)
console.log('Disabling warm boot for slave SPI...');
srcFile[13] = 0;
srcFile[14] = 0;
}
let crc = 0xFFFF;
console.log(crc >>> 15);
console.log(crc);
const updateCrc = (byte) => {
// CRC-16-CCITT, Initialize to 0xFFFF, No zero padding
for (let i = 7; i >= 0; i--) {
const data_bit = (byte >>> i) & 1;
const crc_bit = crc >>> 15;
const xor_value = (data_bit ^ crc_bit) ? 0x1021 : 0;
crc = 0xFFFF & ((crc << 1) ^ xor_value);
//const xor_value = ((crc >>> 15) ^ ((byte >>> i) & 1)) ? 0x1021 : 0;
//crc = (0xFFFF & (crc << 1)) ^ xor_value;
}
}
const src = Buffer.concat([srcFile, Buffer.alloc(7)]);
const hexByte = (byte) => ('00' + (byte).toString(16).toUpperCase()).substr(-2);
console.log(typeof(src), '00' + ((src.length - 4) * 8).toString(16));
const crcOpcode = srcFile[srcFile.length - 6];
const crcMsb = srcFile[srcFile.length - 5];
const crcLsb = srcFile[srcFile.length - 4];
console.log(`CRC16 ${ hexByte(crcOpcode) } ${ hexByte(crcMsb) } ${ hexByte(crcLsb) }`);
const lastCrcPos = srcFile.length - 6;
let binaryWriteoutPos = 0;
src.forEach((byte, n) => {
if (n > 11 && n < lastCrcPos) {
updateCrc(byte);
} else if (n === lastCrcPos) {
updateCrc(byte);
const msb_crc = crc >>> 8;
const lsb_crc = 0xFF & crc;
console.log(`Curr byte: ${ hexByte(byte) }. Computed CRC16 is ${ hexByte(msb_crc) } ${ hexByte(lsb_crc) }`); //${ ('0000' + (crc).toString(16).toUpperCase()).substr(-4) } ${ crc }`);
}
if (n == 13 || n == 14) {
// byte = 0;
//console.log(byte);
}
if (skip) {
--skip;
return;
//byte = 0;
}
let msb_lsb_byte = 0;
for (let i = 7; i >= 0; --i) {
// files[index] += byte & (1 << i) ? '1\n' : '0\n';
const bitValue = (byte & (1 << i)) ? 1 : 0;
currentString = (bitValue ? '1' : '0') + currentString;
++bitCounter;
msb_lsb_byte = msb_lsb_byte | (bitValue << (7 - i));
}
fileBinData.writeUInt8(msb_lsb_byte, binaryWriteoutPos++);
if (++pos >= 4096) {
pos = 0;
++index;
}
if (bitCounter === 256) {
bitCounter = 0;
const val = ('00'+(rowCounter).toString(16).toUpperCase()).substr(-2);
fileData += ` .INIT_${ val } (256'b${ currentString })`;
currentString = '';
++rowCounter;
if (rowCounter === 128) {
rowCounter = 0;
fileData += `
) f${ fileCounter } (.i_clock (i_clock), .i_reset (i_reset), .i_enable (i_enable), .i_address (i_address[14:0]), .o_data (block[${ fileCounter }]),
.i_data (i_data),
.i_we (i_we & ~i_address[15]));
// ${ fileCounter + 1 }
RamFile #(
`;
++fileCounter;
} else {
if (n < src.length - 4 - 1) {
fileData += `,\n`;
} else {
console.log(n);
}
}
}
// const b_val = ('00'+(byte).toString(16).toUpperCase()).substr(-2);
// process.stdout.write(b_val);
});
if (bitCounter < 256) {
const val = ('00'+(rowCounter).toString(16).toUpperCase()).substr(-2);
fileData += ` .INIT_${ val } (256'b${ currentString })`;
currentString = '';
++rowCounter;
if (rowCounter === 128) {
rowCounter = 0;
fileData += `
) f${ fileCounter } (.i_clock (i_clock), .i_reset (i_reset), .i_enable (i_enable), .i_address (i_address[14:0]), .o_data (block[${ fileCounter }]),
.i_data (i_data),
.i_we (i_we & i_address[15]));
// ${ fileCounter + 1 }
RamFile #(
`;
++fileCounter;
}
}
console.log('');
fileData += `
) f${ fileCounter } (.i_clock (i_clock), .i_reset (i_reset), .i_enable (i_enable), .i_address (i_address[14:0]), .o_data (block[${ fileCounter }]),
.i_data (i_data),
.i_we (i_we & i_address[15]));
wire [2:0] block_address = i_address[17:15];
assign o_data = block[ block_address ];
endmodule
`;
console.log(`Binary length ${ binaryWriteoutPos }`);
fs.writeFileSync('./RAMB36E1_init_params_new.v', fileData);
fs.writeFileSync('./example-384-processed.bin', fileBinData);
//let n = 0;
//files.forEach(file => {
// fs.writeFileSync(`./example.vivado${ ++n }.hex`, file);
//});
`timescale 1ns / 1ps
`define COUNTER_RESOLUTION_BITS 24
module EthernetPhyWrapper (
// Universal interface
input wire MDC, // Management data clock max 25 MHz
//inout wire MDIO, // Management data I/O starts in Z state
input wire TX_EN, // Active high
input wire TX0,
input wire TX1,
output wire CRS_DV, // High when data is available
output wire RX0,
output wire RX1,
output wire REFCLK, // 50 MHz RMII clock. In Arty, just returns XTAL1_CLKIN_50MHZ back to the rest of the board
// Arty interface PHY connections. Remove in real external RMII PHY.
// Emulates power-on reset because Arty boots the PHY in MII mode
// Management interface
// In the controller, wait 84 ms until feeding data on boot
output wire ARTY_ETH_MDC, // Management data clock max 25 MHz
// Keep in "Z" on boot (make sure it has a pull-up resistor in the PHY board)
//inout wire ARTY_ETH_MDIO, // Management data I/O
output wire ARTY_ETH_TX_EN, // Active high
output wire ARTY_ETH_TXD1,
output wire ARTY_ETH_TXD0,
input wire ARTY_ETH_RXD1,
input wire ARTY_ETH_RXD0,
input wire ARTY_ETH_CRS_DV, // "Data is ready" CRS_DV/LED_CFG not in full-duplex. Receive medium is not idle (carrier sense)
// Physical interface
output wire ARTY_ETH_REF_CLK, // 50 MHz in RMII mode. Derived from GCLK100
output wire ARTY_ETH_RSTN, // Reset active low 1 us power on reset only
// To put into RMII mode only
inout wire ARTY_ETH_RX_DV, // Put to 1 while resetting to put PHY into the RMII mode then go Z
// Tweak for Arty board. In the physical board 8720,
// 50 MHz signal comes from the REFCLK pin; its CLKIN connected to a real XTAL.
// No need to connect it in Lattice.
input wire ARTY_GCLK100, // Divided to make an analog of XTAL1_CLKIN_50MHZ
input wire DELAY_ENGINE_COUNTING,
input wire DELAY_ENGINE_COUNTED,
output wire DELAY_ENGINE_START,
output wire [`COUNTER_RESOLUTION_BITS-1:0] DELAY_ENGINE_DELAY
);
assign CRS_DV = ARTY_ETH_CRS_DV;
assign RX0 = ARTY_ETH_RXD0;
assign RX1 = ARTY_ETH_RXD1;
assign ARTY_ETH_TX_EN = TX_EN;
assign ARTY_ETH_TXD0 = TX0;
assign ARTY_ETH_TXD1 = TX1;
// Hardware emulation of RMII board:
// 1. Hold RESET 1 us since boot.
// 2. Wait 3 us before 32 MDC clocks.
// 3. Keep ETH_RX_DV at 1 for 30-40 ns after raising edge of MDC.
// 4. Generate internal MDC clock to emulate setting of RMII mode.
// Note MDC is an independent clock so it must be provided externally with different phase and so on.
// 5. Go to Z after the first flop
// 1. Divide the clock
// Use Ethernet 50 MHz source as the main clock
reg derived_clock_50_mhz = 1'b0;
always @(posedge ARTY_GCLK100)
begin
derived_clock_50_mhz <= #4 ~derived_clock_50_mhz;
end
wire GLOBAL_CLOCK_50MHZ;
// Throw the derived clock on global clock net
BUFG eth_50_mhz_clk_buf (
.O (GLOBAL_CLOCK_50MHZ),
.I (derived_clock_50_mhz)
);
assign ARTY_ETH_REF_CLK = GLOBAL_CLOCK_50MHZ;
assign REFCLK = GLOBAL_CLOCK_50MHZ;
// An MDC multiplexer because we have to send some signal there too:
reg initializing = 1'b1;
reg local_MDC = 1'b0;
reg [6:0] toggle_mdc_32_times = 7'd64; // 64 is up and down
assign ARTY_ETH_MDC = (initializing & local_MDC) | (~initializing & MDC);
reg HOLD_RX_DV_TO_ENABLE_RMII_ON_BOOT = 1'bz;
assign ARTY_ETH_RX_DV = HOLD_RX_DV_TO_ENABLE_RMII_ON_BOOT;
reg power_on_reset_signal = 1'b0;
assign ARTY_ETH_RSTN = power_on_reset_signal;
reg [`COUNTER_RESOLUTION_BITS-1:0] current_delay_signal = 0;
assign DELAY_ENGINE_DELAY = current_delay_signal;
reg start_waiting_signal = 1'b0;
assign DELAY_ENGINE_START = start_waiting_signal;
// State machine
reg waiting_phase_resetting = 1'b1;
reg waiting_phase_stabilizing = 1'b0;
reg latching_in_hardware_cfg_pins = 1'b0;
always @(posedge REFCLK)
begin
//if (initializing)
//begin
if (~DELAY_ENGINE_COUNTING & ~start_waiting_signal)
begin
// Launch counter first time wait for 1 us
if (~DELAY_ENGINE_COUNTED)
begin
if (waiting_phase_resetting)
begin
current_delay_signal <= #4 `COUNTER_RESOLUTION_BITS'd50;
start_waiting_signal <= #4 1'b1;
end
end
else
// Counting just completed
begin
// Switch to stabilizing wait mode. Wait for 3 us
// RELEASE RESET
if (waiting_phase_resetting)
begin
waiting_phase_resetting <= #4 1'b0;
waiting_phase_stabilizing <= #4 1'b1;
power_on_reset_signal <= #4 1'b1;
HOLD_RX_DV_TO_ENABLE_RMII_ON_BOOT <= #4 1'b1; // 1'bz
current_delay_signal <= #4 `COUNTER_RESOLUTION_BITS'd150;
start_waiting_signal <= #4 1'b1;
end
else
// Stabilizing is done. Give some MDC clock and wait for latching.
if (waiting_phase_stabilizing)
begin
waiting_phase_stabilizing <= #4 1'b0;
latching_in_hardware_cfg_pins <= #4 1'b1;
end
end
end
else
begin
// Release "Start" pulse
if (DELAY_ENGINE_COUNTING & start_waiting_signal)
begin
start_waiting_signal <= #4 1'b0;
end
end
if (latching_in_hardware_cfg_pins)
begin
local_MDC = #4 ~local_MDC;
toggle_mdc_32_times = #4 toggle_mdc_32_times - 6'b1;
// On the second raising edge of MDC, put HOLD_RX_DV_TO_ENABLE_RMII_ON_BOOT to Z:
if (toggle_mdc_32_times == 7'd62)
begin
HOLD_RX_DV_TO_ENABLE_RMII_ON_BOOT <= #4 1'bz;
end
if (!toggle_mdc_32_times)
begin
// Ready!
initializing <= #4 1'b0;
latching_in_hardware_cfg_pins <= #4 1'b0;
end
end
end
//end
endmodule
`timescale 1ns / 1ps
module RamFile # (
parameter INIT_00 = 256'b0,
parameter INIT_01 = 256'b0,
parameter INIT_02 = 256'b0,
parameter INIT_03 = 256'b0,
parameter INIT_04 = 256'b0,
parameter INIT_05 = 256'b0,
parameter INIT_06 = 256'b0,
parameter INIT_07 = 256'b0,
parameter INIT_08 = 256'b0,
parameter INIT_09 = 256'b0,
parameter INIT_0A = 256'b0,
parameter INIT_0B = 256'b0,
parameter INIT_0C = 256'b0,
parameter INIT_0D = 256'b0,
parameter INIT_0E = 256'b0,
parameter INIT_0F = 256'b0,
parameter INIT_10 = 256'b0,
parameter INIT_11 = 256'b0,
parameter INIT_12 = 256'b0,
parameter INIT_13 = 256'b0,
parameter INIT_14 = 256'b0,
parameter INIT_15 = 256'b0,
parameter INIT_16 = 256'b0,
parameter INIT_17 = 256'b0,
parameter INIT_18 = 256'b0,
parameter INIT_19 = 256'b0,
parameter INIT_1A = 256'b0,
parameter INIT_1B = 256'b0,
parameter INIT_1C = 256'b0,
parameter INIT_1D = 256'b0,
parameter INIT_1E = 256'b0,
parameter INIT_1F = 256'b0,
parameter INIT_20 = 256'b0,
parameter INIT_21 = 256'b0,
parameter INIT_22 = 256'b0,
parameter INIT_23 = 256'b0,
parameter INIT_24 = 256'b0,
parameter INIT_25 = 256'b0,
parameter INIT_26 = 256'b0,
parameter INIT_27 = 256'b0,
parameter INIT_28 = 256'b0,
parameter INIT_29 = 256'b0,
parameter INIT_2A = 256'b0,
parameter INIT_2B = 256'b0,
parameter INIT_2C = 256'b0,
parameter INIT_2D = 256'b0,
parameter INIT_2E = 256'b0,
parameter INIT_2F = 256'b0,
parameter INIT_30 = 256'b0,
parameter INIT_31 = 256'b0,
parameter INIT_32 = 256'b0,
parameter INIT_33 = 256'b0,
parameter INIT_34 = 256'b0,
parameter INIT_35 = 256'b0,
parameter INIT_36 = 256'b0,
parameter INIT_37 = 256'b0,
parameter INIT_38 = 256'b0,
parameter INIT_39 = 256'b0,
parameter INIT_3A = 256'b0,
parameter INIT_3B = 256'b0,
parameter INIT_3C = 256'b0,
parameter INIT_3D = 256'b0,
parameter INIT_3E = 256'b0,
parameter INIT_3F = 256'b0,
parameter INIT_40 = 256'b0,
parameter INIT_41 = 256'b0,
parameter INIT_42 = 256'b0,
parameter INIT_43 = 256'b0,
parameter INIT_44 = 256'b0,
parameter INIT_45 = 256'b0,
parameter INIT_46 = 256'b0,
parameter INIT_47 = 256'b0,
parameter INIT_48 = 256'b0,
parameter INIT_49 = 256'b0,
parameter INIT_4A = 256'b0,
parameter INIT_4B = 256'b0,
parameter INIT_4C = 256'b0,
parameter INIT_4D = 256'b0,
parameter INIT_4E = 256'b0,
parameter INIT_4F = 256'b0,
parameter INIT_50 = 256'b0,
parameter INIT_51 = 256'b0,
parameter INIT_52 = 256'b0,
parameter INIT_53 = 256'b0,
parameter INIT_54 = 256'b0,
parameter INIT_55 = 256'b0,
parameter INIT_56 = 256'b0,
parameter INIT_57 = 256'b0,
parameter INIT_58 = 256'b0,
parameter INIT_59 = 256'b0,
parameter INIT_5A = 256'b0,
parameter INIT_5B = 256'b0,
parameter INIT_5C = 256'b0,
parameter INIT_5D = 256'b0,
parameter INIT_5E = 256'b0,
parameter INIT_5F = 256'b0,
parameter INIT_60 = 256'b0,
parameter INIT_61 = 256'b0,
parameter INIT_62 = 256'b0,
parameter INIT_63 = 256'b0,
parameter INIT_64 = 256'b0,
parameter INIT_65 = 256'b0,
parameter INIT_66 = 256'b0,
parameter INIT_67 = 256'b0,
parameter INIT_68 = 256'b0,
parameter INIT_69 = 256'b0,
parameter INIT_6A = 256'b0,
parameter INIT_6B = 256'b0,
parameter INIT_6C = 256'b0,
parameter INIT_6D = 256'b0,
parameter INIT_6E = 256'b0,
parameter INIT_6F = 256'b0,
parameter INIT_70 = 256'b0,
parameter INIT_71 = 256'b0,
parameter INIT_72 = 256'b0,
parameter INIT_73 = 256'b0,
parameter INIT_74 = 256'b0,
parameter INIT_75 = 256'b0,
parameter INIT_76 = 256'b0,
parameter INIT_77 = 256'b0,
parameter INIT_78 = 256'b0,
parameter INIT_79 = 256'b0,
parameter INIT_7A = 256'b0,
parameter INIT_7B = 256'b0,
parameter INIT_7C = 256'b0,
parameter INIT_7D = 256'b0,
parameter INIT_7E = 256'b0,
parameter INIT_7F = 256'b0
) (
input wire i_clock,
input wire i_reset,
input wire i_enable,
input wire [14:0] i_address,
output wire o_data,
input wire [1:0] i_data,
input wire i_we
);
wire [31:0] DO_PATTERN;
wire [15:0] ADDR_PATTERN;
assign ADDR_PATTERN[14:0] = i_address;
assign o_data = DO_PATTERN[0];
wire [31:0] DI_PATTERN;
assign DI_PATTERN[1:0] = i_data;
RAMB36E1 # (
.DOA_REG (0),
.INIT_00 (INIT_00),
.INIT_01 (INIT_01),
.INIT_02 (INIT_02),
.INIT_03 (INIT_03),
.INIT_04 (INIT_04),
.INIT_05 (INIT_05),
.INIT_06 (INIT_06),
.INIT_07 (INIT_07),
.INIT_08 (INIT_08),
.INIT_09 (INIT_09),
.INIT_0A (INIT_0A),
.INIT_0B (INIT_0B),
.INIT_0C (INIT_0C),
.INIT_0D (INIT_0D),
.INIT_0E (INIT_0E),
.INIT_0F (INIT_0F),
.INIT_10 (INIT_10),
.INIT_11 (INIT_11),
.INIT_12 (INIT_12),
.INIT_13 (INIT_13),
.INIT_14 (INIT_14),
.INIT_15 (INIT_15),
.INIT_16 (INIT_16),
.INIT_17 (INIT_17),
.INIT_18 (INIT_18),
.INIT_19 (INIT_19),
.INIT_1A (INIT_1A),
.INIT_1B (INIT_1B),
.INIT_1C (INIT_1C),
.INIT_1D (INIT_1D),
.INIT_1E (INIT_1E),
.INIT_1F (INIT_1F),
.INIT_20 (INIT_20),
.INIT_21 (INIT_21),
.INIT_22 (INIT_22),
.INIT_23 (INIT_23),
.INIT_24 (INIT_24),
.INIT_25 (INIT_25),
.INIT_26 (INIT_26),
.INIT_27 (INIT_27),
.INIT_28 (INIT_28),
.INIT_29 (INIT_29),
.INIT_2A (INIT_2A),
.INIT_2B (INIT_2B),
.INIT_2C (INIT_2C),
.INIT_2D (INIT_2D),
.INIT_2E (INIT_2E),
.INIT_2F (INIT_2F),
.INIT_30 (INIT_30),
.INIT_31 (INIT_31),
.INIT_32 (INIT_32),
.INIT_33 (INIT_33),
.INIT_34 (INIT_34),
.INIT_35 (INIT_35),
.INIT_36 (INIT_36),
.INIT_37 (INIT_37),
.INIT_38 (INIT_38),
.INIT_39 (INIT_39),
.INIT_3A (INIT_3A),
.INIT_3B (INIT_3B),
.INIT_3C (INIT_3C),
.INIT_3D (INIT_3D),
.INIT_3E (INIT_3E),
.INIT_3F (INIT_3F),
.INIT_40 (INIT_40),
.INIT_41 (INIT_41),
.INIT_42 (INIT_42),
.INIT_43 (INIT_43),
.INIT_44 (INIT_44),
.INIT_45 (INIT_45),
.INIT_46 (INIT_46),
.INIT_47 (INIT_47),
.INIT_48 (INIT_48),
.INIT_49 (INIT_49),
.INIT_4A (INIT_4A),
.INIT_4B (INIT_4B),
.INIT_4C (INIT_4C),
.INIT_4D (INIT_4D),
.INIT_4E (INIT_4E),
.INIT_4F (INIT_4F),
.INIT_50 (INIT_50),
.INIT_51 (INIT_51),
.INIT_52 (INIT_52),
.INIT_53 (INIT_53),
.INIT_54 (INIT_54),
.INIT_55 (INIT_55),
.INIT_56 (INIT_56),
.INIT_57 (INIT_57),
.INIT_58 (INIT_58),
.INIT_59 (INIT_59),
.INIT_5A (INIT_5A),
.INIT_5B (INIT_5B),
.INIT_5C (INIT_5C),
.INIT_5D (INIT_5D),
.INIT_5E (INIT_5E),
.INIT_5F (INIT_5F),
.INIT_60 (INIT_60),
.INIT_61 (INIT_61),
.INIT_62 (INIT_62),
.INIT_63 (INIT_63),
.INIT_64 (INIT_64),
.INIT_65 (INIT_65),
.INIT_66 (INIT_66),
.INIT_67 (INIT_67),
.INIT_68 (INIT_68),
.INIT_69 (INIT_69),
.INIT_6A (INIT_6A),
.INIT_6B (INIT_6B),
.INIT_6C (INIT_6C),
.INIT_6D (INIT_6D),
.INIT_6E (INIT_6E),
.INIT_6F (INIT_6F),
.INIT_70 (INIT_70),
.INIT_71 (INIT_71),
.INIT_72 (INIT_72),
.INIT_73 (INIT_73),
.INIT_74 (INIT_74),
.INIT_75 (INIT_75),
.INIT_76 (INIT_76),
.INIT_77 (INIT_77),
.INIT_78 (INIT_78),
.INIT_79 (INIT_79),
.INIT_7A (INIT_7A),
.INIT_7B (INIT_7B),
.INIT_7C (INIT_7C),
.INIT_7D (INIT_7D),
.INIT_7E (INIT_7E),
.INIT_7F (INIT_7F),
.EN_ECC_READ("FALSE"),
.EN_ECC_WRITE("FALSE"),
.RAM_MODE("TDP"),
.READ_WIDTH_A (1),
.RDADDR_COLLISION_HWCONFIG("PERFORMANCE"),
.SIM_COLLISION_CHECK("NONE"),
.SIM_DEVICE ("7SERIES"),
.SRVAL_A (72'h0),
.WRITE_MODE_A ("WRITE_FIRST"),
.WRITE_WIDTH_A (2)
) bram36_single_bl (
.CASCADEOUTA (),
.CASCADEOUTB (),
.DBITERR (),
.DOBDO (),
.DOPADOP (),
.DOPBDOP (),
.ECCPARITY (),
.RDADDRECC (),
.SBITERR (),
.ADDRBWRADDR (16'b0),
.CASCADEINA (1'b0),
.CASCADEINB (1'b0),
.CLKBWRCLK (1'b0),
.DIBDI (32'b0),
.DIPADIP (4'b0),
.DIPBDIP (4'b0),
.ENARDEN (i_enable),
.ENBWREN (1'b0),
.INJECTDBITERR(1'b0),
.INJECTSBITERR(1'b0),
.REGCEAREGCE (1'b0),
.REGCEB (1'b0),
.RSTRAMARSTRAM (i_reset),
.RSTRAMB (1'b0),
.RSTREGARSTREG (1'b0),
.RSTREGB (1'b0),
.WEBWE (8'b0),
.WEA ({3'b0, i_we}),
.DIADI (DI_PATTERN),
.CLKARDCLK (i_clock),
// 15-bit address
.ADDRARDADDR (ADDR_PATTERN),
// 1-bit output
.DOADO (DO_PATTERN)
);
endmodule
# include <GLES2/gl2.h>
# include <cstdio>
void runApp (int width, int height) {
printf("GL_VERSION : %s\n", glGetString(GL_VERSION) );
printf("GL_RENDERER : %s\n", glGetString(GL_RENDERER) );
glViewport(0, 0, width, height);
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
/* Create swap chain GPGPU render textures
const gpgpuTexture = [,];
for (let i = 0; i < 2; ++i) {
gpgpuTexture[i] = {
texture: gl.createTexture(),
framebuffer: gl.createFramebuffer()
};
gl.bindTexture(gl.TEXTURE_2D, gpgpuTexture[i].texture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gpgpuTextureSide, gpgpuTextureSide, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
gl.bindFramebuffer(gl.FRAMEBUFFER, gpgpuTexture[i].framebuffer);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, gpgpuTexture[i].texture, 0);
}
*/
//char* data[width * height * 8] = { 0 };
//glBindFramebuffer(GL_FRAMEBUFFER, 1);//gpgpuTexture[chainIdSrc].framebuffer);
//glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
}
`timescale 1ns / 1ps
module testbench ();
reg GCLK100 = 1'b0;
wire ETH_MDC;
wire ETH_MDIO, ETH_RX_DV;
reg signal_ETH_MDIO_write = 1'bz;
reg signal_ETH_RX_DV_write = 1'bz;
wire signal_ETH_MDIO_read;
wire signal_ETH_RX_DV_read;
assign signal_ETH_MDIO_read = ETH_MDIO;
assign ETH_MDIO = signal_ETH_MDIO_write;
assign signal_ETH_RX_DV_read = ETH_RX_DV;
assign ETH_RX_DV = signal_ETH_RX_DV_write;
reg ETH_REF_CLK = 1'b0;
wire ETH_RSTN;
reg ETH_CRS_DV = 1'b0, ETH_RXD0 = 1'b0, ETH_RXD1 = 1'b0;
wire ETH_TX_EN, ETH_TXD0, ETH_TXD1;
wire LED0_B, LED1_B, LED2_B, LED3_B;
wire LED0_R, LED1_R, LED2_R, LED3_R;
reg DONE = 1'b0;
wire CK_IO26, CK_IO27, CK_IO28, CK_IO29, CK_IO30, CK_IO31, CK_IO32, CK_IO33, CK_IO34;
reg BTN3 = 1'b0, BTN2 = 1'b0, BTN1 = 1'b0, SW3 = 1'b0, SW2 = 1'b0, SW1 = 1'b0, SW0 = 1'b0;
wire CK_IO0, CK_IO1, CK_IO2, CK_IO3, CK_IO4, CK_IO5;
reg CK_RST = 1'b1;
always begin
#5 GCLK100 = ~GCLK100;
end
always begin
#10 ETH_REF_CLK = ~ETH_REF_CLK;
end
top entire_fpga (
.GCLK100 (GCLK100),
.CK_RST (CK_RST),
.BTN0 (BTN0),
.BTN1 (BTN1),
.BTN2 (BTN2),
.BTN3 (BTN3),
.SW0 (SW0),
.SW1 (SW1),
.SW2 (SW2),
.SW3 (SW3),
.LED0_B (LED0_B),
.LED1_B (LED1_B),
.LED2_B (LED2_B),
.LED3_B (LED3_B),
.LED0_R (LED0_R),
.LED1_R (LED1_R),
.LED2_R (LED2_R),
.LED3_R (LED3_R),
/*
.ETH_RXD0 (ETH_RXD0),
.ETH_RXD1 (ETH_RXD1),
.ETH_CRS_DV (ETH_CRS_DV),
.ETH_TXD0 (ETH_TXD0),
.ETH_TXD1 (ETH_TXD1),
.ETH_TX_EN (ETH_TX_EN),
.ETH_MDC (ETH_MDC),
.ETH_MDIO (ETH_MDIO),
.ETH_RX_DV (ETH_RX_DV),
.ETH_REF_CLK (ETH_REF_CLK),
.ETH_RSTN (ETH_RSTN),
*/
// LED strip
/*
.CK_IO37 (CK_IO37),
.CK_IO39 (CK_IO39),
*/
// Lattice Reprogrammer
.CK_IO0 (CK_IO0),
.CK_IO1 (CK_IO1),
.CK_IO2 (CK_IO2),
.CK_IO3 (CK_IO3),
.CK_IO4 (CK_IO4),
.CK_IO5 (CK_IO5),
// Diagnostic outputs
.CK_IO26 (CK_IO26),
.CK_IO27 (CK_IO27),
.CK_IO28 (CK_IO28),
.CK_IO29 (CK_IO29),
.CK_IO30 (CK_IO30),
.CK_IO31 (CK_IO31),
.CK_IO32 (CK_IO32),
.CK_IO33 (CK_IO33),
.CK_IO34 (CK_IO34),
.JD7 (ETH_TXD1), // TX1
.JA1 (ETH_TXD0), // TX0
.JA2 (ETH_RXD1), // RX1
.JA3 (ETH_CRS_DV), // CRS_DV
.JA4 (ETH_MDC), // MDC
.JA7 (ETH_TX_EN), // TX_EN
.JA8 (ETH_RXD0), // RX0
.JA9 (ETH_REF_CLK), // REFCLK
.JA10 (ETH_MDIO) // MDIO
/* .LED4 (LED4),
.LED5 (LED5),
.LED6 (LED6),
.LED7 (LED7) */
);
/*
CustomDelay #(.CLOCK_FREQUENCY_HZ (100_000_000))
delay_service (
.CLK (GCLK100),
.DELAY_IN_NANOSECONDS (32'd80),
.RESET (REQUEST_DELAY),
.COMPLETE (DELAY_PASSED));
*/
initial begin
#4205 signal_ETH_RX_DV_write = 1'b1;
#1340
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#15
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
// SFD byte
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// ff ff ff ff ff ff c8 d9 d2 78 13 34 08 06 00 01 08 00 06 04 00 01 c8 d9 d2 78 13 34 c0 a8 00 01 00 00 00 00 00 00 c0 a8 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cd f4 59 79
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
// \xff\xff\xff\xff\xff\xff\xc8\xd9\xd2\x78\x13\x34\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xc8\xd9\xd2\x78\x13\x34\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
// Another one for 192.168.254.54 and requester .11:
// \xc8\xd9\xd2\x78\x13\x34\x42\x55\x55\x55\x55\x55\x08\x06\x00\x01\x08\x00\x06\x04\x00\x02\x42\x55\x55\x55\x55\x55\xc0\xa8\xfe\x36\xc8\xd9\xd2\x78\x13\x34\xc0\xa8\xfe\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
// Byte 0
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 1
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 2
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 3
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 4
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 5
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Bytes 6, 7, 8, 9, 10, 11 - sender's MAC c8 d9 d2 78 13 34
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 12: 0x08
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 13: 0x06
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 14: 0x00
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 15: 0x01
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 16: 0x08
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 17: 0x00
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 18: 0x06
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 19: 0x04
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 20: 0x00
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 21: 0x01
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Bytes 22, 23, 24, 25, 26, 27 - sender's MAC c8 d9 d2 78 13 34
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Bytes 28, 29, 30, 31 - sender's IP address c0 a8 00 01
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Bytes 32, 33, 34, 35, 36, 37 - dest MAC address (unknown)
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Bytes 38, 39, 40, 41 - dest IP address to resolve into MAC 36_fe_a8_c0
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#1280
// 58
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
// 59
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
// 60
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// 61
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// 62
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
// Last byte # 63
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
/*
#1345
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#1345
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#1340
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#15
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
// SFD byte
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// ff ff ff ff ff ff c8 d9 d2 78 13 34 08 06 00 01 08 00 06 04 00 01 c8 d9 d2 78 13 34 c0 a8 00 01 00 00 00 00 00 00 c0 a8 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cd f4 59 79
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
// \xff\xff\xff\xff\xff\xff\xc8\xd9\xd2\x78\x13\x34\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xc8\xd9\xd2\x78\x13\x34\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
// Byte 0
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 1
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 2
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 3
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 4
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 5
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 6
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// Byte 7
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#4000
// 58
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
// 59
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
// 60
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// 61
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// 62
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
// Last byte # 63
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#1340
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#15
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
// SFD byte
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// ff ff ff ff ff ff c8 d9 d2 78 13 34 08 06 00 01 08 00 06 04 00 01 c8 d9 d2 78 13 34 c0 a8 00 01 00 00 00 00 00 00 c0 a8 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cd f4 59 79
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
// \xff\xff\xff\xff\xff\xff\xc8\xd9\xd2\x78\x13\x34\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xc8\xd9\xd2\x78\x13\x34\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
// Bytes 0-5: target MAC 42 55 55 55 55 55
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
// Bytes 6, 7, 8, 9, 10, 11 - sender's MAC c8 d9 d2 78 13 34
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 12: 0x08
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 13: 0x06
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 14: 0x00
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 15: 0x01
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 16: 0x08
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 17: 0x00
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 18: 0x06
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 19: 0x04
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 20: 0x00
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Byte 21: 0x01
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Bytes 22, 23, 24, 25, 26, 27 - sender's MAC c8 d9 d2 78 13 34
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Bytes 28, 29, 30, 31 - sender's IP address c0 a8 00 01
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Bytes 32, 33, 34, 35, 36, 37 - dest MAC address (unknown)
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
// Bytes 38, 39, 40, 41 - dest IP address to resolve into MAC 36_fe_a8_c0
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1;
#20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b0; #20 ETH_RXD0 = 1'b1; ETH_RXD1 = 1'b1; #20 ETH_RXD0 = 1'b0; ETH_RXD1 = 1'b0;
#1280
// 58
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
// 59
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
// 60
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// 61
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
// 62
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
// Last byte # 63
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#1345
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#1345
ETH_CRS_DV = 1'b1;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b1;
ETH_RXD1 = 1'b1;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
#20
ETH_CRS_DV = 1'b0;
ETH_RXD0 = 1'b0;
ETH_RXD1 = 1'b0;
*/
# 4000 CK_RST = 1'b0;
# 4200 CK_RST = 1'b1;
# 1_800_000 CK_RST = 1'b0;
# 4200 CK_RST = 1'b1;
#5000 DONE = 1'b1;
end
endmodule
/*
module testbench2 ();
reg GCLK100, CK_RST, BTN0, BTN1;
wire ETH_REF_CLK;//, CK_IO35, CK_IO38, BTN0;
wire CK_IO37, CK_IO39, LED6, LED7, ETH_MDC, ETH_MDIO, LED1_B;
// wire CK_IO34, CK_IO37, CK_IO36, CK_IO39, LED4, LED5, LED6, LED7;
reg BTN2, SW0;
top t (
.GCLK100 (GCLK100),
.CK_RST (CK_RST),
.BTN0 (BTN0),
.BTN1 (BTN1),
.BTN2 (BTN2),
.SW0 (SW0),
.LED1_B (LED1_B),
.ETH_REF_CLK (ETH_REF_CLK),
.ETH_MDC (ETH_MDC),
.ETH_MDIO (ETH_MDIO),
.CK_IO37 (CK_IO37),
.CK_IO39 (CK_IO39),
.CK_IO0 (CK_IO0),
.CK_IO1 (CK_IO1),
.CK_IO2 (CK_IO2),
.CK_IO3 (CK_IO3),
.CK_IO4 (CK_IO4),
.CK_IO5 (CK_IO5),
.LED4 (LED4),
.LED5 (LED5),
.LED6 (LED6),
.LED7 (LED7)
);
always begin
#5 GCLK100 = ~GCLK100;
end
*/
//always begin
// #20 ETH_REF_CLK = ~ETH_REF_CLK;
//end
/*
reg EVT_EDGE, not_in1, xnor_in1, xnor_in2;
wire EXIT_PULSE, xnor_out, not_out;
EdgeToPulse pulse1 (
.EDGE (EVT_EDGE),
.PULSE (EXIT_PULSE));
LUT4 # (
.INIT (16'b01010101_01010101)
) not1 (
.O (not_out),
.I0 (not_in1),
.I1 (1'b0),
.I2 (1'b0),
.I3 (1'b0)
);
LUT4 # (
.INIT (16'b10011001_10011001)
) xnor1 (
.O (xnor_out),
.I0 (xnor_in1),
.I1 (xnor_in2),
.I2 (1'b0),
.I3 (1'b0)
);
* /
initial begin
//Initialize clock
GCLK100 = 1'b0;
//ETH_REF_CLK = 1'b0;
CK_RST = 1'b1;
BTN0 = 1'b0;
BTN1 = 1'b0;
/*EVT_EDGE = 1'b0;
xnor_in1 = 1'b0;
xnor_in2 = 1'b0;
not_in1 = 1'b0;* /
BTN2 = 1'b0;
SW0 = 1'b0;
#15 CK_RST = 1'b0;
#3_000 CK_RST = 1'b1;
#10 BTN1 = 1'b1;
#10 BTN2 = 1'b1;
#10 BTN2 = 1'b0;
#10 SW0 = 1'b1;
#10 BTN2 = 1'b1;
#10 SW0 = 1'b0;
#10 SW0 = 1'b1;
/*#20 EVT_EDGE = 1'b1;
#20 EVT_EDGE = 1'b0;
#20 EVT_EDGE = 1'b1;
#20 EVT_EDGE = 1'b0;
#20 not_in1 = 1'b1;
#20 not_in1 = 1'b0;
#20 not_in1 = 1'b1;
#20 xnor_in1 = 1'b1;
#20 xnor_in1 = 1'b0;
#20 xnor_in2 = 1'b1;
#20 xnor_in1 = 1'b1;* /
#11_500_000 CK_RST = 1'b0;
#100 CK_RST = 1'b1;
//#185 BTN0 = 1'b1;
//#27 BTN0 = 1'b0;
//End simulation
//#90_000_000
//$finish;
end
endmodule
*/
/*
`define DELAY_IN_NS 2'd0
`define DELAY_IN_US 2'd1
`define DELAY_IN_MS 2'd2
`define DELAY_IN_S 2'd3
module CustomDelay #(
parameter CLOCK_CYCLE_NS = 10
) (
input wire CLK,
input wire [31:0] DELAY_IN_NANOSECONDS,
input wire RESET,
output wire COMPLETE
);
// Statically calculate the number of bits required to represent the counted number
// localparam CLOCK_CYCLE_IN_NS = 32'b1 / CLOCK_FREQUENCY_HZ;
//localparam NUMBER_OF_PULSES_FOR_MAXIMUM_DELAY = 32'h7FFFFFFF / CLOCK_CYCLE_IN_NS;
//localparam MAXIMUM_BITS = $clog2(NUMBER_OF_PULSES_FOR_MAXIMUM_DELAY);
reg [32:0] counter = 0;
reg complete = 1'b0;
reg counting = 1'b0;
always @(posedge CLK) begin
if (RESET)
begin
counter <= DELAY_IN_NANOSECONDS / CLOCK_CYCLE_NS;
complete <= 1'b0;
counting <= 1'b1;
end
if (counting & ~complete & counter == 32'b1 & ~RESET)
begin
complete <= 1'b1;
counting <= 1'b0;
end
if (counting)
begin
counter <= counter - 1;
end
end
assign COMPLETE = complete;
endmodule
*/
// Unused in RMII
//input wire ETH_RXD3,
//input wire ETH_RXD2,
//output wire ETH_TXD2,
//output wire ETH_TXD3,
// input wire ETH_COL, // PHYAD0 not in full-duplex. Always 0 in full-duplex. Not used in RMII
// input wire ETH_RXERR, // MDIX_EN synchronous to RX_CLK if error receiving
// input wire ETH_RX_DV, // MII_MODE asserted high when valid data received
//input wire ETH_TX_CLK, // 25 MHz derived from ETH_REF_CLK
// input wire ETH_RX_CLK, // 25 MHz recovered. Not used in RMII
`timescale 1ns / 1ps
`define COUNTER_RESOLUTION_BITS 24
// Can receive Ethernet packets on 100 Mbit/s up to 9200 bytes in size.
// Standard packets are 1500 bytes.
// Receives Ethernet header in dedicated memory to interface with external world:
// The packet structure:
//
module JumboFrameReprogrammer ();
endmodule
module SystemCounter #(
parameter RESOLUTION_BITS = 5
) (
input wire CLOCK,
output reg [RESOLUTION_BITS-1:0] COUNTER = 0
);
always @(posedge CLOCK)
begin
COUNTER <= #4 COUNTER + 1'b1;
end
endmodule
module DelayEngine # (
parameter COUNTER_RESOLUTION_BITS = `COUNTER_RESOLUTION_BITS ) (
input wire CLOCK,
output wire COUNTING,
input wire START,
input wire [COUNTER_RESOLUTION_BITS-1:0] DELAY,
output wire COUNTED
);
// Global supercounter
wire [COUNTER_RESOLUTION_BITS-1:0] SYSTEM_COUNTER;
SystemCounter #(
.RESOLUTION_BITS (COUNTER_RESOLUTION_BITS)
) system_counter (
.CLOCK (CLOCK),
.COUNTER (SYSTEM_COUNTER)
);
// Timers service
reg [COUNTER_RESOLUTION_BITS-1:0] timestamp_started_1 = 0;
reg [COUNTER_RESOLUTION_BITS-1:0] delay_1 = 0;
reg counting = 1'b0;
reg counted = 1'b0;
reg [COUNTER_RESOLUTION_BITS-1:0] time_passed_since_timestamp_1 = 0;
always @(posedge CLOCK)
begin
if (~counting & START)
begin
delay_1 = DELAY;
timestamp_started_1 <= #4 SYSTEM_COUNTER;
counting <= #4 1'b1;
counted <= #4 1'b0;
end
else
// Compute how many ticks have passed
begin
if (counting)
begin
time_passed_since_timestamp_1 <= #4 (SYSTEM_COUNTER - timestamp_started_1);
if (time_passed_since_timestamp_1 >= delay_1)
begin
counting <= #4 1'b0;
counted <= #4 1'b1;
end
end
end
end
assign COUNTING = counting;
assign COUNTED = counted;
endmodule
module top (
input wire GCLK100, // Quartz 100 MHz
input wire CK_RST,
input wire BTN0,
input wire BTN1,
input wire BTN2,
input wire BTN3,
input wire SW0,
input wire SW1,
input wire SW2,
input wire SW3,
output wire CK_IO37, //+
output wire CK_IO39, //+
output wire CK_IO5, //SCK
input wire CK_IO4, // SO
output wire CK_IO3, //SI
output wire CK_IO2, // SS_B
input wire CK_IO1, // CDONE
output wire CK_IO0, // CRESET_B
// ONLY OUTPUTS HERE, DON'T FRY THE BOARD!!!
output wire CK_IO26, // (black)
output wire CK_IO27,
output wire CK_IO28,
output wire CK_IO29,
output wire CK_IO30,
output wire CK_IO31,
output wire CK_IO32,
output wire CK_IO33, // (orange wire)
// A separate wire (the green one) DON'T FRY THE BOARD!
output wire CK_IO34,
// Management interface
/*
output wire ETH_MDC, // Management data clock max 25 MHz
inout wire ETH_MDIO, // Management data I/O
output wire ETH_TX_EN, // Active high
output wire ETH_TXD1,
output wire ETH_TXD0,
input wire ETH_RXD1,
input wire ETH_RXD0,
input wire ETH_CRS_DV, // "Data is ready" CRS_DV/LED_CFG not in full-duplex. Receive medium is not idle (carrier sense)
// Check that these are empty!!! (we're successfully in RMII)
input wire ETH_RXD2,
input wire ETH_RXD3,
// Physical interface
output wire ETH_REF_CLK, // 50 MHz in RMII mode
output wire ETH_RSTN, // Reset active low 1 us power on reset only
// To put into RMII mode only
inout wire ETH_RX_DV, // Put to 1 while resetting to put PHY into the RMII mode then go Z
*/
output wire LED4,
output wire LED5,
output wire LED6,
output wire LED7,
output wire LED0_B,
output wire LED0_R,
output wire LED0_G,
output wire LED1_B,
output wire LED1_R,
output wire LED1_G,
output wire LED2_B,
output wire LED2_R,
output wire LED2_G,
output wire LED3_B,
output wire LED3_R,
output wire LED3_G,
output wire JD7, // TX1
output wire JA1, // TX0
input wire JA2, // RX1
input wire JA3, // CRS_DV
output wire JA4, // MDC
output wire JA7, // TX_EN
input wire JA8, // RX0
input wire JA9, // REFCLK
inout wire JA10, // MDIO
inout wire JD2,
output wire JD3,
output wire JD4,
output wire JD8,
inout wire JD9,
output wire JD10
);
wire SPI_FLASH_SI = JD2; // blue
wire SPI_FLASH_SCK = JD3; // green
wire SPI_FLASH_NOT_HOLD = JD4; // yellow
wire SPI_FLASH_NOT_WP = JD8; // orange
wire SPI_FLASH_SO = JD9; // red
wire SPI_FLASH_NOT_CS = JD10; // brown
assign SPI_FLASH_NOT_CS = ~BTN0;
assign SPI_FLASH_SCK = GCLK100; //1'b0;
assign SPI_FLASH_NOT_WP = 1'b1;
assign SPI_FLASH_NOT_HOLD = 1'b1;
// 9 pins of RMII PHY
wire CRS_DV, RX0, RX1, REFCLK, MDIO;
reg MDC = 1'b0;
/*
reg mdio_signal_write = 1'bz;
wire mdio_signal_read;
assign ETH_MDIO = mdio_signal_write;
assign mdio_signal_read = ETH_MDIO;
*/
reg TX_EN = 1'b0;
reg TX0 = 1'b0;
reg TX1 = 1'b0;
/*
reg MDIO_src = 1'b0;
always @(posedge REFCLK)
begin
if (~MDC)
begin
mdio_signal_write <= #4 1'bz;
MDIO_src <= #4 mdio_signal_read;
end
else
mdio_signal_write <= #4 1'b0;
begin
end
end
*/
// Delay engine for the RMII emulator
wire DELAY_ENGINE_COUNTING, DELAY_ENGINE_COUNTED, DELAY_ENGINE_START;
wire [`COUNTER_RESOLUTION_BITS-1:0] DELAY_ENGINE_DELAY;
assign JA7 = TX_EN;
assign JD7 = TX1;
assign JA1 = TX0;
assign RX0 = JA8;
assign RX1 = JA2;
assign CRS_DV = JA3;
assign JA4 = MDC;
// assign REFCLK = JA9;
BUFG global_clock_50_mhz (
.I (JA9),
.O (REFCLK));
assign MDIO = JA10;
/*
EthernetPhyWrapper ethernet_rmii_chip (
// 9-pin RMII emulation
.MDC (MDC), // Management data clock max 25 MHz
// .MDIO (MDIO), // Management data I/O
.TX_EN (TX_EN), // Active high
.TX1 (TX1),
.TX0 (TX0),
.RX1 (RX1),
.RX0 (RX0),
.CRS_DV (CRS_DV),
.REFCLK (REFCLK),
// Arty interface. Remove in real external RMII PHY.
// Emulates power-on reset because Arty boots the PHY in MII mode
// Transparent wires
// Management interface
.ARTY_ETH_MDC (ETH_MDC), // Management data clock max 25 MHz
// .ARTY_ETH_MDIO (ETH_MDIO), // Management data I/O
.ARTY_ETH_TX_EN (ETH_TX_EN), // Active high
.ARTY_ETH_TXD1 (ETH_TXD1),
.ARTY_ETH_TXD0 (ETH_TXD0),
.ARTY_ETH_RXD1 (ETH_RXD1),
.ARTY_ETH_RXD0 (ETH_RXD0),
.ARTY_ETH_CRS_DV (ETH_CRS_DV), // "Data is ready" CRS_DV/LED_CFG not in full-duplex. Receive medium is not idle (carrier sense)
// Physical interface
.ARTY_ETH_REF_CLK (ETH_REF_CLK), // 50 MHz in RMII mode. Derived from GCLK100
.ARTY_ETH_RSTN (ETH_RSTN), // Reset active low 1 us power on reset only
// To put into RMII mode only
.ARTY_ETH_RX_DV (ETH_RX_DV), // Put to 1 while resetting to put PHY into the RMII mode then go Z
.ARTY_GCLK100 (GCLK100),
.DELAY_ENGINE_COUNTING (DELAY_ENGINE_COUNTING),
.DELAY_ENGINE_COUNTED (DELAY_ENGINE_COUNTED),
.DELAY_ENGINE_START (DELAY_ENGINE_START),
.DELAY_ENGINE_DELAY (DELAY_ENGINE_DELAY)
);
*/
DelayEngine delay_engine (
.CLOCK (REFCLK),
.COUNTING (DELAY_ENGINE_COUNTING),
.START (DELAY_ENGINE_START),
.DELAY (DELAY_ENGINE_DELAY),
.COUNTED (DELAY_ENGINE_COUNTED));
assign LED3_R = CRS_DV;
reg [7:0] receiving_byte = 8'd0;
reg [7:0] received_byte = 8'd0;
reg byte_is_ready = 1'b0;
reg [1:0] receive_ptr = 2'd0;
reg [13:0] receiving_byte_number = 14'd0;
reg receiving = 1'b0;
reg synchronized_crs_dv_0 = 1'b0;
reg synchronized_crs_dv = 1'b0;
reg sfd_detected = 1'b0;
reg [1:0] no_crs_toggle = 2'd0;
reg [31:0] crc_state = 32'hFFFFFFFF;
reg [7:0] latched_byte_for_crc32 = 8'd0;
(* keep = "true", DONT_TOUCH = "true" *) reg [31:0] fcs_reg = 32'h00000000;
wire [31:0] crc_next_combinational_slow;
(* keep = "true", DONT_TOUCH = "true" *) Lfsr #(
.LFSR_WIDTH(32),
.LFSR_POLY(32'h4c11db7),
.LFSR_FEED_FORWARD(0),
.REVERSE(1),
.DATA_WIDTH(8),
.LFSR_CONFIG ("GALOIS"),
.STYLE("LOOP")
)
eth_crc_8 (
.data_in(latched_byte_for_crc32), // { RX1, RX0, receiving_byte[5:0] }
.state_in(crc_state),
.state_out(crc_next_combinational_slow)
);
reg byte_for_crc32_is_ready = 1'b0;
reg reset_crc_state = 1'b0;
/*
always @(posedge REFCLK)
begin
if (reset_crc_state)
begin
crc_state <= #4 32'hFFFFFFFF;
end
else
if (byte_for_crc32_is_ready)
begin
crc_state <= #13 crc_next_combinational_slow;
end
fcs_reg <= #4 ~crc_state;
end */
// ARP packet parser.
// We start responding while this packet runs the data.
// Because the response won't complete before a potential new packet can arrive,
// if we detected an ARP packet we're responding to, we will lock the parser until the send finishes.
// This may lead to misses of packets, but these are repeated often by the ARP stack.
reg arp_parser_is_locked = 1'b0;
reg sending_arp_response = 1'b0;
wire [10:0] arp_response_bit_address;
//TX1 <= #4 RX1;
//TX_EN <= #4 1'b1;
//TX0 <= #4 RX0;
//TX1 <= #4 RX1;
reg reset_arp_response_counter = 1'b0;
reg [1:0] skip_first_arp_sending_counter_pulse = 2'b10;
reg maybe_arp_request = 1'b1; // & each condition until the last one on every received byte. Sets to 1 on first packet
reg target_is_broadcast = 1'b1;
reg target_is_direct_mac_address = 1'b1;
assign LED0_R = ~maybe_arp_request;
assign LED1_R = ~target_is_broadcast;
assign LED2_R = ~target_is_direct_mac_address;
wire arp_response_sent;
reg [31:0] requester_ip_address = 32'b0;
reg [47:0] requester_mac_address = 48'b0;
// TODO: fix test
//wire [31:0] const_device_ip_address = 32'h02_00_a8_c0;
wire [31:0] const_device_ip_address = 32'h36_fe_a8_c0;
wire [47:0] const_device_mac_address = 48'h55_55_55_55_55_42;
wire [63:0] const_eth_preamble = 64'hD5_55_55_55_55_55_55_55;
// Offsets
wire [3:0] current_dibit_index_in_byte = receive_ptr * 3'd2;
wire [5:0] mac_index_combinational_slow = (receiving_byte_number - 14'd6) * 14'd8 + current_dibit_index_in_byte;
wire [4:0] ip_address_index_combinational_slow = (receiving_byte_number - 14'd28) * 14'd8 + current_dibit_index_in_byte;
wire [4:0] our_ip_address_index_combinational_slow = (receiving_byte_number - 14'd38) * 14'd8 + current_dibit_index_in_byte;
wire [5:0] our_mac_address_index_combinational_slow = receiving_byte_number * 14'd8 + current_dibit_index_in_byte;
wire [7:0] eth_frame_type_index_combinational_slow = (receiving_byte_number - 14'd12) * 14'd8 + current_dibit_index_in_byte;
wire [79:0] const_eth_frame_type_pattern = 80'h01000406000801000608;
wire [79:0] const_eth_frame_type_reply_pattern = 80'h02000406000801000608;
wire [15:0] const_eth_frame_type_ip_v4 = 16'h0008;
// 512 bytes max address (doesn't support 1500 packets yet)
reg [8:0] crc_encoding_byte_number = 9'b0;
reg maybe_udp_packet = 1'b1;
reg code_red = 1'b0;
assign LED3_G = code_red;
reg [7:0] received_udp_packet = 8'b0;
reg [1:0] bitstream_dibit = 2'b0;
reg bitstream_write_enable = 1'b0;
reg [17:0] bitstream_write_addr = 18'b0;
/*
always @(negedge REFCLK)
begin
if (bitstream_write_enable)
begin
bitstream_write_addr <= #4 bitstream_write_addr + 18'd1;
end
else
begin
bitstream_write_addr <= #4 18'b0;
end
end
*/
// assign bitstream_dibit = { RX1, RX0 };
always @(posedge REFCLK)
begin
if (receiving & sfd_detected)
begin
if (maybe_udp_packet)
begin
// Frame type == IPv4
if (receiving_byte_number >= 14'd12 & receiving_byte_number < 14'd14)
begin
maybe_udp_packet <= #4 const_eth_frame_type_ip_v4[eth_frame_type_index_combinational_slow +: 2] == { RX1, RX0 } ? maybe_udp_packet : 1'b0;
end
else if (receiving_byte_number >= 14'd30 & receiving_byte_number < 14'd34) begin
maybe_udp_packet <= #4 const_device_ip_address[((receiving_byte_number - 14'd30) * 14'd8 + current_dibit_index_in_byte) +: 2] == { RX1, RX0 } ? maybe_udp_packet : 1'b0;
end
/*else if (receiving_byte_number == 14'd14)
begin
code_red <= #4 1'b1;
end*/
else if (receiving_byte_number >= 14'd42 & receiving_byte_number < 14'd7379)
begin
bitstream_write_enable <= #4 1'b1;
bitstream_dibit <= #4 { RX1, RX0 };
// bitstream_dibit <= #4 { 1'b1, 1'b0 };
bitstream_write_addr <= #4 (receiving_byte_number - 14'd42) * 14'd8 + current_dibit_index_in_byte;
//if (receiving_byte_number >= 14'd7375) // 42
//begin
// receiving_byte_number
// current_dibit_index_in_byte
//if (receiving_byte_number == 14'd7375)
if (receiving_byte_number == 14'd7360) //0x1cc0 == 0x99
begin
received_udp_packet[((receiving_byte_number - 14'd7360) * 14'd8 + current_dibit_index_in_byte) +: 2] <= #4 { RX1, RX0 };
code_red <= #4 1'b1;
reset_synchronizer2 <= #4 1'b1;
end
//end
end
else if (receiving_byte_number == 14'd7379)
begin
bitstream_write_enable <= #4 1'b0;
reset_synchronizer2 <= #4 1'b0;
end
end
end
if (receiving & sfd_detected & ~arp_parser_is_locked)
begin
if (maybe_arp_request)
begin
// Testbench only
/*
if (receiving_byte_number >= 14'd6 & receiving_byte_number < 14'd41)
begin
bitstream_write_enable <= #4 1'b1;
bitstream_dibit <= #4 { RX1, RX0 };
bitstream_write_addr <= #4 (receiving_byte_number - 14'd6) * 14'd8 + current_dibit_index_in_byte;
end
else if (receiving_byte_number == 14'd41)
begin
bitstream_write_enable <= #4 1'b0;
end
*/
// Capture receiver's MAC address (might be broadcast our our)
if (receiving_byte_number < 14'd6) begin
target_is_direct_mac_address <= #4 const_device_mac_address[our_mac_address_index_combinational_slow +: 2] == { RX1, RX0 } ? target_is_direct_mac_address : 1'b0;
target_is_broadcast <= #4 target_is_broadcast & RX1 & RX0;
// Previous flag - the last flag will be caught in the byte 6
maybe_arp_request <= #4 (target_is_direct_mac_address | target_is_broadcast);
end
else
// Capture sender's MAC address
if (receiving_byte_number >= 14'd6 & receiving_byte_number < 14'd12) begin
if (receiving_byte_number == 14'd6)
begin
// It's calculated in the end of the cycle
maybe_arp_request <= #4 (target_is_direct_mac_address | target_is_broadcast);
end
requester_mac_address[mac_index_combinational_slow +: 2] <= #4 { RX1, RX0 };
end
else
// Frame type == ARP
if (receiving_byte_number >= 14'd12 & receiving_byte_number < 14'd22) begin
maybe_arp_request <= #4 const_eth_frame_type_pattern[eth_frame_type_index_combinational_slow +: 2] == { RX1, RX0 } ? maybe_arp_request : 1'b0;
end
else
// Capture sender's IP address
if (receiving_byte_number >= 14'd28 & receiving_byte_number < 14'd32) begin
requester_ip_address[ip_address_index_combinational_slow +: 2] <= #4 { RX1, RX0 };
end
else
// Finally compare if they're looking for us, and start sending a response if they do! :-)
if (receiving_byte_number >= 14'd38 & receiving_byte_number < 14'd42) begin
maybe_arp_request <= #4 const_device_ip_address[our_ip_address_index_combinational_slow +: 2] == { RX1, RX0 } ? maybe_arp_request : 1'b0;
end
else
if (receiving_byte_number == 14'd42)
begin
arp_parser_is_locked <= #4 1'b1;
sending_arp_response <= #4 1'b1;
reset_arp_response_counter <= #4 1'b1;
end
end
end
//end
// it's trivial now! :-) Voila!
//always @(posedge REFCLK)
//begin
// Send 72 bytes in di-bits
if (sending_arp_response)
begin
reset_arp_response_counter <= #4 1'b0;
if (~arp_response_sent)
begin
// Silly Xilinx counters don't start counting on "enable" (they are too power efficient LOL)
if (skip_first_arp_sending_counter_pulse > 2'b0)
begin
if (~arp_response_bit_address)
begin
skip_first_arp_sending_counter_pulse <= #4 skip_first_arp_sending_counter_pulse - 2'b1;
// Anyway, set the first two bits of preamble to let them settle
// { TX1, TX0 } <= #4 const_eth_preamble[ arp_response_bit_address +: 2 ];
crc_encoding_byte_number <= #4 14'b0;
//reset_crc_state <= #4 1'b0;
//byte_for_crc32_is_ready <= #4 1'b0;
//latched_byte_for_crc32 <= #4 { RX1, RX0, receiving_byte[5:0] };
//byte_for_crc32_is_ready <= #4 1'b1;
// Reset CRC32
// crc_state <= #4 32'hFFFFFFFF;
end
end
else
begin
// CODE RED!
TX_EN <= #4 1'b1;
// Calculate CRC32 1 byte per clock (it doesn't match to the bit address
// If arp_response_bit_address % 8 is 0 (the beginning of every byte)
// Byte address (arp_response_bit_address gets incremented by 2 so divide it by 2 to increment byte address by 1).
crc_encoding_byte_number <= #4 arp_response_bit_address[10:2];
if (crc_encoding_byte_number < 11'd60)
//if (crc_encoding_byte_number < 11'd58)
begin
if (~arp_response_bit_address[1])
begin
// Capture result of computation of CRC32 (latched_byte_for_crc32 + crc_state) => crc_next_combinational_slow => crc_state
//if (crc_encoding_byte_number < 11'd59)
//begin
crc_state <= #13 crc_next_combinational_slow;
//end
end
else
begin
if (crc_encoding_byte_number == 11'd0)
begin
// Initialize crc_state at the same time when supplying the 0th byte.
crc_state <= #4 32'hFFFFFFFF;
end
if (crc_encoding_byte_number < 11'd6)
begin
latched_byte_for_crc32 <= #4 requester_mac_address[ crc_encoding_byte_number * 11'd8 +: 8 ];
end
else
if (crc_encoding_byte_number >= 11'd6 & crc_encoding_byte_number < 11'd12)
begin
latched_byte_for_crc32 <= #4 const_device_mac_address[ (crc_encoding_byte_number - 11'd6) * 11'd8 +: 8 ];
end
else
if (crc_encoding_byte_number >= 11'd12 & crc_encoding_byte_number < 11'd22)
begin
latched_byte_for_crc32 <= #4 const_eth_frame_type_reply_pattern[ (crc_encoding_byte_number - 11'd12) * 11'd8 +: 8 ];
end
else
if (crc_encoding_byte_number >= 11'd22 & crc_encoding_byte_number < 11'd28)
begin
latched_byte_for_crc32 <= #4 const_device_mac_address[ (crc_encoding_byte_number - 11'd22) * 11'd8 +: 8 ];
end
else
if (crc_encoding_byte_number >= 11'd28 & crc_encoding_byte_number < 11'd32)
begin
latched_byte_for_crc32 <= #4 const_device_ip_address[ (crc_encoding_byte_number - 11'd28) * 11'd8 +: 8 ];
end
else
if (crc_encoding_byte_number >= 11'd32 & crc_encoding_byte_number < 11'd38)
begin
latched_byte_for_crc32 <= #4 requester_mac_address[ (crc_encoding_byte_number - 11'd32) * 11'd8 +: 8 ];
end
else
if (crc_encoding_byte_number >= 11'd38 & crc_encoding_byte_number < 11'd42)
begin
latched_byte_for_crc32 <= #4 requester_ip_address[ (crc_encoding_byte_number - 11'd38) * 11'd8 +: 8 ];
end
else
if (crc_encoding_byte_number >= 11'd42 & crc_encoding_byte_number < 11'd60)
// if (crc_encoding_byte_number >= 11'd42 & crc_encoding_byte_number < 11'd58)
begin
// Zero padding
latched_byte_for_crc32 <= #4 8'b0;
end
end
end
if (arp_response_bit_address < 11'd64)
begin
{ TX1, TX0 } <= #4 const_eth_preamble[ arp_response_bit_address +: 2 ];
end
else
if (arp_response_bit_address >= 11'd64 & arp_response_bit_address < 11'd112)
begin
{ TX1, TX0 } <= #4 requester_mac_address[ arp_response_bit_address - 11'd64 +: 2 ];
end
else
if (arp_response_bit_address >= 11'd112 & arp_response_bit_address < 11'd160)
begin
{ TX1, TX0 } <= #4 const_device_mac_address[ arp_response_bit_address - 11'd112 +: 2 ];
end
else
if (arp_response_bit_address >= 11'd160 & arp_response_bit_address < 11'd240)
begin
{ TX1, TX0 } <= #4 const_eth_frame_type_reply_pattern[ arp_response_bit_address - 11'd160 +: 2 ];
end
else
if (arp_response_bit_address >= 11'd240 & arp_response_bit_address < 11'd288)
begin
{ TX1, TX0 } <= #4 const_device_mac_address[ arp_response_bit_address - 11'd240 +: 2 ];
end
else
if (arp_response_bit_address >= 11'd288 & arp_response_bit_address < 11'd320)
begin
{ TX1, TX0 } <= #4 const_device_ip_address[ arp_response_bit_address - 11'd288 +: 2 ];
end
else
if (arp_response_bit_address >= 11'd320 & arp_response_bit_address < 11'd368)
begin
{ TX1, TX0 } <= #4 requester_mac_address[ arp_response_bit_address - 11'd320 +: 2 ];
end
else
if (arp_response_bit_address >= 11'd368 & arp_response_bit_address < 11'd400)
begin
{ TX1, TX0 } <= #4 requester_ip_address[ arp_response_bit_address - 11'd368 +: 2 ];
end
else
if (arp_response_bit_address >= 11'd400 & arp_response_bit_address < 11'd544)
//if (arp_response_bit_address >= 11'd400 & arp_response_bit_address < 11'd528)
begin
// Zero padding
{ TX1, TX0 } <= #4 2'b0;
end
else
if (arp_response_bit_address >= 11'd544 & arp_response_bit_address < 11'd576)
//if (arp_response_bit_address >= 11'd528 & arp_response_bit_address < 11'd560)
begin
// CRC32
{ TX1, TX0 } <= #4 ~crc_state[ arp_response_bit_address - 11'd544 +: 2 ];
//{ TX1, TX0 } <= #4 ~crc_state[ arp_response_bit_address - 11'd528 +: 2 ];
end
end
end
else
begin
sending_arp_response <= #4 1'b0;
skip_first_arp_sending_counter_pulse <= #4 2'b10;
TX_EN <= #4 1'b0;
{ TX1, TX0 } <= #4 2'b0;
// Unlock the parser so it can receive some ARP packets and collect a different data
// This unlock might happen in the middle of receiving of another packet,
// then unlock must happen after that receive will finishes.
// We don't reset "maybe_arp_request" here, it'll happen in the beginning of another packet,
// if the current packet was receiving, we'll drop it because we're not caching MAC and IP addresses of
// requestors yet (but it's totally doable with a double-buffering).
arp_parser_is_locked <= #4 1'b0;
end
end
//synchronized_crs_dv_0 <= #4 CRS_DV;
//synchronized_crs_dv <= synchronized_crs_dv_0;
//if (~receiving & synchronized_crs_dv & (RX1 | RX0))
if (~receiving & CRS_DV & ~RX1 & RX0 & ~sfd_detected)
begin
receiving <= #4 1'b1;
receiving_byte_number <= 14'd0;
receive_ptr <= #4 1'b0;
end
if (receiving)
begin
if (~sfd_detected)
begin
if (RX1 & RX0)
begin
sfd_detected <= #4 1'b1;
receive_ptr <= #4 1'b0;
// Reset parser because it might be tricked by the previous packet
// If it was sending, we're missing the parsing of the current packet:
// that bug is by design.
if (~arp_parser_is_locked)
begin
maybe_arp_request <= #4 1'b1;
maybe_udp_packet <= #4 1'b1;
target_is_broadcast <= #4 1'b1;
target_is_direct_mac_address <= #4 1'b1;
end
end
end
else
begin
if (receive_ptr == 2'd0)
begin
receiving_byte[1:0] <= #4 { RX1, RX0 };
//byte_for_crc32_is_ready <= #4 1'b0;
//if (receiving_byte_number == 14'b0)
//begin
// reset_crc_state <= #4 1'b1;
//end
end
if (receive_ptr == 2'd1)
begin
receiving_byte[3:2] <= #4 { RX1, RX0 };
//if (receiving_byte_number == 14'd0)
//begin
// reset_crc_state <= #4 1'b0;
//end
end
if (receive_ptr == 2'd2)
begin
receiving_byte[5:4] <= #4 { RX1, RX0 };
end
if (receive_ptr == 2'd3)
begin
receiving_byte[7:6] <= #4 { RX1, RX0 };
receiving_byte_number <= #4 receiving_byte_number + 14'd1;
//if (receiving_byte_number < 14'd60)
//begin
// latched_byte_for_crc32 <= #4 { RX1, RX0, receiving_byte[5:0] };
// byte_for_crc32_is_ready <= #4 1'b1;
//end
// Output it
// received_byte <= #4 { RX1, RX0, receiving_byte[5:0] };
// Or output a specific byte in the packet:
if (receiving_byte_number == {0,0,0,0,0,0,0,0,0,0, SW3, SW2, SW1, SW0 })
//if (receiving_byte_number == {0,0,0,0,0,0,0,0,1'b1,1'b1,1'b1,1'b1, SW1, SW0 }) //14'd6) // 0, 1, 2, 3, 4, 5 - DST MAC
//if (receiving_byte_number == 14'd63) // 0, 1, 2, 3, 4, 5 - DST MAC
//if (receiving_byte_number == 14'd41) // 0, 1, 2, 3, 4, 5 - DST MAC
begin
received_byte <= #4 { RX1, RX0, receiving_byte[5:0] };
byte_is_ready <= #4 1'b1;
end
end
receive_ptr <= #4 receive_ptr + 2'd1;
end
if (~CRS_DV)
begin
if (no_crs_toggle == 2'd3)
begin
receiving <= #4 1'b0;
sfd_detected <= #4 1'b0;
no_crs_toggle <= #4 2'd0;
end
no_crs_toggle <= no_crs_toggle + 1'b1;
end
end
if (CRS_DV)
begin
no_crs_toggle <= #4 2'd0;
end
end
assign LED1_B = sending_arp_response;
COUNTER_TC_MACRO # (
.COUNT_BY (48'h000000000002), // Count by a di-bit
.DEVICE ("7SERIES"),
.DIRECTION ("UP"),
.RESET_UPON_TC ("TRUE"), //Reset counter upon terminal count
.TC_VALUE (10'd576), // Terminal count value, number of bits to send an ARP response
.WIDTH_DATA (11) // Counter output bus width, 1-48
) arp_response_counter_registers (
.Q (arp_response_bit_address), // Counter output bus, width determined by WIDTH_DATA parameter
.TC (arp_response_sent), // 1-bit terminal count output, high = terminal count is reached
.CLK (REFCLK), // 1-bit positive edge clock input
.CE (sending_arp_response), // 1-bit active high clock enable input
.RST (reset_arp_response_counter) // 1-bit active high synchronous reset
);
/*
assign CK_IO26 = crc_state[0];
assign CK_IO27 = crc_state[1];
assign CK_IO28 = crc_state[2];
assign CK_IO29 = crc_state[3];
assign CK_IO30 = crc_state[4];
assign CK_IO31 = crc_state[5];
assign CK_IO32 = crc_state[6];
assign CK_IO33 = crc_state[7];
*/
/*
assign CK_IO26 = ~BTN1 ? received_byte[0] : fcs_reg[0 + 8 * SW0 + 16 * SW1];
assign CK_IO27 = ~BTN1 ? received_byte[1] : fcs_reg[1 + 8 * SW0 + 16 * SW1];
assign CK_IO28 = ~BTN1 ? received_byte[2] : fcs_reg[2 + 8 * SW0 + 16 * SW1];
assign CK_IO29 = ~BTN1 ? received_byte[3] : fcs_reg[3 + 8 * SW0 + 16 * SW1];
assign CK_IO30 = ~BTN1 ? received_byte[4] : fcs_reg[4 + 8 * SW0 + 16 * SW1];
assign CK_IO31 = ~BTN1 ? received_byte[5] : fcs_reg[5 + 8 * SW0 + 16 * SW1];
assign CK_IO32 = ~BTN1 ? received_byte[6] : fcs_reg[6 + 8 * SW0 + 16 * SW1];
assign CK_IO33 = ~BTN1 ? received_byte[7] : fcs_reg[7 + 8 * SW0 + 16 * SW1];
*/
/*
assign CK_IO26 = ~BTN1 ? received_byte[0] : fcs_reg[0 + 8 * SW0 + 16 * SW1];
assign CK_IO27 = ~BTN1 ? received_byte[1] : fcs_reg[1 + 8 * SW0 + 16 * SW1];
assign CK_IO28 = ~BTN1 ? received_byte[2] : fcs_reg[2 + 8 * SW0 + 16 * SW1];
assign CK_IO29 = ~BTN1 ? received_byte[3] : fcs_reg[3 + 8 * SW0 + 16 * SW1];
assign CK_IO30 = ~BTN1 ? received_byte[4] : fcs_reg[4 + 8 * SW0 + 16 * SW1];
assign CK_IO31 = ~BTN1 ? received_byte[5] : fcs_reg[5 + 8 * SW0 + 16 * SW1];
assign CK_IO32 = ~BTN1 ? received_byte[6] : fcs_reg[6 + 8 * SW0 + 16 * SW1];
assign CK_IO33 = ~BTN1 ? received_byte[7] : fcs_reg[7 + 8 * SW0 + 16 * SW1];*/
wire [7:0] fcs_0 = fcs_reg[7:0]; // { fcs_reg[0], fcs_reg[1], fcs_reg[2], fcs_reg[3], fcs_reg[4], fcs_reg[5], fcs_reg[6], fcs_reg[7] };
wire [7:0] fcs_1 = fcs_reg[15:8]; //{ fcs_reg[8], fcs_reg[9], fcs_reg[10], fcs_reg[11], fcs_reg[12], fcs_reg[13], fcs_reg[14], fcs_reg[15] };
wire [7:0] fcs_2 = fcs_reg[23:16]; //{ fcs_reg[16], fcs_reg[17], fcs_reg[18], fcs_reg[19], fcs_reg[20], fcs_reg[21], fcs_reg[22], fcs_reg[23] };
wire [7:0] fcs_3 = fcs_reg[31:24]; //{ fcs_reg[24], fcs_reg[25], fcs_reg[26], fcs_reg[27], fcs_reg[28], fcs_reg[29], fcs_reg[30], fcs_reg[31] };
/*
assign CK_IO26 = ~SW3 ? received_byte[0] : ~SW0 & ~SW1 ? fcs_0[0] : SW0 & ~SW1 ? fcs_1[0] : ~SW0 & SW1 ? fcs_2[0] : fcs_3[0];
assign CK_IO27 = ~SW3 ? received_byte[1] : ~SW0 & ~SW1 ? fcs_0[1] : SW0 & ~SW1 ? fcs_1[1] : ~SW0 & SW1 ? fcs_2[1] : fcs_3[1];
assign CK_IO28 = ~SW3 ? received_byte[2] : ~SW0 & ~SW1 ? fcs_0[2] : SW0 & ~SW1 ? fcs_1[2] : ~SW0 & SW1 ? fcs_2[2] : fcs_3[2];
assign CK_IO29 = ~SW3 ? received_byte[3] : ~SW0 & ~SW1 ? fcs_0[3] : SW0 & ~SW1 ? fcs_1[3] : ~SW0 & SW1 ? fcs_2[3] : fcs_3[3];
assign CK_IO30 = ~SW3 ? received_byte[4] : ~SW0 & ~SW1 ? fcs_0[4] : SW0 & ~SW1 ? fcs_1[4] : ~SW0 & SW1 ? fcs_2[4] : fcs_3[4];
assign CK_IO31 = ~SW3 ? received_byte[5] : ~SW0 & ~SW1 ? fcs_0[5] : SW0 & ~SW1 ? fcs_1[5] : ~SW0 & SW1 ? fcs_2[5] : fcs_3[5];
assign CK_IO32 = ~SW3 ? received_byte[6] : ~SW0 & ~SW1 ? fcs_0[6] : SW0 & ~SW1 ? fcs_1[6] : ~SW0 & SW1 ? fcs_2[6] : fcs_3[6];
assign CK_IO33 = ~SW3 ? received_byte[7] : ~SW0 & ~SW1 ? fcs_0[7] : SW0 & ~SW1 ? fcs_1[7] : ~SW0 & SW1 ? fcs_2[7] : fcs_3[7];
*/
/*
assign CK_IO26 = requester_mac_address[0];
assign CK_IO27 = requester_mac_address[1];
assign CK_IO28 = requester_mac_address[2];
assign CK_IO29 = requester_mac_address[3];
assign CK_IO30 = requester_mac_address[4];
assign CK_IO31 = requester_mac_address[5];
assign CK_IO32 = requester_mac_address[6];
assign CK_IO33 = requester_mac_address[7];
*/
assign CK_IO34 = byte_is_ready;
/*
SW0
SW1
LED0_B
LED1_B
*/
// assign ETH_RSTN = CK_RST;
// assign LED0_R = ETH_CRS_DV;
// assign LED1_R = ETH_RXERR;
// assign LED2_R = ETH_RX_DV;
// assign CK_IO34 = 1'b0;// ETH_MDIO;
//assign LED2_B = ETH_RXD2;
//assign LED3_B = ETH_RXD3;
/*
//assign CK_IO26 = ETH_RXD0;//BTN0;
//assign CK_IO27 = ETH_RXD1;//BTN1;
//assign CK_IO28 = ETH_RXD2;//BTN2;
//assign CK_IO29 = ETH_RXD3;//BTN3;
*/
/*
assign CK_IO26 = BTN0;
assign CK_IO27 = BTN1;
assign CK_IO28 = BTN2;
assign CK_IO29 = BTN3;
assign CK_IO30 = SW0;
assign CK_IO31 = SW1;
assign CK_IO32 = SW2;
assign CK_IO33 = SW3;
*/
assign CK_IO26 = received_udp_packet[0];
assign CK_IO27 = received_udp_packet[1];
assign CK_IO28 = received_udp_packet[2];
assign CK_IO29 = received_udp_packet[3];
assign CK_IO30 = received_udp_packet[4];
assign CK_IO31 = received_udp_packet[5];
assign CK_IO32 = received_udp_packet[6];
assign CK_IO33 = received_udp_packet[7];
// assign LED2_B = ~clk_25;
/*
reg [31:0] cnt_50 = {32'b0};
reg pulse_50;
reg clk_25 = 1'b0;
reg [31:0] cnt_2 = {32'b0};
reg pulse_2;
reg clk_1 = 1'b0;
reg [31:0] cnt_0_062 = {32'b0};
reg pulse_0_062;
reg clk_0_031 = 1'b0;
always @(posedge GCLK100)
begin
if (pulse_50)
begin
clk_25 = ~clk_25;
end
{ pulse_50, cnt_50 } <= cnt_50 + 32'h8000_0000; // 25 MHz
// { pulse_50, cnt_50 } <= cnt_50 + 32'h4000_0000; // 12.5 MHz
if (pulse_2)
begin
clk_1 = ~clk_1;
end
{ pulse_2, cnt_2 } <= cnt_2 + 32'h51eb851; // 1 MHz
if (pulse_0_062)
begin
clk_0_031 = ~clk_0_031;
end
// { pulse_0_062, cnt_0_062 } <= cnt_0_062 + 32'h28f5c2; // 31.250 kHz
{ pulse_0_062, cnt_0_062 } <= cnt_0_062 + 32'h147ae1; // 31.250 kHz
end
*/
assign CK_IO37 = LED0_G;
// assign CK_IO39 = clk_1;
/*
wire eth_md_mem0;
wire [6:0] counter_read_phy_cnt_addr;
reg counter_read_phy_counted_to_the_end = 1'b0;
wire counter_read_phy_counted_to_the_end_signal;
//assign ETH_REF_CLK = clk_25;
COUNTER_TC_MACRO # (
.COUNT_BY (48'h000000000001), // Count by value
.DEVICE ("7SERIES"), // Target Device: "7SERIES"
.DIRECTION ("UP"), // Counter direction, "UP" or "DOWN"
.RESET_UPON_TC ("FALSE"),//Reset counter upon terminal count, "TRUE" or "FALSE"
.TC_VALUE (7'h2F), // Working to read status
//.TC_VALUE (7'h40), // Writing control value
//.TC_VALUE (7'h0E), // Terminal count value
.WIDTH_DATA (7) // Counter output bus width, 1-48
) counter_read_phy (
.Q (counter_read_phy_cnt_addr), // Counter output bus, width determined by WIDTH_DATA parameter
.TC (counter_read_phy_counted_to_the_end_signal), // 1-bit terminal count output, high = terminal count is reached
.CLK (GCLK100), // 1-bit positive edge clock input
.CE (BTN1 & clk_0_031 & pulse_0_062), // 1-bit active high clock enable input
.RST (~CK_RST) // driven by reset synchronizer, not resetting state!
);
reg reading_from_phy = 1'b0;
//assign ETH_MDC = BTN1 & clk_0_031 & (counter_read_phy_cnt_addr > 6'h0) & ~reading_from_phy;
//assign ETH_MDIO = ~counter_read_phy_counted_to_the_end ? eth_md_mem0 : 1'bz; // To drive the inout net
RAM64X1S #(
//.INIT(64'b00_10000_10000_01_10__1111111_11111111_11111111_11111111_11) // READ 1
.INIT(64'b00_10000_10000_01_10__1111111_11111111_11111111_11111111_11) // READ 1
//.INIT(64'b00_11000_10000_01_10__1111111_11111111_11111111_11111111_11) // READ 3
//.INIT(64'b00010000100_01_00000_10000_10_10__1111111_11111111_11111111_11111111_11) // WRITE
// RRRRR AAAAA WR ST
) RAM64X1S_inst (
.O (eth_md_mem0), // 1-bit data output
.A0 (counter_read_phy_cnt_addr[0]), // Address[0] input bit
.A1 (counter_read_phy_cnt_addr[1]), // Address[1] input bit
.A2 (counter_read_phy_cnt_addr[2]), // Address[2] input bit
.A3 (counter_read_phy_cnt_addr[3]), // Address[3] input bit
.A4 (counter_read_phy_cnt_addr[4]), // Address[4] input bit
.A5 (counter_read_phy_cnt_addr[5]), // Address[5] input bit
.D (1'b0), // 1-bit data input
.WCLK (1'b0), // Write clock input
.WE (1'b0) // Write enable input
);
wire [5:0] phy_reg_value_cnt_addr;
wire phy_reg_value_counted_to_the_end;// = 1'b0;
COUNTER_TC_MACRO # (
.COUNT_BY (48'h000000000001), // Count by value
.DEVICE ("7SERIES"), // Target Device: "7SERIES"
.DIRECTION ("UP"), // Counter direction, "UP" or "DOWN"
.RESET_UPON_TC ("TRUE"),//Reset counter upon terminal count, "TRUE" or "FALSE"
.TC_VALUE (6'h12), // Terminal count value
.WIDTH_DATA (6) // Counter output bus width, 1-48
) counter_read_status (
.Q (phy_reg_value_cnt_addr), // Counter output bus, width determined by WIDTH_DATA parameter
.TC (phy_reg_value_counted_to_the_end), // 1-bit terminal count output, high = terminal count is reached
//.CLK (GCLK100 & ~reading_from_phy | reading_from_phy & BTN3), //clk_0_031), // 1-bit positive edge clock input
.CLK (GCLK100),// & ~reading_from_phy | reading_from_phy & BTN3), //clk_0_031), // 1-bit positive edge clock input
//.CE (counter_read_phy_counted_to_the_end & (clk_25 & pulse_50 & ~reading_from_phy | reading_from_phy)),// & clk_0_031 & pulse_0_062)), //BTN3)), // 1-bit active high clock enable input
.CE (counter_read_phy_counted_to_the_end & (clk_0_031 & pulse_0_062 & ~reading_from_phy | reading_from_phy & clk_0_031 & pulse_0_062)), //BTN3)), // 1-bit active high clock enable input
.RST (~CK_RST) // driven by reset synchronizer, not resetting state!
);
wire write_enable = counter_read_phy_counted_to_the_end & ~reading_from_phy;
RAM64X1S eth_read_status (
.O (LED0_G), // 1-bit data output
.A0 (phy_reg_value_cnt_addr[0]), // Address[0] input bit
.A1 (phy_reg_value_cnt_addr[1]), // Address[1] input bit
.A2 (phy_reg_value_cnt_addr[2]), // Address[2] input bit
.A3 (phy_reg_value_cnt_addr[3]), // Address[3] input bit
.A4 (phy_reg_value_cnt_addr[4]), // Address[4] input bit
.A5 (phy_reg_value_cnt_addr[5]), // Address[5] input bit
.D (ETH_MDIO), // 1-bit data input
.WCLK (ETH_MDC), // Write clock input
.WE (write_enable) // Write enable input
);
// assign LED3_B = ETH_MDIO & counter_read_phy_counted_to_the_end;
always @(posedge clk_25)
begin
if (counter_read_phy_counted_to_the_end_signal)
begin
counter_read_phy_counted_to_the_end = 1'b1;
end
if (phy_reg_value_counted_to_the_end)
begin
reading_from_phy = 1'b1;
end
end
*/
wire SPI_SCK;// = CK_IO5;
wire SPI_SO;// = CK_IO4;
wire SPI_SI;// = CK_IO3;
wire SPI_SS_B;// = CK_IO2;
wire CDONE;// = CK_IO1;
wire CRESET_B;// = CK_IO0;
wire reprogrammer_enable;// = 1'b1;//~CDONE;
IOBUF io_spi_sck (
.O(), // Buffer output: dc
.IO(CK_IO5), // Buffer inout port (connect directly to top-level port)
.I(SPI_SCK), // Buffer input
.T(~reprogrammer_enable) // 3-state enable input, high=input, low=output
);
IOBUF io_spi_si (
.O(), // Buffer output: dc
.IO(CK_IO3), // Buffer inout port (connect directly to top-level port)
.I(SPI_SI), // Buffer input
.T(~reprogrammer_enable) // 3-state enable input, high=input, low=output
);
IOBUF io_spi_ss_b (
.O(), // Buffer output: dc
.IO(CK_IO2), // Buffer inout port (connect directly to top-level port)
.I(SPI_SS_B), // Buffer input
.T(~reprogrammer_enable) // 3-state enable input, high=input, low=output
);
IOBUF io_spi_creset_b (
.O(), // Buffer output: dc
.IO(CK_IO0), // Buffer inout port (connect directly to top-level port)
.I(CRESET_B), // Buffer input
.T(~reprogrammer_enable) // 3-state enable input, high=input, low=output
);
assign LED0_B = reprogrammer_enable;
// Reprogrammer wiring;
//assign CK_IO5 = SPI_SCK;
assign SPI_SO = CK_IO4;
//assign CK_IO3 = SPI_SI;
//assign CK_IO2 = SPI_SS_B;
assign CDONE = CK_IO1;
//assign CK_IO0 = CRESET_B;
reg btn0_synchronizer1;
reg btn0_synchronizer2;
reg reset_synchronizer1;
reg reset_synchronizer2;
reg [31:0] cnt = {32'b0};
// Not used because REFCLK is 50 MHz!
//reg pix_stb;
//reg divided = 1'b0;
wire reset_src_wire = ~CK_RST;
wire reset = reset_synchronizer2;
reg resetting = 1'b0;
reg resetting_wait = 1'b0;
wire resetting_wait_counted_to_the_end;
reg ready = 1'b0;
reg button_pressed = 1'b0;
reg button_released = 1'b0;
reg memory_clear_wait = 1'b0;
wire memory_clear_wait_counted_to_the_end;
reg sending = 1'b0;
reg sent = 1'b0;
// Sending substate machine:
reg sending_skip_first_pulse_wait = 1'b0;
// reg sending_skip_first_pulse_detected = 1'b0;
reg sending_normal_sending_mode = 1'b0;
wire counted_to_the_end;
reg reset_pressed = 1'b0;
reg reset_released = 1'b0;
/*
Fsm s1 (
input wire CLOCK,
input wire FROM_A,
input wire FROM_B,
input wire FROM_C,
input wire EVT_E,
input wire EVT_F,
input wire EVT_G,
output wire TO_ON_E,
output wire TO_ON_F,
output wire TO_ON_G,
output wire ACTIVE,
output wire ENTERED,
output wire EXITED,
);
*/
always @(posedge REFCLK)//GCLK100)
begin
btn0_synchronizer1 <= BTN0;
btn0_synchronizer2 <= btn0_synchronizer1;
reset_synchronizer1 <= reset_src_wire;
//reset_synchronizer2 <= reset_synchronizer1;
// Not used because REFCLK is 50 MHz!
/*
if (pix_stb)
begin
divided = ~divided;
end
*/
// { pix_stb, cnt } <= cnt + 32'ha3cb22; // 1us // divide by 4: (2^32)/4 = 0x4000
// { pix_stb, cnt } <= cnt + 32'ha7c5;
// { pix_stb, cnt } <= cnt + 32'h28f5c28; // 500 kHz
//{ pix_stb, cnt } <= cnt + 32'h51eb851; // 1 MHz
// { pix_stb, cnt } <= cnt + 32'h9999_999a; // 30 MHz
// Not used because REFCLK is 50 MHz!
//{ pix_stb, cnt } <= cnt + 32'hffff_ffff; // 50 MHz
//{ pix_stb, cnt } <= cnt + 32'h8000_0000; // 25 MHz
// { pix_stb, cnt } <= cnt + 32'h7ae1_47ae; // 24 MHz
// { pix_stb, cnt } <= cnt + 32'h4000_0000; // 12.5 MHz
// { pix_stb, cnt } <= cnt + 32'h56;
if (reset & ~reset_pressed)
begin
reset_pressed = 1'b1;
reset_released = 1'b0;
end
if (~reset & reset_pressed)
begin
reset_pressed = 1'b0;
reset_released = 1'b1;
end
if (reset_released)
begin
reset_released = 1'b0;
resetting = 1'b1;
ready = 1'b0;
sending = 1'b0;
sending_skip_first_pulse_wait = 1'b0;
//sending_skip_first_pulse_detected = 1'b0;
sending_normal_sending_mode = 1'b0;
sent = 1'b0;
memory_clear_wait = 1'b0;
resetting_wait = 1'b0;
end
if (resetting & ~reset & ~resetting_wait)
begin
// resetting = 1'b0;
// ready = 1'b1;
resetting_wait = 1'b1;
end
if (resetting_wait & resetting_wait_counted_to_the_end)
begin
resetting_wait = 1'b0;
resetting = 1'b0;
memory_clear_wait = 1'b1;
end
if (memory_clear_wait & memory_clear_wait_counted_to_the_end)
begin
memory_clear_wait = 1'b0;
//ready = 1'b1;
//ready = 1'b0;
sent = 1'b0;
sending = 1'b1;
//button_released = 1'b0;
end
if (btn0_synchronizer2 & ~button_pressed)
begin
button_pressed = 1'b1;
end
if (~btn0_synchronizer2 & button_pressed)
begin
button_pressed = 1'b0;
button_released = 1'b1;
end
else if ((ready | sent) & button_released)
begin
ready = 1'b0;
sent = 1'b0;
sending = 1'b1;
button_released = 1'b0;
end
if (sending & counted_to_the_end)
begin
sending = 1'b0;
sending_skip_first_pulse_wait = 1'b0;
// sending_skip_first_pulse_detected = 1'b0;
sending_normal_sending_mode = 1'b0;
sent = 1'b1;
end
/* if (sending_skip_first_pulse_detected) // & ~divided) // the pulse is over: transition into normal send mode
begin
sending_skip_first_pulse_detected = 1'b0;
sending_normal_sending_mode = 1'b1;
end */
if (sending_skip_first_pulse_wait) // & divided) // became positive (first pulse)
begin
sending_skip_first_pulse_wait = 1'b0;
//sending_skip_first_pulse_detected = 1'b1;
sending_normal_sending_mode = 1'b1;
end
// First ender the sending substate
// if (sending & ~sending_skip_first_pulse_wait & ~sending_skip_first_pulse_detected & ~sending_normal_sending_mode)
if (sending & ~sending_skip_first_pulse_wait & ~sending_normal_sending_mode)
begin
sending_skip_first_pulse_wait = 1'b1;
end
end
wire [3:0] resetting_wait_cnt_addr;
COUNTER_TC_MACRO # (
.COUNT_BY (48'h000000000001), // Count by value
.DEVICE ("7SERIES"), // Target Device: "7SERIES"
.DIRECTION ("UP"), // Counter direction, "UP" or "DOWN"
.RESET_UPON_TC ("FALSE"),//Reset counter upon terminal count, "TRUE" or "FALSE"
//.TC_VALUE (3'h2), // Terminal count value
//.TC_VALUE (3'h4), // Terminal count value
.TC_VALUE (4'h9), // Terminal count value
.WIDTH_DATA (4) // Counter output bus width, 1-48
) counter_200_ns (
.Q (resetting_wait_cnt_addr), // Counter output bus, width determined by WIDTH_DATA parameter
.TC (resetting_wait_counted_to_the_end), // 1-bit terminal count output, high = terminal count is reached
// .CLK (GCLK100), // 1-bit positive edge clock input
.CLK (REFCLK), // 1-bit positive edge clock input
//.CE (pix_stb & divided & resetting_wait), // 1-bit active high clock enable input
.CE (resetting_wait), // 1-bit active high clock enable input
.RST (reset) // driven by reset synchronizer, not resetting state!
);
wire [15:0] memory_clear_wait_cnt_addr;
COUNTER_TC_MACRO # (
.COUNT_BY (48'h000000000001), // Count by value
.DEVICE ("7SERIES"), // Target Device: "7SERIES"
.DIRECTION ("UP"), // Counter direction, "UP" or "DOWN"
.RESET_UPON_TC ("FALSE"),//Reset counter upon terminal count, "TRUE" or "FALSE"
//.TC_VALUE (16'h9c40), // Terminal count value 800 us at 50 MHz
.TC_VALUE (16'h7530), // Terminal count value 600 us at 50 MHz
//.TC_VALUE (16'h4e20), // Terminal count value
.WIDTH_DATA (16) // Counter output bus width, 1-48
) counter_800_us (
.Q (memory_clear_wait_cnt_addr), // Counter output bus, width determined by WIDTH_DATA parameter
.TC (memory_clear_wait_counted_to_the_end), // 1-bit terminal count output, high = terminal count is reached
//.CLK (GCLK100), // 1-bit positive edge clock input
.CLK (REFCLK),
//.CE (pix_stb & divided & memory_clear_wait), // 1-bit active high clock enable input
.CE (memory_clear_wait), // 1-bit active high clock enable input
.RST (resetting) // 1-bit active high synchronous reset
);
wire [17:0] addr;
COUNTER_TC_MACRO # (
.COUNT_BY (48'h000000000001), // Count by value
.DEVICE ("7SERIES"), // Target Device: "7SERIES"
.DIRECTION ("UP"), // Counter direction, "UP" or "DOWN"
.RESET_UPON_TC ("TRUE"),//Reset counter upon terminal count, "TRUE" or "FALSE"
//.TC_VALUE (18'h3eef8), // Terminal count value
// .TC_VALUE (18'h3eff8), // Terminal count value
//.TC_VALUE (18'h2edf8), // Terminal count value for iCE40HX1K
.TC_VALUE (18'he579), // Terminal count value for iCE40LP384
.WIDTH_DATA (18) // Counter output bus width, 1-48
) counter1 (
.Q (addr), // Counter output bus, width determined by WIDTH_DATA parameter
.TC (counted_to_the_end), // 1-bit terminal count output, high = terminal count is reached
.CLK (~REFCLK), // 1-bit positive edge clock input
// .CE (pix_stb & divided & sending), // 1-bit active high clock enable input
.CE (sending), // 1-bit active high clock enable input
.RST (resetting) // 1-bit active high synchronous reset
);
assign reprogrammer_enable = ~counted_to_the_end;
// TODO: wait 49 SPI_SCK cycles after receiving the CDONE signal
wire output_data;
wire output_clock = sending & sending_normal_sending_mode & REFCLK & (addr != 18'b0); // divided;
// RamSource ram_source (.i_clock (GCLK100), .i_reset (resetting), .i_enable (sending_normal_sending_mode), .i_address (addr), .o_data (output_data));
/*
reg output_data_reg = 1'b0;
always @(posedge REFCLK)
begin
output_data_reg <= #4 output_data;
end
*/
// RamSource ram_source (.i_clock (GCLK100), .i_reset (1'b0), .i_enable (sending_normal_sending_mode), .i_address (addr), .o_data (output_data)); // was working recently
RamSource ram_source (.i_clock (~REFCLK), .i_reset (1'b0), .i_enable (sending_normal_sending_mode | bitstream_write_enable),
.i_address (bitstream_write_enable ? bitstream_write_addr : addr),
.o_data (output_data),
.i_data (bitstream_dibit),
.i_we (bitstream_write_enable)
);
/*
wire [7:0] block;
RamFile #(
.INIT_00 (256'b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000),
.INIT_01 (256'b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111),
.INIT_02 (256'b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111),
.INIT_03 (256'b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111),
) f0 (.i_clock (GCLK100), .i_reset (resetting), .i_enable (sending_normal_sending_mode), .i_address (addr[14:0]), .o_data (block[0]));
wire [2:0] block_address = addr[17:15];
assign output_data = block[ block_address ]; */
assign LED7 = output_data;
assign LED6 = output_clock;
assign LED5 = CDONE;
assign SPI_SS_B = sent; //~(reset | resetting | ready | sending | memory_clear_wait);
assign LED4 = SPI_SS_B & SPI_SO;
assign CRESET_B = ~resetting;
assign SPI_SCK = output_clock;
assign SPI_SI = output_data;
//assign SPI_SI = output_data_reg;
endmodule
# include <array>
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
# include <xcb/xcb.h>
# include "./init-egl.h"
# include "./runApp.h"
# include <sys/epoll.h>
# include <fcntl.h>
# include <errno.h>
# include <signal.h>
# include <sys/signalfd.h>
# include <unistd.h>
# include <netdb.h>
# include <arpa/inet.h>
# include <ifaddrs.h>
# include <net/if.h>
# include <sys/socket.h>
# include <netinet/in.h>
#define _XOPEN_SOURCE 700
#include <termios.h>
// TODO: add crash handler so we can do graceful shutdown and cleanup everything
void printipv4(in_addr* ipv4) {
char str4[INET_ADDRSTRLEN] = { 0 };
inet_ntop(AF_INET, ipv4, str4, INET_ADDRSTRLEN);
printf("%s", str4);
}
# define ALEN(arr) (sizeof(arr)/sizeof(arr[0]))
int create_epoll_pump () {
// Create epoll file descriptor
// int epfd = epoll_create1(EPOLL_CLOEXEC);
int epfd = epoll_create1(0);
return epfd;
}
void make_async (int fd) {
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
}
void add_listener (int epoll_fd, int fd, int additional_conditions = 0) {
// Enable level triggering of arrived data on the fd
epoll_event event = { 0 };
// event.events = EPOLLIN | EPOLLET;
event.events = EPOLLIN | EPOLLET | additional_conditions;
event.data.ptr = 0;
event.data.fd = fd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &event);
}
xcb_drawable_t create_xcb_window (
xcb_connection_t* c,
int launch_width,
int launch_height) {
// get the first screen
xcb_screen_t* screen = xcb_setup_roots_iterator(xcb_get_setup(c)).data;
xcb_drawable_t win = xcb_generate_id(c);
uint32_t mask = XCB_CW_EVENT_MASK;
uint32_t values[1] = {
XCB_EVENT_MASK_EXPOSURE
| XCB_EVENT_MASK_KEY_PRESS
| XCB_EVENT_MASK_KEY_RELEASE
| XCB_EVENT_MASK_RESIZE_REDIRECT
| XCB_EVENT_MASK_FOCUS_CHANGE
| XCB_EVENT_MASK_VISIBILITY_CHANGE
| XCB_EVENT_MASK_POINTER_MOTION
| XCB_EVENT_MASK_BUTTON_PRESS
| XCB_EVENT_MASK_BUTTON_RELEASE };
int border_width = 0;
xcb_create_window(c,
XCB_COPY_FROM_PARENT,
win,
screen->root,
0, 0,
launch_width, launch_height,
border_width,
XCB_WINDOW_CLASS_INPUT_OUTPUT,
screen->root_visual,
mask, values);
// map the window on the screen
xcb_map_window(c, win);
xcb_flush(c);
return win;
}
int init_socket () {
// in_addr v4 = { 0 };
sockaddr_in v4 = { 0 };
sockaddr_in6 v6 = { 0 };
ifaddrs* pInterfaces = 0;
getifaddrs(&pInterfaces);
ifaddrs* pInterface = pInterfaces;
while (pInterface) {
if (!(pInterface->ifa_flags & IFF_LOOPBACK)) {
if (pInterface->ifa_addr->sa_family == AF_INET) {
sockaddr_in* ipv4interface = (sockaddr_in*)pInterface->ifa_addr;
in_addr* ipv4 = & ipv4interface->sin_addr;
memcpy(&v4, ipv4interface, sizeof(v4));
// printipv4(ipv4);
char str4[INET_ADDRSTRLEN] = { 0 };
inet_ntop(AF_INET, ipv4, str4, INET_ADDRSTRLEN);
printf("%s IPv4: %s\n", pInterface->ifa_name, str4);
} else if (pInterface->ifa_addr->sa_family == AF_INET6) {
sockaddr_in6* ipv6interface = (sockaddr_in6*)pInterface->ifa_addr;
in6_addr* ipv6 = & ipv6interface->sin6_addr;
int linkLocal = ((unsigned short*)ipv6->s6_addr)[0];
if (linkLocal != 0x80FE) {
memcpy(&v6, ipv6interface, sizeof(v6));
char str6[INET6_ADDRSTRLEN] = { 0 };
inet_ntop(AF_INET6, ipv6, str6, INET6_ADDRSTRLEN);
printf("%s IPv6: %s\n", pInterface->ifa_name, str6);
}
}
}
pInterface = pInterface->ifa_next;
}
freeifaddrs(pInterfaces);
// 1 socket per interface and protocol version
int fdDns = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// bind to a random port
// int port = 12345;
// v4.sin_port = htons(port);
int bindOk = bind(fdDns, (sockaddr*)&v4, sizeof(v4));
if (bindOk == -1) {
printf("Failed to bind to a random port\n");//port %d\n", port);
}
socklen_t bytes_our_addr = sizeof(v4);
if (getsockname(fdDns, (struct sockaddr *)&v4, &bytes_our_addr) != -1) {
printf("UDP is listening on port %d\n", ntohs(v4.sin_port));
}
return fdDns;
}
termios orig_term_attr = { 0 };
void restore_terminal () {
tcsetattr(fileno(stdin), TCSANOW, &orig_term_attr);
}
unsigned char bitstream[ 7337 ] = { 0 };
void load_bitstream () {
FILE* file = fopen("./../arachne-pnr/example-384-processed.bin", "rb");
if (!file) {
fprintf(stderr, "Unable to open bitstream file");
return;
}
unsigned long fileLen = 7337;
fread(bitstream, fileLen, 1, file);
fclose(file);
}
int main (int args_array_size, const char** args_array) {
unsigned char char_to_send = '1';
printf("Instant-384 UDP Proxy v1.0\n");
bool should_send = false;
sigset_t mask = { 0 };
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGQUIT);
// Block signals so that they aren't handled according to their default dispositions
sigprocmask(SIG_BLOCK, &mask, 0);
int sfd = signalfd(-1, &mask, SFD_NONBLOCK);
xcb_connection_t* c = xcb_connect(0, 0);
int window_width = 64;
int window_height = 64;
xcb_drawable_t win = create_xcb_window(c, window_width, window_height);
int xcb_fd = xcb_get_file_descriptor(c);
int event_pump_fd = create_epoll_pump();
int fdDns = init_socket();
make_async(fdDns);
add_listener(event_pump_fd, xcb_fd);
add_listener(event_pump_fd, sfd);
termios new_term_attr;
/* set the terminal to raw mode */
tcgetattr(fileno(stdin), &orig_term_attr);
memcpy(&new_term_attr, &orig_term_attr, sizeof(termios));
new_term_attr.c_lflag &= ~(ECHO|ICANON);
new_term_attr.c_cc[VTIME] = 0;
new_term_attr.c_cc[VMIN] = 0;
tcsetattr(fileno(stdin), TCSANOW, &new_term_attr);
add_listener(event_pump_fd, STDIN_FILENO);
add_listener(event_pump_fd, fdDns, EPOLLOUT);
EGLDisplay egl_display;
EGLConfig egl_config;
EGLContext egl_context;
EGLSurface egl_surface;
setup_egl(
win,
&egl_display,
&egl_config,
&egl_context,
&egl_surface);
for (;;) {
xcb_generic_event_t* e = 0;
while (true) {
epoll_event ready_events[ 1024 ] = { 0 };
int num_fd_ready = -1;
do {
// num_fd_ready = epoll_pwait(event_pump_fd, ready_events, ALEN(ready_events), -1, &mask);
num_fd_ready = epoll_wait(event_pump_fd, ready_events, ALEN(ready_events), -1);
printf("Got an event from the pump\n");
if (num_fd_ready < 0) {
printf("Should we exit?\n");
break;
}
for (int i = 0; i < num_fd_ready; ++i) {
int fdSource = ready_events[i].data.fd;
if (fdSource == xcb_fd) {
printf("Got second XCB fd event from the pump\n");
goto after_pump;
} else if (fdSource == sfd) {
printf("signal\n");
signalfd_siginfo info = { 0 };
int ret = read(sfd, &info, sizeof(info));
if (ret == sizeof(info)) {
if (info.ssi_signo == 2) {
// Ctrl+C
printf("Exit by Ctrl+C\n");
restore_terminal();
return 0;
}
printf("signo = %d\n", info.ssi_signo);
printf("pid = %d\n", info.ssi_pid);
printf("uid = %d\n", info.ssi_uid);
num_fd_ready = 0;
break;
}
} else if (fdSource == fdDns && ready_events[i].events & EPOLLIN) {
unsigned char dnsPacket[ 1500 ] = { 0 };
sockaddr_storage srcAddr = { 0 };
socklen_t bytesSrcAddr = sizeof(srcAddr);
ssize_t bytesRecvd = recvfrom(fdDns, dnsPacket, sizeof(dnsPacket), 0, (sockaddr*)&srcAddr, &bytesSrcAddr);
printf("UDP packet from ");
printipv4(&((sockaddr_in*)&srcAddr)->sin_addr);
int sent = -1;
//for (int a = 0; a < 1; ++a) {
// sent = sendto(fdDns, dnsPacket, bytesValidRequest + sizeof(DnsShortAnswerA), MSG_DONTWAIT, (sockaddr*)&srcAddr, bytesSrcAddr);
//}
// sent = sendto(fdDns, dnsPacket, bytesRecvd, MSG_DONTWAIT, (sockaddr*)&srcAddr, bytesSrcAddr);
if (sent == -1) {
printf("---------- Send failed: %d\n", errno);
}
} else if (fdSource == fdDns && ready_events[i].events & EPOLLOUT) {
printf("UDP socket ready to write %c\n", char_to_send);
if (should_send) {
should_send = false;
//unsigned char udpPacket[ 7334 ] = { 0 };
//udpPacket[ 0 ] = 0xAA;
//udpPacket[ 7333 ] = char_to_send;
sockaddr_in dstAddr = { 0 };
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr("192.168.254.54");
int dstPort = 42;
dstAddr.sin_port = htons(dstPort);
load_bitstream();
int sent = sendto(fdDns, bitstream, sizeof(bitstream), MSG_DONTWAIT,
(sockaddr*)&dstAddr, sizeof(dstAddr));
//int sent = sendto(fdDns, udpPacket, sizeof(udpPacket), MSG_DONTWAIT,
// (sockaddr*)&dstAddr, sizeof(dstAddr));
if (sent == -1) {
printf("---------- Send failed: %d\n", errno);
}
}
} else if (STDIN_FILENO == fdSource) {
int byte_result = 0;
read(ready_events[i].data.fd, &byte_result, 1);
if (byte_result == 10) {
// "Enter"
printf("\n");
// } else if (byte_result == 97) {
} else if (byte_result >= ' ' && byte_result <= '~') {
char_to_send = byte_result;
printf("Sending bitstream %c...\n", char_to_send);
//unsigned char udpPacket[ 7334 ] = { 0 };//char_to_send };//, 0 };
//udpPacket[ 0 ] = 0xAA;
//udpPacket[ 7333 ] = char_to_send;
sockaddr_in dstAddr = { 0 };
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr("192.168.254.54");
int dstPort = 42;
dstAddr.sin_port = htons(dstPort);
load_bitstream();
int sent = sendto(fdDns, bitstream, sizeof(bitstream), MSG_DONTWAIT,
(sockaddr*)&dstAddr, sizeof(dstAddr));
//int sent = sendto(fdDns, udpPacket, sizeof(udpPacket), MSG_DONTWAIT,
// (sockaddr*)&dstAddr, sizeof(dstAddr));
if (sent == -1) {
printf("---------- Send failed: %d\n", errno);
}
// should_send = true;
} else {
printf("STDIN %d %d\n", num_fd_ready, ready_events[i].data.fd);
printf("STDIN read %d\n", byte_result);
}
} else {
printf("[[[ GOT SOME UNEXPECTED INTERRUPTION OF epoll ]]]\n");
}
}
} while (num_fd_ready > 0);
after_pump:
printf("Events pump done\n");
if ((e = xcb_poll_for_event(c))) {
printf("xcb event\n");
break;
}
}
if (!e) {
printf("Done.\n");
break;
}
switch (e->response_type & ~0x80) {
case XCB_EXPOSE: {
printf("Exposure\n");
runApp(window_width, window_height);
eglSwapBuffers(egl_display, egl_surface);
break;
}
case XCB_KEY_PRESS:
printf("Break on keypress.\n");
goto endloop;
case XCB_RESIZE_REQUEST: {
const xcb_resize_request_event_t* cfgEvent
= (const xcb_resize_request_event_t*)e;
printf("%dx%d\n", cfgEvent->width, cfgEvent->height);
window_width = cfgEvent->width;
window_height = cfgEvent->height;
runApp(window_width, window_height);
eglSwapBuffers(egl_display, egl_surface);
break;
}
case XCB_CONFIGURE_NOTIFY: {
const xcb_configure_notify_event_t* cfgEvent = (const xcb_configure_notify_event_t *)e;
printf("%dx%d\n", cfgEvent->width, cfgEvent->height);
/*
if (((cfgEvent->width != width) || (cfgEvent->height != height))) {
destWidth = cfgEvent->width;
destHeight = cfgEvent->height;
if ((destWidth > 0) && (destHeight > 0))
{
// Swap chain recreation ins done in this function
windowResize();
}
}*/
}
} // switch
printf("XCB %d\n", e->response_type);
free(e);
}
endloop:
restore_terminal();
return 0;
}
# Synthesize
./../yosys/yosys -p "read_verilog ./proj/example.v; synth_ice40 -nobram -blif example.blif"
# Place & route
./bin/arachne-pnr -d 384 -P qn32 -p ./proj/ice40lp384.pcf -o example.txt --post-place-blif ./post.blif ./example.blif
# Compiled version of icepack removing deep sleep because we're directly reprogramming over the 5-wire protocol
# CRESET_B, SPI_SCK, SPI_DI, CDONE, SPI_SS_B
./a.out -vvv -n ./example.txt example.bin
# Generate a Verilog with RAM filled with the FPGA image in it (temporary solution)
node ./lattice-conv.js
# reports of what you've made
./../yosys/yosys -q -o ./post.json ./post.blif
./../yosys/yosys -p "read_verilog -sv ./proj/example.v; synth_ice40 -nobram -blif example.blif" && ./bin/arachne-pnr -d 384 -P qn32 -p ./proj/ice40lp384.pcf -o example.txt --post-place-blif ./post.blif ./example.blif && ./a.out -vvv -n -s ./example.txt example-384.bin && node ./gen.js && ./../direct384/build/build.sh # && ./../yosys/yosys -q -o ./post.json ./post.blif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment