04 4bit移位寄存器设计与功能验证(附源码)

这篇具有很好参考价值的文章主要介绍了04 4bit移位寄存器设计与功能验证(附源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面,4位右移移位寄存器,顾名思义使用四个触发器级联,从一次输入到输出,只移动了3位,而不是4位。比如输入是1101,输出时为0001,而不是0000。


虚拟机:VMware -14.0.0.24051
环 境:ubuntu 18.04.1
脚 本:makefile(点击直达)
应用工具:vcs 和 verdi



一、Overview

(1)Theory

  • 行为级描述
    04 4bit移位寄存器设计与功能验证(附源码)

  • 结构级描述

04 4bit移位寄存器设计与功能验证(附源码)

  移位寄存器可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器等;上图是4位右移寄存器原理图,依据移位寄存器的特点,移位寄存器在时钟的控制下,可将输入数据依次往后移动,N个寄存器级联,最后输出的数据是输入数据的右移N-1位。其中,左边的空位会被补0。其中QD是串行输出端,{QA,QB,QC,QD}可实现并行输出,如果将输出端QD接到输入端QI,则可以实现自循环移位寄存器。

(2)Demand

  1. 当复位信号为0时,输出端全为0;在每个时钟的上升沿时刻,输出端的4位数据向右移一位。
  2. 使用行为级描述和结构建模方式描述。

二、Interface

Signal Name Width Direction Description
clk 1 input System clk signal, xxMhz
rst 1 input System reset signal
data 1 input Detected data
result 1 output Detection result signal

三、Timeing

04 4bit移位寄存器设计与功能验证(附源码)


四、Design and Functional Verification

(1)RTL

//行为级描述
//-- modified by xlinxdu, 2022/04/27
module shift(
  input            clk_i  ,
  input            rst_n_i,
  input            data_i ,
  output reg [3:0] out_o
);
reg [3:0] out_s;

always @ (posedge clk_i or negedge rst_n_i)begin
  if(!rst_n_i)begin
    out_s <= 4'b0;
  end
  else begin
    out_s <= {out_s[2:0],data_i};
  end
end

always @ (posedge clk_i or negedge rst_n_i)begin
  if(!rst_n_i)begin
    out_o <= 4'b0;
  end
  else begin
    out_o <= (out_s >> 3);
  end
end
 
endmodule

//结构级描述
//-- modified by xlinxdu, 2022/04/27
module shift(
  input            clk_i   ,
  input            rst_n_i   ,
  input            data_i  ,
  output reg [3:0] result_o,
  output reg [3:0] out_o
);
reg [2:0] cnt;
reg QA,QB,QC,QD;

always @ (posedge clk_i or negedge rst_n_i)begin
  if(!rst_n_i) begin
    cnt <= 2'b0;
    QA <= 1'b0;
    QB <= 1'b0;
    QC <= 1'b0;
    QD <= 1'b0;
    result_o <= 4'b0;
  end
  else begin
    QA <= data_i;
    QB <= QA;
    QC <= QB;
    QD <= QC;
    result_o <= {QD,QC,QB,QA};
  end
end

always @ (posedge clk_i or negedge rst_n_i)begin
  if(!rst_n_i) begin
    out_o <= 4'b0;
  end
  else begin
    out_o <= {out_o[2:0],QD};
  end
end
endmodule

(2)Test Bench

//行为级描述测试平台
//-- modified by xlinxdu, 2022/04/27
module tb_shift;
  reg clk_i;
  reg rst_n_i;
  reg data_i;
//  wire [3:0] result_o;
  wire [3:0] out_o;

initial begin
  clk_i = 0;
  rst_n_i = 1;
  data_i = 0;
  #10 rst_n_i = 0;
  #10;
  rst_n_i = 1;
end

always #50  clk_i = ~clk_i;
always begin
#100 data_i = 1;
#100 data_i = 1;
#100 data_i = 0;
#100 data_i = 1;
#100;
end
shift tb_shift(
                .clk_i(clk_i),
                .rst_n_i(rst_n_i),
                .data_i(data_i),
//                .result_o(result_o),
                .out_o(out_o)
              );

initial begin
  $fsdbDumpfile("shift.fsdb");
  $fsdbDumpvars              ;
  $fsdbDumpMDA               ;
  #1000 $finish             ;
end
endmodule
//结构描述测试平台
//-- modified by xlinxdu, 2022/04/27
module tb_shift;
  reg clk_i;
  reg rst_n_i;
  reg data_i;
  wire [3:0] result_o;
  wire [3:0] out_o;

initial begin
  clk_i = 0;
  rst_n_i = 1;
  data_i = 0;
  #10 rst_n_i = 0;
  #10;
  rst_n_i = 1;
end

always #50  clk_i = ~clk_i;
always begin
#100 data_i = 1;
#100 data_i = 1;
#100 data_i = 0;
#100 data_i = 1;
#100;
end
shift tb_shift(
                .clk_i(clk_i),
                .rst_n_i(rst_n_i),
                .data_i(data_i),
                .result_o(result_o),
                .out_o(out_o)
              );

initial begin
  $fsdbDumpfile("shift.fsdb");
  $fsdbDumpvars              ;
  $fsdbDumpMDA               ;
  #1000 $finish             ;
end
endmodule

五、Result

(1)行为级描述测试结果

04 4bit移位寄存器设计与功能验证(附源码)

(2)结构级描述测试结果

04 4bit移位寄存器设计与功能验证(附源码)
分析
  在行为级描述过程中,输出只与输入有关,每次只会操作就近的四位数据,之外的数据会被丢弃掉,四位内左侧补0,因为每次只有四位数据被赋值到中间变量out_s造成下一次的时候,四位以外的数据丢失了,数据不符合实际电路产生的值bug)。
  在结构级描述过程中,输出与result_o是4位寄存器的并输出端,out_o是移位后数据的输出端,其中输出的值需要看该时刻前面的完整的输入值。比如刚开始的时候,串行输入值为0110时,移位输出值为0000;串行输入值为01101时,移位输出值为0001;串行输入值为0110111时,移位输出值为0110,,依次类推,每来一个时钟,数据右移一位输出。

