首页/文章/ 详情

FPGA入门4——移位寄存器应用

1年前浏览432


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



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


代码实现:













































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

测试代码





































`timescale    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  $readmemb ("./data.txt",mem1x16);//readmemb代表读取二进制end
initial  begin  #100  lvds_send_d();
end  
task  lvds_send_d();  integer  i;  begin    for(i=0;i<255;i=i+1)    begin      @(posedge  lvds_clock);      lvds_d<=mem1x16[i[3:0]];      i_30<=i[3:0];    end  endendtaskendmodule

这里介绍一种modelsim使用的便捷方法,就是使用脚本,modelsim下方是可以用脚本实现仿真的。如果单纯按键操作对于一个软件工程师将会浪费很多时间!

善于用代码解决问题本是一个软件工程师的基本素养!











































#此处是注释
#退出当前仿真功能quit -sim
#清除命令行显示信息.main 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


来源:集成电路小刚
通用理论
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-27
最近编辑:1年前
集成电路小刚
硕士 立志成为集成电路领域专家
获赞 3粉丝 42文章 69课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