0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

移位寄存器的设计与实现

FPGA设计论坛 来源:CSDN技术社区 作者:ECC&SM9 2022-09-06 11:35 次阅读

移位寄存器(左移、右移、双向)的Verilog实现

移位寄存器的功能和电路形式较多,按移位方向分有左移、右移、和双向移位寄存器;按接收数据方式分为串行输入和并行输入;按输出方向分为串行输出和并行输出。

如果将若干个触发器级联成如下图所示电路,则构成基本的移位寄存器。图中是一个4位移位寄存器,串行二进制数据从输入端Dsi输入,左边触发器的输出作为右邻触发器的数据输入。若将串行数码D3D2D1D0从高位(D3)至低位(D0)按时钟脉冲间隔依次送到Dsi端,经过第一个时钟脉冲后,Q0=D3。由于跟随D3后面的是D2,因此经过第二个时钟脉冲后,触发器FF0的状态移入触发器FF1而FF0转变为新的状态,即Q1=D3,Q0=D2。以此类推,输入数码依次由左侧触发器移到右侧触发器。经过4个时钟脉冲后,4个触发器的输出状态Q3Q2Q1Q0与输入数码D3D2D1D0相对应。这样,就将串行输人数据转换为并行输出数据Dpo。

1afba39c-2d8d-11ed-ba43-dac502259ad0.png

一般来说,N位移位寄存器要由N个触发器构成,需要N·Tcp来完成串行到并行的数据转换,同样也需要N・Tcp来实现并行到串行的数据输出。这里,Tcp为时钟周期。从上述操作可以看出,移位寄存器只能用脉冲边沿敏感的触发器,而不能用电平敏感的锁存器来构成,因为在时钟脉冲高电平期间,锁存器输出跟随输入变化的特性将使移位操作失去控制。显然,移位寄存器属于同步时序电路。

1.基本移位

首先说明“由于国家标准规定,逻辑图中最低有效位(LSB)到最高有效位(MSB)的电路排列顺序应从上到下,从左到右。因此定义移位寄存器中的数据从低位触发器移向高位为右移,反之则为左移。这一点与通常计算机程序中规定相反,后者从自然二进制数的排列考虑,将数据移向高位定义为左移,反之为右移。”此内容摘自《电子技术基础-数字部分》康华光主编教材。

module shifter( din, clk, rst, dout,done);

input din, clk, rst;

output [7:0] dout;

output reg done; //完成移位

reg [7:0] dout;

reg [3:0] cnt;

always @(posedge clk)

begin

if(rst) //清零

dout <= 8’b0;

else if(cnt<=4’d7)

begin

dout<=dout>>1; //左移

dout[7]<=din;

/*dout <= dout<<1;

dout[0] <= din; */ //右移

end

else

dout<=dout;

end

always@(posedge clk)

begin

if(rst)

begin

cnt<=4'd0;

done<=1'b0;

end

