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

📄 rxmodule.v

📁 华大机顶盒源码(包括所有源代码).rar
💻 V
字号:
module RxModule(RESETN, CLKM,
                //input
                MDI, VALIDI, FSYNCI, DMUX,
                //output 
                DATA, FSYNCV, DEN,RX_PID,
                //debug
                test 
                ); 

input         RESETN;                                   //reset signal,low level is valid.
input         CLKM;                                      //the synchrony clock signal

input [7:0]   MDI;                                       //the input data,8bits
input         VALIDI;                                    //the valid data signal
input         FSYNCI;                                    //the data synchrony signal.
                                                                   //FSYNCI=1,indicate the MDI byte data should save into 
                                                                   //the first buffer unit(buffer0[0] or buffer[1])
input         DMUX;                                     //

output [15:0] DATA;                                 //the output data,16bits 
output        FSYNCV;
output        DEN;
output [12:0]  RX_PID;                             //the pid data output

//debug
output       test;
reg          test;
//debug

reg [7:0]  DBUFF0[0:3];                            //the depth is four ,the word length is 8bits
reg [7:0]  DBUFF1[0:3];
reg        FSYNC1;
reg        FSYNCV;
reg [12:0] RX_PID;

reg        BufSel;                                         //select buffer signal
reg [1:0]  bufcnt;                                       //buffer address counter
reg        buffull;                                         //the flag that the input buffer is full
reg        reg1, reg2;                          

wire [31:0] DBUFF;
wire [31:0] TEMPD;

//wire testbit;

assign DBUFF = BufSel ? ({DBUFF0[0], DBUFF0[1], DBUFF0[2], DBUFF0[3]}):                                    //according to the BufSel,
                          ({DBUFF1[0], DBUFF1[1], DBUFF1[2], DBUFF1[3]});                                                   //select DBUFF0 or DBUFF1
assign TEMPD = BufSel ? ({DBUFF1[0], DBUFF1[1], DBUFF1[2], DBUFF1[3]}): 
                          ({DBUFF0[0], DBUFF0[1], DBUFF0[2], DBUFF0[3]});                         
assign DATA  = DMUX ? DBUFF[15:0] : DBUFF[31:16];
assign DEN   = reg1 & ~reg2;

parameter MAX_SEG = 7'd125;

always @(negedge RESETN or posedge CLKM)
begin
if(!RESETN) begin                                     // RESETN=1,then clear the DBUFF0 and DBUFF1                                                     
   DBUFF0[0] <= 0;
   DBUFF0[1] <= 0;
   DBUFF0[2] <= 0;
   DBUFF0[3] <= 0;   
   DBUFF1[0] <= 0;
   DBUFF1[1] <= 0;
   DBUFF1[2] <= 0;
   DBUFF1[3] <= 0;
end else if(VALIDI) begin
    if(BufSel) begin
       if(FSYNCI)   DBUFF1[0] <= MDI;
       else   DBUFF1[bufcnt] <= MDI;
    end else begin
       if(FSYNCI)  DBUFF0[0] <= MDI;
       else  DBUFF0[bufcnt] <= MDI;
    end
end 
end

always @(negedge RESETN or posedge CLKM)
if(!RESETN) 
    BufSel <= 0;
else if(bufcnt==2'b11 && VALIDI)
    BufSel <= ~BufSel;

always @(negedge RESETN or posedge CLKM)
if(!RESETN) begin
    bufcnt <= 0;
    FSYNC1 <= 0;
    buffull <= 0;
end else if(VALIDI) begin
    if(FSYNCI) begin
       bufcnt <= 2'b01;
       FSYNC1 <= 1;
       buffull <= 0;
    end else if(bufcnt==2'b11) begin
       bufcnt <= 2'b00;
       FSYNC1 <= 0;
       buffull <= 1;
    end else begin
       bufcnt <= bufcnt + 1;
       FSYNC1 <= FSYNC1;
       buffull <= 0;
    end
end

always @(posedge CLKM or negedge RESETN)
if(!RESETN) begin
   reg1 <= 0;
   reg2 <= 0;
end else begin
   reg1 <= buffull;
   reg2 <= reg1;
end

always @(negedge RESETN or posedge CLKM)
if(!RESETN)  FSYNCV <= 0;
else if(bufcnt==2'b11) FSYNCV <= FSYNC1;
else FSYNCV <= FSYNCV;   

always @(negedge RESETN or posedge CLKM)
if(!RESETN)   RX_PID <= 0;
else if(bufcnt==2'b11 && FSYNC1 && !FSYNCV)
    RX_PID <= TEMPD[20:8];
else  RX_PID <= RX_PID;

//debug
always @(negedge RESETN or posedge CLKM)
if(!RESETN)   test <= 0;
else if(bufcnt==2'b11 && FSYNC1 && !FSYNCV)
    if(TEMPD[20:8]==13'h1FFF)
       test <= 0;
    else
       test <= 1;
else  test <= test;


endmodule

⌨️ 快捷键说明

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