基于-verilog的抢答器设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()

);

相关文档
最新文档