[讨论] verilog抢答器代码

holmes94   2014-3-20 00:25 楼主
初学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 编辑
  • 捕获.PNG

回复评论 (5)

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

我改了一下,这样应该行了,你怎么看?阳阳
点赞  2014-3-21 19:32
引用: Linasity 发表于 2014-3-21 19:32
module last(
        input clk,
        input clk_c,

代码面目全非了,两个时钟也行,可以分别复位,关键是用一个时钟怎么复位,我想不通诶。。
点赞  2014-3-22 11:21
always @(posedge clk)
        begin
                rst<=timeout&&reset;
        end
改成
always @(*)
        begin
                rst<=timeout&&reset;
        end
试一下
点赞  2014-3-22 15:04
引用: Linasity 发表于 2014-3-21 19:32
module last(
        input clk,
        input clk_c,

帅哥这段代码细看有问题欸:set是开始信号,是一个脉冲信号,set为0时,en也应该锁存在高电平啊,除非有复位信号。。
点赞  2014-3-23 09:42
额。。我把test文件写错了,代码是没有问题的。。

辛苦那些看我代码的人了
点赞  2014-3-23 10:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复