概述
杭电数字电路课程设计-移位寄存器
实验目的
(1)学习双向移位寄存器。
(2)掌握灵活运用Verilog HDL语言进行各种描述与建模的技巧和方法。
模块设计
模块功能:
用于实现多功能移位寄存器,受使能信号控制,为低电平时有效,根据输入信号S选择不同的功能,当S[1:0]为00时实现保持功能。在时钟上升沿时,当S[1:0]为01时实现左移一位功能,当S[1:0]为10时实现右移一位功能,当S[1:0]为11时实现置入数据D。
程序源代码
module sy_fifteen(
input [1:0] S,
input [3:0] D,
input OE, CLK,
output reg [3:0] Q
);
always @(posedge OE or posedge CLK)
begin
if(OE)
begin
Q <= 4'bzzzz;
end
else if(S[1:0] == 2'b01)
begin
Q <= {Q[2:0], Q[3]};
end
else if(S[1:0] == 2'b10)
begin
Q <= {Q[0], Q[3:1]};
end
else if(S[1:0] == 2'b11)
begin
Q <= D;
end
end
endmodule
测试程序源代码
module test;
// Inputs
reg [1:0] S;
reg [3:0] D;
reg OE;
reg CLK;
// Outputs
wire [3:0] Q;
// Instantiate the Unit Under Test (UUT)
sy_fifteen uut (
.S(S),
.D(D),
.OE(OE),
.CLK(CLK),
.Q(Q)
);
always
begin
#10 CLK = ~CLK;
end
initial begin
// Initialize Inputs
S = 0;
D = 0;
OE = 1;
CLK = 0;
// Wait 100 ns for global reset to finish
#20; OE = 1; S = 2'b01;
D = 4'b1101;
#20; OE = 0; S = 2'b11;
D = 4'b1101;
#20; OE = 0; S = 2'b00;
D = 4'b1101;
#20; OE = 0; S = 2'b01;
D = 4'b1101;
#20; OE = 0; S = 2'b10;
D = 4'b1101;
// Add stimulus here
end
endmodule
思考与遇到的问题
1.实验出现的问题与解决方案
出现的问题:
本实验在一开始编写仿真测试文件进行测试时与板子上调试时,始终保持Q[3:0]输出高阻态。
解决方案:
仔细研究代码发现并无问题。因本实验实现的是多功能移位寄存器,在我们具体实现的过程中未有初始状态,所以在调试阶段因先使用置入数据D功能,这样才能进行测试功能的正确性,若未置入数据D,则直接调用其他功能则一直默认输入为高阻zzzz。
2.思考与探索
思考题1:欲将本实验的4位多功能移位寄存器改造成具有多片级联扩展的功能,譬如可以使用2片扩展成8位多功能移位寄存器,那么需要对该4位多功能移位寄存器模块作何改动,需要增加几个引脚?功能作何修改?
(1)在模块中增加片选功能;需要增加8个引脚,即4个LED用于显示增加的位数,4个开关用于使用置入D时增加的4位。
(2)在判断功能时,若为左移,则通过片选信号,先选择寄存器1,取出Q[6:3]置入,再选择寄存器2,取出Q[2:0],Q[7]置入。完成功能。
(3)在判断功能时,若为右移,则通过片选信号,先选择寄存器2,取出Q[4:1]置入,再选择寄存器1,取出Q[0],Q[7:5]置入。完成功能。
思考题2:如果要实现一个补码的算术移位寄存器,试结合补码的算术移位规则,考虑移位寄存器模块的设计方法。
(1)首先先判断该数是正数还是负数,若为正数则符号为不变即Q[3] = 0,无论左移还是右移都补0;
(2)若为负数,则符号位不变,右移补1,左移补0;
本文为博主原创,转载请附链接!!
如有问题,请指正~
创作不易~~
最后
以上就是酷酷寒风为你收集整理的杭电数字电路课程设计——移位寄存器杭电数字电路课程设计-移位寄存器的全部内容,希望文章能够帮你解决杭电数字电路课程设计——移位寄存器杭电数字电路课程设计-移位寄存器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复