974 lines
30 KiB
Verilog
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
|
|
|