初学fpga,写一下有定时功能的抢答器,复位信号那一块总是写不好。
先上代码
module a1(
input reset,//主持人复位信号
input clk,
input in_a,
input in_b,
input in_c,
input set,//开始信号
output reg q_a,
output reg q_b,
output reg q_c,
output reg [2:0] c_out//计数端
);
reg flag;
reg rst;
reg timeout;//计时结束信号
always @(posedge clk)
begin
rst<=timeout&&reset;
end
always @(posedge set or negedge rst)
begin
if (!rst)
begin
flag<=0;
end
else
flag<=set;
end
always @(posedge clk or negedge rst)
begin
if (!rst)
begin
q_a<=1'b0;q_b<=1'b0;q_c<=1'b0;c_out<=3'b000;timeout=1;
end
else if(flag==1)
begin
c_out[2:0]<=c_out[2:0]+1'b1;
if(c_out==3'b111)
timeout=0;
else if ( (q_a==1) || (q_b==1) || (q_c==1) )
begin
q_a<=1'b0;q_b<=1'b0;q_c<=1'b0;
end
else if ( in_a )q_a<=1'b1;
else if ( in_b )q_b<=1'b1;
else if ( in_c )q_c<=1'b1;
end
end
endmodule
大概思路:接收到开始抢答信号set后flag置为1,开始计数,至3'b111后产生timeout信号,timeout和输入复位信号reset有一个为零就将rst置零,整个系统复位。
测试一下,计数功能正常,就复位信号为x,请教一下怎么改,或者换一组写法。
本帖最后由 holmes94 于 2014-3-20 00:27 编辑
module last(
input clk,
input clk_c,
input wire set,
output reg en,
output reg[3:0] cnt,
input wire rst,
input wire in_a,
input wire in_b,
input wire in_c,
output reg q_a,
output reg q_b,
output reg q_c,
output reg rset,
output reg rset_1
//output reg sec
);
always @(posedge clk_c)
begin:clk_com
if(set)
en=1;
//sec<=1;
else
en=0;
if(en)
begin
if((cnt==4'b1100)||rst)//exchange in_b with number
begin
cnt=4'b0000;
rset_1=0;
end
else
begin
cnt=cnt+4'b0001;
rset_1=1;
end
end
end
always @(posedge clk)
begin
if(!rset & !rset_1)
q_a=0;
else if ( (q_b==1) || (q_c==1) )
q_a=0;
else if ( in_a )
q_a=1;
end
always @(posedge clk)
begin
if(!rset & !rset_1)
q_b=0;
else if ( (q_a==1) || (q_c==1) )
q_b=0;
else if ( in_b )
q_b=1;
end
always @(posedge clk)
begin
if(!rset & !rset_1)
q_c=0;
else if ( (q_a==1) || (q_c==1) )
q_c=0;
else if ( in_c )
q_c=1;
end
endmodule
我改了一下,这样应该行了,你怎么看?阳阳
引用: Linasity 发表于 2014-3-21 19:32
module last(
input clk,
input clk_c,
代码面目全非了,两个时钟也行,可以分别复位,关键是用一个时钟怎么复位,我想不通诶。。
always @(posedge clk)
begin
rst<=timeout&&reset;
end
改成
always @(*)
begin
rst<=timeout&&reset;
end
试一下
帅哥这段代码细看有问题欸:set是开始信号,是一个脉冲信号,set为0时,en也应该锁存在高电平啊,除非有复位信号。。