移位寄存器及verilog实现 并行输入串行输出

1 概念

移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,它也是数字系统中应用非常广泛的时序逻辑部件之一。

有四种不同类型的移位寄存器可用数据输入和输出设备的方式不同:

串行输入,串行输出

串行输入,并行输出

并行输入,串行输出

并行输入,并行输出
在这里插入图片描述
右移位寄存器的特点是右边寄存器的次态等于左边触发器的现态。串行输出数据从触发器FD的QD端输出,并行数据从个触发器的QA~QD端输出,两种输出方式都属于同向输出。各触发器都采用同一时钟信号,所以它们工作在同步状态。如果将FD的输出端QD接到FA的输入端DI,则可以构成循环移位的右移位寄存器。

右移寄存器

并行输入串行输出

module right_shift_pin_sout(
    clk    ,
    rst_n  ,
    //其他信号,举例dout
    sout,
    pin    
    );

    //参数定义
    parameter      DATA_W =         4;
    parameter    CNT_W=2;

    //输入信号定义
    input               clk    ;
    input               rst_n  ;
    input [DATA_W-1: 0] pin    ;

    //输出信号定义
    output  sout   ;



    //中间信号定义
    reg[CNT_W-1: 0]     cnt    ;
    wire [DATA_W-1: 0]   D    ;

    reg [DATA_W-1: 0]   Q    ;
    //计数
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            cnt<=0;
        end
        else begin
            if(cnt==DATA_W-1)begin
                cnt<=0;
            end
            else begin
                cnt<=cnt+1;
            end
         end
    end
    //D
    assign D=(cnt==0)?pin:4'b0;
    assign sout=Q[3];
    //sout
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            sout<=0;
        end
        else begin
            sout<=Q[3];
        end
    end
//Q
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            Q<=0;
        end
        else if(cnt==0)begin
            Q<=D;
        end
        else begin
            Q[3:1]<=Q[2:0]; 
        end
    end



    endmodule


tb

 `timescale 1 ns/1 ns

module testbench_name();
parameter      DATA_W =         4;
parameter    CNT_W=2;
//时钟和复位
reg clk  ;
reg rst_n;
 
wire sout;  
reg[DATA_W-1: 0]  pin ; 
        //时钟周期,单位为ns,可在此修改时钟周期。
        parameter CYCLE    = 20;

        //复位时间,此时表示复位3个时钟周期的时间。
        parameter RST_TIME = 3 ;

        //待测试的模块例化
        right_shift_pin_sout 
        #(.DATA_W(DATA_W),.CNT_W(CNT_W))  uut(
       .clk    (   clk    ), 
       .rst_n  (   rst_n  ), 
       .sout   (  sout   ),
       .pin    (   pin    ) 
            )  ;  
        

            //生成本地时钟50M
            initial begin
                clk = 0;
                forever
                #(CYCLE/2)
                clk=~clk;
            end

            //产生复位信号
            initial begin
                rst_n = 1;
                #2;
                rst_n = 0;
                #(CYCLE*RST_TIME);
                rst_n = 1;
            end

            //输入信号pin赋值方式
            initial begin
                #1;
                //赋初值
                pin =4'b1111;
                #(9*CYCLE);
                pin=4'b1000;
                #(9*CYCLE);
                pin=4'b0010;
                #(9*CYCLE);
                pin=4'b0001;
                //开始赋值

            end

endmodule


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值