一、状态转移型的序列信号产生器的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中仿真所得仿真图: