📄 ctc_mctrl.v
字号:
///*********************************************************************/// 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 + -