Verilog实现移位寄存器「建议收藏」

Verilog实现移位寄存器「建议收藏」移位寄存器

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

Verilog实现8位环形移位寄存器

左移: 环形就是首尾相连

module shift_regist (
    input  wire clk,
    input wire rstn,
    input wire [7:0]D,
    output reg [7:0]Q
);
always @(posedge  clk  or  negedge  rstn) begin
    if(!rstn)
        Q<=8'b000000;
    else
         Q<={ 
   D[6:0],D[7]} ;    
end
endmodule //shift_regist 

右移:

module shift_regist (
    input  wire clk,
    input wire [7:0]D,
    input wire rstn,
    output reg [7:0]Q
);
always @(posedge  clk ) begin
        if(!rstn)
        Q<=8'b000000;
    else
         Q<={ 
   D[0],D[7:1]} ;    
end
endmodule //shift_regist  

普通的移位寄存器用for语句实现:

module shift_regist2(Q,D,rst,clk);
    output [7:0] Q;
    input D,rst,clk;
    reg [7:0] Q;
    integer i;
always @(posedge clk)
    if (!rst) 
        Q<=8'b000000;
    else
      	for (i=7;i>0;i=i-1)
        begin
            Q[i]<=Q[i-1];  
                Q[0]<=D;
            end
endmodule 

普通左移:

//8 bit shift register
module shift_regist(
  input d,
  input rstn,
  input clk,
  output reg [7:0]q
);
  always@(posedge clk or negedge rstn)begin
    if(!rstn)
      q <=8'b0;
    else
      q <={ 
   q[6:0],d};
  end
endmodule

tb测试:

module tb;
  reg d,rstn,clk;
  wire [7:0]q;

  shift_regist u_shift(d,rstn,clk,q);

  initial begin
    rstn=0;
    clk=0;
    #5
    rstn=1;
  end

  always #5 clk=~clk;

  initial begin
    d=0;
    #10 d=0; //00
    #10 d=1; //001
    #10 d=1; //0011
    #10 d=0; //00110
    #10 d=0;
    #10 d=1;
    #10 d=1;
    #10 d=0;
    #10 d=1;
    #10 $finish;
  end
endmodule

图形分析:
在这里插入图片描述

双向shift:就是加个判断

always@(posedge clk)begin
	if(dir==0)
		sf<={ 
   sf[2:0],din};
	else
		sf<={ 
   din,sf[3:1]};
end
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • C++ this指针

    C++ this指针this指针引言:首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。注意:this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。this指针的类型取决于…

    2022年5月17日
    44
  • phpstorm 常用快捷键

    phpstorm 常用快捷键

    2022年3月2日
    72
  • 三极管的使用方法,放大,截止,饱和[通俗易懂]

    三极管的使用方法,放大,截止,饱和[通俗易懂]1.首先认识清楚三极管的管脚                       参考资料万用表区分mos管引脚2.知道管脚我们也就知道NPN和PNP了,箭头朝内PNP,导通电压顺箭头过,电压导通,电流控制。那箭头朝外的自然就是NPN了!NPN管工作在放大区的时候:集电极电压&gt;基极电压&gt;发射极电压也就是:Vc&gt;Vb&gt;Ve …

    2025年10月20日
    2
  • Java实现Date日期加一天[通俗易懂]

    Java实现Date日期加一天[通俗易懂]因为在项目中遇到了需要将日期进行加减一些天数的操作,但是自己加需要考虑到跨月的情况,所以便找了Java提供的相关的API,方法如下date=newdate();//取时间Calendarcalendar=newGregorianCalendar();calendar.setTime(date);calendar.add(calendar.DATE,1);//把日期往……

    2022年7月26日
    47
  • TC_P_Windows 安裝Eclipse

    TC_P_Windows 安裝Eclipse

    2021年8月6日
    55
  • PPT 中插入域代码公式的方法

    PPT 中插入域代码公式的方法PPT中插入域代码公式的方法插入对象,选择Word*Document,或OpenDocument都可以; 在新打开的页面中,选择插入文档部件,再选择域代码; 在域代码选项中,选择Eq,具体语法如下。域代码:Eq(公式)域注意:我们希望能够尽快以你的语言为你提供最新的帮助内容。本页面是自动翻译的,可能包含语法错误或不准确之处。我们的目的是使此内容能对你有所帮助。可以在本页面底部告诉我们此信息是否对你有帮助吗?请在此处查看本文的英文版本以…

    2022年6月1日
    232

发表回复

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

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