zoukankan      html  css  js  c++  java
  • 卷积编码后的删余模块---Verilog代码

    卷积编码后的删余模块---Verilog代码

    module DATA_conv_encoder(
    
        input            wire              DCONV_CLK_I,
        input            wire              DCONV_DIN,
        input            wire              DCONV_ND,
        input            wire              DCONV_RST,
        input            wire    [3:0]     RATE_CON,
        input            wire              DCONV_CLK_O,
        output           reg               DCONV_DOUT,
        output           reg     [8:0]     DCONV_INDEX,
        output           reg               DCONV_RDY
    );
    
    //-------------------------------------------------------------------------
    
    wire [1:0] DATA_OUT_V;
    
    conv_encoder conv_encoder1(
        .data_in(DCONV_DIN),
        .nd(DCONV_ND),
        .clk(DCONV_CLK_I),
        .aclr(DCONV_RST),
        .data_out_v(DATA_OUT_V),
        .rdy(RDY)
    );
    
    //-------------------------------------------------------------------------
    
    reg [1:0] Puncture_BUF_12;   //2
    reg [5:0] Puncture_BUF_34;   //6
    reg [3:0] Puncture_BUF_23;   //4
    reg [1:0] i;
    reg BUF_RDY;
    
    always @ ( negedge DCONV_RST or posedge DCONV_CLK_I )
    begin
        if(!DCONV_RST)
        begin
           Puncture_BUF_12 <= 0;
            Puncture_BUF_34 <= 0;
           Puncture_BUF_23 <= 0;
           i <= 0;
        end
        else 
        begin
            if(RDY)
            begin
                case(RATE_CON)
                4'b1101,4'b0101,4'b1001:  // Rate is 1/2 .
                begin
                    Puncture_BUF_12 <= DATA_OUT_V;
                    BUF_RDY <= 1;
                end
                4'b1111,4'b0111,4'b1011,4'b0011:     // Rate is 3/4 .
                begin
                    case(i)
                    2'b00:
                    begin
                        Puncture_BUF_34 [1:0] <= DATA_OUT_V;
                        BUF_RDY <= 1;
                        i <= i + 1 ;
                    end
                    2'b01:
                    begin
                        Puncture_BUF_34 [3:2] <= DATA_OUT_V;
                        BUF_RDY <= 1;
                        i <= i + 1 ;
                    end
                    2'b10: 
                    begin
                        Puncture_BUF_34 [5:4] <= DATA_OUT_V;
                        BUF_RDY <= 1;
                        i <= 2'b00 ;
                    end
                    default: 
                    begin
                        Puncture_BUF_34 <= 0;
                        BUF_RDY <= 0;     
                        i <= 0;
                    end
                    endcase
                end
                4'b0001:         // Rate is 2/3 .
                begin
                    case ( i )
                    2'b00:
                    begin
                        Puncture_BUF_23 [1:0] <= DATA_OUT_V;
                        BUF_RDY <= 1;
                        i <= i + 1 ;            
                    end
                    2'b01:
                    begin
                        Puncture_BUF_23 [3:2] <= DATA_OUT_V;
                        BUF_RDY <= 1;
                        i <= 0 ;            
                    end
                    default:
                    begin
                        Puncture_BUF_23 <= 0;
                        BUF_RDY <= 0;
                        i <= 0 ;            
                    end
                    endcase
                end
                endcase
            end
            else 
            begin
                BUF_RDY <= 0;
                Puncture_BUF_12 <= 0;
                Puncture_BUF_34 <= 0;
                Puncture_BUF_23 <= 0;
                i <= 0;
            end
        end
    end
    
    
    //-------------------------------------------------------------------------
    
    reg [2:0] j;
    
    always @ ( negedge DCONV_RST or posedge DCONV_CLK_O )     // Puncture and output the data.
    begin
        if(!DCONV_RST)
        begin
            DCONV_DOUT <= 0 ;
            DCONV_RDY <= 0;
            j <= 3'b000;
        end
        else 
        begin
            if(BUF_RDY)
            begin
                case(RATE_CON)
                4'b1101,4'b0101,4'b1001:        // Rate is 1/2 .
                begin
                    case (j)
                    3'b000:
                    begin
                        DCONV_DOUT <= Puncture_BUF_12 [j] ;
                        DCONV_RDY <= 1;
                        j <= j +1 ;
                    end
                    3'b001:
                    begin
                        DCONV_DOUT <= Puncture_BUF_12 [j] ;
                        DCONV_RDY <= 1;
                        j <= 3'b000 ;
                    end
                    default:
                    begin
                        DCONV_DOUT <= 0 ;
                        DCONV_RDY <= 0;
                        j <= 3'b000 ;
                    end
                    endcase
                end
    
                4'b1111,4'b0111,4'b1011,4'b0011:     // Rate is 3/4 .
                begin
                    case (j)
                    3'b000,3'b001,3'b010:
                    begin
                        DCONV_DOUT <= Puncture_BUF_34 [j] ;
                        DCONV_RDY <= 1;
                        j <= j + 1 ;
                    end              
                    3'b011: 
                    begin
                        DCONV_DOUT <= Puncture_BUF_34 [j+2] ;
                        DCONV_RDY <= 1;
                        j <= 3'b000 ;
                    end
                    default: 
                    begin
                        DCONV_DOUT <= 0;
                        DCONV_RDY <= 0;     
                        j <= 0;
                    end
                    endcase
                end 
    
                4'b0001:         // Rate is 2/3 .
                begin
                    case ( j )
                    3'b000,3'b001:
                    begin
                        DCONV_DOUT <= Puncture_BUF_23 [j] ;
                        DCONV_RDY <= 1;
                        j <= j + 1 ;            
                    end
                    3'b010:
                    begin
                        DCONV_DOUT <= Puncture_BUF_23 [j] ;
                        DCONV_RDY <= 1;
                        j <= 3'b000 ;            
                    end
                    default:
                    begin
                        DCONV_DOUT <= 0 ;
                        DCONV_RDY <= 0 ;
                        j <= 0 ;            
                    end
                    endcase 
                end
                endcase
            end
            else 
            begin
                DCONV_DOUT <= 0 ;
                DCONV_RDY <= 0 ;
            end
        end
    end
    
    //-----------------------------------------------------------------------------
    
    reg [9:0] INDEX_TEMP;
    reg [8:0] DCONV_INDEX;
    
    always @ ( negedge DCONV_RST or posedge DCONV_CLK_O )
    begin
       if (! DCONV_RST)
       begin
            DCONV_INDEX <= 0 ;
            INDEX_TEMP <= 0;
       end
       else 
       begin
               if(BUF_RDY)
               begin
                   case(RATE_CON)
                   4'b1101,4'b1111:
                begin
                    if(INDEX_TEMP< 47)
                    begin
                        INDEX_TEMP <= INDEX_TEMP + 1 ;
                        DCONV_INDEX <= INDEX_TEMP ;
                    end
                    else
                    begin
                        INDEX_TEMP <= 0 ;
                        DCONV_INDEX <= INDEX_TEMP ; 
                    end
                end
                4'b0101,4'b0111:                
                begin
                    if(INDEX_TEMP< 95)
                    begin
                    INDEX_TEMP  <= INDEX_TEMP + 1 ;
                    DCONV_INDEX <= INDEX_TEMP ;
                    end
                    else
                    begin
                        INDEX_TEMP <= 0 ;
                        DCONV_INDEX <= INDEX_TEMP ; 
                    end
                end
                4'b1001,4'b1011:                
                begin
                    if( INDEX_TEMP< 191)
                    begin
                        INDEX_TEMP <= INDEX_TEMP + 1 ;
                        DCONV_INDEX <= INDEX_TEMP ;
                    end
                    else
                    begin
                        INDEX_TEMP <= 0 ;
                        DCONV_INDEX <= INDEX_TEMP ; 
                    end
                end
                4'b0001,4'b0011:                
                begin
                    if(INDEX_TEMP< 287 )
                    begin
                        INDEX_TEMP <= INDEX_TEMP + 1 ;
                        DCONV_INDEX <= INDEX_TEMP ;
                    end
                    else
                    begin
                        INDEX_TEMP <= 0 ;
                        DCONV_INDEX <= INDEX_TEMP ; 
                    end
                end
                   endcase
               end
               else 
                   DCONV_INDEX <= 0 ;
       end
    end
    
    endmodule
  • 相关阅读:
    腾讯分析系统架构解析
    GreenPlum简单性能测试与分析--续
    我的一些提高效率的设置
    Windows 上借助注册表来修改键盘按键的映射
    WPF入门——Converter、XAML和Style
    30个极大提高开发效率的Visual Studio Code插件(转)
    USB PD充电
    macOS Mojave 美化一下终端
    WPF入门(4)——资源
    使用Duilib开发Windows软件(5)——使用VLC做视频播放
  • 原文地址:https://www.cnblogs.com/chensimin1990/p/13034094.html
Copyright © 2011-2022 走看看