移位寄存器是一种在若干相同时间脉冲下工作的以触发器为基础的器件,数据以并行或串行的方式输入到该器件中,然后每个时间脉冲依次向左或右移动一个比特,在输出端进行输出。

移位寄存器可以用来寄存代码,还可以用来实现数据的串行—并行转换、数值的运算以及数据的处理等。

代码实现:
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;elseshift_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;elses_cnt<=s_cnt+1'b1;always@*//以电平触发//如何写全敏感列表1.条件列表里的所有变量,以及赋值语句中的所有变量if(s_cnt==3'd7)s_flag<=1'b1;elses_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/1nsmodule tb_ex_shift_reg;reg lvds_clock,rst_n;reg [0:0] mem1x16 [15:0];//这是声明memory变量reg lvds_d,i_30;initial beginlvds_clock=0;rst_n=0;#100rst_n=1;endinitial begin("./data.txt",mem1x16);//readmemb代表读取二进制endinitial begin#100lvds_send_d();endtask lvds_send_d();integer i;begin=0;i<255;i=i+1)beginlvds_clock);=mem1x16[i[3:0]];=i[3:0];endendendtaskendmodule
这里介绍一种modelsim使用的便捷方法,就是使用脚本,modelsim下方是可以用脚本实现仿真的。如果单纯按键操作对于一个软件工程师将会浪费很多时间!
善于用代码解决问题本是一个软件工程师的基本素养!
#此处是注释#退出当前仿真功能quit -sim#清除命令行显示信息clear#创建库vlib ./libvlib ./lib/work#映射逻辑库名,将逻辑库名映射库路径vmap work ./lib/work#vlog -work work ./tb_ex_shift_reg.v#..当前目录向上翻vlog -work work ./../design/ex_shift_reg.vvlog -work work ./../design/*.v#启动仿真vsim -voptargs=+acc work.tb_ex_shift_reg#划分信号模块add wave -divider {tb_1111}#添加波形add wave tb_ex_shift_reg/lvds_dadd wave tb_ex_shift_reg/o_lvds_dadd wave tb_ex_shift_reg/i_30add wave tb_ex_shift_reg/lvds_clockadd 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