移位寄存器是一种在若干相同时间脉冲下工作的以触发器为基础的器件,数据以并行或串行的方式输入到该器件中,然后每个时间脉冲依次向左或右移动一个比特,在输出端进行输出。
移位寄存器可以用来寄存代码,还可以用来实现数据的串行—并行转换、数值的运算以及数据的处理等。
代码实现:
module ex_shift_reg( //类似为LVDS接口,标准差分信号低电压2.5V,远距离高速传输
input wire lvds_clk,
input wire rst_n,
input wire lvds_d, //单比特数据转换
output reg [7:0] o_lvds_d
);
reg [7:0] shift_reg;// 用户存储我们的串转并的数据;
reg [2:0] s_cnt;
reg s_flag;//以组合逻辑实现
reg s_flag_dly1,s_flag_dly2;
//位拼接符——把不同位宽的数据拼接在一起
//(7'b1010_000,3'b010)--->10'b1010_000_010;等效
//用位拼接符实现移位寄存器
always @(posedge lvds_clk or negedge rst_n)
if(rst_n==1'b0)
shift_reg<= 'd0;
else
shift_reg<={lvds_d,shift_reg[7:1]};
//第一个时钟周期(0000_000 lvds_d1)
//第二个时钟周期(0000_00lvds_d1 lvds_d2)
//第八个时钟周期(lvds_d1 d2....d8)
always@(posedge lvds_clk or negedge rst_n)
if(rst_n==1'b0)
s_cnt<='b0;
else
s_cnt<=s_cnt+1'b1;
always@*//以电平触发
//如何写全敏感列表1.条件列表里的所有变量,以及赋值语句中的所有变量
if(s_cnt==3'd7)
s_flag<=1'b1;
else
s_flag<=1'b0;//这个分支条件一定要写全,不然生成锁存器,锁存器在设计中很危险
always@(posedge lvds_clk or negedge rst_n)
if(rst_n==1'b0)
o_lvds_d<='d0;
else if(s_flag==1'b1)
o_lvds_d=shift_reg;
always@(posedge lvds_clk)
(s_flag_dly2,s_flag_dly1)<=(s_flag_dly1,s_ flag);//用位拼接符号实现打拍延时
endmodule
测试代码
1ns/1ns
module tb_ex_shift_reg;
reg lvds_clock,rst_n;
reg [0:0] mem1x16 [15:0];//这是声明memory变量
reg lvds_d,i_30;
initial begin
lvds_clock=0;
rst_n=0;
#100
rst_n=1;
end
initial begin
("./data.txt",mem1x16);//readmemb代表读取二进制
end
initial begin
#100
lvds_send_d();
end
task lvds_send_d();
integer i;
begin
0;i<255;i=i+1) =
begin
lvds_clock);
mem1x16[i[3:0]]; =
i[3:0]; =
end
end
endtask
endmodule
这里介绍一种modelsim使用的便捷方法,就是使用脚本,modelsim下方是可以用脚本实现仿真的。如果单纯按键操作对于一个软件工程师将会浪费很多时间!
善于用代码解决问题本是一个软件工程师的基本素养!
#此处是注释
#退出当前仿真功能
quit -sim
#清除命令行显示信息
clear
#创建库
vlib ./lib
vlib ./lib/work
#映射逻辑库名,将逻辑库名映射库路径
vmap work ./lib/work
#
vlog -work work ./tb_ex_shift_reg.v
#..当前目录向上翻
vlog -work work ./../design/ex_shift_reg.v
vlog -work work ./../design/*.v
#启动仿真
vsim -voptargs=+acc work.tb_ex_shift_reg
#划分信号模块
add wave -divider {tb_1111}
#添加波形
add wave tb_ex_shift_reg/lvds_d
add wave tb_ex_shift_reg/o_lvds_d
add wave tb_ex_shift_reg/i_30
add wave tb_ex_shift_reg/lvds_clock
add wave tb_ex_shift_reg/rst_n
#划分信号模块
add wave -divider {ex_shift_reg_instaa}
#*是通配符匹配所有的信号
add wave tb_ex_shift_reg/ex_shift_reg_inst/*
run 100us