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

📄 rxinfofr.v

📁 华大机顶盒源码
💻 V
字号:
module RxInfoFr( CLKM, ResetN,
                 //input
                 bInfo, Fsync, Den, Rx_DB, Init_Mem_End, CompNewSeg_End, first_key,
                 //output
                 Init_Mem, RxNewSeg, Rx_SelLW,
                 Req_Mem, Mem_Blk_Num, Mem_Blk_Size,  Max_Seg_Num,
                 Seg_Num,
                 //debug
                 RxEn, DenCnt,dec_data
               );

input         CLKM;
input         ResetN;

input         bInfo;
input         Fsync;
input         Den;
input  [15:0] Rx_DB;
input         Init_Mem_End;
input         CompNewSeg_End;
input  [7:0]  first_key;

output        Init_Mem;
output        RxNewSeg;
output [7:0]  Req_Mem;
output [7:0]  Mem_Blk_Num;
output [15:0] Mem_Blk_Size;
output [11:0] Max_Seg_Num;
output [11:0] Seg_Num;
output        Rx_SelLW;

//debug
output [2:0]  DenCnt;
output        RxEn;
output [15:0] dec_data;

reg           Init_Mem;
reg           RxNewSeg;
reg           Rx_SelLW;
reg    [7:0]  Req_Mem;
reg    [7:0]  Mem_Blk_Num;
reg    [15:0] Mem_Blk_Size;
reg    [11:0]  Max_Seg_Num;
reg    [11:0]  Seg_Num;
reg           Start_Indicator;
reg    [2:0]  DenCnt;
reg    [4:0]  CurState;

reg    [7:0]  key;
reg           rst_key;
reg           set_key;

wire   [15:0]  dec_data;

wire RxEn;

assign RxEn = bInfo & Fsync & Den;
assign dec_data[15:8] = ~(key ^ ~Rx_DB[15:8]);
assign dec_data[7:0] = ~(Rx_DB[15:8] ^ ~Rx_DB[7:0]);

always @(posedge CLKM or negedge ResetN)
if(!ResetN) 
   key <= 0;
else if(rst_key)
   key <= first_key;
else if(set_key) 
   key <= Rx_DB[7:0];


parameter Idle = 5'b00001,
          RxHW1 = 5'b00010,
	  RxLW1 = 5'b00100,
	  RxLW2 = 5'b01000,
	  WaitNxtDen = 5'b10000;
	  
always @(posedge CLKM or negedge ResetN)
if(!ResetN) begin
	Init_Mem <= 0;
	RxNewSeg <= 0;
        Rx_SelLW <= 0;
	Req_Mem <= 0;
	Mem_Blk_Num <= 0;
	Mem_Blk_Size <= 0;
	Max_Seg_Num <= 0;
	Seg_Num <= 0;
	Start_Indicator <= 0;
	DenCnt <= 0;
	CurState <= Idle;
        rst_key <= 1;
        set_key <= 0;
