关于输出波形的问题

2019-03-25 08:04发布

下面的是程序,可以直接运行,里面Vde_counter没办法正常输出,我也弄不明白为啥,控制它的波形都对


          //******************************************************************************************
    //*  COMPANY    :  TERASIC.  www.terasic.com  (c) 2005 all rights reserved.                *
    //*  NAME       :  ITU-R BT.656 YCrCb 4:2:2 DECODER                                                                *
    //*  Created    :  7/5/2005                                                                *
    //*  Author     :  Joe Yang                                                                *
    //******************************************************************************************

`define sync 8'd101
module deinterlace
(
        CLOCK,   //system clock
        TD_D,    //4:2:2 video data stream
        TD_HS,   //Decoder_hs
        TD_VS,   //Decoder_vs
        //SW1,  //the function of SW1 is not sure!!
       
        Y,       //4:4:4 Y
        Cb,      //4:4:4 Cb
        Cr,   //4:4:4 Cr

        ////test/////
        YY,
        CCb,
        CCr,
       
        vde,
        h_tr,
        blank_h,
        Vde_counter,
       
   HSx2
       
        //blank  
   //Ypix_clock, //Y pixel clock        
        //VSx1,
        //Y_check,
        //START,
        //COUNTER,
        //R,G,B,
        //h_tr,
   //SW0,
);

        input CLOCK;
        input [7:0]TD_D;
        input TD_HS;
        input TD_VS;
   //input SW0;        //key1,key0
   //input SW1;       
       
        output [7:0]Y;
        output [7:0]Cb;
        output [7:0]Cr;
       
        ///////test///////
        output [7:0]YY;
        output [7:0]CCb;
        output [7:0]CCr;
       
        output blank_h;
        output vde;
        output h_tr;
       
        output HSx2;
        output [10:0]Vde_counter;
       
       

        //output blank;
       
//test

   //output VSx1;
        //output Ypix_clock;
        //output Y_check;
        //output START;
        //output [1:0]COUNTER;
       
       
        //output [9:0]R;
        //output [9:0]G;
        //output [9:0]B;
    //output h_tr;

       
        reg [7:0]YY;
        reg [7:0]CCb,Cbb;
        reg [7:0]CCr,Crr;
       
   reg  HSx2 ;//TD_HS;
        //wire VSx1=TD_VS;
       
        reg[7:0]R1,R2,R3;
        reg[7:0]RR1,RR2,RR3;
       
        //wire [7:0]cr={2'b0,Cr[6:1]};
        //wire [7:0]cb={3'b0,Cb[6:2]};       
       
        //wire [7:0]Rr=(Y-16)-{1'b0,Cr[7:0]};//
        //wire [7:0]Gg=(Y-16)-cr -cb;
        //wire [7:0]Bb=(Y-16)-{1'b0,Cb[7:0]};//

   // wire [9:0]R={Rr,2'b00};
   // wire [9:0]G={Gg,2'b00};
   // wire [9:0]B={Bb,2'b00};
       
//   
        wire  Y_check=( (R3==8'hff) && (R2==8'h00) && (R1==8'h00) )?1:0;       
        always @(posedge CLOCK)
        begin
           RR1=TD_D;
           RR2=R1;
           RR3=R2;
        end
       
        always @(negedge CLOCK)
        begin
            R1=RR1;
            R2=RR2;
            R3=RR3;
        end
       
        reg START,Field;       
       
        always @(posedge CLOCK)
        begin
           if (Y_check==1) //ff,00,00前导
              begin
                START=~TD_D[4];//开始信号  0-start 1--end
                     Field= TD_D[6];//场信号  1--odd  0--even
        end       
        end

        reg [1:0]COUNTER;       
        always @(posedge CLOCK)
        begin
                   if (!START)  //START=1, XY[4]=0, 表示sav信号
                        COUNTER=0;
                        else COUNTER=COUNTER+2'b1;
    end                       

    reg Ypix_clock; // 频率为clock的一半
         
        always @(posedge CLOCK)
        begin
                 case (COUNTER)
                        0:begin Cbb = TD_D;                  Ypix_clock =0;end
                        1:begin YY  = TD_D;CCr=Crr;CCb=Cbb;  Ypix_clock =1;end
                        2:begin Crr = TD_D;                  Ypix_clock =0;end
                        3:begin YY  = TD_D;CCr=Crr;CCb=Cbb;  Ypix_clock =1;end                       
        endcase                        
    end                       



reg [10:0]H_COUNTER;
reg [10:0]RH_COUNTER;
////////////////////////////////////////////
/*
hs-----_______________________--------
vs-----_______________________________________

*/
///////////////////////////////////////////
        always @(posedge CLOCK)
        begin
                    if (TD_HS) H_COUNTER=0; //低电平计数                  
                         else H_COUNTER=H_COUNTER+11'b1;// TD_HS effective in low
    end                       

        always @(posedge TD_HS)// 由低电平变成高电平时 赋值
        begin
                RH_COUNTER=H_COUNTER;//  RH_COUNTER是H_COUNTER最大时,锁存
    end                       
       
    always @(posedge CLOCK) //101??
         begin
                if (
                        ((H_COUNTER >= 0) && (H_COUNTER < `sync)) ||               
                    ((H_COUNTER >= RH_COUNTER[10:1]) && (H_COUNTER < (RH_COUNTER[10:1]+`sync+1)))
                        )               
                        //  0=<H_COUNTER<=101||      720=<H_COUNTER<=720+102 ??
                       
                HSx2=0;//???
                else
                HSx2=1;
    end                       

        reg [10:0]h;
        reg h_tr;
        reg h_tr_h;
       
always @(posedge CLOCK)
begin
      if(!HSx2)
                h=0;
                else
                h=h+11'b1;
end

   always @(posedge CLOCK)
        begin
     if ((h< 51) || (h > 771))
                h_tr=0;
                else
                h_tr=1;
   end
       
   always @(posedge CLOCK)
  begin
     if ((h< 41) || (h > 781))  
                h_tr_h=0;
                else
                h_tr_h=1;
   end

       
wire  [7:0]Yw;//YYw;
wire  [7:0]Cwr;//CCwr;
wire  [7:0]Cwb;//CCwb;

//assign        YYw  =((h_tr==1) && (VSx1==1))?Yw : 8'h10;//current set
//assign        CCwr =((h_tr==1) && (VSx1==1))?Cwr: 8'h80;
//assign        CCwb =((h_tr==1) && (VSx1==1))?Cwb: 8'h80;


/*
reg [10:0]pcounter_h;
reg [10:0]pcounter_v;

always @(posedge CLOCK)
begin
     if
            (!h_tr) pcounter_h=0;
     else
            pcounter_h=pcounter_h+11'b1;
end       

always @(posedge h_tr)
begin
     if
          (!TD_VS) pcounter_v=0;
     else
          pcounter_v=pcounter_v+11'b1;
end

//??? wire t
wire t=(
//                ((pcounter_h >=0) && (pcounter_h < 45)  && (pcounter_v[9:5]==5'b00000)) ||
                ((pcounter_h >=0) && (pcounter_h < 90)  && (pcounter_v[9:5]==5'b00001)) ||
                ((pcounter_h >=0) && (pcounter_h < 135) && (pcounter_v[9:5]==5'b00010)) ||
                ((pcounter_h >=0) && (pcounter_h < 180) && (pcounter_v[9:5]==5'b00011)) ||
                ((pcounter_h >=0) && (pcounter_h < 225) && (pcounter_v[9:5]==5'b00100)) ||
                ((pcounter_h >=0) && (pcounter_h < 270) && (pcounter_v[9:5]==5'b00101)) ||
                ((pcounter_h >=0) && (pcounter_h < 315) && (pcounter_v[9:5]==5'b00110)) ||
                //((pcounter_h >=0) && (pcounter_h < 360) && (pcounter_v[9:5]==5'b00111)) ||
                ((pcounter_h >=0) && (pcounter_h < 405) && (pcounter_v[9:5]==5'b01000)) ||
                ((pcounter_h >=0) && (pcounter_h < 450) && (pcounter_v[9:5]==5'b01001)) ||
                ((pcounter_h >=0) && (pcounter_h < 495) && (pcounter_v[9:5]==5'b01010)) ||
                ((pcounter_h >=0) && (pcounter_h < 540) && (pcounter_v[9:5]==5'b01011)) ||
                ((pcounter_h >=0) && (pcounter_h < 585) && (pcounter_v[9:5]==5'b01100)) ||
//                ((pcounter_h >=0) && (pcounter_h < 630) && (pcounter_v[9:5]==5'b01101)) ||
                ((pcounter_h >=0) && (pcounter_h < 675) && (pcounter_v[9:5]==5'b01110)) ||
                ((pcounter_h >=0) && (pcounter_h < 720) && (pcounter_v[9:5]==5'b01111))                
                )?1:0;
               
wire [7:0]ym= t? 8'hff:8'h80;
wire [7:0]crm=t? 8'h80:8'h80;
wire [7:0]cbm=t? 8'h80:8'h80;
               


wire  [7:0]Ymm  =SW1? ym :Yw ;
wire  [7:0]Crmm =SW1? crm:Cwr;
wire  [7:0]Cbmm =SW1? cbm:Cwb;
*/

wire  [7:0]Ymm  =Yw ;
wire  [7:0]Crmm =Cwr;
wire  [7:0]Cbmm =Cwb;


reg[10:0]Hde_counter;
reg[10:0]Vde_counter;

always @(posedge CLOCK)
begin
          if(HSx2==0)
          Hde_counter=0;
                else
          Hde_counter=Hde_counter+11'b1;
end       

always@(posedge  HSx2)
begin
     if (TD_VS==1) // effective low or high ?
           Vde_counter=0;
                else
           Vde_counter=Vde_counter+11'b1;
end

//wire hde=((Hde_counter > 51) && (Hde_counter < 691)) ? 1:0;//720  640
wire vde=((Vde_counter > 31) && (Vde_counter < 511)) ? 1:0;//480
wire blank_h  = h_tr   & vde;
wire blank  =   h_tr_h & vde;

wire  [7:0]Y  = (blank_h)?Ymm   :8'h10;
wire  [7:0]Cr = (blank_h)?Crmm  :8'h80;
wire  [7:0]Cb = (blank_h)?Cbmm  :8'h80;

dul_port_c1024 YYYR(
        .iDATA(YY[7:0]),
        .iHSYNC(TD_HS),
//        .iHSYNCx2(HSx2),
        .iHSYNCx2(blank),
        .Y_CLOCK(Ypix_clock),
        .Y_CLOCKx2(CLOCK),
        .oDATA(Yw[7:0]),
        .field(Field),
        .VS(TD_VS)               
);


dul_port_c1024 CBB(
        .iDATA(CCb[7:0]),
        .iHSYNC(TD_HS),
//        .iHSYNCx2(HSx2),
        .iHSYNCx2(blank),
        .Y_CLOCK(Ypix_clock),
        .Y_CLOCKx2(CLOCK),
        .oDATA(Cwb[7:0]),
        .field(Field),
        .VS(TD_VS)               
);

dul_port_c1024 CRR(
        .iDATA(CCr[7:0]),
        .iHSYNC(TD_HS),
//        .iHSYNCx2(HSx2),
        .iHSYNCx2(blank),
        .Y_CLOCK(Ypix_clock),
        .Y_CLOCKx2(CLOCK),
        .oDATA(Cwr[7:0]),
        .field(Field),
        .VS(TD_VS)                       
);

endmodule


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
3008202060
1楼-- · 2019-03-25 10:52
 精彩回答 2  元偷偷看……
吴鉴鹰.
2楼-- · 2019-03-25 15:16
看你很辛苦,帮顶
仙猫
3楼-- · 2019-03-25 17:24
1、Vde_counter 呈暗黄 {MOD},说明该信号未被赋值过。
2、程序里给 Vde_counter 赋初值的条件是 (HSx2上升沿) 和 (TD_VS==1),从仿真波形图看出,这两个条件未成立过。


仙猫
4楼-- · 2019-03-25 19:42
如想用最简单的办法看到结果,可在 Vde_counter 的定义处,先给它赋个初值就行了。
3008202060
5楼-- · 2019-03-25 22:24
吴鉴鹰. 发表于 2014-6-21 11:08
看你很辛苦,帮顶

多谢多谢
3008202060
6楼-- · 2019-03-26 00:19
仙猫 发表于 2014-6-22 08:13
如想用最简单的办法看到结果,可在 Vde_counter 的定义处,先给它赋个初值就行了。

啊 果然 谢谢啊

一周热门 更多>