我是靠谱客的博主 称心月饼,最近开发中收集的这篇文章主要介绍HDLbits笔记-移位寄存器Circuits----sequential Logic前言一、shift registers(移位寄存器)二、算术移位寄存器三、线性反馈移位寄存器(LFSR)总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Circuits----sequential Logic

文章目录

  • Circuits----sequential Logic
  • 前言
  • 一、shift registers(移位寄存器)
    • 1.异步置零的移位寄存器
    • 2.环形移位寄存器
  • 二、算术移位寄存器
    • 1题目
  • 三、线性反馈移位寄存器(LFSR)
  • 总结


前言

计算机中补码的形式存在,所以看补码的算术移位和逻辑移位

一、shift registers(移位寄存器)

对于逻辑移位,就是不考虑符号位,移位的结果只是数据所有的位数进行移位。
左移:低位补0
右移:高位补0
例:
01010101>>3=00001010
01101011<<3=01011000

1.异步置零的移位寄存器

移位寄存器
移位补0

module top_module(
    input clk,
    input areset,  // async active-high reset to zero
    input load,//Data is loaded at high levels
    input ena,//High levels shift data to the right
    input [3:0] data,
    output reg [3:0] q); 

    always@(posedge clk or posedge areset)begin
        if(areset)
            q <= 4'd0;
        else if(load)
            q <= data;
        else if(ena)
            q <= {1'b0,q[3:1]};//q <= q[3:1]; Use vector part select to express a shift.
        else
            q <= q;
    end
            
endmodule

2.环形移位寄存器

环形移位寄存器
以图为例子,数组data的大小为5,值分别为{0,1,2,3,4},循环右移3位

移动三位

module top_module(
    input clk,
    input load,
    input [1:0] ena,
    input [99:0] data,
    output reg [99:0] q); 

    always@(posedge clk)begin
        if(load)
            q <= data;
        else
            begin
                case(ena)
                    2'b01: q <= {q[0],q[99:1]};
                    2'b10: q <= {q[98:0],q[99]};
					default: q <= q;
                endcase
            end
    end
    
endmodule

二、算术移位寄存器

左移:属于逻辑移位,补’0’
右移:属于算术移位,补’符号位’

例:
01010101>>3=00001010(正数右移)
11010101>>3=11111010(负数右移)
01101011<<3=01011000
(补码的算术移位运算)

1题目

Build a 64-bit arithmetic shift register, with synchronous load. The shifter can shift both left and right, and by 1 or 8 bit positions, selected by amount.
(64位算术移位寄存器)
load: Loads shift register with data[63:0] instead of shifting.
ena: Chooses whether to shift.
amount: Chooses which direction and how much to shift

  • 2’b00: shift left by 1 bit.
  • 2’b01: shift left by 8 bits.
  • 2’b10: shift right by 1 bit.
  • 2’b11: shift right by 8 bits.

代码如下(示例)

module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg [63:0] q); 

    always@(posedge clk)begin
        if(load)
            q <= data;
        else if(ena)
            case(amount)
                2'b00: q <= {q[62:0],1'd0};
                2'b01: q <= {q[55:0],8'd0};
                2'b10: q <= {q[63],q[63:1]};
                2'b11: q <= {{8{q[63]}},q[63:8]};
            endcase
        else
            q <= q;
    end
            
endmodule

三、线性反馈移位寄存器(LFSR)

LFSR的反馈函数就是简单地对移位寄存器中的某些位进行异或,并将异或的结果填充到LFSR的最左端,如图所示。对于LFSR中每一位的数据,可以参与异或,也可以不参与异或。其中,我们把参与异或的位称为抽头(taps)。
下图taps在 5 和 3
HLD
构造线性移位寄存器,reset应当使LFSR归1
代码如下(示例)

module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 5'h1
    output [4:0] q
); 

    always@(posedge clk)begin
        if(reset)
            q <= 5'h1;
        else begin
            q[4] <= 1'b0 ^ q[0];
            {q[3],q[1],q[0]} <= {q[4],q[2],q[1]};
            q[2] <= q[3] ^ q[0];
        end
    end
endmodule

总结

在这里插入图片描述

最后

以上就是称心月饼为你收集整理的HDLbits笔记-移位寄存器Circuits----sequential Logic前言一、shift registers(移位寄存器)二、算术移位寄存器三、线性反馈移位寄存器(LFSR)总结的全部内容,希望文章能够帮你解决HDLbits笔记-移位寄存器Circuits----sequential Logic前言一、shift registers(移位寄存器)二、算术移位寄存器三、线性反馈移位寄存器(LFSR)总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部