⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 enframe.v

📁 LAPS协议的设计与实现
💻 V
字号:
module  enframe(                //input                clk,                rst_n,                Tsop,                bytes_data_num,                Tdata_to_enframe,                //output                fifo_trans_rdreq,                Dout,                Tenb                );//=========================================================////============	I/O direction  =============================////=========================================================//input        clk;input        rst_n;input        Tsop;input [10:0] bytes_data_num;input [7:0]  Tdata_to_enframe;output       fifo_trans_rdreq;output[7:0]  Dout;output       Tenb;//=========================================================////=================	I/O Type  =============================////=========================================================//reg         fifo_trans_rdreq;reg  [7:0]  Dout;reg         Tenb;//=========================================================////============	Internal Signals  ==========================////=========================================================//reg         sapi_cnt;reg  [10:0] data_cnt;reg  [1:0]  data_type;reg         tag1;//for 2-cyclereg         tag2;reg         crc_added;wire [15:0] LUT[15:0];		reg  [1:0]  tag_crc;reg         first_crc;reg  [15:0] buffer_crc;reg  [15:0] reg_crc;reg  [2:0]  current_state;reg  [2:0]  next_state;//==========================================================////============	Internal Nets Assignments ===================////==========================================================//assign      LUT[0] = 16'h1021,	//Look Up Table for crc		 			   LUT[1] = 16'h2042,      	     LUT[2] = 16'h4084,				LUT[3] = 16'h8108,      		    LUT[4] = 16'h1231,				LUT[5] = 16'h2462,            LUT[6] = 16'h48C4,            LUT[7] = 16'h9188,         			LUT[8] = 16'h3331,           	LUT[9] = 16'h6662,				LUT[10]= 16'hCCC4,				LUT[11]= 16'h89A9,				LUT[12]= 16'h0373,				LUT[13]= 16'h06E6,				LUT[14]= 16'h0DCC,				LUT[15]= 16'h1B98; //=========================================================////============	Parameters Define  =========================////=========================================================//parameter IDLE  = 3'b000,          ADDR  = 3'b001,          CONTR = 3'b010,          SAPI  = 3'b011,          DATA  = 3'b100,          CRC   = 3'b101;//==========================================================////====================	Process  ============================////==========================================================////main state machine//State transitalways @ (posedge clk or negedge rst_n)  begin  if (!rst_n)  current_state <= IDLE;  else         current_state <= next_state;end//state generationalways @ (*)  begin    if(!rst_n)     next_state <= IDLE;    else  begin        case(current_state)        IDLE:  begin            if(Tsop)		next_state <= ADDR;            else      next_state <= IDLE;        end        ADDR:  next_state <= CONTR;        CONTR: next_state <= SAPI;        SAPI:  begin            if(sapi_cnt) next_state <= DATA;            else         next_state <= SAPI;        end         DATA:  begin            if(data_cnt==bytes_data_num+1) next_state <= CRC;            else                           next_state <= DATA;        end        CRC:  begin            if(crc_added)  next_state <= IDLE;            else           next_state <= CRC;        end        default: next_state <= IDLE;         endcase    endend//cnt generation//sapi_cnt         always @ (posedge clk or negedge rst_n)  begin    if(!rst_n)   sapi_cnt<=1'b0;    else  begin        if(current_state==SAPI) sapi_cnt <= ~sapi_cnt;        else                    sapi_cnt <= 1'b0;    endend //data_cntalways @(posedge clk or negedge rst_n)  begin    if(!rst_n)  data_cnt <= 11'd0;    else  begin		  if(current_state==DATA)  begin		      if(data_cnt==bytes_data_num+1)  data_cnt <= 11'd0;			   else  begin 	   					 case(data_type)					 2'b00:  data_cnt <= data_cnt + 11'd1;					 2'b01:  begin					     if(!tag1) data_cnt <= data_cnt + 11'd1;						  else   		 data_cnt <= data_cnt;										    end					 2'b10:  begin 					     if(!tag2) data_cnt <= data_cnt + 11'd1;						  else   		 data_cnt <= data_cnt;										    end					 default:;					 endcase															end		  end		  else  data_cnt <= 11'd0;	 endend//fifo_trans_rdreqalways@(*)  begin    if(!rst_n)    fifo_trans_rdreq = 1'b0;    else  begin        if(current_state==SAPI && sapi_cnt) fifo_trans_rdreq = 1'b1;	     else if(current_state==DATA) begin	         if(data_cnt==bytes_data_num+1)  fifo_trans_rdreq = 1'b0;	         else  begin	             case(data_type)                2'b01:  begin                     if(tag1) fifo_trans_rdreq = 1'b1;                    else     fifo_trans_rdreq = 1'b0;	             end	             2'b10:  begin                     if(tag2) fifo_trans_rdreq = 1'b1;                    else     fifo_trans_rdreq = 1'b0;                end                default: fifo_trans_rdreq = 1'b1;                endcase            end        end        else  fifo_trans_rdreq = 1'b0;    endend//data_typealways@(*)  begin	 case(Tdata_to_enframe)	 8'h7e:   data_type = 2'b01;    8'h7d:   data_type = 2'b10;	 default: data_type = 2'b00;    endcaseend//Dout[7:0]always @(posedge clk or negedge rst_n)  begin    if(!rst_n)  begin        Dout      <= 8'h7e;        tag1      <= 1'b0;        tag2      <= 1'b0;        tag_crc   <= 2'b00;        first_crc <= 1'b1;    end	 else  begin		  case(current_state)		  IDLE:  Dout<=8'h7e;							  ADDR:  Dout<=8'h04;								  CONTR:	Dout<=8'h03;					  SAPI:  begin 				if(!sapi_cnt)		Dout<=8'hfe;				else   					Dout<=8'h01;															  end		  DATA:  begin								if(data_cnt==bytes_data_num+1)  begin				    first_crc <= 1'b1; //the higher 8-bit					 if(reg_crc[15:8]==8'h7e)  begin					     Dout    <= 8'h7d;					     tag_crc <= 2'b01;					 end					 else if(reg_crc[15:8]==8'h7d) begin					     Dout    <= 8'h7d;					     tag_crc <= 2'b10;					 end					 else  begin					     Dout<=reg_crc[15:8];					     tag_crc <= 2'b00;					 end		      end		      else  begin 	   					 case(data_type)					 2'b00: Dout <= Tdata_to_enframe;					 2'b01:  begin					     tag1 <= ~tag1;					   	 if(!tag1) Dout<=8'h7d;						  else   			Dout<=8'h5e;												    end					 2'b10:  begin 					     tag2 <= ~tag2;				      		if(!tag2) Dout<=8'h7d;						  else      Dout<=8'h5d;					 end											 default:;					 endcase															end		  end		  CRC:  begin		      case (tag_crc) //7e,7d or normal data				2'b00: 	begin				    first_crc <= 1'b0;//the lower 8-bit				    if(reg_crc[7:0]==8'h7e)  begin				        Dout<=8'h7d;				        tag_crc <= 2'b01;				    end				    else if(reg_crc[7:0]==8'h7d)  begin				        Dout<=8'h7d;				        tag_crc <= 2'b10;				    end				    else		Dout <= reg_crc[7:0]; 			   end				2'b01:  begin				    Dout<= 8'h5e;				    if(first_crc) tag_crc   <= 2'b00;				end				2'b10:  begin				    Dout<= 8'h5d;				    if(first_crc) tag_crc   <= 2'b00;				end			   default:;				endcase		  end	   		  endcase	 endend//crc_addedalways @(*)  begin    if(!rst_n) crc_added <= 1'b0;	 else  begin		  if(current_state==IDLE)  crc_added = 1'b0;		  else if(current_state==CRC)  begin		      case (tag_crc)				2'b00: 	begin				    if(reg_crc[7:0]!=8'h7e&&reg_crc[7:0]!=8'h7d) 				          crc_added = 1'b1;				    else  crc_added = 1'b0; 			   end				2'b01:  begin				    if(!first_crc) crc_added = 1'b1;				    else           crc_added = 1'b0;				end				2'b10:  begin				    if(!first_crc) crc_added = 1'b1;				    else           crc_added = 1'b0;				end			   default:;				endcase		  end	     else   crc_added = 1'b0;	 endend//Tenb,point that if could be transferedalways @ (posedge clk or negedge rst_n)  begin    if(!rst_n)     Tenb <= 1'b1;    else  begin        case(current_state)        SAPI:  if(sapi_cnt) Tenb <= 1'b0;        DATA:  begin            if(data_cnt==bytes_data_num+1)  Tenb <= 1'b1;            else                            Tenb <= 1'b0;        end        default: Tenb <= 1'b1;         endcase    endend//====================	CRC ==========================////buffer_crcalways @(*)  begin     if(!rst_n)  buffer_crc = 16'd0;	 else  begin	     case(current_state)	     ADDR:	 buffer_crc = reg_crc[7:0]^8'h04;							     CONTR:  buffer_crc = reg_crc[7:0]^8'h03;				     SAPI:  begin 		     if(!sapi_cnt)  buffer_crc = reg_crc[7:0]^8'hfe;		     else           buffer_crc = reg_crc[7:0]^8'h01;														     end	     DATA:  begin	         if(data_cnt==bytes_data_num+1)  buffer_crc = buffer_crc;	         else  begin	             case(data_type)	             2'b00:  buffer_crc = reg_crc[7:0]^Tdata_to_enframe;                 2'b01:  begin                      if(!tag1) buffer_crc = reg_crc[7:0]^Tdata_to_enframe;                     else      buffer_crc = buffer_crc; 	             end	             2'b10:  begin                      if(!tag2) buffer_crc = reg_crc[7:0]^Tdata_to_enframe;                     else      buffer_crc = buffer_crc;                  end                 default: buffer_crc = buffer_crc;                 endcase             end         end         default: buffer_crc = buffer_crc;	     endcase	endend//reg_crcalways @(posedge clk or negedge rst_n)  begin	 if(!rst_n)  reg_crc  <= 16'hffff;	 else	 begin 	     case(current_state)	     ADDR,	     CONTR,	     SAPI: reg_crc <= f(LUT[0],buffer_crc[0])^f(LUT[1],buffer_crc[1])^	                    f(LUT[2],buffer_crc[2])^f(LUT[3],buffer_crc[3])^	                    f(LUT[4],buffer_crc[4])^f(LUT[5],buffer_crc[5])^							  f(LUT[6],buffer_crc[6])^f(LUT[7],buffer_crc[7])^							  f(LUT[8],reg_crc[8])^f(LUT[9],reg_crc[9])^							  f(LUT[10],reg_crc[10])^f(LUT[11],reg_crc[11])^							  f(LUT[12],reg_crc[12])^f(LUT[13],reg_crc[13])^							  f(LUT[14],reg_crc[14])^f(LUT[15],reg_crc[15]);	     DATA:  begin		      if(fifo_trans_rdreq)								         reg_crc <= f(LUT[0],buffer_crc[0])^f(LUT[1],buffer_crc[1])^	                    f(LUT[2],buffer_crc[2])^f(LUT[3],buffer_crc[3])^	                    f(LUT[4],buffer_crc[4])^f(LUT[5],buffer_crc[5])^							  f(LUT[6],buffer_crc[6])^f(LUT[7],buffer_crc[7])^							  f(LUT[8],reg_crc[8])^f(LUT[9],reg_crc[9])^							  f(LUT[10],reg_crc[10])^f(LUT[11],reg_crc[11])^							  f(LUT[12],reg_crc[12])^f(LUT[13],reg_crc[13])^							  f(LUT[14],reg_crc[14])^f(LUT[15],reg_crc[15]);	     end	     CRC:  begin	         if(crc_added) reg_crc <= 16'hffff;	         else          reg_crc <= reg_crc;	     end        default: reg_crc <= reg_crc;        endcase    endend//function for predigest  	function [15:0] f;input[15:0] a;input       b;	 if(b)  f = a;	 else   f = 16'd0;endfunctionendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -