我是靠谱客的博主 糊涂天空,最近开发中收集的这篇文章主要介绍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

最后

以上就是糊涂天空为你收集整理的Verilog实现移位寄存器的全部内容,希望文章能够帮你解决Verilog实现移位寄存器所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部