Files

974 lines
30 KiB
Verilog

`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/11/14 17:44:48
// Design Name:
// Module Name: FrameMerge
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module FrameMerge(
input clk,
input rst,
input rst2,
input sync,
input nd,
input din,
input [6:0] vio_stopbit,
input frameIDnd,
input clk2,
output reg framerdy = 1'b0,
// output reg flag_recvram = 1'b0,
// input [12:0] recv_addr1,
// input [12:0] recv_addr2,
// output [7:0] recv_data1,
// output [7:0] recv_data2,
input [13:0] recv_addr_new_0,
input [13:0] recv_addr_new_1,
input [13:0] recv_addr_new_2,
input [13:0] recv_addr_new_3,
output [7:0] recv_data_new_0,
output [7:0] recv_data_new_1,
output [7:0] recv_data_new_2,
output [7:0] recv_data_new_3,
output reg [16:0] RAMaddra_write_0 = 17'd0,
output reg [16:0] RAMaddra_write_1 = 17'd0,
output reg [16:0] RAMaddra_write_2 = 17'd0,
output reg [16:0] RAMaddra_write_3 = 17'd0,
output reg [16:0] RAMaddra_new_0 = 17'd0,
output reg [16:0] RAMaddra_new_1 = 17'd0,
output reg [16:0] RAMaddra_new_2 = 17'd0,
output reg [16:0] RAMaddra_new_3 = 17'd0,
output reg flag_notbyte = 1'd0,
output reg [1:0] state_ram = 2'd0,
output reg flag_stop = 1'd0, //给shx,拉高一个clk表示当前时帧有效数据接收完毕
output reg [16:0] addr_stop = 17'd0, //给shx,拉高一个clk,与flag_stop对齐,指示位置与最后1bit有效数据的位置对齐
//debug
output reg berstart_1d = 1'b0,
output reg bercompare = 1'b0,
output reg [16:0] bercount = 17'd0,
output reg [16:0] bercount_max = 17'd0,
output reg [16:0] ROMaddra_d2 = 17'd0,
output reg RAMdout_d1 = 1'd0,
// output reg validnd_1_1d = 1'b0,
// output reg validnd_2_1d = 1'b0,
output reg validnd_new_new = 1'b0,
// output reg [63:0] stop_temp_1 = 64'd0,
// output reg [63:0] stop_temp_2 = 64'd0,
output reg [63:0] stop_temp_new = 64'd0,
output flag_stop_0, //给shx,拉高1个clk表示当前时帧有效数据接收完毕
output [16:0] addr_stop_0,
output reg [2:0] cnt_8 = 3'b0,
output reg state_8 = 1'd0,
output rdy_scramble,
output dout_scramble,
output reg [16:0] RAMaddra = 17'd0, //比较误码率
output reg [16:0] ROMaddra = 17'd0, //比较误码率
output reg [0:0] nd_ber = 1'd0, //比较误码率
output reg [63:0] recvNetData,
output reg recvNetDataNd
// input [7:0] video_id01,
// input [7:0] video_id02,
// input [7:0] video_id03,
// input [7:0] MAC_idNum
);
reg frameIDnd_d1 = 1'd0;
reg frameIDnd_d2 = 1'd0;
always @(posedge clk)begin
frameIDnd_d1 <= frameIDnd;
frameIDnd_d2 <= frameIDnd_d1;
end
// always @(posedge clk)begin
// if(frameIDnd && !frameIDnd_d1) flag_recvram <= ~flag_recvram;
// else flag_recvram <= flag_recvram;
// end
//-------------------------------------------------------------------------------------------------------------//
// reg validnd_1 = 1'b0;
// reg validnd_2 = 1'b0;
reg validnd_new = 1'b0;
reg [9:0] validlength = 10'd0;
reg [6:0] cnt_net;
reg [1:0] state_recv;
reg nd_recvnet_dout;
always @(posedge clk)begin
if(rst)begin
// validnd_1 <= 1'b0;
// validnd_2 <= 1'b0;
state_recv <= 2'd0;
validnd_new <= 1'b0;
validlength <= 10'd0;
cnt_net <= 6'd0;
nd_recvnet_dout <= 1'd0;
end
else begin
case(state_recv)
2'd0:begin
if(!validnd_new)begin
if(sync)begin
validnd_new <= 1'b1;
nd_recvnet_dout <= 1'b1;
end
else begin
validnd_new <= 1'b0;
end
end
else begin
if(cnt_net == 6'd63) begin
validlength <= validlength + 10'd1;
if(validlength == 10'd1023)begin
validnd_new <= 1'b0;
state_recv <= 2'd1;
end else begin
validnd_new <= 1'b1;
state_recv <= state_recv;
end
nd_recvnet_dout <= 1'b0;
cnt_net <= 6'd63;
end
else begin
state_recv <= state_recv;
nd_recvnet_dout <= 1'b1;
cnt_net <= cnt_net +6'd1;
validlength <= validlength + 10'd1;
if(validlength == 10'd1023)begin
validnd_new <= 1'b0;
end else begin
validnd_new <= 1'b1;
end
end
end
end
2'd1:begin
if(!validnd_new)begin
if(sync)begin
validnd_new <= 1'b1;
end
else begin
validnd_new <= 1'b0;
end
state_recv <= state_recv;
end
else begin
state_recv <= state_recv;
nd_recvnet_dout <= 1'b0;
cnt_net <= 6'd0;
validlength <= validlength + 10'd1;
if(validlength == 10'd1023)begin
validnd_new <= 1'b0;
end else begin
validnd_new <= 1'b1;
end
end
end
default:begin
if(!validnd_new)begin
if(sync)begin
validnd_new <= 1'b1;
nd_recvnet_dout <= 1'b1;
end
else begin
validnd_new <= 1'b0;
end
end
else begin
if(cnt_net == 6'd63) begin
validlength <= validlength + 10'd1;
if(validlength == 10'd1023)begin
validnd_new <= 1'b0;
state_recv <= 2'd1;
end else begin
validnd_new <= 1'b1;
state_recv <= state_recv;
end
nd_recvnet_dout <= 1'b0;
cnt_net <= 6'd63;
end
else begin
state_recv <= state_recv;
nd_recvnet_dout <= 1'b1;
cnt_net <= cnt_net +6'd1;
validlength <= validlength + 10'd1;
if(validlength == 10'd1023)begin
validnd_new <= 1'b0;
end else begin
validnd_new <= 1'b1;
end
end
end
end
endcase
end
end
// reg [15:0] RAMaddra_1 = 16'd0;
// reg [15:0] RAMaddra_2 = 16'd0;
// reg [16:0] RAMaddra_new = 17'd0;
// reg [15:0] RAMaddra = 16'd0; //比较误码率
reg [0:0] dout_scramble_d1 = 1'd0; //比较误码率
// reg [0:0] nd_ber = 1'd0; //比较误码率
// reg validnd_1_1d = 1'b0;
// reg validnd_2_1d = 1'b0;
reg validnd_new_1d = 1'b0;
always @(posedge clk)begin
if(rst)begin
// RAMaddra_1 <= 16'd0;
// RAMaddra_2 <= 16'd0;
// RAMaddra_new <= RAMaddra_new;
RAMaddra <= 17'd0; //比较误码率
ROMaddra <= 17'd0; //比较误码率
dout_scramble_d1 <= 1'd0; //比较误码率
nd_ber <= 1'd0; //比较误码率
// validnd_1_1d <= 1'b0;
// validnd_2_1d <= 1'b0;
validnd_new_1d <= 1'b0;
end else begin
// validnd_1_1d <= validnd_1;
// if(validnd_1_1d) begin
// RAMaddra_1 <= RAMaddra_1 + 16'd1;
// end else begin
// RAMaddra_1 <= RAMaddra_1;
// end
// validnd_2_1d <= validnd_2;
// if(validnd_2_1d) begin
// RAMaddra_2 <= RAMaddra_2 + 16'd1;
// end else begin
// RAMaddra_2 <= RAMaddra_2;
// end
validnd_new_1d <= validnd_new;
// if(validnd_new_1d) begin
// RAMaddra_new <= RAMaddra_new + 16'd1;
// end else begin
// RAMaddra_new <= RAMaddra_new;
// end
//比较误码率
// if(validnd_1_1d||validnd_2_1d) begin
if(validnd_new_1d) begin
RAMaddra <= RAMaddra + 17'd1;
ROMaddra <= ROMaddra + 17'd1;
dout_scramble_d1 <= dout_scramble;
nd_ber <= 1'd1;
end
else begin
RAMaddra <= RAMaddra;
ROMaddra <= ROMaddra;
dout_scramble_d1 <= dout_scramble_d1;
nd_ber <= 1'd0;
end
//比较误码率
end
end
reg nd_recvnet_dout_d1;
reg nd_recvnet_dout_d2;
reg nd_recvnet_dout_d3;
reg nd_recvnet_dout_d4;
reg wr_en_232;
reg rs232_send;
reg [4:0] cnt_422_wait;
wire validnd_new_delay;
reg validnd_new_delay_d1;
wire framedata;
reg framedata_d1;
reg [7:0] data_net_byte [87:0];
reg [7:0] clk_net_byte;
reg [9:0] clk_net_bit;
//shiftram_scramble shiftram_scramble(.CLK(clk),.D({dout_scramble,validnd_new}),.Q({framedata,validnd_new_delay}));
reg [7:0] cnt_422_net;
always @(posedge clk)begin
if(rst2)begin
state_ram <= 2'd0;
RAMaddra_new_0 <= 17'd0;
RAMaddra_new_1 <= 17'd0;
RAMaddra_new_2 <= 17'd0;
RAMaddra_new_3 <= 17'd0;
flag_notbyte <= 1'd0;
nd_recvnet_dout_d1 <= 1'd0;
nd_recvnet_dout_d2 <= 1'd0;
nd_recvnet_dout_d3 <= 1'd0;
nd_recvnet_dout_d4 <= 1'd0;
recvNetDataNd <= 1'd0;
recvNetData <= 64'd0;
wr_en_232 <= 1'b0;
rs232_send <= 1'b0;
cnt_422_wait <= 5'd0;
cnt_422_net <= 8'd0;
clk_net_bit <= 10'd0;
clk_net_byte <= 8'd0;
validnd_new_delay_d1 <= 1'b0;
framedata_d1 <= 1'b0;
end
else begin
framedata_d1 <= framedata;
validnd_new_delay_d1 <= validnd_new_delay;
nd_recvnet_dout_d1 <= nd_recvnet_dout;
nd_recvnet_dout_d2 <= nd_recvnet_dout_d1;
nd_recvnet_dout_d3 <= nd_recvnet_dout_d2;
nd_recvnet_dout_d4 <= nd_recvnet_dout_d3;
if(!nd_recvnet_dout_d1 && nd_recvnet_dout_d2) begin//检测到网络层数据传输完毕拉高2个clk recvNetDataNd
recvNetDataNd <= 1'b1;
end
else begin
if(!nd_recvnet_dout_d3 && nd_recvnet_dout_d4) begin//延迟2个clk确保50MHz采到recvNetDataNd再拉低
recvNetDataNd <= 1'b0;
end
else begin
recvNetDataNd <= recvNetDataNd;
end
end
case(state_ram)
//有了新的一帧,准备开始存储
2'd0:begin
if(frameIDnd_d2) begin
state_ram <= 2'd1;
RAMaddra_new_0<= RAMaddra_new_0;
RAMaddra_new_1<= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
else begin
state_ram <= state_ram;
RAMaddra_new_0<= RAMaddra_new_0;
RAMaddra_new_1<= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
validnd_new_new <= 1'd0;
flag_notbyte <= 1'd0;
end
2'd1:begin
if(flag_stop_0) begin
if(recvNetData[63:56] == 8'd2 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_0 <= addr_stop_0 +17'd1;
end
else if(recvNetData[63:56] == 8'd3 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_1 <= addr_stop_0 +17'd1;
end
else if(recvNetData[63:56] == 8'd4 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_2 <= addr_stop_0 +17'd1;
end
else if(recvNetData[63:56] == 8'hff && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_3 <= addr_stop_0 +17'd1;
end
else begin
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
validnd_new_new <= 1'd0;
state_ram <= 2'd2;
end
else begin
state_ram <= state_ram;
validnd_new_new <= validnd_new;
if(validnd_new_new) begin
if(nd_recvnet_dout_d1) begin
recvNetData[63:0] <= {dout_scramble,recvNetData[63:1]};
end
else begin
if(recvNetData[63:56] == 8'd2 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_0 <= RAMaddra_new_0 + 17'd1;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
else if(recvNetData[63:56] == 8'd3 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1 + 17'd1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
else if(recvNetData[63:56] == 8'd4 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2 + 17'd1;
RAMaddra_new_3 <= RAMaddra_new_3;
end
else if(recvNetData[63:56] == 8'hff && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3 + 17'd1;
end
else begin
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
end
end
else begin
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
end
flag_notbyte <= 1'd0;
end
2'd2:begin
// rs232_send <= 1'b0;
state_ram <= 2'd0;
if(recvNetData[63:56] == 8'd2 && recvNetData[23:0]==24'h7E5A33) begin
case(RAMaddra_new_0[2:0])
3'b000:begin
flag_notbyte <= 1'd0;
RAMaddra_new_0 <= RAMaddra_new_0;
end
3'b001:begin
flag_notbyte <= 1'd1;
RAMaddra_new_0 <= RAMaddra_new_0+17'd7;
end
3'b010:begin
flag_notbyte <= 1'd1;
RAMaddra_new_0 <= RAMaddra_new_0+17'd6;
end
3'b011:begin
flag_notbyte <= 1'd1;
RAMaddra_new_0 <= RAMaddra_new_0+17'd5;
end
3'b100:begin
flag_notbyte <= 1'd1;
RAMaddra_new_0 <= RAMaddra_new_0+17'd4;
end
3'b101:begin
flag_notbyte <= 1'd1;
RAMaddra_new_0 <= RAMaddra_new_0+17'd3;
end
3'b110:begin
flag_notbyte <= 1'd1;
RAMaddra_new_0 <= RAMaddra_new_0+17'd2;
end
3'b111:begin
flag_notbyte <= 1'd1;
RAMaddra_new_0 <= RAMaddra_new_0+17'd1;
end
endcase
end
else if(recvNetData[63:56] == 8'd3 && recvNetData[23:0]==24'h7E5A33) begin
case(RAMaddra_new_1[2:0])
3'b000:begin
flag_notbyte <= 1'd0;
RAMaddra_new_1 <= RAMaddra_new_1;
end
3'b001:begin
flag_notbyte <= 1'd1;
RAMaddra_new_1 <= RAMaddra_new_1+17'd7;
end
3'b010:begin
flag_notbyte <= 1'd1;
RAMaddra_new_1 <= RAMaddra_new_1+17'd6;
end
3'b011:begin
flag_notbyte <= 1'd1;
RAMaddra_new_1 <= RAMaddra_new_1+17'd5;
end
3'b100:begin
flag_notbyte <= 1'd1;
RAMaddra_new_1 <= RAMaddra_new_1+17'd4;
end
3'b101:begin
flag_notbyte <= 1'd1;
RAMaddra_new_1 <= RAMaddra_new_1+17'd3;
end
3'b110:begin
flag_notbyte <= 1'd1;
RAMaddra_new_1 <= RAMaddra_new_1+17'd2;
end
3'b111:begin
flag_notbyte <= 1'd1;
RAMaddra_new_1 <= RAMaddra_new_1+17'd1;
end
endcase
end
else if(recvNetData[63:56] == 8'd4 && recvNetData[23:0]==24'h7E5A33) begin
case(RAMaddra_new_2[2:0])
3'b000:begin
flag_notbyte <= 1'd0;
RAMaddra_new_2 <= RAMaddra_new_2;
end
3'b001:begin
flag_notbyte <= 1'd1;
RAMaddra_new_2 <= RAMaddra_new_2+17'd7;
end
3'b010:begin
flag_notbyte <= 1'd1;
RAMaddra_new_2 <= RAMaddra_new_2+17'd6;
end
3'b011:begin
flag_notbyte <= 1'd1;
RAMaddra_new_2 <= RAMaddra_new_2+17'd5;
end
3'b100:begin
flag_notbyte <= 1'd1;
RAMaddra_new_2 <= RAMaddra_new_2+17'd4;
end
3'b101:begin
flag_notbyte <= 1'd1;
RAMaddra_new_2 <= RAMaddra_new_2+17'd3;
end
3'b110:begin
flag_notbyte <= 1'd1;
RAMaddra_new_2 <= RAMaddra_new_2+17'd2;
end
3'b111:begin
flag_notbyte <= 1'd1;
RAMaddra_new_2 <= RAMaddra_new_2+17'd1;
end
endcase
end
else if(recvNetData[63:56] == 8'hff&& recvNetData[23:0]==24'h7E5A33) begin
case(RAMaddra_new_3[2:0])
3'b000:begin
flag_notbyte <= 1'd0;
RAMaddra_new_3 <= RAMaddra_new_3;
end
3'b001:begin
flag_notbyte <= 1'd1;
RAMaddra_new_3 <= RAMaddra_new_3+17'd7;
end
3'b010:begin
flag_notbyte <= 1'd1;
RAMaddra_new_3 <= RAMaddra_new_3+17'd6;
end
3'b011:begin
flag_notbyte <= 1'd1;
RAMaddra_new_3 <= RAMaddra_new_3+17'd5;
end
3'b100:begin
flag_notbyte <= 1'd1;
RAMaddra_new_3 <= RAMaddra_new_3+17'd4;
end
3'b101:begin
flag_notbyte <= 1'd1;
RAMaddra_new_3 <= RAMaddra_new_3+17'd3;
end
3'b110:begin
flag_notbyte <= 1'd1;
RAMaddra_new_3 <= RAMaddra_new_3+17'd2;
end
3'b111:begin
flag_notbyte <= 1'd1;
RAMaddra_new_3 <= RAMaddra_new_3+17'd1;
end
endcase
end
else begin
flag_notbyte <= 1'b0;
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
end
default:begin
if(frameIDnd_d2) begin
state_ram <= 2'd1;
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
else begin
state_ram <= state_ram;
RAMaddra_new_0 <= RAMaddra_new_0;
RAMaddra_new_1 <= RAMaddra_new_1;
RAMaddra_new_2 <= RAMaddra_new_2;
RAMaddra_new_3 <= RAMaddra_new_3;
end
validnd_new_new <= 1'd0;
flag_notbyte <= 1'd0;
end
endcase
end
end
reg [8:0] bagcnt = 9'd0;
always @(posedge clk)begin
if(rst)begin
bagcnt <= 9'd0;
end else begin
if(sync)begin
bagcnt <= bagcnt + 9'd1;
end else begin
bagcnt <= bagcnt;
end
end
end
wire scramblestart;
assign scramblestart = (bagcnt == 9'd0)? sync : 1'b0;
// wire rdy_scramble;
// wire dout_scramble;
Scramble Scramble (
.clk(clk),
.rst(rst2 || framerdy),
.start(scramblestart),
// .nd(validnd_1||validnd_2),
.nd(validnd_new),
.din(din),
.rdy(rdy_scramble),
.dout(dout_scramble)
);
//------------------------------------------比较误码率---------------------------//
reg [16:0] RAMaddrb = 17'd0;
wire RAMdout;
RAM_merge RAM_merge_0 (
.clka(clk), // input clka
// .wea(validnd_1_1d||validnd_2_1d), // input [0 : 0] wea
.wea(validnd_new_1d), // input [0 : 0] wea
.addra(RAMaddra), // input [16 : 0] addra
.dina(dout_scramble), // input [0 : 0] dina
.clkb(clk), // input clkb
.addrb(RAMaddrb), // input [16 : 0] addrb
.doutb(RAMdout) // output [0 : 0] doutb
);
// reg [15:0] ROMaddra = 16'd0;
wire ROMdout;
ROM_ber ROM_ber (
.clka(clk), // input clka
.addra(ROMaddra), // input [16 : 0] addra
.douta(ROMdout) // output [0 : 0] douta
);
reg berstart = 1'b0;
always @(posedge clk)begin
if(rst2)begin
RAMaddrb <= 17'd0;
berstart <= 1'b0;
end else begin
if(!berstart)begin
RAMaddrb <= 17'd0;
if(bagcnt == 9'd105 && validlength == 10'd1023)begin
berstart <= 1'b1;
end else begin
berstart <= 1'b0;
end
end else begin
if(RAMaddrb == 17'd107519)begin
berstart <= 1'b0;
RAMaddrb <= 17'd0;
end else begin
berstart <= 1'b1;
RAMaddrb <= RAMaddrb + 17'd1;
end
end
end
end
reg [16:0] ROMaddra_d1 = 17'd0;
always @(posedge clk)begin
berstart_1d <= berstart;
if(rst)begin
bercompare <= 1'b0;
bercount <= 17'd0;
ROMaddra_d1 <= 17'd0;
ROMaddra_d2 <= 17'd0;
RAMdout_d1 <= 1'd0;
bercount_max <= bercount;
end else begin
if(nd_ber) begin
bercompare <= dout_scramble_d1^ROMdout;
bercount <= bercount + bercompare;
ROMaddra_d1 <= ROMaddra;
ROMaddra_d2 <= ROMaddra_d1;
RAMdout_d1 <= dout_scramble_d1;
bercount_max <= bercount_max;
end
else begin
bercompare <= 1'd0;
bercount <= bercount;
ROMaddra_d1 <= ROMaddra_d1;
ROMaddra_d2 <= ROMaddra_d2;
RAMdout_d1 <= RAMdout_d1;
bercount_max <= bercount_max;
end
end
end
//------------------------------------------比较误码率---------------------------//
// RAM_recv RAM_recv_1 (
// .clka(clk), // input clka
// .wea(validnd_1_1d), // input [0 : 0] wea
// .addra(RAMaddra_1), // input [15 : 0] addra
// .dina(dout_scramble), // input [0 : 0] dina
// .clkb(clk2), // input clkb
// .addrb(recv_addr1), // input [12 : 0] addrb
// .doutb(recv_data1) // output [7 : 0] doutb
// );
// RAM_recv RAM_recv_2 (
// .clka(clk), // input clka
// .wea(validnd_2_1d), // input [0 : 0] wea
// .addra(RAMaddra_2), // input [15 : 0] addra
// .dina(dout_scramble), // input [0 : 0] dina
// .clkb(clk2), // input clkb
// .addrb(recv_addr2), // input [12 : 0] addrb
// .doutb(recv_data2) // output [7 : 0] doutb
// );
RAM_recvnew RAM_recvnew_0 (
.clka(clk), // input clka
.wea(validnd_new_new), // input [0 : 0] wea
.addra(RAMaddra_new_0), // input [16 : 0] addra
.dina(dout_scramble), // input [0 : 0] dina
.clkb(clk2), // input clkb
.addrb(recv_addr_new_0), // input [13 : 0] addrb
.doutb(recv_data_new_0) // output [7 : 0] doutb
);
RAM_recvnew RAM_recvnew_1 (
.clka(clk), // input clka
.wea(validnd_new_new), // input [0 : 0] wea
.addra(RAMaddra_new_1), // input [16 : 0] addra
.dina(dout_scramble), // input [0 : 0] dina
.clkb(clk2), // input clkb
.addrb(recv_addr_new_1), // input [13 : 0] addrb
.doutb(recv_data_new_1) // output [7 : 0] doutb
);
RAM_recvnew RAM_recvnew_2 (
.clka(clk), // input clka
.wea(validnd_new_new), // input [0 : 0] wea
.addra(RAMaddra_new_2), // input [16 : 0] addra
.dina(dout_scramble), // input [0 : 0] dina
.clkb(clk2), // input clkb
.addrb(recv_addr_new_2), // input [13 : 0] addrb
.doutb(recv_data_new_2) // output [7 : 0] doutb
);
/*RAM_recvnew RAM_recvnew_3 (
.clka(clk), // input clka
.wea(validnd_new_new), // input [0 : 0] wea
.addra(RAMaddra_new_3), // input [16 : 0] addra
.dina(dout_scramble), // input [0 : 0] dina
.clkb(clk2), // input clkb
.addrb(recv_addr_new_3), // input [13 : 0] addrb
.doutb(recv_data_new_3) // output [7 : 0] doutb
);*/
//-------------------------------------------------------------------------------------------------------------//
//-------------------------------------找停止位---------------------------//
// reg nd_stop_1 = 1'd0;
// reg nd_stop_2 = 1'd0;
reg nd_stop_new = 1'd0;
// reg [15:0] RAMaddra_1_temp = 16'd0;
// reg [15:0] RAMaddra_2_temp = 16'd0;
reg [16:0] RAMaddra_new_temp = 17'd0;
find_stop find_stop (
.clk(clk),
// .nd_stop_1(nd_stop_1),
// .nd_stop_2(nd_stop_2),
.nd_stop_new(nd_stop_new),
// .RAMaddra_1_temp(RAMaddra_1_temp),
// .RAMaddra_2_temp(RAMaddra_2_temp),
.RAMaddra_new_temp(RAMaddra_new_temp),
// .stop_temp_1(stop_temp_1),
// .stop_temp_2(stop_temp_2),
.stop_temp_new(stop_temp_new),
.vio_stopbit(vio_stopbit),
.flag_stop_0(flag_stop_0),
.addr_stop_0(addr_stop_0)
);
// reg [63:0] stop_temp_1 = 64'd0;
// reg [63:0] stop_temp_2 = 64'd0;
// reg flag_stop_0 = 1'd0; //给shx,拉高1个clk表示当前时帧有效数据接收完毕
// reg [15:0] addr_stop_0 = 16'd0; //给shx,拉高1个clk,与flag_stop对齐,指示位置与最后1bit有效数据的位置对齐
always @(posedge clk)begin
// nd_stop_1 <= validnd_1_1d;
// nd_stop_2 <= validnd_2_1d;
nd_stop_new <= validnd_new_1d;
// if(validnd_1_1d) begin
// stop_temp_1[0] <= dout_scramble;
// stop_temp_1[63:1] <= stop_temp_1[62:0];
// RAMaddra_1_temp <= RAMaddra_1;
// RAMaddra_2_temp <= 16'd0;
// end
// else begin
// if(validnd_2_1d) begin
// stop_temp_2[0] <= dout_scramble;
// stop_temp_2[63:1] <= stop_temp_2[62:0];
// RAMaddra_1_temp <= 16'd0;
// RAMaddra_2_temp <= RAMaddra_2;
// end
// else begin
// stop_temp_1 <= stop_temp_1;
// stop_temp_2 <= stop_temp_2;
// RAMaddra_1_temp <= RAMaddra_1_temp;
// RAMaddra_2_temp <= RAMaddra_2_temp;
// end
// end
if(validnd_new_1d) begin
stop_temp_new[0] <= dout_scramble;
stop_temp_new[63:1] <= stop_temp_new[62:0];
if(recvNetData[63:56] == 8'd2 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_temp <= RAMaddra_new_0;
end
else if(recvNetData[63:56] == 8'd3 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_temp <= RAMaddra_new_1;
end
else if(recvNetData[63:56] == 8'd4 && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_temp <= RAMaddra_new_2;
end
else if(recvNetData[63:56] == 8'hff && recvNetData[23:0]==24'h7E5A33) begin
RAMaddra_new_temp <= RAMaddra_new_3;
end
else begin
RAMaddra_new_temp <= RAMaddra_new_temp;
end
end
else begin
stop_temp_new <= stop_temp_new;
RAMaddra_new_temp <= RAMaddra_new_temp;
end
end
// reg [2:0] cnt_8 = 3'b0;
// reg state_8 = 1'd0;
always @(posedge clk)begin
case(state_8)
1'd0:begin
if(flag_stop_0)begin
cnt_8 <= 3'b0;
flag_stop <= 1'b1;
addr_stop <= addr_stop_0;
state_8 <= 1'd1;
end
else begin
cnt_8 <= 3'b0;
flag_stop <= 1'b0;
addr_stop <= addr_stop;
state_8 <= state_8;
end
end
1'd1:begin
if(cnt_8==3'd7) begin
cnt_8 <= 3'b0;
flag_stop <= 1'b0;
addr_stop <= addr_stop;
state_8 <= 1'd0;
end
else begin
cnt_8 <= 3'b1+cnt_8;
flag_stop <= 1'b1;
addr_stop <= addr_stop;
state_8 <= state_8;
end
end
endcase
end
reg [16:0] RAMaddra_new_0_d1 = 17'd0;
reg [16:0] RAMaddra_new_1_d1 = 17'd0;
reg [16:0] RAMaddra_new_2_d1 = 17'd0;
reg [16:0] RAMaddra_new_3_d1 = 17'd0;
always@(posedge clk2)begin
RAMaddra_new_0_d1 <= RAMaddra_new_0;
RAMaddra_new_1_d1 <= RAMaddra_new_1;
RAMaddra_new_2_d1 <= RAMaddra_new_2;
RAMaddra_new_3_d1 <= RAMaddra_new_3;
RAMaddra_write_0 <= RAMaddra_new_0_d1;
RAMaddra_write_1 <= RAMaddra_new_1_d1;
RAMaddra_write_2 <= RAMaddra_new_2_d1;
RAMaddra_write_3 <= RAMaddra_new_3_d1;
end
//-------------------------------------找停止位---------------------------//
always @(posedge clk)begin
if(rst2)begin
framerdy <= 1'b0;
end else begin
if(bagcnt == 9'd105 && validlength == 10'd1023)begin
framerdy <= 1'b1;
end else begin
framerdy <= 1'b0;
end
end
end
ila_ber ila_ber(
.clk(clk),
.probe0(rst),
.probe1(ROMdout),
.probe2(validnd_new_delay),
.probe3(bercount),
.probe4(flag_stop_0),
.probe5(framedata_d1),
.probe6(recvNetDataNd),
.probe7(addr_stop_0),
.probe8(nd_recvnet_dout_d1),
.probe9(recvNetData),
.probe10(dout_scramble),
.probe11(wr_en_232),
.probe12(framedata),
.probe13(data_net_byte[87]),
.probe14(RAMaddra_new_0),
.probe15(RAMaddra_new_1)
);
endmodule