当前位置:文档之家› 时序逻辑电路1

时序逻辑电路1

时序逻辑电路1
实验一、四位寄存器的设计
一、实验目的
设计一个带有异步置数和同步清零信号的4位寄存器,并在开发板上验证。

二、编写HDL文件
module register(
input load,
input clk,
input clr,
input wire [3:0]d,
output reg[3:0]q
);
reg [25:0]q1;
always@(posedge clk or posedge clr)
begin
if(clr==1)
q1<=0;
else
q1<=q1+1;
end
assign mclk=q1[25];
always@(posedge mclk or posedge clr)
if(clr==1)
q<=0;
else if(load==1)
q<=d;
endmodule
三、编写约束文件
NET"clk"LOC="B8";
NET"clr"LOC="P11";
NET"load"LOC="L3";
NET"d[0]"LOC="K3";
NET"d[1]"LOC="B4";
NET"d[2]"LOC="G3";
NET"d[3]"LOC="F3";
NET"q[0]"LOC="M5";
NET"q[1]"LOC="M11";
NET"q[2]"LOC="P7";
NET"q[3]"LOC="P6";
四、RTL级电路图
五、验证实验结果
调节四位开关的值,观察四位LED灯的示数,判断是否相等;并使清零开关处于有效位置,观察是否异步清零;使置数位有效,观察是否同步置数,发现结果正确,实验成功。

实验二、可逆十进制加法器
一、实验目的
设计一个具有异步清零、同步置数端的可逆十进制计数器。

选1Hz作为CLK 信号,4个LED灯指示计数状态,一个逻辑开关作为清零端,一个逻辑开关作为置数端,一个逻辑开关作为计数方式。

二、编写HDL文件
module keni(
input clk,
input clr,
input load,
input ni,
input [3:0]d,
output reg [3:0]a
);
reg [25:0]q1;
always@(posedge clk )
begin
if(q1==50000000)
q1<=0;
else
q1<=q1+1;
end
assign q=q1[25];
always@(posedge q or posedge clr or posedge load)
begin
if (clr==1)
a<=0;
else if(clr==0&load==1)
a<=d;
else if(clr==0&load==0&a==9&ni==0)
a<=0;
else if(ni==0)
a<=a+1;
else if(clr==0&load==0&a==0&ni==1)
a<=9;
else if(clr==0&load==0&ni==1)
a<=a-1;
end
endmodule
三、编写约束文件
NET"clk"LOC="B8";
NET"clr"LOC="P11";
NET"load"LOC="L3";
NET"ni"LOC="N3";
NET"d[0]"LOC="K3";
NET"d[1]"LOC="B4";
NET"d[2]"LOC="G3";
NET"d[3]"LOC="F3";
NET"a[0]"LOC="M5";
NET"a[1]"LOC="M11";
NET"a[2]"LOC="P7";
NET"a[3]"LOC="P6";
四、生成RTL级电路图
五、实验结果
根据LED灯的指示情况,可以实现可逆十进制计数功能;可通过控制清零、置数两逻辑开关,对四个LED灯进行异步清零、异步置数,实验成功。

六、实验问题及解决方法
实验过程中最大的问题就是同步(异步)清零、同步(异步)置数的问题,首先我没有特别明确同步异步的区别,再编程的时候总是清零置数搞混淆,导致测试总是出现这样那样的问题,所以为了彻底解决这个问题,我从网上查询其他类似得有关同步(异步)清零、置数的程序,再结合数电中同步、置数的相关知识,认真思考程序的原理,最后解决了这个问题。

还有就是计数器的编程,根据数电上的相关知识,结合Verilog语言,调试
之后就成功编程。

七、感想与意见
这次实验是关于时序逻辑电路的实验,相对于之前的组合逻辑实验有着明显的不同,一个最直观的感受就是always语句的使用,在时序逻辑电路中always
的使用可以说是程序的灵魂,在一个个always模块的拼接下才有了时序逻辑电路。

在经过前几次实验的训练之后,这次实验没有什么大的问题,基本上通过资料和自己的思考就可以解决,同时在实验的预习中对数电课程的知识得到了巩固,自己解决问题的能力也得到提高。

相关主题