精华内容
下载资源
问答
  •  计数型序列信号发生器能产生多组序列信号,这是移位型发生器所没有的功能.计数型序列信号发生器是由计数器和组合电路构成的。  本实验的目的就是设计一个序列信号发生器。设计产生序列11100100、11100100、···...


    前言

    在数字电路中, 序列信号是指在同步脉冲作用下循环地产生一串周期性的二进制信号.能产生这种信号的逻辑器件就称为序列信号发生器。
    序列信号发生器是数字电路系统中常用的功能单元,按照序列训话长度M和触发器数目n的关系可分为三种:
    (1)最大循环长度序列码,M=2^n;
    (2)最大线性序列码(m序列码),M=(2^n)-1。
    (3)任意循环长度序列码,M<2^n。
    序列信号发生器是能够产生一组或多组的序列信号的时序电路,他可以有纯时序电路构成,也可以有包含时序和组合逻辑的混合电路构成。
    下面介绍三种设计思路,以产生100111序列的信号发生器为例。

    一、由移位寄存器构成

    单纯使用移位寄存器的序列信号发生器,由于输入输出之间没有组合电路,不需要组合逻辑反馈运算,因此电路工作频率高,但问题在于移位寄存器的长度取决于序列长度,占用电路面积大。
    代码如下(示例):

    module  signal_maker1(out,clk, load, D);
    parameter M=6;
    output out;
    input clk,load;
    input [M-1:0] D;
    reg [M-1:0] Q;
    initial Q=6'b100111;
    always @(posedge clk)
    if(load) 
    Q<=D;
    else 
    Q<={Q[M-2:0],Q[M-1]};
    assign out=Q[M];
    endmodule
    

    二、由移位寄存器和组合逻辑电路构成

    反馈移位型序列码发生器的结构框图如下图所示,它由移位寄存器和组合逻辑网络组成,从移位寄存器的某一输出端可以得到周期性的序列码。
    在这里插入图片描述
    其设计按以下步骤进行:
    (1)根据给定序列信号的循环周期M,确定移位寄存器位数n,2^(n-1)<M≤2^n
    (2)确定移位寄存器的M个独立状态。将给定的序列码按照移位规律每n位一组,划分为M个状态。若M个状态中出现重复现象,则应增加移位寄存器位数。用n+1位再重复上述过程,直到划分为M个独立状态为止.
    (3)根据M个不同的状态列出移位寄存器的态序表和反馈函数表,求出反馈函数F的表达式。
    (4)检查自启动性能。
    与上面的序列信号发生器相比,各个寄存器的输出需要经过反馈网络,然后才连接到移位寄存器的输入端。因此,电路的速度必然下降,但反馈网络的好处在于它可以节省寄存器。

    对于“100111”序列的信号发生器。
    首先,确定所需移位寄存器的个数n。因M=6,故n≥3。
    然后,确定移位寄存器的六个独立状态。
    按照规律每三位一组,划分六个状态为100、001、011、111、111、110。
    其中状态111重复出现,故取n=4,并重新划分状态,得到:1001、0011、0111、1111、1110、1100。因此确定n=4。
    第三,列态序表和反馈激励函数表,求反馈函数F的表达式。
    首先列出态序表,然后根据每一状态所需要的移位输入即反馈输入信号,列出反馈激励函数表,如下表所示。求得反馈激励函数:
    在这里插入图片描述
    在这里插入图片描述

    代码如下(示例):

    module  signal_maker(out,clk, load, D);
    parameter M=4;
    output out;
    input clk,load;
    input [M-1:0] D;
    reg[M-1:0] Q;
    wire w1;
    
    always @(posedge clk)
    if(load)
    Q<=D;
    else
    Q<={Q[M-2:0],w1};
    assign w1=(~Q[3])|((~Q[1])&(~Q[0]))|(~Q[3]&(~Q[2]));
    assign out=Q[M-1];
    endmodule
    

    仿真出来的电路如下:
    在这里插入图片描述

    三、由计数器构成

    计数型序列信号发生器和反馈型序列信号发生器大体相同,它们都是由时序电路和组合电路两部分构成。不同在于,反馈型序列信号发生器的时序状态由移位寄存器产生,输出取寄存器的最高位;而在计数型序列信号发生器中,采用计数器代替移位寄存器产生时序状态,输出由组合电路产生。

    计数型的好处在于,计数器的状态设置与输出序列没有直接关系,不需要像上面一样,根据输出确定状态。只需要将反馈网络设计好就可以了。因此计数结构对于输出序列的更改比较方便,而且只要连接到不同的反馈网络,它可以同时产生多组序列码

    在这里插入图片描述
    设计过程分为两步:第一,根据序列码的长度M设计模M计数器,状态可以自定;第二,按计数器的状态转移关系和序列码的要求设计组合输出网络。
    对于“100111”序列的信号发生器。
    序列信号的M值为6,因为需选用模6的计数器。计数器的状态选择从000到101可以得到输出的组合逻辑真值表
    在这里插入图片描述
    由真值表可画出输出Z的卡诺图,得到输出函数:
    在这里插入图片描述

    代码如下(示例):

    module signal_maker3(out,clk,reset);
    parameter M=3;
    output out;
    input clk,reset;
    reg[M-1:0] counter;
    
    always @(posedge clk)
    if(!reset) 
    count<=3'b000;
    else 
    counter<=counter+1;
    assign out=counter[2]|((counter[1])&(~counter[0]))|(counter[1]&counter[0]);
    endmodule
    

    仿真出来的电路:
    在这里插入图片描述

    展开全文
  • 伪随机序列 发生器 verilog quartus仿真,带ROM模块
  • Verilog实现m序列发生器

    万次阅读 多人点赞 2015-07-18 13:09:53
    1.m序列简介 m序列是目前广泛应用的一种伪随机序列,其在通信领域有着广泛的应用,如扩频通信,卫星通信的码分多址,数字数据中的加密、加扰、同步、误码率测量等领域。m序列在所有的伪随机序列里面的地位是最...
    1.m序列简介

    m序列是目前广泛应用的一种伪随机序列,其在通信领域有着广泛的应用,如扩频通信,卫星通信的码分多址,数字数据中的加密、加扰、同步、误码率测量等领域。m序列在所有的伪随机序列里面的地位是最基础同样也是最重要的。它的特点就是产生方便快捷,有很强的规律特性,同时自相关性、互相关特性也很好。在IS-95的反向信道中,选择了m序列的PN码作为地址码,利用不同相位m序列几乎正交的特性来为每个用户的业务信道分配了一个相位 。简单来说,n级反馈移位寄存器的状态最多由2^n 个,同时,在线性的反馈移位寄存器中,全“0”状态永不改变,所以也就是说,它的最长的周期就是 2^n - 1。
    2.m序列性质
    周期为2^n-1的m序列由以下几个特点:
    ①随机性
    在m序列的一个周期中,0和1出现概率大致相同,0码只比1码多一个,且1的个数为,0的个数为。
    ②移位可加性
    某个周期为p的m序列与其经任意延迟移位后的序列模2相加后,其结果仍是周期为p的m序列,只是原序列某次延迟移位后的序列。
    ③预先可确定性
    m序列是由移位寄存器的初始状态和反馈网络唯一确定的。
    ④游程特性
    序列中取值相同的相继元素称为一个游程。游程长度指的是游程中元素的个数。在m序列中,一共有个游程。其中长度为1的游程占总游程数的一半;长度为2的游程占总游程的1/4;长度为k的游程占总游程数的,且在长度为k的游程中,连0与连1的游程数各占一半。另外,还有一个长度为n的1游程和一个长度为(n一1)的0游程。
    3.特征方程
    image
    说明:①ci的值决定了反馈线的连接状态;
    ②在上式和后面的公式中都将“”简写为“+”;
    ③式中xi本身并无实际意义,它仅指明其系数是ci的值。
    ④特征方程f(x)决定了一个线性反馈移存器的结构,从而决定了它产生的序列的构造和周期。
    4.本原多项式
    使一个线性反馈移存器产生最长周期序列的充分必要条件是其特征方程f(x)为本原多项式。
    本原多项式是指满足下列条件的多项式:
    ①是既约的,即不能分解因子的;
    ② 可以整除(x^m + 1),m = 2^n – 1;即是( x^m + 1 )的一个因子;
    ③ 除不尽( x^q+ 1 ),q < m。
    常用本原多项式:
    image
    5.一般的线性反馈移存器方框
    image
    例:表示上式中仅x0, x1,和x4的系数c0 = c1 = c4 = 1,而其余系数c2 = c3 = 0。
    image

    6.Verilog代码
    /******************************************************************************
    功能:产生m序列 生成多项式f( x )=x^3 + x + 1
    email:lidong10280528
    作者:黎冬
    时间:2015.07.18
    ****************************************************************************/

    module m_sequence
    (
    sys_clk,
    sys_rst_n,
    out,shift
    );
    //input
    input sys_clk;
    input sys_rst_n;

    //output
    output out;//最终输出
    output [ 3:0 ]shift;//4位移位寄存器值的输出

    /***********************************************************************/

    reg [ 3:0 ]rShift;//4位移位寄存器
    reg rOut;
    always @( posedge sys_clk or negedge sys_rst_n )
    if( sys_rst_n == 0 )begin //初始化
    rShift <= 'b0110;
    rOut <= 1'b0;
    end
    else 
    begin
    rShift <= { feedback,rShift[ 3:1 ] }; //移位运算
    rOut <= rShift[ 0 ];

    end

    /************************************************************************/
    wire feedback = rShift[ 0 ]^rShift[ 3 ];
    assign out= rOut;
    assign shift = rShift;
    endmodule

    7.激励文件
    `timescale 1 ns/ 1ns
    module m_sequence_test();

    reg sys_clk,sys_rst_n;
    wire out;
    wire [ 3:0 ]shift;
    initial
    begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    #100;
    sys_rst_n = 1'b1;
    forever #20 sys_clk = ~sys_clk;
    end

    m_sequence I1
    (
    .sys_clk( sys_clk ),
    .sys_rst_n( sys_rst_n ),
    .out( out ),
    .shift( shift )
    );
    endmodule

    8.结果
    image
    default

    展开全文
  • Verilog -- 序列发生器的设计

    千次阅读 2020-06-21 12:59:10
    Verilog序列发生器的设计 @(verilog) 文章目录Verilog -- 序列发生器的设计1. 题目2. 思路1 - 状态机实现3. 思路2 - 移位寄存器实现4. 思路3 -- 计数器+组合逻辑 1. 题目 产生序列信号11010111至少需要几级...

    Verilog – 序列发生器的设计

    @(verilog)

    1. 题目

    产生序列信号11010111至少需要几级触发器?

    2. 思路1 - 状态机实现

    最容易想到的就是采用状态机,每个状态输出序列中的一位,发送完一组序列后回到开始状态继续循环。需要注意的是状态变量的位宽,由于题目要求采用最少的触发器,因此至少需要log2()log_2(序列长度)个状态,对于本题也就是3个触发器,输出逻辑可以采用always(*)纯组合逻辑实现。

    代码比较简单,就不写了。

    3. 思路2 - 移位寄存器实现

    序列的问题很多都可以用移位寄存器解决,只是移位寄存器方案可能会消耗较多的寄存器资源。
    对于本题,如果规定了模块只有三个端口:

    module seq_gen(
    input                                   clk,
    input                                   rst_n,
    output reg                              seq );
    

    那么需要在初始化的时候将移位寄存器值初始化为目标序列,或者有一个输入序列的接口,那就可以在初始化时将序列填入移位寄存器中。代码如下:

    module seq_gen(
    input                                   clk,
    input                                   rst_n,
    output                                  seq );
    
    reg [7:0]out_seq;
    always@(posedge clk or negedge rst_n)
      if(!rst_n) out_seq <= 8'b11010111;
      else out_seq <= {out_seq[6:0],out_seq[7]};
    
    assign seq = out_seq[7];
    

    移位寄存器版本至少需要序列长度个寄存器,也就是8个。

    4. 思路3 – 计数器+组合逻辑

    其实最上面的状态机版本就可以理解为计数器+组合逻辑的方法,因为状态变量相当于一个计数器。因此状态机版本的好处在于不需要考虑输出的组合逻辑怎么搭,直接case无脑就好了。而如果真的要自己手搭输出的组合逻辑呢?其实也不难,画个真值表就搞定了:

    a0 a1 a2 out
    0 0 0 1
    0 0 1 1
    0 1 0 0
    0 1 1 1
    1 0 0 0
    1 0 1 1
    1 1 0 1
    1 1 1 1

    对应的卡诺图:

    a0\a1a2 00 01 10 11
    0 1 1 0 1
    1 0 1 1 1

    化简一下得到:out = a0a1a2+a0a1 a2\overline{\overline{a_0}a_1\overline{a_2}+a_0\overline{a_1}\ \overline{a_2}}
    因此代码中只要有一个不断累加的3位计数器,配合上输出的组合逻辑表达式即可。

    在之前的文章中也提到,如果计数器级数为N, 则环形计数器可以代表的状态数为N, 扭环形计数器为2N,线性移位反馈寄存器表示的状态数为2^N-1,所以本题没办法使用N=3的上述计数器。

    展开全文
  • m序列发生器 verilog

    热门讨论 2012-07-12 23:31:43
    VERILOG 产生伪随机序列,已做仿真。仿真结果包含在工程中。
  • 序列发生器、序列校验器、序列检测器一条龙服务 序列发生器:产生指定序列 author : Mr.Mao e-mail : 2458682080@qq.com module seq_generator( input clk , input rst_n , output reg data ); //规定输出...

    序列发生器、序列校验器、序列检测器一条龙服务

    序列发生器:产生指定序列

    author : Mr.Mao
    e-mail : 2458682080@qq.com
    
    
    module seq_generator(
        input            clk ,
    	 input            rst_n ,
    	 output    reg    data 
    );
    
    //规定输出数据
        parameter HEAD  = 8'b1110_1000 ;
    	 parameter DATA0 = 8'b1111_0000 ;
    	 parameter DATA1 = 8'b0000_1111 ;
    	 parameter DATA2 = 8'b1111_1111 ;
    	 parameter DATA3 = 8'b1010_1010 ;
    	 parameter SUM   = 8'b1010_1000 ;
    	 
    	 reg [5:0] bit_cnt ;
    
    //模为48的计数器
    always @ (posedge clk or negedge rst_n)
    begin 
         if(!rst_n)
    	      bit_cnt <= 1'b0 ;
    	
         else if(bit_cnt < 6'd47)
    	      bit_cnt <= bit_cnt + 1'b1 ;
    	
         else
    	      bit_cnt <= 1'b0 ;
    end
    
    
    //输出赋值
    always @ (posedge clk or negedge rst_n)
    begin
        if(!rst_n)
    	     data <= 1'b0 ;
    		 
    	 else
    	     case(bit_cnt[5:3])
    		        3'b000 : data <= HEAD[3'd7-bit_cnt[2:0]]    ;
    			    3'b001 : data <= DATA0[3'd7-bit_cnt[2:0]]	;
    				3'b010 : data <= DATA1[3'd7-bit_cnt[2:0]]	;
    				3'b011 : data <= DATA2[3'd7-bit_cnt[2:0]]	;
    				3'b100 : data <= DATA3[3'd7-bit_cnt[2:0]]	;
    				3'b101 : data <= SUM[3'd7-bit_cnt[2:0]]     ;
    			endcase
    end
    
    endmodule
    

    序列校验器:检验序列器产生的序列是否和我们要求的一样

    author : Mr.Mao
    e-mail : 2458682080@qq.com
    
    
    module seq_rd(
         input           clk ,
    	  input           rst_n ,
    	  input           data_in ,
    	  
    	  output   [7:0]  out_data0 ,
    	  output   [7:0]  out_data1 ,
    	  output   [7:0]  out_data2 ,
    	  output   [7:0]  out_data3 ,
    	  output          out_check_flag 
    );
    
    
         reg      [5:0]   bit_cnt ;
    	  reg      [40:0]  data ;
    	  reg      [7:0]   sum ;
    	  wire     [7:0]   sum_check ;
    	  wire             head_check ;
    	  
    assign  {out_data0, out_data1, out_data2, out_data3, sum_check} = data[39:0] ;
    assign  out_check_flag = ((bit_cnt == 6'd40) && (sum_check == sum)) ;
    
    
    seq_detect u_seq_detect(
         .clk              (clk) ,
    	  .rst_n            (rst_n) ,
    	  .data_in          (data_in) ,
    	  .sout             (sout)
    );
    
    
    always @ (posedge clk or negedge rst_n)
    begin 
          if(!rst_n)
    		     begin 
    			      bit_cnt <= 6'b0 ;
    					data <= 40'b0 ;
    			  end
    			  
    		else if(head_check) 
    		     begin
    			      bit_cnt <= 6'd1 ;
    					data[0] <= data_in ;
    			  end
    			  
    		else if(bit_cnt < 6'd40)
    		     begin
    			      bit_cnt <= bit_cnt + 1'b1 ;
    					data[0] <= data_in ;
    					data[40:1] <= data[39:0] ;
    				end
    		
    		else  
    		     begin
    			      bit_cnt <= 6'b0 ;
    			  end
    end
    
    
    always @ (posedge clk or negedge rst_n)
    begin 
          if(!rst_n)
    		    sum <= 8'b0 ;
    			
    		else if(head_check)
    		    sum <= 8'b0 ;
    			 
    		else if(bit_cnt[2:0] == 3'b111 && bit_cnt[5] != 1'b1)
    		    sum <= sum + {data[6:0], data_in} ;
    end
    
    endmodule
    

    序列检测器:检测要求序列

    author : Mr.Mao
    e-mail : 2458682080@qq.com
    
    module seq_detect(      //时序检测
          input        clk ,  //时钟输入
    		input        rst_n ,  //复位信号
    		input        data_in ,  //串行数据输入
    		output wire  sout   //序列检测输出
    );
    
    
    parameter s0 = 0, s1 = 1, s2 = 2, s3 = 3, s4 = 4, s5 = 5, s6 = 6, s7 = 7, s8 = 8 ;
    
    reg  [3:0]          current_state ;
    reg  [3:0]          next_state ;
    
    
    /*现状态的跳转*/
    always @(posedge clk or negedge rst_n)
    begin
         if(!rst_n)
    	      current_state <= s0 ;
    		else 
    		   current_state <= next_state ;
    end
    
    always @(*)
    begin 
         case(current_state)   /*现状态的跳转触发次状态的判断*/
    	      s0 : if(data_in == 1'b1)  next_state <= s1 ; else next_state <= s0 ;
    			s1 : if(data_in == 1'b1)  next_state <= s2 ; else next_state <= s0 ;
    			s2 : if(data_in == 1'b1)  next_state <= s3 ; else next_state <= s0 ;
    			s3 : if(data_in == 1'b0)  next_state <= s4 ; else next_state <= s3 ;
    			s4 : if(data_in == 1'b1)  next_state <= s5 ; else next_state <= s0 ;
    			s5 : if(data_in == 1'b0)  next_state <= s6 ; else next_state <= s2 ;
    			s6 : if(data_in == 1'b0)  next_state <= s7 ; else next_state <= s1 ;
    			s7 : if(data_in == 1'b0)  next_state <= s8 ; else next_state <= s1 ;
    			s8 : if(data_in == 1'b0)  next_state <= s0 ; else next_state <= s1 ;
    			default : next_state <= s0 ;
    		endcase
    end
    
    assign sout = (current_state ==s8) ; /*检测结果输出*/
    
    endmodule
    
    //force data_in 1 0,0 300ns,1 400ns,0 500ns -repeat 800ns	
    //这段命令在Moedelsim命令窗口执行,模拟‘11101000’	输入激励
    

    序列检测器的testbench代码

    `timescale 10 ns/ 100 ps
    module seq_detect_tb();
    
    reg clk ;
    reg data_in ;
    reg rst_n ;
    wire sout ;
    
    
    seq_detect i_seq_detect(
          .sout         (sout),
    		.clk          (clk),
    		.data_in      (data_in),
    		.rst_n        (rst_n)
    );
       
    	  initial
    	      begin
    			clk <= 0 ;
    			rst_n <= 0 ;
    			#10 rst_n <= 1'b1 ;
    			@(negedge clk)
    			repeat(10)
    			   begin
    				   data_in <= $random ;
    					#10 ;
    				end
    				data_in <= 1 ;
    				#10     data_in <= 1 ;
    				#10     data_in <= 1 ;
    				#10     data_in <= 1 ;
    				#10     data_in <= 0 ;
    				#10     data_in <= 1 ;
    				#10     data_in <= 0 ;
    				#10     data_in <= 0 ;
    				#10     data_in <= 0 ;
    			repeat(10)
    			    begin
    				    data_in <= $random ;
    					 #10 ;
    				 end
    			#100   $stop ;
    			end
    			
    			
    		always     #5
    		    begin
    			    clk <= ~clk ;
    			 end
    endmodule
    				
    				
    
    展开全文
  • 此程序是用verilog语言实现的伪随机序列,程序里面对同步字节、数据包、数据帧都有说明,使得程序明白易懂。 此程序是用verilog语言实现的伪随机序列,程序里面对同步字节、数据包、数据帧都有说明,使得程序明白...
  • 文章目录m序列发生器什么是m序列发生器如何实现m序列发生器如何得到m序列的反馈方程 m序列发生器 什么是m序列发生器 m序列发生器的概念在《数字电路》这门课里讲的比较详细了,这里就不给大家详细复习了。简而言之,...
  • verilog】十一、m序列发生器

    千次阅读 2020-07-04 11:55:57
    m序列:最长线性反馈移位寄存器序列的简称。是一种伪随机序列、伪噪声码。 伪随机序列:不能预先确定但可以重复实现的序列。 二、原理 递推方程: 特征方程: x^i仅指明其系数代表ci的值,x本身的...
  • 序列发生器

    2015-04-22 21:26:19
    Verilog语言实现序列发生器,产生一段序列,供您用于实现别的程序。
  • 基于LFSR的伪随机序列发生器

    千次阅读 2018-04-18 21:11:45
    伪随机序列在现在的数字电路设计中还是蛮重要的,在找工作面试中也会碰到,因此整理一下伪随机序列发生...整理一下线性反馈移位寄存器和Verilog编写的序列发生器模块。 这是一个典型的线性反馈移位寄存器。通过选取系数
  • 求问, 用verilog编写了一个伪随机序列发生器,产生01二进制码流,仿真与signaltap信号抓取没有问题,但是连接到示波器显示的波形却像噪音一样
  • EDA序列信号发生和检测设计实验程序,用Verilog语言设计的,下载到实验仪器测试成功
  • m序列发生器

    2014-04-15 10:52:45
    verilog写的m序列生成,3阶的,并3位一组输出,quartus编译通过,modelsim仿真验证过。
  • Verilog作业,模55加法器_信号发生器(fsm)_序列检测器(fsm),包括设计代码,测试代码,仿真波形
  • 数字IC设计-FPGA——用Verilog实现序列检测(有限状态机) 序列检测:有“101”序列输入时输出为1,其他输入情况下,输出为0。画出状态转移图,并用Verilog描述。 “101” 序列检测 序列检测在数据通讯,...
  • 一篇关于FPAG的文章,讨论的是混沌调频序列发生器verilog语言的实现
  • 序列发生器的设计

    2021-06-17 20:31:37
    Verilog序列发生器的设计 产生序列信号11010111至少需要几级触发器? 思路1 - 状态机实现 最容易想到的就是采用状态机,每个状态输出序列中的一位,发送完一组序列后回到开始状态继续循环。需要注意的是状态...
  • Verilog HDL 之 序列信号发生器 一、原理  在数字电路中, 序列信号是指在同步脉冲作用下循环地产生一串周期性的二进制信号.能产生这种信号的逻辑器件就称为序列信号发生器.根据结构不同,它可分为反馈移位型和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 864
精华内容 345
关键字:

verilog序列发生器