verilog序列生成器最少移位寄存器实现[通俗易懂]

verilog序列生成器最少移位寄存器实现[通俗易懂]verilog序列生成器最少移位寄存器实现序列生成器序列生成器实现方式移位寄存器版(输入序列版)最少移位寄存器版VCS仿真![仿真](https://img-blog.csdnimg.cn/42e1e4f55f4443faa70b38adad7c5db1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASmFydmlz56CB5ZGY,size_20,color_FFFFFF,t_7

大家好,又见面了,我是你们的朋友全栈君。

序列生成器

序列生成与序列检测都是数字电路中比较常见的电路,序列检测实现检测一个序列的是否为目标序列,序列生成 则是生成指定序列。

序列生成器实现方式

  1. 状态转移形(利用状态机转移,逐个输出序列值);需要使用序列长度的状态,如果输出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. 移位寄存器形
    移位寄存器有2中实现方式,一种是输入整个序列,在时钟驱动下不断按顺序循环输出序列中的某一位,从而实现序列的循环输出。另外一种是最少移位寄存器版,使用最少的寄存器,实现寄存器移位输出,下面分别介绍

移位寄存器版(输入序列版)

该方式需要并行输入序列然后串行输出,使用寄存器的数量等于序列的位宽,内部用于移位输出序列
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个寄存器实现状态转移,列出状态转移方程
可以最后化简卡诺图得到(是次态)
Q
2 = Q’2Q1+Q1Q’0;
Q1 = Q’2Q0+Q’1Q0;
Q
0 = Q2Q’1+Q’2Q1Q’0;
然后编写Verilog

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

`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

仿真

verilog序列生成器最少移位寄存器实现[通俗易懂]


from SDU CNSATM

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160272.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++STL容器总结[通俗易懂]

    持续更新中!!!各大容器的特点:1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map;特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的…

    2022年4月4日
    40
  • 深度学习之softmax损失函数[通俗易懂]

    深度学习之softmax损失函数[通俗易懂]深度学习之softmax损失函数归一化向量的每个元素均大于0小于1,且和为1,所以可以将其看作归属各个类别的概率。损失函数可以看作真实类别的负对数概率,希望其越小。importnumpyasnpD=784K=10N=128#scores是分值矩阵,每行代表一个样本scores=np.random.randn(N,K)print(scores.shape)#样本标签y=np.random.randint(K,size=N)print(y.shape)#指数化分值矩

    2022年6月26日
    35
  • 毕业设计 – 题目:基于stm32的智能扫地机器人设计与实现

    1课题背景随着人口老龄化的到来和人民对提升生活品质的需要,人们对在现实生活场景中取代人力的服务机器人有着迫切的需要。同时,机电、自动控制、计算机、传感器等技术的发展也为制造服务机器人提供了技术支持。扫地机器人是服务机器人中技术最成熟和最为广泛使用的机器人。它可以自动的在室内行走,通过刷扫和吸尘将地面上的碎屑吸收进垃圾收集装置中,完成清洁地面的任务,有效的减少了人们清洁地面这种简单重复的家务劳动,节约了劳动力,提高了生活品质。对于许多忙于工作和生的人来说,扫地机器人已经成为家庭必

    2022年4月6日
    97
  • oracle怎样将数据库恢复到某个时间点之前_oracle删除时间段之前的数据

    oracle怎样将数据库恢复到某个时间点之前_oracle删除时间段之前的数据deletefromtablename;insertintotablenameselect*fromtablenameasoftimestampto_timestamp(‘2017-01-0811:00:00′,’yyyy-mm-ddhh24:mi:ss’)注意:1.表结构更改了不可使用此方法恢复数据;2.时间间隔不能太长(几个小时还是没…

    2022年9月23日
    1
  • idea创建java项目_使用IDEA创建java项目(hello word)

    idea创建java项目_使用IDEA创建java项目(hello word)前提:已安装好jdk,配置好环境变量。我使用的是java8首先在自己的D盘下建一个文件夹,用来存放我们待会新建的项目,我创建了IdeaProject:1,第一步打开idea2,第二步选择创建java项目,并选择自己的jdk(我自己本地已经配置了所以有),没有可以点击new去自己的安装目录下找,一般默认安装C:\ProgramFiles\Java,然后选择next下一步3,第三步将“Creat…

    2022年7月9日
    59
  • potplayer怎么设置清晰度_potplayer输出分辨率设置

    potplayer怎么设置清晰度_potplayer输出分辨率设置今天因为要看视频,所以用到了播放器,之前就下载过potplayer和kmplayer这两个播放器,一开始发现kmp的清晰度明显高于potplayer播放器,但随之发现kmplayer有几个缺点①在使用倍速播放的过程中有频繁的卡顿现象②设置较为繁琐③网上的教程不多,维护的人少(这两个软件作者相同,potplayer是作者跳槽之后开发的版本)。 所以还是准备使用potplayer,…

    2025年11月13日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号