不爱水的鱼

基于FPGA的m序列产生

0
阅读(3047)

 

m序列产生

  利用FPGA产生一路m伪随机序列,使用verilog HDL语言编写代码,

  //INIT_VAL 移位寄存器的初始值

  //N 移位寄存器的长度

  //C_i各级移位寄存器的系数

      //通过修改这三个参数可以得到不同长度的m序列

module m_N #(parameter INIT_VAL = 4'B1111,N = 4,C_i = 4'o23)

            (clk,rst_n,EN_n,status,PN);          

  //INPUT CLK

  input clk;//时钟信号

  input rst_n;//复位信号

  input EN_n;//使能信号,低有效

  //OUTPUT

  output PN;//PN序列输出端

  output reg status;//状态端口,用于初始化和供其他模块查询其状态

  

  reg[N-1:0] M_N;//移位寄存器

  

  parameter FREE = 1'B0,

            READY = 1'B1;

  

  assign PN = ((status == READY)  && (EN_n == 1'b0) ) ? M_N[0] : 1'B0; //在使能信号EN_n 为低时,输出m序列

  

  always@(posedge clk or negedge rst_n)

  begin

    if(!rst_n)begin  //复位处理

      M_N <= INIT_VAL;

      status <= READY;

    end

    else begin

      case(status)

           

        READY:begin

          if(EN_n == 1'b0)begin

            M_N <= {^{M_N&C_i},M_N[N-1:1]}; //减位异或移位,并反馈到M_N最左端

          end

        end

        

        default:begin

          status <= READY;

          M_N <= INIT_VAL;

        end

        

      endcase

   end

 end

  

endmodule