end
else begin
	case (CurState)
		Idle : 
		begin
			if(Init_Mem_End)
				Init_Mem <= 0;
			if(CompNewSeg_End)
				RxNewSeg <= 0;
                        Rx_SelLW <= 0;
			Req_Mem <= Req_Mem;
			Mem_Blk_Num <= Mem_Blk_Num;
			Mem_Blk_Size <= Mem_Blk_Size;
			Max_Seg_Num <= Max_Seg_Num;
			Seg_Num <= Seg_Num;
			Start_Indicator <= 0;
			DenCnt <= 0;
                        set_key <= 0;
                       	rst_key <= 1;
			if(RxEn)
				CurState <= RxHW1;
		end
		RxHW1 : 
		begin
                        rst_key <= 0;
		        if (DenCnt != 3'b000)
		        	set_key <= 1;
		        else
		        	set_key <= 0;
		        	
			case (DenCnt)
			3'b000 : 
			begin
				Start_Indicator <= Rx_DB[6];
				CurState <= RxLW1;
			end
			3'b001 :
			begin
				if((dec_data[15:8]==8'hB7) && (dec_data[1]==1)) begin
//					DenCnt <= DenCnt + 1;
//					CurState <= WaitNxtDen;
                                        CurState <= RxLW1;
				end
				else 
					CurState <= Idle;
			end
			3'b010 : 
			begin
//				DenCnt <= DenCnt + 1;
//				CurState <= WaitNxtDen;
                                CurState <= RxLW1;
			end
			3'b011 : 
			begin
				if((dec_data[15:8]!=0) && (dec_data[7:0]==8'h44))
					CurState <= RxLW1;
				else
					CurState <= Idle;
			end
			3'b100 :
			begin
				if(!Init_Mem_End) begin
					if(dec_data[7]) begin
//						DenCnt <= DenCnt + 1;
//						CurState <= WaitNxtDen;
                                                CurState <= RxLW1;
					end
					else begin
						CurState <= Idle;
					end
				end
				else begin
					CurState <= RxLW1;
				end
			end
			3'b101 : 
			begin
				Req_Mem <= dec_data[7:0];
				CurState <= RxLW1;
			end
			3'b110 :
			begin
				Mem_Blk_Size[7:0] <= dec_data[15:8];
				Max_Seg_Num[11:4] <= dec_data[7:0];
                                CurState <= RxLW1;
//				Init_Mem <= 1;
//				CurState <= Idle;
			end
			default :
				CurState <= Idle;
			endcase	
		end
		RxLW1 :
		begin
			Rx_SelLW <= 1;
			CurState <= RxLW2;			
	        	set_key <= 0;
		end
		RxLW2 :
		begin
			Rx_SelLW <= 1;
		        if (DenCnt != 3'b000)
		        	set_key <= 1;
		        else
		        	set_key <= 0;

			case(DenCnt)
			3'b000 :
			begin
				if(Rx_DB[5:4]==2'b10) begin
					DenCnt <= DenCnt + 1;
					CurState <= WaitNxtDen;
				end
				else begin
					CurState <= Idle;
				end
			end
			3'b001 :
			begin
				DenCnt <= DenCnt + 1;
				CurState <= WaitNxtDen;
			end
			3'b010 : 
			begin
				DenCnt <= DenCnt + 1;
				CurState <= WaitNxtDen;
			end
			3'b011 : 
			begin
				if(dec_data[15:8]==8'h5A) begin
					DenCnt <= DenCnt + 1;
					CurState <= WaitNxtDen;
				end
				else
					CurState <= Idle;
			end
			3'b100 : 
			begin
				if(!Init_Mem_End) begin
					DenCnt <= DenCnt + 1;
					CurState <= WaitNxtDen;
				end
				else begin	
					Seg_Num <= dec_data[11:0];
					if(Start_Indicator)
						RxNewSeg <= 1;
					else if(Seg_Num != dec_data[11:0])
						RxNewSeg <= 1;
					else
						RxNewSeg <= 0;
					CurState <= Idle;				
				end
			end
			3'b101 : 
			begin
				Mem_Blk_Num <= dec_data[15:8];
				Mem_Blk_Size[15:8] <= dec_data[7:0];
				DenCnt <= DenCnt + 1;
				CurState <= WaitNxtDen;
			end
			3'b110 :
			begin
				Max_Seg_Num[3:0] <= dec_data[15:12];
				Init_Mem <= 1;
				CurState <= Idle;
			end
			default :
				CurState <= Idle;
			endcase
		end
		WaitNxtDen :
		begin
			Rx_SelLW <= 0;
	        	set_key <= 0;
			if(Den)
				CurState <= RxHW1;
			else
				CurState <= WaitNxtDen;
		end
		default :
			CurState <= Idle;
	endcase
end

endmodule                 

⌨️ 快捷键说明

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