博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

QAM调制---Verilog代码

Posted on 2020-06-06 17:57  沉默改良者  阅读(910)  评论(0编辑  收藏  举报

QAM调制---Verilog代码

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2020/05/28 11:41:08
// Design Name: 
// Module Name: DATA_16QAM_mapper
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


//原书提供的代码是有问题的!!!


module DATA_16QAM_mapper(

    input               wire                   DM_CLK,
    input               wire                   DM_RST,
    input               wire                   DM_DIN,
    input               wire                   DM_ND,
    output              reg       [7:0]        DM_RE,
    output              reg       [7:0]        DM_IM,
    output              reg       [5:0]        DM_INDEX,
    output              reg                    DM_RDY

    );

//----------------------------------------------------------------------

reg[3:0] STOR;
reg[1:0] counter;
reg      MAPEN;
reg      OUTEN;
reg[7:0] RE_TEMP;    
reg[7:0] IM_TEMP;
reg[5:0] DM_COUNT;
reg      OUTEN;
reg[1:0] OUT_COUNT;


always @(negedge DM_RST or posedge DM_CLK)
begin
    if(!DM_RST)
    begin
        MAPEN<=1'b0;
        STOR[3:0] <= 4'b0000;
        counter[1:0] <= 2'b00;
        RE_TEMP[7:0]<=8'b00000000;
        IM_TEMP[7:0]<=8'b00000000;
        OUTEN<=0;
        DM_RE[7:0]<=8'b00000000;
        DM_IM[7:0]<=8'b00000000;
        DM_COUNT[5:0]<=6'b000000;
        DM_INDEX[5:0]<=6'b000000;
        DM_RDY<=0;
        OUT_COUNT<=2'b00;

    end
    else 
    begin
        if(DM_ND)
        begin
            counter<=counter+1;
            case(counter)
                2'b00:STOR[0]<=DM_DIN;
                2'b01:STOR[1]<=DM_DIN;           //存入输入数值
                2'b10:STOR[2]<=DM_DIN;
                2'b11:STOR[3]<=DM_DIN;
           endcase
        end
        else 
        begin
            counter <=2'b00; 
              STOR  <=4'b0000;
        end

        if (counter==2'b11)       // MAPEN 标记四个信号是否已经存入
            MAPEN<=1'b1;
        else
            MAPEN<=1'b0;

        if(MAPEN)
        begin
               case(STOR[1:0])
                2'b00:RE_TEMP[7:0]<=8'b11000011;
                2'b10:RE_TEMP[7:0]<=8'b11101100;
                2'b01:RE_TEMP[7:0]<=8'b00111101;
                2'b11:RE_TEMP[7:0]<=8'b00010100; 
               endcase
            case(STOR[3:2])
                2'b00:IM_TEMP[7:0]<=8'b11000011;
                2'b10:IM_TEMP[7:0]<=8'b11101100;
                2'b01:IM_TEMP[7:0]<=8'b00111101;
                2'b11:IM_TEMP[7:0]<=8'b00010100;
            endcase
            OUTEN<=1;
        end
        else
        begin
            OUTEN<=0;
            RE_TEMP[7:0]<=8'b00000000;
            IM_TEMP[7:0]<=8'b00000000;
        end

        if(OUTEN)
        begin
           DM_RE<=RE_TEMP;
              DM_IM<=IM_TEMP;

              if(DM_COUNT==47)
                      DM_COUNT<=0;
           else
                   DM_COUNT<=DM_COUNT+1;

           DM_INDEX<=DM_COUNT;
           DM_RDY<=1'b1;
        end

        if (DM_INDEX==47)
           OUT_COUNT<=OUT_COUNT+1;

        if (OUT_COUNT==2'b11)
        begin
           DM_RE[7:0]<=8'b00000000;
           DM_IM[7:0]<=8'b00000000;
           DM_INDEX[5:0]<=6'b000000;
           DM_COUNT[5:0]<=6'b000000;
           DM_RDY<=0;
        end
    end
end

endmodule