else if(cnt==4'd7)

begin

cnt<=4'd0;

done<=1'b1;

end

else begin

cnt<=cnt+1'b1;

done<=1'b0;

end

end

endmodule

仿真结果图

1b195554-2d8d-11ed-ba43-dac502259ad0.png

2.双向移位

双向移位实现数据保持、右移、左移、并行置数、并行输出。

module two_way(

input clk,

input rst,

input s0,s1, //选择输入端口

input din1,din2, //串行数据输入

input [3:0] d, //并行数据输入

output reg [3:0] q //输出端口

);

always@(posedge clk or negedge rst)

begin

if(!rst)

q<=4'd0;

else begin

case({s1,s0})

2'b00: q<=q;  //输出保持不变

2'b01: q<={q[2:0],din1};  //右移

2'b10: q<={din2,q[3:1]};  //左移

2'b11: q<=d;         //并行置数

endcase

end

end

endmodule

1b30969c-2d8d-11ed-ba43-dac502259ad0.png

仿真结果图

总结一般掌握左移、右移方法即可,并根据实际需求加以应用,串并转换也适用。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109302
  • 移位寄存器
    +关注

    关注

    2

    文章

    182

    浏览量

    22021
  • 触发器
    +关注

    关注

    14

    文章

    1681

    浏览量

    60406

原文标题:移位寄存器(左移、右移、双向)的Verilog实现

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [4.4.1]--移位寄存器实现序列发生

    信号发生
    学习电子知识
    发布于 :2022年12月13日 19:43:12

    数字逻辑电路:移位寄存器实现序列发生(1)#硬声创作季

    数字逻辑电路
    学习硬声知识
    发布于 :2022年12月30日 18:30:59

    55 0806_02 使用移位寄存器实现一行数据寄存 - 第1节

    移位寄存器
    充八万
    发布于 :2023年08月19日 17:38:17

    55 0806_02 使用移位寄存器实现一行数据寄存 - 第2节 #硬声创作季

    移位寄存器
    充八万
    发布于 :2023年08月19日 17:39:08

    55 0806_02 使用移位寄存器实现一行数据寄存 - 第3节 #硬声创作季

    移位寄存器
    充八万
    发布于 :2023年08月19日 17:39:58

    55 0806_02 使用移位寄存器实现一行数据寄存 - 第4节 #硬声创作季

    移位寄存器
    充八万
    发布于 :2023年08月19日 17:40:48

    55 0806_02 使用移位寄存器实现一行数据寄存 - 第5节

    移位寄存器
    充八万
    发布于 :2023年08月19日 17:41:39

    55 0806_02 使用移位寄存器实现一行数据寄存 - 第6节

    移位寄存器
    充八万
    发布于 :2023年08月19日 17:42:29

    用labview模拟掷骰子次数,只能用一个移位寄存器实现

    程序给出掷骰子次数,输出掷骰子后骰子各面出现的次数。如果用多个移位寄存器的可以实现,也正确。但是用一个移位寄存器实现,却输出不正确。不知道哪儿错了?
    发表于 08-16 21:46

    labview移位寄存器实现闪灯报错

    必须将循环内部的有效数据类型连接至位于循环右侧边框的移位寄存器,或者删除该移位寄存器。怎么理解
    发表于 10-25 23:29

    Matlab移位寄存器实现

    本文主要介绍Matlab如何实现移位寄存器,首先介绍的是移位寄存器的原理及作用,其次介绍了m序列的生成原理及m序列的matlab 仿真实现,最后介绍了Matlab如何
    发表于 06-20 04:20

    一维数组自动在末尾添加元素,不使用移位寄存器怎么实现

    一维数组自动在末尾添加元素,不使用移位寄存器怎么实现比如我有一个字符串 想要存入这个数组末尾也就是数组索引3在位置插入字符串a,然后在下一循环又自动添加在数组索引5当中怎么能实现,不能用移位寄
    发表于 04-23 16:41

    寄存器移位寄存器

    寄存器移位寄存器:介绍寄存器原理和移位寄存器的原理及实现
    发表于 05-20 11:47 0次下载

    线性反馈移位寄存器原理与实现

    线性反馈移位寄存器(LFSR)是一个产生二进制位序列的机制。这个寄存器由一个初始化矢量设置的一系列信元组成,最常见的是,密钥。这个寄存器的行为被一个时钟调节。
    发表于 12-22 09:37 4.7w次阅读
    线性反馈<b class='flag-5'>移位寄存器</b>原理与<b class='flag-5'>实现</b>

    移位寄存器实现边沿检测的技巧

    本文记录一下关于用移位寄存器实现边沿检测的技巧。要学会硬件思维式的“模块式”读写代码,那么请多看别人的代码,并用ISE或者VIVADO综合出来看看。 边沿检测 边沿检测,顾名思义,就是检查信号的边沿
    发表于 04-15 10:26 2974次阅读