368 lines
14 KiB
Verilog
368 lines
14 KiB
Verilog
`timescale 1 ns / 1 ps
|
|
|
|
module eeg_emg_upload
|
|
(
|
|
input clk ,
|
|
input rst_n ,
|
|
(*mark_debug="true"*)input [ 8-1:0] m_axis_eeg_tdata ,
|
|
(*mark_debug="true"*)input m_axis_eeg_tlast ,
|
|
(*mark_debug="true"*)input m_axis_eeg_tvalid ,
|
|
|
|
(*mark_debug="true"*)input [ 8-1:0] m_axis_emg_tdata ,
|
|
(*mark_debug="true"*)input m_axis_emg_tlast ,
|
|
(*mark_debug="true"*)input m_axis_emg_tvalid ,
|
|
|
|
(*mark_debug="true"*)input diff_pkt_data_sel ,
|
|
(*mark_debug="true"*)input [1:0] eeg_emg_sel , // eeg_emg_sel[1]:emg,eeg_emg_sel[0]:eeg
|
|
(*mark_debug="true"*)input [15:0] eeg_send_package_num ,
|
|
(*mark_debug="true"*)input [15:0] emg_send_package_num ,
|
|
input stop_sample ,
|
|
(*mark_debug="true"*)output reg [7:0] eeg_emg_tdata ,
|
|
(*mark_debug="true"*)output reg eeg_emg_tvalid ,
|
|
(*mark_debug="true"*)output reg eeg_emg_tlast
|
|
);
|
|
|
|
(*mark_debug="true"*)reg [15:0] eeg_data_cnt ;
|
|
(*mark_debug="true"*)wire [8:0] axis_emg_fifo_tdata ;
|
|
(*mark_debug="true"*)reg fifo_emg_rd_en ;
|
|
(*mark_debug="true"*)reg fifo_emg_rd_en_dly ;
|
|
(*mark_debug="true"*)reg [15:0] fifo_rd_en_cnt ;
|
|
(*mark_debug="true"*)wire [8:0] fifo_rd_data ;
|
|
(*mark_debug="true"*)reg [7:0] axis_emg_tdata_tmp ;
|
|
(*mark_debug="true"*)reg axis_emg_tlast_tmp ;
|
|
(*mark_debug="true"*)reg axis_emg_tvalid_tmp ;
|
|
(*mark_debug="true"*)reg [7:0] axis_eeg_tdata_tmp ;
|
|
(*mark_debug="true"*)reg axis_eeg_tlast_tmp ;
|
|
(*mark_debug="true"*)reg axis_eeg_tvalid_tmp ;
|
|
(*mark_debug="true"*)reg [7:0] eeg_emg_tdata_tmp ;
|
|
(*mark_debug="true"*)reg eeg_emg_tvalid_tmp ;
|
|
(*mark_debug="true"*)reg eeg_emg_tlast_tmp ;
|
|
(*mark_debug="true"*)wire [ 8-1:0] msg_crc[0:1] ;
|
|
(*mark_debug="true"*)wire [16-1:0] crc16_out ;//wire
|
|
(*mark_debug="true"*)reg [16-1:0] crc16 ;
|
|
(*mark_debug="true"*)reg crc_vld ;
|
|
(*mark_debug="true"*)reg fifo_rst ;
|
|
|
|
assign axis_emg_fifo_tdata[8:0]={m_axis_emg_tlast,m_axis_emg_tdata[7:0]};
|
|
assign crc16_out = crc16_d8(crc16, eeg_emg_tdata_tmp);
|
|
|
|
always @(posedge clk or negedge rst_n) begin//eeg数据计数
|
|
if (!rst_n) begin
|
|
fifo_rst <= 1'b1 ;
|
|
end else begin
|
|
fifo_rst <= stop_sample ;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//eeg数据计数
|
|
if (!rst_n) begin
|
|
eeg_data_cnt[15:0] <= 16'b0 ;
|
|
end else if(stop_sample)begin
|
|
eeg_data_cnt[15:0] <= 16'b0 ;
|
|
end else if(m_axis_eeg_tlast==1'b1)begin
|
|
eeg_data_cnt[15:0] <= 16'b0 ;
|
|
end else if(m_axis_eeg_tvalid==1'b1)begin
|
|
eeg_data_cnt[15:0] <= eeg_data_cnt[15:0]+1'b1 ;
|
|
end else begin
|
|
eeg_data_cnt[15:0] <= eeg_data_cnt[15:0] ;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//emg 读使能打拍
|
|
if (!rst_n) begin
|
|
fifo_emg_rd_en_dly <= 1'b0 ;
|
|
end else if(stop_sample)begin
|
|
fifo_emg_rd_en_dly <= 1'b0 ;
|
|
end else begin
|
|
fifo_emg_rd_en_dly <= fifo_emg_rd_en ;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//emg读使能产生?当fifo_emg_rd_en为1和fifo_rd_en_cnt[15:0]为emg_send_package_num[15:0]-1时,需要将其置为0,其它则用fifo_emg_rd_en
|
|
if (!rst_n) begin
|
|
fifo_emg_rd_en <= 1'b0;
|
|
end else if(stop_sample)begin
|
|
fifo_emg_rd_en <= 1'b0;
|
|
end else if(eeg_emg_sel[1:0]==2'b11)begin
|
|
if(m_axis_eeg_tlast==1'b1)
|
|
fifo_emg_rd_en <= 1'b1;
|
|
else if((fifo_emg_rd_en == 1'b1)&&(fifo_rd_en_cnt[15:0]==emg_send_package_num[15:0]-1))
|
|
fifo_emg_rd_en <= 1'b0;
|
|
else
|
|
fifo_emg_rd_en <= fifo_emg_rd_en ;
|
|
end else if(eeg_emg_sel[1:0]==2'b10)begin
|
|
if(m_axis_emg_tlast==1'b1)
|
|
fifo_emg_rd_en <= 1'b1;
|
|
else if((fifo_emg_rd_en == 1'b1)&&(fifo_rd_en_cnt[15:0]==emg_send_package_num[15:0]-1))
|
|
fifo_emg_rd_en <= 1'b0;
|
|
else
|
|
fifo_emg_rd_en <= fifo_emg_rd_en ;
|
|
end else begin
|
|
fifo_emg_rd_en <= 1'b0;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//emg读使能计数?
|
|
if (!rst_n) begin
|
|
fifo_rd_en_cnt[15:0] <= 16'b0;
|
|
end else if(stop_sample)begin
|
|
fifo_rd_en_cnt[15:0] <= 16'b0;
|
|
end else if(fifo_emg_rd_en==1'b1)begin
|
|
fifo_rd_en_cnt[15:0] <= fifo_rd_en_cnt[15:0]+1'b1 ;
|
|
end else begin
|
|
fifo_rd_en_cnt[15:0] <= 16'b0;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//emg valid_tmp和tdata_tmp产生
|
|
if (!rst_n) begin
|
|
axis_emg_tvalid_tmp <= 1'b0 ;
|
|
axis_emg_tdata_tmp[7:0] <= 8'b0 ;
|
|
end else if(stop_sample)begin
|
|
axis_emg_tvalid_tmp <= 1'b0 ;
|
|
axis_emg_tdata_tmp[7:0] <= 8'b0 ;
|
|
end else if(eeg_emg_sel[1:0]==2'b11)begin//当eeg和emg都有时?
|
|
if(fifo_emg_rd_en_dly)begin
|
|
if(fifo_rd_en_cnt[15:0] <= 16'd85)begin//去掉emg头
|
|
axis_emg_tvalid_tmp <= 1'b0 ;
|
|
axis_emg_tdata_tmp[7:0] <= fifo_rd_data[7:0] ;
|
|
end else if(fifo_rd_en_cnt[15:0]==emg_send_package_num[15:0]-16'd13)begin
|
|
axis_emg_tdata_tmp[7:0] <= msg_crc[0][7:0];
|
|
end else if(fifo_rd_en_cnt[15:0]==emg_send_package_num[15:0]-16'd12)begin
|
|
axis_emg_tdata_tmp[7:0] <= msg_crc[1][7:0];
|
|
end else begin
|
|
axis_emg_tvalid_tmp <= 1'b1 ;
|
|
axis_emg_tdata_tmp[7:0] <= fifo_rd_data[7:0] ;
|
|
end
|
|
end else begin
|
|
axis_emg_tvalid_tmp <= 1'b0 ;
|
|
axis_emg_tdata_tmp[7:0] <= fifo_rd_data[7:0] ;
|
|
end
|
|
end else if(eeg_emg_sel[1:0]==2'b10)begin//当只有emg时?
|
|
axis_emg_tvalid_tmp <= fifo_emg_rd_en_dly ;
|
|
axis_emg_tdata_tmp[7:0] <= fifo_rd_data[7:0] ;
|
|
end else begin
|
|
axis_emg_tvalid_tmp <= 1'b0;
|
|
axis_emg_tdata_tmp[7:0] <= 8'b0 ;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//emg tlast_tmp产生
|
|
if (!rst_n)
|
|
axis_emg_tlast_tmp <= 1'b0 ;
|
|
else if(stop_sample)begin
|
|
axis_emg_tlast_tmp <= 1'b0 ;
|
|
end else if((eeg_emg_sel[1:0]==2'b11)||(eeg_emg_sel[1:0]==2'b10))begin//閲囬泦鏉垮拰emg閮芥湁鏃舵垨鑰呭彧鏈塭mg鏃?
|
|
if((fifo_emg_rd_en==1'b0)&&(fifo_emg_rd_en_dly==1'b1))
|
|
axis_emg_tlast_tmp <= 1'b1 ;
|
|
else
|
|
axis_emg_tlast_tmp <= 1'b0 ;
|
|
end else begin
|
|
axis_emg_tlast_tmp <= 1'b0;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//eeg valid_tmp和data_tmp[7:0]产生 ,根据选择来判断,2'b11来判断
|
|
if (!rst_n) begin
|
|
axis_eeg_tvalid_tmp <= 1'b0 ;
|
|
axis_eeg_tdata_tmp[7:0] <= 8'b0 ;
|
|
end else if(stop_sample)begin
|
|
axis_eeg_tvalid_tmp <= 1'b0 ;
|
|
axis_eeg_tdata_tmp[7:0] <= 8'b0 ;
|
|
end else if(eeg_emg_sel[1:0]==2'b11)begin//当eeg和emg都有时?
|
|
if(m_axis_eeg_tvalid)begin
|
|
if(eeg_data_cnt[15:0] >= eeg_send_package_num[15:0]-16'd14)begin//去掉eeg的尾巴
|
|
axis_eeg_tvalid_tmp <= 1'b0 ;
|
|
axis_eeg_tdata_tmp[7:0] <= axis_eeg_tdata_tmp[7:0] ;
|
|
end else begin
|
|
axis_eeg_tvalid_tmp <= 1'b1 ;
|
|
axis_eeg_tdata_tmp[7:0] <= m_axis_eeg_tdata[7:0] ;
|
|
end
|
|
end else begin
|
|
axis_eeg_tvalid_tmp <= 1'b0 ;
|
|
axis_eeg_tdata_tmp[7:0] <= m_axis_eeg_tdata[7:0] ;
|
|
end
|
|
end else if(eeg_emg_sel[1:0]==2'b01)begin//当只有eeg时?
|
|
axis_eeg_tvalid_tmp <= m_axis_eeg_tvalid ;
|
|
axis_eeg_tdata_tmp[7:0] <= m_axis_eeg_tdata[7:0] ;
|
|
end else begin
|
|
axis_eeg_tvalid_tmp <= 1'b0;
|
|
axis_eeg_tdata_tmp[7:0] <= 8'b0 ;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//emg tlast_tmp产生,先用stop_sample,然后根据选择的sel来判断如何做
|
|
if (!rst_n)
|
|
axis_eeg_tlast_tmp <= 1'b0 ;
|
|
else if(stop_sample)begin
|
|
axis_eeg_tlast_tmp <= 1'b0 ;
|
|
end else if(eeg_emg_sel[1:0]==2'b01)begin//当只有eeg时?
|
|
axis_eeg_tlast_tmp <= m_axis_eeg_tlast ;
|
|
end else begin
|
|
axis_eeg_tlast_tmp <= 1'b0;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//emg valid_tmp和data_tmp[7:0]产生
|
|
if (!rst_n) begin
|
|
eeg_emg_tvalid_tmp <= 1'b0 ;
|
|
eeg_emg_tdata_tmp[7:0] <= 8'b0 ;
|
|
eeg_emg_tlast_tmp <= 1'b0 ;
|
|
end else if(stop_sample)begin
|
|
eeg_emg_tvalid_tmp <= 1'b0 ;
|
|
eeg_emg_tdata_tmp[7:0] <= 8'b0 ;
|
|
eeg_emg_tlast_tmp <= 1'b0 ;
|
|
end else if(eeg_emg_sel[1:0]==2'b11)begin//当eeg和emg都有时?
|
|
if(axis_eeg_tvalid_tmp==1'b1)begin
|
|
eeg_emg_tvalid_tmp <= axis_eeg_tvalid_tmp ;
|
|
eeg_emg_tdata_tmp[7:0] <= axis_eeg_tdata_tmp[7:0] ;
|
|
eeg_emg_tlast_tmp <= axis_eeg_tlast_tmp ;
|
|
end else if(axis_emg_tvalid_tmp==1'b1)begin
|
|
eeg_emg_tvalid_tmp <= axis_emg_tvalid_tmp ;
|
|
eeg_emg_tdata_tmp[7:0] <= axis_emg_tdata_tmp[7:0] ;
|
|
eeg_emg_tlast_tmp <= axis_emg_tlast_tmp ;
|
|
end else begin
|
|
eeg_emg_tvalid_tmp <= 1'b0 ;
|
|
eeg_emg_tdata_tmp[7:0] <= eeg_emg_tdata_tmp[7:0] ;
|
|
eeg_emg_tlast_tmp <= 1'b0 ;
|
|
end
|
|
end else if(eeg_emg_sel[1:0]==2'b01)begin //当只有eeg时?
|
|
eeg_emg_tvalid_tmp <= axis_eeg_tvalid_tmp ;
|
|
eeg_emg_tdata_tmp[7:0] <= axis_eeg_tdata_tmp[7:0] ;
|
|
eeg_emg_tlast_tmp <= axis_eeg_tlast_tmp ;
|
|
end else if(eeg_emg_sel[1:0]==2'b10)begin//当只有emg时?
|
|
eeg_emg_tvalid_tmp <= axis_emg_tvalid_tmp ;
|
|
eeg_emg_tdata_tmp[7:0] <= axis_emg_tdata_tmp[7:0] ;
|
|
eeg_emg_tlast_tmp <= axis_emg_tlast_tmp ;
|
|
end else begin
|
|
eeg_emg_tvalid_tmp <= 1'b0 ;
|
|
eeg_emg_tdata_tmp[7:0] <= 8'b0 ;
|
|
eeg_emg_tlast_tmp <= 1'b0 ;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//主要计算eeg_emng_tlast
|
|
if (!rst_n) begin
|
|
eeg_emg_tvalid <= 1'b0 ;
|
|
eeg_emg_tlast <= 1'b0 ;
|
|
end else if(stop_sample)begin
|
|
eeg_emg_tvalid <= 1'b0 ;
|
|
eeg_emg_tlast <= 1'b0 ;
|
|
end else begin //打拍?
|
|
eeg_emg_tvalid <= eeg_emg_tvalid_tmp ;
|
|
eeg_emg_tlast <= eeg_emg_tlast_tmp ;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk or negedge rst_n) begin//
|
|
if (!rst_n) begin
|
|
eeg_emg_tdata[7:0] <= 8'b0 ;
|
|
end else if(stop_sample)begin
|
|
eeg_emg_tdata[7:0] <= 8'b0 ;
|
|
end else if((eeg_emg_sel[1:0]==2'b11)&&(diff_pkt_data_sel==1'b0))begin //eeg和emg都有时? diff_pkt_data_sel==1'b0 默认差分打包数据 1:选择差分8通道原始数据
|
|
if(eeg_emg_tvalid_tmp==1'b1)begin
|
|
if(fifo_rd_en_cnt[15:0]==emg_send_package_num[15:0]-16'd11)begin
|
|
eeg_emg_tdata[7:0] <= msg_crc[0][7:0];
|
|
end else if(fifo_rd_en_cnt[15:0]==emg_send_package_num[15:0]-16'd10)begin
|
|
eeg_emg_tdata[7:0] <= msg_crc[1][7:0];
|
|
end else begin
|
|
eeg_emg_tdata[7:0] <= eeg_emg_tdata_tmp[7:0] ;
|
|
end
|
|
end else begin
|
|
eeg_emg_tdata[7:0] <= eeg_emg_tdata[7:0] ;
|
|
end
|
|
end else if(((eeg_emg_sel[1:0]==2'b10)&&(diff_pkt_data_sel==1'b0))||(eeg_emg_sel[1:0]==2'b01))begin
|
|
eeg_emg_tdata[7:0] <= eeg_emg_tdata_tmp[7:0] ;
|
|
end else begin
|
|
eeg_emg_tdata[7:0] <= 8'b0 ;
|
|
end
|
|
end
|
|
|
|
function automatic [15:0] crc16_d8;
|
|
input [15:0] crcIn;
|
|
input [7:0] data;
|
|
begin
|
|
crc16_d8[0] = crcIn[0] ^ crcIn[1] ^ crcIn[2] ^ crcIn[3] ^ crcIn[4] ^ crcIn[5] ^ crcIn[6] ^ crcIn[7] ^ crcIn[8] ^ data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4] ^ data[5] ^ data[6] ^ data[7];
|
|
crc16_d8[1] = crcIn[9];
|
|
crc16_d8[2] = crcIn[10];
|
|
crc16_d8[3] = crcIn[11];
|
|
crc16_d8[4] = crcIn[12];
|
|
crc16_d8[5] = crcIn[13];
|
|
crc16_d8[6] = crcIn[0] ^ crcIn[14] ^ data[0];
|
|
crc16_d8[7] = crcIn[0] ^ crcIn[1] ^ crcIn[15] ^ data[0] ^ data[1];
|
|
crc16_d8[8] = crcIn[1] ^ crcIn[2] ^ data[1] ^ data[2];
|
|
crc16_d8[9] = crcIn[2] ^ crcIn[3] ^ data[2] ^ data[3];
|
|
crc16_d8[10] = crcIn[3] ^ crcIn[4] ^ data[3] ^ data[4];
|
|
crc16_d8[11] = crcIn[4] ^ crcIn[5] ^ data[4] ^ data[5];
|
|
crc16_d8[12] = crcIn[5] ^ crcIn[6] ^ data[5] ^ data[6];
|
|
crc16_d8[13] = crcIn[6] ^ crcIn[7] ^ data[6] ^ data[7];
|
|
crc16_d8[14] = crcIn[0] ^ crcIn[1] ^ crcIn[2] ^ crcIn[3] ^ crcIn[4] ^ crcIn[5] ^ crcIn[6] ^ data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4] ^ data[5] ^ data[6];
|
|
crc16_d8[15] = crcIn[0] ^ crcIn[1] ^ crcIn[2] ^ crcIn[3] ^ crcIn[4] ^ crcIn[5] ^ crcIn[6] ^ crcIn[7] ^ data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4] ^ data[5] ^ data[6] ^ data[7];
|
|
end
|
|
endfunction
|
|
|
|
|
|
always @ (posedge clk or negedge rst_n) begin//主要计算crc_vld
|
|
if (!rst_n)begin
|
|
crc_vld <= 1'b0;
|
|
end else if(stop_sample==1'b1)begin
|
|
crc_vld <= 1'b0;
|
|
end else if (eeg_emg_tlast_tmp==1'b1)begin
|
|
crc_vld <= 1'b0;
|
|
end else if(axis_eeg_tvalid_tmp | axis_emg_tvalid_tmp)begin//axis_record_tvalid_tmp==1'b1
|
|
crc_vld <= 1'b1;
|
|
end else begin
|
|
crc_vld <= crc_vld;
|
|
end
|
|
end
|
|
|
|
always @ (posedge clk or negedge rst_n) begin//主要计算crc16
|
|
if (!rst_n)begin
|
|
crc16 <= 16'hFFFF;
|
|
end else if(stop_sample==1'b1)begin
|
|
crc16 <= 16'hFFFF;
|
|
end else if (crc_vld==1'b0)begin
|
|
crc16 <= 16'hFFFF;
|
|
end else if(eeg_emg_sel[1:0]==2'b01)begin//当只有eeg时?
|
|
if(eeg_emg_tvalid_tmp==1'b1)begin
|
|
if((eeg_data_cnt[15:0] == eeg_send_package_num[15:0]-16'd14)||(eeg_data_cnt[15:0] == eeg_send_package_num[15:0]-16'd13))begin
|
|
crc16 <= crc16 ;
|
|
end else begin
|
|
crc16 <= crc16_out ;
|
|
end
|
|
end else begin
|
|
crc16 <= crc16;//crc16_out ;
|
|
end
|
|
end else if((eeg_emg_sel[1:0]==2'b11)||(eeg_emg_sel[1:0]==2'b10))begin//eeg和emg都有时或者只有emg时?
|
|
if(eeg_emg_tvalid_tmp==1'b1)begin
|
|
if((fifo_rd_en_cnt[15:0]==emg_send_package_num[15:0]-16'd11)||(fifo_rd_en_cnt[15:0]==emg_send_package_num[15:0]-16'd10))begin
|
|
crc16 <= crc16 ;
|
|
end else begin
|
|
crc16 <= crc16_out ;
|
|
end
|
|
end else begin
|
|
crc16 <= crc16;//crc16_out ;
|
|
end
|
|
end else begin//
|
|
crc16 <= crc16_out ;
|
|
end
|
|
end
|
|
|
|
assign msg_crc[0] = crc16[15: 8];
|
|
assign msg_crc[1] = crc16[ 7: 0];
|
|
|
|
fifo_generator_0 u0_fifo_generator_0(
|
|
.full ( ),
|
|
.din (axis_emg_fifo_tdata[8:0]),
|
|
.wr_en (m_axis_emg_tvalid ),
|
|
.empty ( ),
|
|
.dout (fifo_rd_data[8:0] ),
|
|
.rd_en (fifo_emg_rd_en ),
|
|
.rst (fifo_rst ),//~rst_n(20260902 change)
|
|
.wr_clk(clk ),
|
|
.rd_clk(clk )
|
|
);
|
|
|
|
|
|
endmodule
|