0
点赞
收藏
分享

微信扫一扫

实验六 移位寄存器的设计【Verilog】


实验六 移位寄存器的设计【Verilog】

  • ​​前言​​
  • ​​推荐​​
  • ​​实验六 移位寄存器的设计​​
  • ​​一、实验目的​​
  • ​​二、实验环境​​
  • ​​三、实验任务​​
  • ​​四、实验原理与实验步骤​​
  • ​​五、实验思考​​
  • ​​实验六 移位寄存器的设计​​
  • ​​最后​​

前言

编写于
2022/12/3 19:47

公开发布于
2022/12/5 16:40

以下内容源自Verilog实验
仅供学习交流使用

推荐

Verilog

实验六 移位寄存器的设计

一、实验目的

  1. 掌握移位寄存器的工作原理和设计方法。
  2. 理解串并数据转换的概念和方法。

二、实验环境

  1. 装有ModelSim和VIVADO的计算机。
  2. Sword实验系统。

三、实验任务

  1. 用VerilogHDL语言设计实现8位带并行输入的右移移位寄存器,在ModelSim上实现功能仿真。
  2. 生成FPGA设计文件,下载到Sword实验系统上验证电路功能。

四、实验原理与实验步骤

1.实验原理

在移位寄存器中,要求每来一个时钟脉冲,寄存器中的数据就会按顺序向左或者向右移动一位。因此,在构成移位寄存器时,必须采用主-从触发器或者边沿触发器,而不能采用电平触发器。

数据输入移位寄存器的方式有串行输入和并行输入两种。下图是串行输入移位寄存器。在时钟的作用下,输入数据进入移位寄存器最左位,同时,将已存入寄存器的数据右移一位。并行输入方式是把全部输入数据同时存入寄存器。

实验六 移位寄存器的设计【Verilog】_Verilog

图1 串行输入的移位寄存器

下图是具有串行和并行输入的8位右移移位寄存器模块。

实验六 移位寄存器的设计【Verilog】_fpga开发_02

图2 具有并行输入的移位寄存器
通过并行输入命令选择是串行输入还是并行输入。

2.实验步骤
(1)用Verilog语言采用结构描述或者行为描述方法设计一个仅带有8bit并行输入的右移移位寄存器。
(2)编写测试模块,完成modelsim下电路的功能仿真,验证电路功能。
(3)建立完成I/O引脚分配。
系统时钟为100MHz,从提供的clkdiv引出clkdiv[24]作为移位控制时钟。
测试移位寄存器时采用开关SW[0]~ SW[7]作为移位寄存器的并行输入,SW[15]作为clr信号,将输出显示在led[0]~led[7]上(或同时显示到led和数码管上)。设置相应的约束文件。
(4)生成FPGA文档,并下载到实验板上物理运行,检查设计结果。

五、实验思考

1、在完成实验的基础上,设计实现实验原理中图2“带有并行输入的移位寄存器”电路模块,并在modelsim下完成电路仿真。
2、结合自己的设计,比较与文档提供的异同,对自己的代码提出改进建议。

实验六 移位寄存器的设计

1.用VerilogHDL语言设计实现8位带并行输入的右移移位寄存器,在ModelSim上实现功能仿真。
(1)用Verilog语言采用结构描述或者行为描述方法设计一个仅带有8bit并行输入的右移移位寄存器。

//并行输入的移位寄存器
module shiftregist1(D,clk,reset,Q);
parameter shiftregist_width=8;
output[shiftregist_width-1:0] D;
input clk,reset;
input [shiftregist_width-1:0] Q;
reg[shiftregist_width-1:0] D;

initial D=8'b00001111;
always @(posedge clk or negedge reset)
begin
if(!reset) D<=Q;
else D<={D[0],D[shiftregist_width-1:1]};

end


endmodule

(2)编写测试模块,完成modelsim下电路的功能仿真,验证电路功能。
测试模块:

module shiftregist1_tb;
parameter shiftregist_width=8;
wire[shiftregist_width-1:0] D;
reg clk,reset;
reg [shiftregist_width-1:0] Q;

shiftregist u1(D,clk,reset,Q);

always
#5 clk=~clk;

initial
begin
clk=0;
reset=1;
Q=0;
#100
reset=0;
Q=8'b11110000;
#10
reset=1;

end


endmodule

仿真结果如下:

实验六 移位寄存器的设计【Verilog】_Verilog_03

3)建立完成I/O引脚分配。
系统时钟为100MHz,从提供的clkdiv引出clkdiv[24]作为移位控制时钟。
测试移位寄存器时采用开关SW[0]~ SW[7]作为移位寄存器的并行输入,SW[15]作为clr信号,将输出显示在led[0]~led[7]上(或同时显示到led和数码管上)。设置相应的约束文件。

shiftregist1 U1(Q,Div[25],SW[0],SW[8:1]);
clk_div U8(clk_100mhz,1'b0,SW[2],Div,CK);
Seg8BCD U0(re[7:0],Q[0]);
Seg8BCD U2(re[15:8],Q[1]);
Seg8BCD U3(re[23:16],Q[2]);
Seg8BCD U4(re[31:24],Q[3]);
Seg8BCD U5(re[39:32],Q[4]);
Seg8BCD U6(re[47:40],Q[5]);
Seg8BCD U7(re[55:48],Q[6]);
Seg8BCD U9(re[63:56],Q[7]);
assign LED_DATA = ~{Q,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0};

在完成实验的基础上,设计实现实验原理中图2“具有串行和并行输入的移位寄存器”电路模块,并在modelsim下完成电路仿真。
电路设计模块:

//有串行和并行输入的移位寄存器
//sel=1 clr=0 置0
//sel=1 clr=1 串行输入 din右移
//sel=0 clr=0 并行输入 置数
//sel=0 clr=1 循环右移
module shiftregist(
output reg[7:0] q, //移位输出
input din, //串行输入
input clk, //时钟
input clr, //置0 置data
input sel, //模式 1-串行 0-并行
input [7:0] data //并行输入

);


always @(posedge clk)
begin
if(sel)
begin
if(!clr) //置0
q<=0;
else
q<={din,q[7:1]};//串行输入 din右移
end
else
begin
if(!clr) //并行输入 置数
q<=data;
else
q<={q[0],q[7:1]};//循环右移
end
end


endmodule

仿真测试模块:

module shiftregist_tb;
wire [7:0] q; //移位输出
reg din; //串行输入
reg clk; //时钟
reg clr; //置0 置data
reg sel; //模式
reg [7:0] data; //并行输入

shiftregist u(q,din,clk,clr,sel,data);

always
#5 clk=~clk;

initial
begin
clk=0;//初始化
din=0;
data=0;
#10
sel=1; clr=0;//置0
#10
clr=1;//串行输入 din右移 sel=1 clr=1
#10 din=1;
#10 din=1;
#10 din=1;
#10 din=1;
#10 din=0;
#10 din=0;
#10 din=0;
#10 din=0;
sel=0;//开始循环右移 sel=0 clr=1
#100
clr=0;//并行输入 sel=0 clr=0
data=8'b11110000;
#10
clr=1;//循环右移 sel=0 clr=1
end


endmodule

仿真结果:

实验六 移位寄存器的设计【Verilog】_fpga开发_04

最后

2022/12/3 21:12

这篇博客能写好的原因是:站在巨人的肩膀上

这篇博客要写好的目的是:做别人的肩膀

开源:为爱发电

学习:为我而行


举报

相关推荐

寄存器

0 条评论