序列信号产生器的verilog HDL 设计

一、状态转移型的序列信号产生器的verilog HDL 设计

用一个不断循环的状态机,循环产生序列信号001011。过程过于简单,我就不画状态图了。

直接给出verilog HDL设计代码:

//有限状态机方式实现001011序列信号产生器  
module sequence_signal_fsm(clk, rst_n, dout);  
    input clk, rst_n;  
    output dout;  
    reg dout;  
    reg [2:0] pre_state, next_state;  
    parameter s0 = 3'b000, s1 = 3'b001, s2 = 3'b010,  
            s3 = 3'b011, s4 = 3'b100, s5 = 3'b101;  
    always @(posedge clk or negedge rst_n)  
        begin  
            if(rst_n == 0)  
                pre_state <= s0;  
            else  
                pre_state <= next_state;  
        end  
  
    always @(pre_state)  
        begin  
            case(pre_state)  
                s0:  
                    begin  
                        dout = 1'b0;  
                        next_state <= s1;  
                    end  
                s1:  
                    begin  
                        dout = 1'b0;  
                        next_state = s2;  
                    end  
                s2:  
                    begin  
                        dout = 1'b1;  
                        next_state = s3;  
                    end  
                s3:  
                    begin  
                        dout = 1'b0;  
                        next_state = s4;  
                    end  
                s4:  
                    begin  
                        dout = 1'b1;  
                        next_state = s5;  
                    end  
                s5:  
                    begin  
                    dout = 1'b1;  
                    next_state = s0;  
                    end  
                default: next_state = s0;  
            endcase  
        end  
  
endmodule  

测试文件为:

`timescale 1ns/1ps
module sequence_signal_fsm_tb;
	reg clk, rst_n;
	wire dout;
	
	always
		#10 clk = ~clk;
		
	initial
		begin
			clk = 1'b0;
			rst_n = 1'b1;
			#10 rst_n = 1'b0;
			#10 rst_n = 1'b1;
		end
	sequence_signal_fsm U1(.clk(clk), .rst_n(rst_n), .dout(dout));

endmodule

在Modelsim中仿真所得波形图为:


二、移位寄存器型序列信号产生器

下面描述的是一个6位移位寄存器类型的序列信号产生器,在输入端输入任意序列,通过移位寄存器,使得输入信号的最高位移入最低位,其他各位依次向左移一位,在每个时钟上升沿到来时,将输入信号的最高位通过dout输出,从而循环产生序列信号。

下面直接给出verilog HDL设计代码:

module signal_generator_shifter_reg(clk, rst, din, dout);
	input clk, rst;
	input [5:0] din;
	output dout;
	reg dout;
	reg [5:0] temp;
	
	always@(posedge clk)
		begin
			if(rst == 1'b1)
				temp <= din;
			else
				begin
					dout <= temp[5];
					temp <= {temp[4:0], temp[5]};
				end
		end
endmodule

测试代码为:

`timescale 1ns/1ps
module signal_generator_shifter_reg_tb;
	reg clk, rst;
	reg [5:0] din;
	wire dout;
	
	always
		#10 clk = ~clk;
		
	initial
		begin
			clk = 1'b0;
			rst = 1'b0;
			#10 rst = 1'b1;
			din = 6'b001011;
			#20 rst = 1'b0;
		end
	signal_generator_shifter_reg U1(.clk(clk), .rst(rst), .din(din), .dout(dout));

endmodule

在Modelsim中仿真所得波形图如下:



三、计数器加组合输出网络类型


计数型序列信号发生器的结构框图如上图示:它由计数器和组合输出网络两部分组成,序列信号从组合输出网络输出。这种类型的序列信号发生器一般分两步来设计,首先根据序列的长度M设计模M计数器,计数器的状态可以自定;然后按计数器的状态转移关系和序列码的要求设计组合输出网络。由于计数器的状态设置和输出网络没有直接的关系,因此这种结构对于输出序列的更改比较方便,而且还能同时产生多组序列码。

下面描述的为计数器加组合输出网络构成的序列信号发生器,产生001011序列信号,通过内部的3位计数器进行计数,由计数状态和输出序列的对应关系,得到其输出组合逻辑真值表,从表中可以看到,Q2Q1Q0从000开始计数并不断加1,每个状态对应一个输出Z。通过真值表可以得到卡诺图,化简后可以得到输出逻辑函数为: 

Q2

Q1

Q0

Z

0

0

0

0

0

0

1

0

0

1

0

1

0

1

1

0

1

0

0

1

1

0

1

1

输出组合逻辑真值表

下面直接给出verilog HDL 设计代码:

module counter_sequence(clk, rst, dout);
	input clk, rst;
	output dout;
	reg [2:0] counter;
	always @(posedge clk)
		begin
			if(rst == 1'b1)
				counter <= 3'b000;
			else if(counter == 3'b101)
				counter <= 3'b000;
			else counter <= counter + 1'b1;
		end
	assign dout = ((~counter[0]) & counter[1]) | counter[2];
endmodule

测试文件:

module counter_sequence_tb;
	reg clk, rst;
	wire dout;
	always
		#10 clk = ~clk;
		
	initial
		begin
			clk = 1'b0;
			rst = 1'b0;
			#10 rst = 1'b1;
			#20 rst = 1'b0;
		end
	counter_sequence U1(.clk(clk), .rst(rst), .dout(dout));
endmodule

在Modelsim中仿真所得仿真图:


猜你喜欢

转载自blog.csdn.net/reborn_lee/article/details/80378670