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

📄 ctc_mctrl.v

📁 上传的是WIMAX系统中
💻 V
📖 第 1 页 / 共 3 页
字号:
///*********************************************************************/// Copyright(c) 2006, ZTE./// All rights reserved.////// Project name : ZXMBW-250(WIMAX)/// File name    : ctc_mctrl.v/// Author       : wangjinshan/// Department   : 2nd IC department/// Email        : wang.jinshan1@zte.com.cn////// Module_name  : ctc_mctrl/// Called by    : ctc_decoder_core  module///---------------------------------------------------------------------/// Module Hiberarchy:///               |----le_ram_u1/// ctc_mctrl-----|----le_ram_u2///---------------------------------------------------------------------////// Release History:///---------------------------------------------------------------------/// Version     |    Date     |       Author Description///---------------------------------------------------------------------/// 1.0-0       | 2006-05-08  | 建立文件///---------------------------------------------------------------------/// Main Function:/// 1、CTC译码核数主控模块///*********************************************************************`timescale 1ns/100psmodule ctc_mctrl    (    ///interface with ctc_rx_fsm    ///input    input              core_gnt,                    ///应答信号    input              wr_over, 		            ///写dpram结束信号    input       [15:0] rx2ctrl_length,              ///FEC译码块的长度    input       [2:0]  rx2ctrl_type,                ///类型号    input       [2:0]  rx2ctrl_frame_end_flag,    input       [1:0]  rx2ctrl_inst,                ///instance    input       [2:0]  rx2ctrl_code_rate,           ///码率 000:HARQ 001:1/2 010:2/3 011:3/4    input       [1:0]  rx2ctrl_modu_type,           ///00为QPSK,01为16QAM,10为64QAM    input       [15:0] rx2ctrl_bnum,                ///突发号    input       [7:0]  rx2ctrl_fnum,                ///FEC号    input       [3:0]  rx2ctrl_miter,               ///最大迭代次数    input       [3:0]  rx2ctrl_segId,               ///segment号    ///output    output reg         dec_finish,                  ///单译码块译码结束标记    output reg         core_req,                    ///请求信号    ///interface with ctc_dpram_1    ///input    input       [11:0] dpram1_rddat,                ///双口RAM的读数据    ///output    output reg  [11:0] dpram1_rdadr,                ///存放译码数据的双口RAM地址    output reg         dpram1_rd,                   ///双口RAM地址的读信号    ///interface with ctc_dpram_2    ///input    input       [23:0] dpram2_rddat,                ///双口RAM的读数据    ///output    output reg  [11:0] dpram2_rdadr,                ///存放译码数据的双口RAM地址    output reg         dpram2_rd,                   ///双口RAM地址的读信号    ///interface with ctc_map    ///input    input       [23:0] le,                          ///外部信息输入    input              sop_sink,                    ///输入包开始信号    input              eop_sink,                    ///输入包结束信号    input              val_sink,                    ///输入数据有效信号    ///output    output reg  [23:0] la,                          ///输出先验信息    output reg  [11:0] ys,                          ///输出信息比特软信息    output reg  [11:0] yp,                          ///输出校验比特软信息    output reg         sop_source,                  ///输出包开始信号    output reg         eop_source,                  ///输出包结束信号    output reg         val_source,                  ///输出数据有效信号    ///同交织解交织地址生成模块接口    ///input    input       [11:0] dat_addr,                    ///地址索引RAM输出数据    ///LLR交织地址索引RAM与译码数据交织地址索引RAM共用一块    input       [11:0] llrde_addr,                  ///解交织地址索引RAM输出数据    ///output    output reg         mctrl2dat_en,                ///使能信号    output reg  [11:0] mctrl2dat_addr,              ///地址索引RAM读地址    output reg         mctrl2dat_rd,                ///地址索引RAM读信号    output reg  [11:0] mctrl2llrde_addr,            ///解交织地址索引RAM读地址    output reg         mctrl2llrde_rd,              ///解交织地址索引RAM读信号    ///interface with resm    ///input    input              dec_end,                     ///译码结束信号    ///output    output reg  [3:0]  dec_no,                      ///迭代次数    output reg  [15:0] ctrl2resm_length,            ///FEC译码块的长度    output reg  [2:0]  ctrl2resm_type,              ///类型号    output reg  [2:0]  ctrl2resm_frame_end_flag,    output reg  [1:0]  ctrl2resm_inst,              ///instance    output reg  [2:0]  ctrl2resm_code_rate,         ///码率 000:HARQ 001:1/2 010:2/3 011:3/4    output reg  [1:0]  ctrl2resm_modu_type,         ///00为QPSK,01为16QAM,10为64QAM    output reg  [15:0] ctrl2resm_bnum,              ///突发号    output reg  [7:0]  ctrl2resm_fnum,              ///FEC号    output reg  [3:0]  ctrl2resm_miter,             ///最大迭代次数    output reg  [3:0]  ctrl2resm_segId,             ///segment号    ///system signals    input              sys_clk,                     ///系统时钟信号    input              reset_b                      ///输入复位信号    );///*********************************************************************///local parameter define:(本地参数:)///*********************************************************************parameter       WIN_SIZE  = 6'd32;                  ///译码活动窗大小/// State codes definitions:parameter       IDLE      = 6'b00_0001;parameter       WAIT      = 6'b00_0010;parameter       RD        = 6'b00_0100;parameter       EOP       = 6'b00_1000;parameter       DEC_ED    = 6'b01_0000;parameter       DEC_AD    = 6'b10_0000;///*********************************************************************///内部信号定义///*********************************************************************reg     [5:0]   st_current;                         ///当前状态reg     [5:0]   st_next;                            ///下一状态reg     [13:0]  fec_cnt;                            ///FEC块长度计数器reg     [5:0]   fwin_cnt;                           ///FEC块长度计数器reg     [5:0]   win_cnt;                            ///滑动窗计数器reg     [2:0]   cnt;                                ///计数器reg     [15:0]  length_1;                           ///FEC译码块的长度///*********************************************************************///主程序代码:///*********************************************************************/// Current State Logic (sequential)/// state_intialization///**************************************************************************// Current State Logic (sequential)// state_intialization///**************************************************************************always @(posedge sys_clk or negedge reset_b) begin    if (~reset_b)        st_current <= IDLE;    else        st_current <= st_next;endalways @(*) begin    st_next = st_current;    case(st_current)        IDLE:            if(core_gnt)                st_next = WAIT;            else                st_next = IDLE;        WAIT:            if(wr_over)                st_next = RD;            else                st_next = WAIT;        RD:            if(win_cnt < WIN_SIZE)                st_next = RD;            else                st_next = EOP;        EOP:            if(eop_sink)                st_next = DEC_ED;            else                st_next = EOP;        DEC_ED:            if(cnt>=3'd5)                st_next = DEC_AD;            else                st_next = DEC_ED;        DEC_AD:            if(dec_end | (dec_no>=ctrl2resm_miter))                st_next = IDLE;            else                st_next = RD;        default:                st_next = IDLE;    endcaseend///**************************************************************************///延迟四个时钟为了接收dec_endalways @(negedge reset_b or posedge sys_clk) begin    if(!reset_b)        cnt <= 1'b0;    else if(st_next==DEC_ED)        cnt <= cnt + 1'b1;    else        cnt <= 1'b0;end///**************************************************************************///请求信号always @(negedge reset_b or posedge sys_clk) begin    if(!reset_b)       core_req <= 1'b0;    else if((st_current == IDLE && dec_finish) || (st_current == IDLE && (~|dec_no)))   //fyz修改       core_req <= 1'b1;    else if(core_gnt)       core_req <= 1'b0;end///计数器处理reg [13:0] p_len;   ///滑动窗计数器always @(negedge reset_b or posedge sys_clk) begin    if(!reset_b) begin            p_len   <= 14'b0;    end    else begin        case(ctrl2resm_length)            14'd24:  begin                p_len   <= ctrl2resm_length[13:0] + 14'd8;            end            14'd48:  begin                p_len   <= ctrl2resm_length[13:0] + 14'd16;            end            14'd72:  begin                p_len   <= ctrl2resm_length[13:0] + 14'd24;            end            14'd120: begin                p_len   <= ctrl2resm_length[13:0] + 14'd8;            end            14'd144: begin                p_len   <= ctrl2resm_length[13:0] + 14'd16;            end            14'd216: begin                p_len   <= ctrl2resm_length[13:0] + 14'd8;            end            14'd240: begin                p_len   <= ctrl2resm_length[13:0] + 14'd16;            end            14'd36:  begin                p_len   <= ctrl2resm_length[13:0] + 14'd28;            end            14'd108: begin                p_len   <= ctrl2resm_length[13:0] + 14'd20;            end            14'd180: begin                p_len   <= ctrl2resm_length[13:0] + 14'd12;            end            default: begin                p_len   <= ctrl2resm_length[13:0];            end        endcase    endend///**************************************************************************///fwin_cnt、fec_cnt、win_cnt计数器//////**************************************************************************always @(negedge reset_b or posedge sys_clk) begin    if(!reset_b) begin        fwin_cnt <=  6'b0;        fec_cnt  <= 14'b0;        win_cnt  <=  6'b0;    end    else        case(st_current)            DEC_AD: begin                fwin_cnt <=  6'b0;                fec_cnt  <= 14'b0;                win_cnt  <=  6'b0;            end            RD: begin                if(fwin_cnt<WIN_SIZE)                    fwin_cnt <= fwin_cnt + 1'b1;                else if((fwin_cnt==WIN_SIZE) & (fec_cnt<p_len))                    fec_cnt <= fec_cnt  + 1'b1;                else if((fec_cnt==p_len) & (win_cnt<WIN_SIZE))                    win_cnt <= win_cnt  + 1'b1;                else begin                    fwin_cnt <= fwin_cnt;                    fec_cnt  <= fec_cnt;                    win_cnt  <= win_cnt;                end            end            default: begin                fwin_cnt <= fwin_cnt;                fec_cnt  <= fec_cnt;                win_cnt  <= win_cnt;            end        endcaseend///**************************************************************************///迭代次数计算///**************************************************************************always @(negedge reset_b or posedge sys_clk) begin    if(!reset_b)        dec_no <= 4'b0;    else if(st_current==IDLE)        dec_no <= 4'b0;

⌨️ 快捷键说明

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