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

📄 utx.v

📁 UTOPIA L2接口发送VERILOG代码
💻 V
📖 第 1 页 / 共 3 页
字号:
				begin 
					if(Uloop_Fifo_Data_Cnt>5'b01101)
						Uloop_Fifo_Rdy  <=#UTX_DLY 1'b1;
					else
						Uloop_Fifo_Rdy <=#UTX_DLY 1'b0; 
					if(Uloop_Fifo_Data_Cnt>5'b10010)
						Uloop_Fifo_Afull <=#UTX_DLY 1'b1;
					else
						Uloop_Fifo_Afull <=#UTX_DLY 1'b0;
				end
		end
	
	always @(posedge Rst or posedge Clk_Sys)
		begin
			if(Rst==1'b1)
				Utx_Cell_Fifo_Afull <= 1'b0;	
			else if(Utx_Cell_Fifo_Write_Dcnt>5'b10001)
				Utx_Cell_Fifo_Afull <=#UTX_DLY 1'b1;
			else 
				Utx_Cell_Fifo_Afull <=#UTX_DLY 1'b0;
		end
	//******************************************************************************//
	//								poll_state_machine							    //
	//******************************************************************************//	
	always @(posedge Rst or posedge Clk_UTP)
		begin
			if(Rst==1'b1)
				begin 
					sUtx_Poll <= UTX_POLL_IDLE;
					Utx_Group_Cnt_Buffer <= 3'b000;
					Utx_Group_Cnt <= 3'b000; 
					U2txaddr01 <= 8'h00;
					U2txaddr <= 8'h00;
					U2txaddr_Buffer <= 8'h00;
					Addr_Rise <= 1'b0;
					Utx_Addr_Fifo_Din <= 11'h000;
					Utx_Addr_Fifo_Wen <= 1'b0;
					Utx_Status_Table <=	{9{1'b0}};
				end
			else
				begin
					case(sUtx_Poll)
						UTX_POLL_IDLE:
							begin
								if(Start_Dn!=1'b1)					//<A NAME="非正常工作状态">
									begin
										sUtx_Poll <=#UTX_DLY UTX_POLL_IDLE;
									end
								else if(U2_Loop_Ctrl[0]==1'b1)
									begin
										sUtx_Poll <=#UTX_DLY UTX_POLL_ADDR_RISE;									
										if( Utx_Addr_Fifo_Full!=1'b1 )  					//<A NAME="轮询端口有数据发送">
											begin
												//Utx_Status_Table[{Utx_Group_Cnt_Buffer,U2txaddr_Buffer[5:0]}] <=#UTX_DLY 1'b1;	
												Utx_Addr_Fifo_Din <=#UTX_DLY {Utx_Group_Cnt_Buffer,U2txaddr_Buffer};
												Utx_Addr_Fifo_Wen <=#UTX_DLY 1'b1;						  //<A NAME="端口信息写入FIFO">
												Addr_Rise <=#UTX_DLY 1'b1;
												U2txaddr <=#UTX_DLY U2txaddr01;
											end
										else
											begin
												Utx_Addr_Fifo_Wen <=#UTX_DLY 1'b0;
												sUtx_Poll <=#UTX_DLY UTX_POLL_ADDR_RISE;
												U2txaddr <=#UTX_DLY U2txaddr_Buffer;
												Addr_Rise <=#UTX_DLY 1'b0;
											end
									end		
								else if(U2_Loop_Ctrl[1]==1'b1)
								 	begin
								 		sUtx_Poll <=#UTX_DLY UTX_POLL_ADDR_RISE;
								 		Utx_Addr_Fifo_Wen <=#UTX_DLY 1'b0;
								 		U2txaddr <=#UTX_DLY U2txaddr_Tx_Buffer;
								 	end		
								else if(Translate==1'b1)					//<A NAME="需要选定端口发送">
									begin											
										sUtx_Poll <=#UTX_DLY UTX_POLL_ADDR_RISE;
										U2txaddr <=#UTX_DLY U2txaddr_Tx_Buffer;			  //<A NAME="送出要选定端口地址">
										Addr_Rise <=#UTX_DLY 1'b0;
										Utx_Status_Table[{Check_Group_Buff,Utx_Cell_Fifo_Dout[5:0]}] <=#UTX_DLY 1'b0 ;
									end
								else if(U2txaddr_Buffer==U2txaddr_Tx_Buffer && Check_Group_Buff==Utx_Group_Cnt_Buffer)
									begin
										sUtx_Poll <=#UTX_DLY UTX_POLL_ADDR_RISE;
										U2txaddr <=#UTX_DLY U2txaddr01;
										Addr_Rise <=#UTX_DLY 1'b1;
									end	
								else if( Utx_Addr_Fifo_Full!=1'b1)				 //<A NAME="没有端口要选定且地址FIFO非满">
								//								else if( Utx_Addr_Fifo_Full!=1'b1 && (U2txaddr_Buffer!=U2txaddr_Tx_Buffer)	
									begin 										 //<A NAME="轮询端口地址增加">
										sUtx_Poll <=#UTX_DLY UTX_POLL_ADDR_RISE;									
										Addr_Rise <=#UTX_DLY 1'b1;
										U2txaddr <=#UTX_DLY U2txaddr01;						 //<A NAME="送出轮询端口地址">
										if(Current_Txclav==1'b1)  					//<A NAME="轮询端口有数据发送">
											begin
												Utx_Status_Table[{Utx_Group_Cnt_Buffer,U2txaddr_Buffer[5:0]}] <=#UTX_DLY 1'b1;	
												Utx_Addr_Fifo_Din <=#UTX_DLY {Utx_Group_Cnt_Buffer,U2txaddr_Buffer};
												Utx_Addr_Fifo_Wen <=#UTX_DLY 1'b1;						  //<A NAME="端口信息写入FIFO">
											end
										else
											Utx_Addr_Fifo_Wen <=#UTX_DLY 1'b0;
									end
								else 												 //<A NAME="地址FIFO满">
									begin
										sUtx_Poll <=#UTX_DLY UTX_POLL_ADDR_RISE;
										U2txaddr <=#UTX_DLY U2txaddr_Buffer;
										Addr_Rise <=#UTX_DLY 1'b0;
									end
							end
						UTX_POLL_ADDR_RISE:
							begin 
								sUtx_Poll <=#UTX_DLY UTX_POLL_IDLE;
								Utx_Addr_Fifo_Wen <=#UTX_DLY 1'b0;
								U2txaddr <=#UTX_DLY 8'hff;
								if(Addr_Rise==1'b0)										//<A NAME="地址不增加">
									begin
										U2txaddr01 <=#UTX_DLY U2txaddr01;
									end
								else
									begin
										Utx_Group_Cnt_Buffer <=#UTX_DLY Utx_Group_Cnt;			//<A NAME="缓存工作组信息">
										U2txaddr_Buffer <=#UTX_DLY U2txaddr01;  					//<A NAME="缓存地址信息">
										if(U2txaddr01==8'b00101111) 				   //<A NAME="地址最大,转换组">
											begin
												U2txaddr01 <=#UTX_DLY 8'b00000000;
												case(Utx_Group_Cnt)										  
													3'b000:	 										  
														begin
															if(U2_Slot_En[1]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b001;
															else if(U2_Slot_En[2]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b010; 
															else if(U2_Slot_En[3]==1'b1) 
																Utx_Group_Cnt <=#UTX_DLY 3'b011;
															else if(U2_Slot_En[4]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b100; 
															else
																Utx_Group_Cnt <=#UTX_DLY 3'b000;
														end		
													3'b001:
														begin
															if(U2_Slot_En[2]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b010;
															else if(U2_Slot_En[3]==1'b1 )
																Utx_Group_Cnt <=#UTX_DLY 3'b011;
															else if(U2_Slot_En[4]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b100;
															else if(U2_Slot_En[0]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b000;
															else
																Utx_Group_Cnt <=#UTX_DLY 3'b001;
														end
													3'b010:
														begin
															if(U2_Slot_En[3]==1'b1)
																
																Utx_Group_Cnt <=#UTX_DLY 3'b011;			   
															else if(U2_Slot_En[4]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b100;				 
															else if(U2_Slot_En[0]==1'b1)
																
																Utx_Group_Cnt <=#UTX_DLY 3'b000;			   
															else if(U2_Slot_En[1]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b001;			  
															else   
																Utx_Group_Cnt <=#UTX_DLY 3'b010;				   
														end
													3'b011:
														begin
															if(U2_Slot_En[4]==1'b1)	
																
																Utx_Group_Cnt <=#UTX_DLY 3'b100;			  
															else if(U2_Slot_En[0]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b000;			  
															else if(U2_Slot_En [1]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b001;			  
															else if(U2_Slot_En [2]==1'b1)
																Utx_Group_Cnt <=#UTX_DLY 3'b010;				
															else
																Utx_Group_Cnt <=#UTX_DLY 3'b011;	
														end
													3'b100:
														begin
															if(U2_Slot_En[0]==1'b1 )
																
																Utx_Group_Cnt <=#UTX_DLY 3'b000;			  
															else if(U2_Slot_En[1]==1'b1 )
																Utx_Group_Cnt <=#UTX_DLY 3'b001;			   
															else if(U2_Slot_En[2]==1'b1 )
																Utx_Group_Cnt <=#UTX_DLY 3'b010;			   
															else if(U2_Slot_En[3]==1'b1 )
																Utx_Group_Cnt <=#UTX_DLY 3'b011;				
															else 
																Utx_Group_Cnt <=#UTX_DLY 3'b100;				   
														end	
													default:
														Utx_Group_Cnt <=#UTX_DLY 3'b000;
												endcase	
											end
										else
											U2txaddr01 <=#UTX_DLY U2txaddr01+8'h01;	
									end  
							end
						default:
							sUtx_Poll <=#UTX_DLY UTX_POLL_IDLE; 
					endcase	
				end
		end
	
	//******************************************************************************//
	//								utx_state_machine								//	
	//******************************************************************************//
	always @(posedge Rst or posedge Clk_UTP)
		begin
			if(Rst==1'b1)
				begin 
					sUtx_State <= UTX_IDLE;
					Translate <= 1'b0;
					U2txenb <= 5'b11111;
					U2txenb_Buffer <= 5'b11111;
					U2txsoc <= 1'b0;
					U2txdata <= 16'h0000;
					Utx_Payload_Cnt <= 4'b0000;
					Utx_Cell_Fifo_Ren <= 1'b0;
					Checked <= 1'b0;	 
					Uloop_Payload_Cnt <= 4'b0000; 
					U2txaddr_Tx_Buffer <= 8'hff;
					Uloop_Checked <= 1'b0;  
					Mloop_Fifo_Wen <= 1'b0;
					Mloop_Fifo_Din <= {33{1'b0}};
					U2group_Buff  <= 3'b111; 
					Data_en_in <= 1'b0;
					Init_in <= 1'b1; 
					Uloop_Addr_Valid <= 1'b0;
					Uloop_Cnt_Add <= 1'b0;
					Utx_State_Buff <= 5'b00000;
					Uloop_Fifo_Ren <= 1'b0;
					Check_Group_Buff <= 3'b111;
				end
			else
				begin
					Utx_State_Buff <= #UTX_DLY sUtx_State;
					case (sUtx_State)
						UTX_IDLE:
							begin
								if(Start_Dn==1'b1)
									begin
										Uloop_Cnt_Add <=#UTX_DLY 1'b0;
										Data_en_in <=#UTX_DLY 1'b0;
										Init_in <=#UTX_DLY 1'b1;
										Mloop_Fifo_Wen <=#UTX_DLY 1'b0;
										Uloop_Payload_Cnt <=#UTX_DLY 4'b0000;
										Utx_Payload_Cnt <=#UTX_DLY 4'b0000;
										if(U2_Loop_Ctrl==2'b00 && Utx_Cell_Fifo_Rdy==1'b1)	   //<A NAME="正常工作且有信元准备好"> 这条语句可能有问题
											begin
												sUtx_State <=#UTX_DLY UTX_WAIT;
												Utx_Cell_Fifo_Ren <=#UTX_DLY 1'b1;					   //<A NAME="读信号有效">
											end	
										else if(U2_Loop_Ctrl==2'b10 && Uloop_Fifo_Rdy==1'b1)   //<A NAME="A环回">
											begin
												sUtx_State <=#UTX_DLY UTX_ULOOP_WAIT;
												Uloop_Fifo_Ren <=#UTX_DLY 1'b1;
											end	
										else if(U2_Loop_Ctrl==2'b01 && Mloop_Fifo_Full!=1'b1 && Utx_Cell_Fifo_Empty!=1'b1)	//<A NAME="B环回">
											begin 
												sUtx_State <=#UTX_DLY UTX_MLOOP_WAIT;
												Utx_Cell_Fifo_Ren <=#UTX_DLY 1'b1;
											end
										else
											begin
												sUtx_State <=#UTX_DLY UTX_IDLE;
												Utx_Cell_Fifo_Ren <=#UTX_DLY 1'b0;
												Uloop_Fifo_Ren <=#UTX_DLY 1'b0;
												Utx_Cell_Fifo_Ren <=#UTX_DLY 1'b0;
											end	
									end
								else
									sUtx_State <=#UTX_DLY UTX_IDLE;	
							end
						UTX_WAIT:	 //<A NAME="读FIFO等待">
							begin
								if(Checked==1'b1)										//<A NAME="信元描述字段检查通过">
									begin
										sUtx_State <=#UTX_DLY UTX_HEAD1;
										Utx_Cell_Fifo_Ren <=#UTX_DLY 1'b0; 
										U2txenb_Buffer <=#UTX_DLY ~Utx_Cell_Fifo_Dout[12:8];
									end
								else													 
									begin
										sUtx_State <=#UTX_DLY UTX_CHECK;
										Utx_Cell_Fifo_Ren <=#UTX_DLY 1'b0;	
									end
							end		
						UTX_CHECK:   //<A NAME="检验信元描述字段">
							begin
								if(Utx_Cell_Fifo_Dout[32]==1'b1)					 			   //<A NAME="信元第一个DWARD">
									begin
										if(Utx_Cell_Fifo_Dout[31]==1'b1)						   //<A NAME="有正确的完整信元">
											begin 
												sUtx_State <=#UTX_DLY UTX_WAIT;
												U2txaddr_Tx_Buffer <=#UTX_DLY Utx_Cell_Fifo_Dout[7:0];
												U2group_Buff  <=#UTX_DLY Utx_Cell_Fifo_Dout[15:13];
												Checked <=#UTX_DLY 1'b1; 									  //<A NAME="检查通过">
												Utx_Cell_Fifo_Ren <=#UTX_DLY 1'b1; //<A NAME="读信元信号有效">
												Translate <=#UTX_DLY 1'b1;	  //<A NAME="需要选定端口">						 
											end
										else //if(Utx_Cell_Fifo_Dout[7:0]!=U2txaddr_Buffer || Utx_Cell_Fifo_Dout[15:13]!=Utx_Group_Cnt_Buffer ) //<A NAME="操作端口非当前轮询端口">
											begin

⌨️ 快捷键说明

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