大家好,又见面了,我是你们的朋友全栈君。
verilog序列生成器最少移位寄存器实现
- 序列生成器
-
- 序列生成器实现方式
- 移位寄存器版(输入序列版)
- 最少移位寄存器版
- 仿真
序列生成器
序列生成与序列检测都是数字电路中比较常见的电路,序列检测实现检测一个序列的是否为目标序列,序列生成 则是生成指定序列。
序列生成器实现方式
- 状态转移形(利用状态机转移,逐个输出序列值);需要使用序列长度的状态,如果输出001011该序列则需要使用6个状态,每个状态中输出0-0-1-0-1-1; 2.计数形(计数与组合逻辑相结合,通过卡诺图化简得到计数值与输出的关系)计算输出与计数器中的状态寄存器的关系,可以看出实现该序列最少需要3个寄存器,2^3>=6,根据计数器的状态转移001-010-011-100-101-110,dout在计数011、101、110的时候输出1,画出卡诺图化简,计算输出dout = Q’0Q1 Q2,编写verilog的让输出等于寄存器组合逻辑就实现了
- 移位寄存器形 移位寄存器有2中实现方式,一种是输入整个序列,在时钟驱动下不断按顺序循环输出序列中的某一位,从而实现序列的循环输出。另外一种是最少移位寄存器版,使用最少的寄存器,实现寄存器移位输出,下面分别介绍
移位寄存器版(输入序列版)
代码语言:javascript复制该方式需要并行输入序列然后串行输出,使用寄存器的数量等于序列的位宽,内部用于移位输出序列
代码语言:javascript复制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
可以看出din如果不输入原序列则无法串行输出序列。
最少移位寄存器版
该方式的实现,主要是基于序列内容,找到寄存器状态转移过程, 比如要实现001011序列。需要找到状态转移的寄存器,可以看到最少需要3个寄存器,最多需要6个寄存器, 先从3个寄存器Q2Q1Q0开始查找写出状态转移 状态转移为001-010-101-011-110-100,可以看出首位Q2的值就是序列输出的值001011. 注意状态转移中不能出现相同的状态,出现了则状态转移则会回到重复的时候继续执行。当然实现方式有可能不只有一种, 像001-010-101-011-111-110 也可以,状态中没有出现重复,该状态转移也能实现序列001011 也可以用4个寄存器实现, 比如0010-0101-1011-0110-1100-1000 或者0010-0101-1011-0111-1110-1100, 可以看出实现移位寄存器有可能不只有一种状态转移,但是要保证状态转移中不能出现重复状态就行,有时候一个序列变长一点,0010010.这个序列使用3个寄存器的话,状态转移为: 001-010-100-001-, 发现出现了重复,所需实现该序列使用3个寄存器是实现不了的,只能增加寄存器数量接着查找状态转移。,其找状态转移的基本原理就是如此,找到状态转移后,化简卡诺图,得到逻辑表达式 以序列001011为例。最少使用3个寄存器实现状态转移,列出状态转移方程 可以最后化简卡诺图得到(是次态) Q2 = Q’2Q1 Q1Q’0; Q1 = Q’2Q0 Q’1Q0; Q0 = Q2Q’1 Q’2Q1Q’0; 然后编写Verilog
代码语言:javascript复制module sequence(
input clk,
input rst_n,
output seq
);
reg [2:0] state;
wire [2:0] state1;
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
state <= 3'h1;
else begin
state <= state1;
end
end
assign seq = state[2];
assign state1[0] = (state[2]&!state[1])|(!state[2]&state[1]&!state[0]);
assign state1[1] = (!state[1]&state[0] )|(!state[2]&state[0]);
assign state1[2] = ((!state[2])&state[1]) | (state[1]&!state[0]);
endmodule
testbench
代码语言:javascript复制`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2020/02/21 00:35:17
// Design Name:
// Module Name: seq_gen_tsb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module seq_gen_tsb(
);
// port
reg clk;
reg rst_n;
wire seq;
// clk
initial
begin
clk = 1'b1;
forever #10 clk = ~clk;
end
//
initial
begin
rst_n = 1'b1;
#20 rst_n = 1'b0;
#50 rst_n = 1'b1;
end
// instantation
sequence inst(
.clk(clk),
.rst_n(rst_n),
.seq(seq)
);
endmodule
仿真
from SDU CNSATM
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160272.html原文链接:https://javaforall.cn