实验六 移位寄存器的设计【Verilog】
- 前言
- 推荐
- 实验六 移位寄存器的设计
- 一、实验目的
- 二、实验环境
- 三、实验任务
- 四、实验原理与实验步骤
- 五、实验思考
- 实验六 移位寄存器的设计
- 最后
前言
编写于
2022/12/3 19:47
公开发布于
2022/12/5 16:40
以下内容源自Verilog实验
仅供学习交流使用
推荐
Verilog
实验六 移位寄存器的设计
一、实验目的
- 掌握移位寄存器的工作原理和设计方法。
- 理解串并数据转换的概念和方法。
二、实验环境
- 装有ModelSim和VIVADO的计算机。
- Sword实验系统。
三、实验任务
- 用VerilogHDL语言设计实现8位带并行输入的右移移位寄存器,在ModelSim上实现功能仿真。
- 生成FPGA设计文件,下载到Sword实验系统上验证电路功能。
四、实验原理与实验步骤
1.实验原理
在移位寄存器中,要求每来一个时钟脉冲,寄存器中的数据就会按顺序向左或者向右移动一位。因此,在构成移位寄存器时,必须采用主-从触发器或者边沿触发器,而不能采用电平触发器。
数据输入移位寄存器的方式有串行输入和并行输入两种。下图是串行输入移位寄存器。在时钟的作用下,输入数据进入移位寄存器最左位,同时,将已存入寄存器的数据右移一位。并行输入方式是把全部输入数据同时存入寄存器。
图1 串行输入的移位寄存器
下图是具有串行和并行输入的8位右移移位寄存器模块。
图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
仿真结果如下:
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
仿真结果:
最后
2022/12/3 21:12
这篇博客能写好的原因是:站在巨人的肩膀上
这篇博客要写好的目的是:做别人的肩膀
开源:为爱发电
学习:为我而行