3297|5

16

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

verilog抢答器代码 [复制链接]

本帖最后由 holmes94 于 2014-3-20 00:27 编辑

初学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,请教一下怎么改,或者换一组写法。

捕获.PNG (21.19 KB, 下载次数: 0)

捕获.PNG
此帖出自FPGA/CPLD论坛

最新回复

always @(posedge clk)         begin                 rst  详情 回复 发表于 2014-3-22 15:04
点赞 关注(1)
 

回复
举报

10

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
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

我改了一下,这样应该行了,你怎么看?阳阳
此帖出自FPGA/CPLD论坛

点评

帅哥这段代码细看有问题欸:set是开始信号,是一个脉冲信号,set为0时,en也应该锁存在高电平啊,除非有复位信号。。  详情 回复 发表于 2014-3-23 09:42
代码面目全非了,两个时钟也行,可以分别复位,关键是用一个时钟怎么复位,我想不通诶。。  详情 回复 发表于 2014-3-22 11:21
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
Linasity 发表于 2014-3-21 19:32
module last(
        input clk,
        input clk_c,

代码面目全非了,两个时钟也行,可以分别复位,关键是用一个时钟怎么复位,我想不通诶。。
此帖出自FPGA/CPLD论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

4
 
always @(posedge clk)
        begin
                rst<=timeout&&reset;
        end
改成
always @(*)
        begin
                rst<=timeout&&reset;
        end
试一下
此帖出自FPGA/CPLD论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

5
 
Linasity 发表于 2014-3-21 19:32
module last(
        input clk,
        input clk_c,

帅哥这段代码细看有问题欸:set是开始信号,是一个脉冲信号,set为0时,en也应该锁存在高电平啊,除非有复位信号。。
此帖出自FPGA/CPLD论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

6
 
额。。我把test文件写错了,代码是没有问题的。。

辛苦那些看我代码的人了
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表