URL
https://opencores.org/ocsvn/10_100m_ethernet-fifo_convertor/10_100m_ethernet-fifo_convertor/trunk
Subversion Repositories 10_100m_ethernet-fifo_convertor
Compare Revisions
- This comparison shows the changes necessary to convert path
/10_100m_ethernet-fifo_convertor
- from Rev 8 to Rev 9
- ↔ Reverse comparison
Rev 8 → Rev 9
/trunk/rtl/verilog/RxModule.v
1,6 → 1,6
//author :gurenliang |
//author :Renliang Gu |
//Email: gurenliang@gmail.com |
//note: if there are some errors, you are welcome to contact me. It would be the best appreciation to me. |
//note: if there are some errors, please feel free to contact me. Thank you very much! |
|
//Next step, reduce the resource consumed |
|
13,18 → 13,20
|
`include "common.v" |
|
`define ff_source_cnt_len 8 //(2^ff_source_cnt_len) must be larger than uframelen |
`define nibble_cnt_len 10 //(2^nibble_cnt_len) must be larger than eth_buf_len/4 |
`define delay_cnt_len 4 //(2^delay_cnt_len) must be larger than the number of clocks you want TxModule to wait at the beginning |
`define delay_cnt_config 4'h9 //the initiation value for the delay_cnt |
`define ff_data_buf_index_len 5 //(2^ff_data_buf_index_len) must be larger than or equal to num_uframe*2 |
`define toggle_lsbs 4'h0 //the length of zeros is ff_data_buf_index_len-1 |
`define IDXlen 3 //2^IDXlen should be the number of cyclic queue |
`define queue_len (1<<3) //define the length of the cyclic queue |
|
//8 bytes preamble, 12 bytes source address and destination address, 2 bytes length/type, 3bytes frameID |
`define eth_buf_len (8*(8+6+6+2)+`frameidlen+`uframelen*`num_uframe+8*4) //the last 4 bytes CRC |
`define da_offset (8<<1) //8 byte before |
`define sa_offset (`da_offset+(6<<1)) //8+6 bytes before |
`define typelen_offset (`sa_offset+(6<<1)) |
`define frameid_offset (`typelen_offset+(2<<1))//index of first bit of frameid |
`define data_offset (`frameid_offset+(`frameidlen>>2)) |
//index of first bit of data |
`define rx_crc_offset (`data_offset+(`uframelen*`num_uframe/4)) //index of first bit of crc |
`define rx_total_len (`rx_crc_offset + (4<<1)) |
`define rxdata_len (`uframelen*`num_uframe/4) |
|
`define frameid_offset 176 //index of frameid in eth_buf |
`define data_offset (`frameid_offset+`frameidlen) //index of beginning of data in eth_buf |
`define delay_cnt_config 0 //the initiation value for the delay_cnt |
|
module RxModule(phy_rxd, phy_rxen, phy_rxclk, phy_rxer, |
ff_clk, ff_data, ff_en, |
33,7 → 35,9
frameid, |
`endif |
|
start); |
start, |
test1, test2, test3, test4 |
); |
input phy_rxen, phy_rxclk, phy_rxer; //MII interface |
input [3:0] phy_rxd; |
|
42,124 → 46,244
|
`ifdef frameIDfromRx |
output[`frameidlen-1:0] frameid; |
reg[`frameidlen-1:0] frameid; |
`endif |
|
output start; //to tell TxModule that buf in RxModule needs data |
output test1, test2, test3, test4; |
reg test1, test2; |
|
parameter delay_cnt_len = (`delay_cnt_config <= 2) ? 1 : (`delay_cnt_config <= 4) ? 2 : |
(`delay_cnt_config <= 8) ? 3 : (`delay_cnt_config <= 16) ? 4 : |
(`delay_cnt_config <= 32) ? 5 : (`delay_cnt_config <= 64) ? 6 : |
(`delay_cnt_config <= 128) ? 7 : 8; |
parameter nibble_idx_len = (`rx_total_len<= 2)? 1 : (`rx_total_len<= 4)? 2 : |
(`rx_total_len<= 8)? 3 : (`rx_total_len<= 16)? 4 : |
(`rx_total_len<= 32)? 5 : (`rx_total_len<= 64)? 6 : |
(`rx_total_len<= 128)? 7 : (`rx_total_len<= 256)? 8 : |
(`rx_total_len<= 512)? 9 : (`rx_total_len<=1024)? 10 : |
(`rx_total_len<=2048)? 11 : 12; |
parameter ff_idx_len = (`rxdata_len<= 2)? 1 : (`rxdata_len<= 4)? 2 : |
(`rxdata_len<= 8)? 3 : (`rxdata_len<= 16)? 4 : |
(`rxdata_len<= 32)? 5 : (`rxdata_len<= 64)? 6 : |
(`rxdata_len<= 128)? 7 : (`rxdata_len<= 256)? 8 : |
(`rxdata_len<= 512)? 9 : (`rxdata_len<=1024)?10 : |
(`rxdata_len<=2048)?10 : 11; |
parameter frameid_idx_len = ((`frameidlen>>2)<= 2)? 1 : ((`frameidlen>>2)<= 4)? 2 : |
((`frameidlen>>2)<= 8)? 3 : ((`frameidlen>>2)<= 16)? 4 : |
((`frameidlen>>2)<= 32)? 5 : ((`frameidlen>>2)<= 64)? 6 : |
((`frameidlen>>2)<= 64)? 7 : 8; |
parameter ff_cnt_len = (`uframelen < 2) ? 1 : (`uframelen < 4) ? 2 : |
(`uframelen < 8) ? 3 : (`uframelen < 16) ? 4 : |
(`uframelen < 32) ? 5 : (`uframelen < 64) ? 6 : |
(`uframelen < 128) ? 7 : (`uframelen < 256) ? 8 : |
(`uframelen < 512) ? 9 : (`uframelen < 1024) ? 10: |
(`uframelen < 2048) ? 11: (`uframelen < 4096) ? 12: |
(`uframelen < 8192) ? 13: 14; |
|
reg ff_data; |
reg ff_en; |
|
reg[ff_cnt_len-1:0] ff_cnt; |
reg[2:0] ff_d; |
|
reg[`uframelen-1:0] ff_data_buf[0:`num_uframe*2-1]; //declare |
reg[`uframelen-1:0] ff_d; |
reg[`ff_source_cnt_len-1:0] ff_cnt; |
reg[`eth_buf_len-1:0] eth_buf; |
reg start=1'b0; |
reg start_intra=1'b0; |
reg[delay_cnt_len-1:0] delay_cnt; |
|
reg[`nibble_cnt_len-1:0] nibble_cnt=0; |
reg[3:0] gap_cnt; |
reg[1:0] gap_len_ctl; |
reg[1:0] cycle; |
|
`ifdef frameIDfromRx |
reg[`frameidlen-1:0] frameidt[0:1]; |
`endif |
reg[3:0] rxdata_buf [0:(`rxdata_len*`queue_len+1)]; //more ram for special usage |
wire[ff_idx_len+`IDXlen-1:0] rxdata_buf_writer_address; |
reg[ff_idx_len+`IDXlen-1:0] rxdata_buf_reader_address; |
|
reg start=1'b0; |
reg start_intra=1'b0; |
reg[`delay_cnt_len-1:0] delay_cnt; |
reg[`frameidlen-1:0] frameid_buf[0:(`queue_len-1)]; |
|
reg[`ff_data_buf_index_len-1:0] ff_data_buf_index; |
wire[`ff_data_buf_index_len-1:0] toggle; |
reg ff_state; |
reg[3:0] gap_cnt = 4'h0; |
reg[nibble_idx_len-1:0] nibble_idx; |
reg[ff_idx_len-1:0] ff_idx; |
|
parameter transfer = 1'b0, gap = 1'b1; |
reg[`IDXlen-1:0] rxIDX, ffIDX; |
|
reg bad_da; |
reg queue_empty; |
|
reg[2:0] rxState = 0; |
parameter s_preamble = 0, s_address = 1, s_typelen = 2, |
s_frameid = 3, s_data = 4, s_crc = 5; |
reg[1:0] ff_state = 0; |
parameter ffs_idle = 0, ffs_transfer = 1, ffs_gap = 2; |
|
wire[47:0] mac_add; |
wire[3:0] da[0:11]; |
assign mac_add = `MAC_ADD; |
assign da[ 0] = mac_add[ 3: 0]; |
assign da[ 1] = mac_add[ 7: 4]; |
assign da[ 2] = mac_add[11: 8]; |
assign da[ 3] = mac_add[15:12]; |
assign da[ 4] = mac_add[19:16]; |
assign da[ 5] = mac_add[23:20]; |
assign da[ 6] = mac_add[27:24]; |
assign da[ 7] = mac_add[31:28]; |
assign da[ 8] = mac_add[35:32]; |
assign da[ 9] = mac_add[39:36]; |
assign da[10] = mac_add[43:40]; |
assign da[11] = mac_add[47:44]; |
|
assign test4 = start_intra; |
assign test3 = start; |
|
always@(posedge phy_rxclk)begin //control the increasing of nibble_idx; |
if(phy_rxen & ~phy_rxer) //data is valid and no error |
nibble_idx <= nibble_idx + 1; |
else |
nibble_idx <= 0; |
end |
|
always@(posedge phy_rxclk)begin |
if(phy_rxen & ~phy_rxer) |
case (rxState) |
s_preamble: |
if(nibble_idx == `da_offset-1) rxState <= s_address; |
else rxState <= s_preamble; |
|
s_address: |
if(nibble_idx == `typelen_offset-1) rxState <= s_typelen; |
else rxState <= s_address; |
|
s_typelen: |
if(nibble_idx == `frameid_offset-1) rxState <= s_frameid; |
else rxState <= s_typelen; |
|
s_frameid: |
if(nibble_idx == `data_offset-1) rxState <= s_data; |
else rxState <= s_frameid; |
|
s_data: |
if(nibble_idx == `rx_crc_offset-1) rxState <= s_crc; |
else rxState <= s_data; |
|
s_crc: |
if(nibble_idx == `rx_total_len-1) rxState <= s_preamble; |
else rxState <= s_crc; |
|
default: rxState <= rxState; |
endcase |
else |
rxState <= s_preamble; |
end |
|
assign rxdata_buf_writer_address = rxIDX*`rxdata_len + nibble_idx - `data_offset; |
|
always@(posedge phy_rxclk)begin //receive data from Ethernet including the preamble, SFD and CRC |
if(phy_rxen & ~phy_rxer) begin //data is valid and no error |
eth_buf <= {phy_rxd, eth_buf[`eth_buf_len-1:4]}; |
nibble_cnt <= nibble_cnt + 1; |
end |
else if ((nibble_cnt == (`eth_buf_len>>2) ) & (eth_buf[111:64] == `MAC_ADD)) begin |
case (rxState) |
s_preamble: test1 <= ~test1; |
s_address: |
if((phy_rxd!=da[nibble_idx-`da_offset])&(nibble_idx < `sa_offset)) |
bad_da <= 1; |
|
s_frameid: begin |
if(nibble_idx==`frameid_offset) begin |
rxIDX <= phy_rxd[2:0]; |
frameid_buf[phy_rxd[2:0]][(`frameidlen-1):(`frameidlen-4)] <= phy_rxd; |
end else |
frameid_buf[rxIDX] <= {phy_rxd, frameid_buf[rxIDX][(`frameidlen-1):4]}; |
end |
|
s_data: begin |
//test2 <= ~test2; |
rxdata_buf[rxdata_buf_writer_address] <= phy_rxd; |
end |
endcase |
end else if ((nibble_idx == `rx_total_len ) & (!bad_da)) begin |
//one frame has been transfered over, the destinate address is right and then been put into the buffer |
|
`ifdef frameIDfromRx |
frameidt[~ff_data_buf_index[`ff_data_buf_index_len-1]] <= eth_buf[`data_offset-1:`frameid_offset]; |
`endif |
|
`ifdef num_cover_4 |
ff_data_buf[toggle ] <= eth_buf[`data_offset+ 1*`uframelen-1: `data_offset+ 0*`uframelen]; |
ff_data_buf[toggle + 1] <= eth_buf[`data_offset+ 2*`uframelen-1: `data_offset+ 1*`uframelen]; |
ff_data_buf[toggle + 2] <= eth_buf[`data_offset+ 3*`uframelen-1: `data_offset+ 2*`uframelen]; |
ff_data_buf[toggle + 3] <= eth_buf[`data_offset+ 4*`uframelen-1: `data_offset+ 3*`uframelen]; |
`ifdef num_cover_8 |
ff_data_buf[toggle + 4] <= eth_buf[`data_offset+ 5*`uframelen-1: `data_offset+ 4*`uframelen]; |
ff_data_buf[toggle + 5] <= eth_buf[`data_offset+ 6*`uframelen-1: `data_offset+ 5*`uframelen]; |
ff_data_buf[toggle + 6] <= eth_buf[`data_offset+ 7*`uframelen-1: `data_offset+ 6*`uframelen]; |
ff_data_buf[toggle + 7] <= eth_buf[`data_offset+ 8*`uframelen-1: `data_offset+ 7*`uframelen]; |
`ifdef num_cover_16 |
ff_data_buf[toggle + 8] <= eth_buf[`data_offset+ 9*`uframelen-1: `data_offset+ 8*`uframelen]; |
ff_data_buf[toggle + 9] <= eth_buf[`data_offset+10*`uframelen-1: `data_offset+ 9*`uframelen]; |
ff_data_buf[toggle + 10] <= eth_buf[`data_offset+11*`uframelen-1: `data_offset+10*`uframelen]; |
ff_data_buf[toggle + 11] <= eth_buf[`data_offset+12*`uframelen-1: `data_offset+11*`uframelen]; |
ff_data_buf[toggle + 12] <= eth_buf[`data_offset+13*`uframelen-1: `data_offset+12*`uframelen]; |
ff_data_buf[toggle + 13] <= eth_buf[`data_offset+14*`uframelen-1: `data_offset+13*`uframelen]; |
ff_data_buf[toggle + 14] <= eth_buf[`data_offset+15*`uframelen-1: `data_offset+14*`uframelen]; |
ff_data_buf[toggle + 15] <= eth_buf[`data_offset+16*`uframelen-1: `data_offset+15*`uframelen]; |
`endif |
`endif |
`endif |
|
start_intra <= 1'b1; |
nibble_cnt <= 0; |
end |
else |
nibble_cnt <= 0; |
start_intra <= 1; |
end else |
bad_da <= 0; |
end |
|
//assign empty = ((ff_data_buf_index[2:0]==3'b011)|(ff_data_buf_index[2:0]==3'b100)); |
//every four 148bit, generate an empty signal to the TxModule |
assign toggle = {~ff_data_buf_index[`ff_data_buf_index_len-1],`toggle_lsbs}; //indicate which half buffer is available |
always@(negedge ff_clk) begin |
case(ff_state) |
ffs_idle: begin //wait the first frame to come |
gap_len_ctl <= 0; |
if(start_intra) ff_state <= ffs_transfer; |
else ff_state <= ffs_idle; |
end |
|
ffs_transfer: begin |
if(ff_cnt == `uframelen-1)begin //every `uframelen bit need a gap |
ff_state <= ffs_gap; |
gap_len_ctl <= gap_len_ctl + 1; |
end |
else ff_state <= ffs_transfer; |
end |
ffs_gap: begin |
if(((gap_len_ctl == 0)&(gap_cnt == 8)) | ((gap_len_ctl != 0)&(gap_cnt == 7))) |
ff_state <=ffs_transfer; |
else ff_state <= ffs_gap; |
end |
endcase |
end |
|
`ifdef frameIDfromRx |
assign frameid = frameidt[ff_data_buf_index[`ff_data_buf_index_len-1]];// |
`endif |
|
always@(negedge ff_clk) //flow the data out of the buffer |
if(start_intra==1'b0) begin //wait the first frame to come |
ff_state <= transfer; |
ff_cnt <= 0; |
ff_data_buf_index <= -1; // to fill every bit in ff_data_buf_index with 1s |
ff_en <= 1'b0; |
|
delay_cnt <= `delay_cnt_config; |
end |
else |
case(ff_state) |
transfer: begin |
delay_cnt <= delay_cnt - 1; |
if(delay_cnt == 0) start <=1'b1; |
|
if(ff_cnt==0) begin //load new 148 bits |
{ff_d[`uframelen-2:0],ff_data} <= ff_data_buf[ff_data_buf_index + 1]; |
ff_data_buf_index <= ff_data_buf_index + 1; |
ff_cnt <= ff_cnt + 1; |
ff_en <= 1'b1; |
always@(negedge ff_clk) begin //flow the data out of the buffer |
case(ff_state) |
ffs_idle: begin |
ff_cnt <= 0; |
delay_cnt <= 0; |
cycle <= 0; |
ff_en <= 0; |
ff_idx <= 0; |
ffIDX <= rxIDX + 2; |
start <= 0; |
rxdata_buf_reader_address <= ffIDX*`rxdata_len+ff_idx; |
end |
|
ffs_transfer: begin |
`ifdef frameIDfromRx |
frameid <= frameid_buf[ffIDX]; |
`endif |
if(delay_cnt == `delay_cnt_config) start <= 1; |
delay_cnt <= delay_cnt + 1; |
gap_cnt <= 0; |
ff_cnt <= ff_cnt + 1; |
cycle <= cycle + 1; |
ff_en <= 1; |
|
if(cycle==0) begin |
{ff_d[2:0],ff_data} <= rxdata_buf[rxdata_buf_reader_address]; |
if(ff_idx == `rxdata_len-1)begin |
if(ffIDX!=rxIDX) begin |
queue_empty <= 0; |
if(queue_empty) begin |
ffIDX <= rxIDX + 2; |
rxdata_buf_reader_address <= (rxIDX + 2)*`rxdata_len; |
end |
else begin |
ffIDX <= ffIDX + 1; |
rxdata_buf_reader_address <= (ffIDX+1)*`rxdata_len; |
end |
end else begin |
rxdata_buf_reader_address <= ffIDX*`rxdata_len; |
queue_empty <= 1; |
end |
ff_idx <= 0; |
end |
else if(ff_cnt == `uframelen) begin //every 148 bit need a gap |
ff_en <= 1'b0; |
ff_cnt <= 0; |
ff_state <= gap; |
ff_data <= 1'b0; |
end |
else begin |
{ff_d[`uframelen-2:0],ff_data} <= ff_d; |
ff_cnt <= ff_cnt + 1; |
ff_idx <= ff_idx + 1; |
rxdata_buf_reader_address <= ffIDX*`rxdata_len+ff_idx+1; |
end |
end |
gap: begin //the 8.25 bit gap is implement by (3*8+9)/4 |
gap_cnt <= gap_cnt + 4'h1; |
if(((ff_data_buf_index[1:0]==2'b11)&(gap_cnt == 4'h7)) |
| ((ff_data_buf_index[1:0]!=2'b11)&(gap_cnt == 4'h6)))begin |
gap_cnt <= 4'h0; |
ff_state <= transfer; |
end |
end |
endcase |
endmodule |
|
end else |
{ff_d[1:0],ff_data} <= ff_d; |
end |
|
ffs_gap: begin //the 8.25 bit gap is implement by (3*8+9)/4 |
ff_en <= 0; |
ff_data <= 0; |
ff_cnt <= 0; |
gap_cnt <= gap_cnt + 1; |
end |
endcase |
end |
endmodule |
/trunk/rtl/verilog/TxModule.v
2,9 → 2,10
//Email: gurenliang@gmail.com |
//note: if there are some errors, you are welcome to contact me. It would be the best appreciation to me. |
|
//Next step, reduce the resource consumed |
|
//version 0.5, defined many parameter to configure the IP core, making it easier to use. |
|
//Next step, add ff_data control to show the IP is busy |
|
//version 0.3, declared a new variable data_av, and use it to start sending frame. |
//version 0.3, delete the usage of pre_buf, and rename the pre to preaddlt |
//version 0.3, add the option of frameID mode, by include common.v and judge the macro-varible frameIDfromRx |
11,17 → 12,16
//This module is used to receive data from the demodulate module and send the data to the Ethernet PHY chip |
`include "common.v" |
|
`define tx_data_buf_len (`frameidlen+`uframelen*`num_uframe+132) |
`define tx_data_buf_len (`frameidlen+`uframelen*`num_uframe+66) |
//132=8.25*`num_uframe is the space between the uframes |
`define tx_data_madeup 4 //add to tx_data_buf_len to make 132 is dividible by 8 |
`define append_zero 4'h0 |
//66=8.25*`num_uframe is the space between the uframes |
`define tx_data_madeup 6 //add to tx_data_buf_len to make 132 is dividible by 8 |
//add to tx_data_buf_len to make 66 is dividible by 8 |
|
`define tx_data_len (`tx_data_buf_len+`tx_data_madeup) |
//make the length of tx_data_buf be conformed to IEEE802.3 |
`define ff_sink_cnt_len 12 //make sure 2^ff_sink_cnt_len is larger than or equal to tx_data_buf_len |
`define ff_cnt_init (1+`frameidlen) |
|
`define tx_cnt_len 10 //make sure 2^tx_cnt_len is larger than [(`tx_data_len >> 2) + 51] |
|
module TxModule(reset, phy_txd, phy_txen, phy_txclk, phy_txer, |
ff_clk, ff_en, ff_data, |
|
31,6 → 31,36
|
start, |
test1, test2, test3, test4); |
//make sure 2^ff_sink_cnt_len is larger than or equal to tx_data_buf_len |
parameter ff_sink_cnt_len = (`tx_data_buf_len <= 2) ? 1 : |
(`tx_data_buf_len <= 4) ? 2 : |
(`tx_data_buf_len <= 8) ? 3 : |
(`tx_data_buf_len <= 16) ? 4 : |
(`tx_data_buf_len <= 32) ? 5 : |
(`tx_data_buf_len <= 64) ? 6 : |
(`tx_data_buf_len <= 128) ? 7 : |
(`tx_data_buf_len <= 256) ? 8 : |
(`tx_data_buf_len <= 512) ? 9 : |
(`tx_data_buf_len <= 1024) ? 10: |
(`tx_data_buf_len <= 2048) ? 11: |
(`tx_data_buf_len <= 4096) ? 12: |
(`tx_data_buf_len <= 8192) ? 13: 14; |
//make sure 2^tx_cnt_len is larger than [(`tx_data_len >> 2) + 51] |
parameter tx_cnt_len = (((`tx_data_len >> 2) + 51) <= 2) ? 1 : |
(((`tx_data_len >> 2) + 51) <= 4) ? 2 : |
(((`tx_data_len >> 2) + 51) <= 8) ? 3 : |
(((`tx_data_len >> 2) + 51) <= 16) ? 4 : |
(((`tx_data_len >> 2) + 51) <= 32) ? 5 : |
(((`tx_data_len >> 2) + 51) <= 64) ? 6 : |
(((`tx_data_len >> 2) + 51) <= 128) ? 7 : |
(((`tx_data_len >> 2) + 51) <= 256) ? 8 : |
(((`tx_data_len >> 2) + 51) <= 512) ? 9 : |
(((`tx_data_len >> 2) + 51) <= 1024) ? 10: |
(((`tx_data_len >> 2) + 51) <= 2048) ? 11: |
(((`tx_data_len >> 2) + 51) <= 4096) ? 12: |
(((`tx_data_len >> 2) + 51) <= 8192) ? 13: 14; |
|
|
input phy_txclk, reset; |
input ff_clk, ff_en, ff_data; //ff_clk should be 207.83333KHz |
|
56,13 → 86,13
//reg[175:0] pre_buf=176'h0008_5952_264C_5247_FFFF_FFFF_FFFF_D555_5555_5555_5555; |
|
reg[`tx_data_buf_len-1:0] tx_data_buf[0:1]; //two buffer helps to step over different frame seamlessly |
reg pre_toggle, toggle=1'b0; //helps to decide when to give PC a MAC frame |
reg pre_toggle1,pre_toggle2, toggle=1'b0; //helps to decide when to give PC a MAC frame |
reg[`tx_data_len-1:0] tx_data; //used as FIFO |
|
reg[`ff_sink_cnt_len-1:0] ff_cnt=0; |
reg[ff_sink_cnt_len-1:0] ff_cnt=0; |
|
reg[`tx_cnt_len-1:0] tx_cnt; |
reg data_av; |
reg[tx_cnt_len-1:0] tx_cnt; |
wire data_av; |
|
reg Enable_Crc, Initialize_Crc; //declare the variables for the CRC module |
wire [3:0] Data_Crc; |
104,6 → 134,12
end |
|
assign phy_txer = 1'b0; |
assign data_av = pre_toggle1^pre_toggle2; |
|
always @ (negedge phy_txclk) begin //state machine run to send out the MAC frame |
pre_toggle1 <= toggle; |
pre_toggle2 <= pre_toggle1; |
end |
|
// Determine the next state |
always @ (negedge phy_txclk) begin //state machine run to send out the MAC frame |
110,13 → 146,11
if (reset) |
state <= s_idle; |
else begin |
if(pre_toggle ^ toggle) data_av<=1'b1; |
case (state) |
s_idle: begin //wait to be trigged |
test1 <= ~test1; |
if(data_av) begin //once be trigged, prepare the data to send |
state <= s_pre; |
data_av <= 1'b0; |
end |
else state <= s_idle; |
end |
151,10 → 185,6
end |
|
always @ (negedge phy_txclk) begin //state machine run to send out the MAC frame |
pre_toggle <= toggle; |
end |
|
always @ (negedge phy_txclk) begin //state machine run to send out the MAC frame |
if (reset) |
tx_cnt <= 0; |
else if(state==s_idle) |
169,7 → 199,7
else |
case (state) |
s_idle: begin |
tx_data <= {`append_zero, tx_data_buf[~toggle]}; |
tx_data <= {{`tx_data_madeup{1'b0}}, tx_data_buf[~toggle]}; |
//already stored MAC preamble, dest address and source address from right to left. |
//decide whether should ask PC for new frame |
/*if(empty) preaddlt <= {16'h0008, `MAC_ADD, `PC_MAC_ADD, `Preamble}; |
/trunk/rtl/verilog/test_feedback.v
1,3 → 1,7
//author :Renliang Gu |
//Email: gurenliang@gmail.com |
//note: if there are some errors, please feel free to contact me. Thank you very much! |
|
//version 0.4, the test_feedback is created, main task is to test the top module, EthernetModule.v |
// the ff_data_source is feed back to ff_data_sink |
|
32,10 → 36,10
.test1(test1), .test2(test2), .test3(test3), .test4(test4) |
); |
|
pll pll_inst ( |
.inclk0 ( clk_in ), |
.c0 ( clk_10K ), |
.c1 ( ff_clk ) |
); |
pll pll_inst ( |
.inclk0 ( clk_in ), |
.c0 ( clk_10K ), |
.c1 ( ff_clk ) |
); |
|
endmodule |
/trunk/rtl/verilog/EthernetModule.v
31,7 → 31,6
//after reset, phy_txclk and phy_rxen must be input ports |
inout phy_txclk, phy_col, phy_rxen, phy_linksts, phy_crs; |
|
//wire ff_en, ff_data, |
wire out_en; |
wire rxen_in, txclk_in; |
|
56,7 → 55,8
.frameid(frameid), |
`endif |
.start(start), |
.test1(test1), .test2(test2), .test3(test3), .test4(test4)); |
.test1(), .test2(), .test3(), .test4()); |
//.test1(test1), .test2(test2), .test3(test3), .test4(test4)); |
|
RxModule RxModule_inst(.phy_rxd(phy_rxd), .phy_rxen(rxen_in), .phy_rxclk(phy_rxclk), .phy_rxer(phy_rxer), |
.ff_clk(ff_clk), .ff_data(ff_data_source), .ff_en(ff_en_source), |
63,9 → 63,8
`ifdef frameIDfromRx |
.frameid(frameid), |
`endif |
.start(start)); |
|
//assign test1 = ff_en; |
//assign test2 = ff_data; |
.start(start), |
//.test1(), .test2(), .test3(), .test4()); |
.test1(test1), .test2(test2), .test3(test3), .test4(test4)); |
|
endmodule |
/trunk/rtl/verilog/common.v
1,6 → 1,6
//author :gurenliang |
//author :Renliang Gu |
//Email: gurenliang@gmail.com |
//note: if there are some errors, you are welcome to contact me. It would be the best appreciation to me. |
//note: if there are some errors, please feel free to contact me. Thank you very much! |
|
//Next step, reduce the resource consumed |
|
18,12 → 18,8
`define MAC_ADD 48'h0100_0000_0000 //mac address: 0x00-00-00-00-00-01 |
`define PC_MAC_ADD 48'hffff_ffff_ffff //mac address of the other terminal |
|
`define uframelen 148 //148-bit |
`define num_uframe 16 //the number of uframes received once |
//`define num_cover_32 |
`define num_cover_16 |
`define num_cover_8 |
`define num_cover_4 |
|
|
`define frameidlen 24 //the id of the MAC frame |
`define frameidlen 24 //the id of the MAC frame |
`define uframelen 148 //148-bit |
`define num_uframe 8 //the number of uframes received once |
`define interval 8.25 //the interval between frames without send any data on fifo |
|