verliog and FPGA实验小记----------实验六:移位寄存器
一.实验目的
- 掌握移位寄存器的工作原理和设计方法。
- 理解串并数据转换的概念和方法。
二.实验环境
- 装有ModelSim和ISE的计算机。
- Sword实验系统。
三.实验任务
- 用VerilogHDL语言设计实现8位带并行输入的右移移位寄存器,在ModelSim上实现功能仿真。
- 生成FPGA设计文件,下载到Sword实验系统上验证电路功能。
四.实验原理
- 实验原理
在移位寄存器中,要求每来一个时钟脉冲,寄存器中的数据就会按顺序向左或者向右移动一位。因此,在构成移位寄存器时,必须采用主-从触发器或者边沿触发器,而不能采用电平触发器。
数据输入移位寄存器的方式有串行输入和并行输入两种。下图是串行输入移位寄存器。在时钟的作用下,输入数据进入移位寄存器最左位,同时,将已存入寄存器的数据右移一位。并行输入方式是把全部输入数据同时存入寄存器。图1 串行输入的移位寄存器
下图是具有串行和并行输入的8位右移移位寄存器模块。
通过并行输入命令选择是串行输入还是并行输入。
五.实验步骤
1. 添加clk_div.v、LED_P2S.ngc、LED_P2S_IO.v、shifter_top.v、shifterIO.ucf到项目中。
2. 新建shiftregist1.v文件,写以下代码
module shiftregist1(D,clk,reset,Q);
parameter shiftregist_width = 8;
output [shiftregist_width-1:0] D;
input [shiftregist_width-1:0] Q;
input clk,reset;
reg [shiftregist_width-1:0] D;
initial
D=8'b00001111;
always @(posedge clk or negedge reset)
if(!reset)
D<=Q;
else
D<={D[shiftregist_width-2:0],D[shiftregist_width-1]};
endmodule
3. 添加P2S.ngc,parallel2serial.v(并串转换文件)到项目中。
**注意:** 移位寄存器既可以实现并行输出(按位的顺序逐一显示),也可以实现串行输出(每个输出同时读出)。
4. 新建文件,编写数码管译码文件
module Seg8BCD(out, in);
output [7:0] out;
input [3:0] in;
reg [7:0] out;
[email protected](in)
begin
case(in)
4'h0: out = 8'b00000011;
4'h1: out = 8'b10011111;
4'h2: out = 8'b00100101;
4'h3: out = 8'b00001101;
4'h4: out = 8'b10011001;
4'h5: out = 8'b01001001;
4'h6: out = 8'b01000001;
4'h7: out = 8'b00011111;
4'h8: out = 8'b00000001;
4'h9: out = 8'b00001001;
4'hA: out = 8'b00010001;
4'hB: out = 8'b11000001;
4'hC: out = 8'b01100011;
4'hD: out = 8'b10000101;
4'hE: out = 8'b01100001;
4'hF: out = 8'b01110001;
default: out = 8'hFF;
endcase
end
endmodule
5. 修改shifter_top.v文件
注意:
- sw[0] :开关0复位
- sw[1:8]:通过开关1~8进行输入数据
- DIV[25]:时钟的频率,数字越大,越慢
- 8位数码管可以看成是8个小灯泡(其中一个小灯泡是8后面的小数点),所以输出8位的数据
- 由于我们的实验目的是想让8个数码管实现流水显示0,1,也就是说每个数码管只用显示0或1,即一位输入足以实现
- 记得调用并串转换模块,即P2S开头的那一段调用
6. 检查约束文件,确保LED与数码管的约束文件没有被注释
7. 编写testbench文件
module shift_test();
wire [7:0]D;
reg [7:0]Q;
reg clk,reset;
always # 20 clk = ~clk;
shiftregist1 u2(D,clk,reset,Q);
initial
begin
clk = 0;
reset = 1;
end
endmodule;
8. 仿真,波形如下:
目录截图如下: