概述
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
最后
以上就是奋斗往事为你收集整理的移位寄存器及verilog实现 并行输入串行输出1 概念右移寄存器的全部内容,希望文章能够帮你解决移位寄存器及verilog实现 并行输入串行输出1 概念右移寄存器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复