(3)bug分析

  针对上述情况,分析产生数据丢失的是因为中间的缓存变量每次只缓存4bit数据,而在四位移位寄存器中,要保证数据不被截取掉,至少保证数据位宽为7(移动的3bit+4bit数据)。见下表:

输入 累计数据(4bit) 移位后的数据(>>3) 累计数据(7bit) 移位后的数据(>>3)
a 000a 0000 000_000a 0000
b 00ab 0000 000_00ab 0000
c 0abc 0000 000_0abc 0000
d abcd 000a 000_abcd 000a
e bcde 000b 00a_bcde 00ab
f cdef 000c 0ab_cdef 0abc
g defg 000d abc_defg abcd
h efgh 000h bcd_efgh bcde
  • 更正后的测试波形与结构描述的一一致。
    04 4bit移位寄存器设计与功能验证(附源码)

作者:xlinxdu
版权:本文是作者原创,版权归作者所有。
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。文章来源地址https://www.toymoban.com/news/detail-446027.html

到了这里,关于04 4bit移位寄存器设计与功能验证(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LABVIEW的移位寄存器

    移位寄存器是数据的容器,可以包含任何数据类型。 添加移位寄存器后,在循环结构左右两侧的平行位置将各增加一个包含三角形的方框。左侧的方框代表上一次循环的运行结果,而右侧的代表本次循环要输入的结果。  最终得到5次循环后的结果。 接下来我们做一个通过移

    2024年02月11日
    浏览(50)
  • FPGA之移位寄存器

            SLICEM中的LUT可以配置为32位移位寄存器,而无需使用slice中可用的触发器。以这种方式使用,每个LUT 可以将串 行数据延迟 1 到 32 个时钟周期。移入D (DI1 LUT 引脚)和移出 Q31(MC31 LUT 引脚)线路将LUT级联,以形成更大的移位寄存器。因此,SLICEM 中的四个 LUT 被级联以

    2024年02月19日
    浏览(51)
  • Verilog实现移位寄存器

    Verilog实现8位环形移位寄存器 左移: 环形就是首尾相连 右移: 普通的移位寄存器用for语句实现: 普通左移: tb测试: 图形分析: 双向shift:就是加个判断

    2024年02月11日
    浏览(54)
  • HDLBits学习笔记——移位寄存器

    为了方便做笔记,从移位寄存器(Shift Registers)这章开始按章节做记录。 1.   4-bit Shift Registers 题目: Build a 4-bit shift register (right shift), with asynchronous reset, synchronous load, and enable. areset: Resets shift register to zero. load: Loads shift register with data[3:0] instead of shifting. ena: Shift right (q[3

    2023年04月08日
    浏览(57)
  • 线性反馈移位寄存器(LSFR)

    流密码的流密钥产生器可以通过线性驱动和非线性组合两部分来实现。而线性驱动部分可以由线性反馈移位寄存器(LFSR)来实现。 线性反馈移位寄存器(LFSR):通常由移位寄存器和异或门逻辑组成。其主要应用在:伪随机数,伪噪声序列,计数器,BIST,数据的加密和CRC校验等

    2024年02月17日
    浏览(48)
  • 4.3 移位寄存器的实现和应用

    在数字电路中,移位寄存器(英语:shift register)是一种在若干相同时间脉冲下工作的以触发器为基础的器件,数据以并行或串行的方式输入到该器件中,然后每个时间脉冲依次向左或右移动一个比特,在输出端进行输出。这种移位寄存器是一维的,事实上还有多维的移位寄存

    2024年02月10日
    浏览(45)
  • Verilog基础之十一、移位寄存器实现

    目录 一、前言 二、工程设计 ​2.1 工程代码 2.2 综合结果 2.3 仿真结果     移位寄存器SRL在工程中属于使用频率较高个模块,可用于存储数据,实现串并转换;根据数据移动方向可分为左移寄存器,右移寄存器,左移是向数据高位移动,右移是向数据低位移动。  工程中包

    2024年02月11日
    浏览(47)
  • 使用FPGA实现桶形移位寄存器

    我给大家介绍的是逻辑/算术左移移位寄存器。实现的功能是根据输入信号shift将输入信号进行移位,高位移除,低位补0。我建立的工程是由3个独立的桶形移位寄存器组成的。 library ieee; use ieee.std_logic_1164.all; entity barrel is      port( inp : in std_logic_vector(7 downto 0);          

    2024年04月29日
    浏览(51)
  • 用移位寄存器实现同步FIFO,带空满判断

            如图所示,同步FIFO带有push信号和pop信号,push代表往队列里面压入一个数据,pop代表往队列外面排出一个数据。         同步FIFO的空满判断用一个计数器来判断,收到push信号计数器加1,收到pop信号时计数器减1,考虑同时push和pop的情况计数器不变,当计数器为

    2024年02月14日
    浏览(57)
  • 实验四 用集成移位寄存器实现序列检测器

    一、实验要求 用移位寄存器和与非门设计一个 1101 序列检测器。电路连续不停地工作,对 串行输入的序列进行检测,当连续检测 4 个码元符合检测码 1101 时,检测器输出 为 1 ,指示灯亮,其他情况下输出为 0 ,指示灯灭。 二、实验设备 1 . Mini-FPGA 开发板( Cyclone IV 系列

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包