基于-verilog的抢答器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Verilog语言的二路抢答器设计实验报告
电子科学与工程学院 121180052 璇
一、实验目的
1、掌握数字系统中触发器、计数器的设计要素。
2、掌握触发器、计数器的VerilogHDL代码编写。
3、进一步掌握ISE软件的用法,学习代码下载的方法。
二、实验步骤
1、设计限时和复位电路。
2、编写限时/复位电路的VerilogHDL代码并综合、仿真。
3、实现限时抢答器并下载到开发板上进行验证。
三、实验原理
1、设计二路抢答器
2、设计定时器和复位电路
可使用计数器来实现定时功能。而给定时间的定时,可以让计数器的输出与特定值比较来实现。这个特定的预置数由时钟频率和定时时间决定。
这个基本想法如下图所示。
图中,“时间到”信号接到计数器的清零端,以便下次计数从0开始。
这里,还需要一个计时开始的功能按键,用来启动计数器的计时。那么,计数器就需要一个使能端,受控于“计时开始”按键。我们知道,EN信号是一个持续信号(允许时保持电平),而“时间到”信号是一个持续时间很短的脉冲,因此还需要一个触发器来产生计数器的EN信号。
复位信号由“时间到”信号和复位按键相或来得到。完整的限时和复位电路如下图所示。
四、实验代码
//主程序部分
Module responder (
input clk,
input set,
input reset,
input wire in_a,
input wire in_b,
output wire q_a,
output wire q_b,
output en
);
wire clr;
wire[27:0]t;
wire clk_10;
wire timeout;
reg[27:0] n=28'h1ffffff;
assign clr = reset||timeout;
trig trigger(
.set(set),
.clk(clk_10),
.clr(clr),
.en(en)
);
count counter(
.clk(clk_10),
.clr(clr),
.en(en),
.cnt(cnt)
);
comp comparator(
.cnt(cnt),
.n(n),
.timeout(timeout)
);
fpga_2 main(
.in_a(in_a),
.in_b(in_b),
.clk(clk_10),
.reset(clr),
.q_a(q_a),
.q_b(q_b),
.en(en)
);
endmodule
//触发器trigger部分
module trig(
input set,
input clk,
input clr,
output reg en
);
always(posedge clk)
begin if(clr) en=0;
else
begin if(set) en=1;
else en=en;
end
end
endmodule
//计数器counter部分
module count(
input clk,
input clr,
input en,
output reg[27:0]t
);
always (posedge clk)
begin
if(clr)
t=0;
else if(en)
t=cnt+1;
end
endmodule
//比较器comparator部分
module comp(
input wire[27:0]t,
input wire[27:0] n,
output reg timeout
);
always (*)
if(cnt==n)
timeout=1;
else
timeout=0;
endmodule
//抢答器部分
module fpga_2(
input wire in_a,
input wire in_b,
input wire clk,
input wire reset,
input en,
output reg q_a,
output reg q_b
);
always (posedge clk)
begin
if ( (q_b==1) ||(reset) )
q_a=0;
else if(in_a&&en)
q_a=1;
end
always (posedge clk)
begin
if ( (q_a==1) ||(reset) )
q_b=0;
else if(in_b&&en)
q_b=1;
end
endmodule
五、仿真测试
1、测试代码
// Add stimulus here
set = 1;
reset = 0;
in_a=1;
#1000 in_a=0;
#100 in_b=1;
#1000 reset=1;
#100 in_b=0;
#100 reset=0;
in_b=1;
#1000 in_b=0;
#100 in_a=1;
#1000 reset=1;
#100 in_a=0;
#100 reset=0;
end
always #10 clk=~clk;
2、仿真结果
六、验证限时电路和复位电路
1在工程中加入DCM
my_clk my_dcm(
.CLK_IN1(clk),
.CLK_OUT1(clk_10),
.RESET(1'b0),
.LOCKED()
);