打印

新手求教,Verilog 写的抢答器

[复制链接]
1587|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jim727|  楼主 | 2012-12-12 21:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jim727 于 2012-12-13 21:35 编辑


小弟新手,很多不懂,谢谢各位帮助

我用quartus 9.1做的,我想知道,为什么变成未知值(X)了
代码很乱,请不惜赐教
我这个是做抢答器,EN1~6是抢答按钮,GRP1~6是各组得分(初始化10分),UP是开始和重置信号,DN是高位得分,低位扣分,check是确认评分。over是控制1次抢答只能评分一次,en是看是否有人按下抢答按钮。lock是控制让第一组抢答后屏蔽其他组信号。我扬声器没写,所以留下记号。
---------------------------eda8_8.v-----------------------------------------------------------------
module eda8_8(CLK,en1,en2,en3,en4,en5,en6,GRP1,GRP2,GRP3,GRP4,GRP5,GRP6,UP,DN,check);
input UP,DN,en1,en2,en3,en4,en5,en6,CLK,check;
output  [7:0] GRP1,GRP2,GRP3,GRP4,GRP5,GRP6;
reg [7:0] GRP1,GRP2,GRP3,GRP4,GRP5,GRP6;
reg EN1,EN2,EN3,EN4,EN5,EN6,lock,checked,over;
wire en;
initial
begin
lock<=1'b1;
GRP1<=7'b00010000;
GRP2<=7'b00010000;
GRP3<=7'b00010000;
GRP4<=7'b00010000;
GRP5<=7'b00010000;
GRP6<=7'b00010000;
checked<=1'b0;
over<=1'b1;
end
always @(check or GRP1 or GRP2 or GRP3 or GRP4 or GRP5 or GRP6 )
begin
    if(check);
    else
    over=~over;
end
always @(posedge CLK)
begin
    case({UP,DN})
    2'b10://wrong answer
    begin
    if(checked&over)
    begin
    case({EN1,EN2,EN3,EN4,EN5,EN6})
    6'b100000:
    begin
        if(GRP1[3:0]!=4'h0)
        GRP1[3:0]<=GRP1[3:0]-4'h1;
    else
        begin
        GRP1[7:4]<=GRP1[7:4]-4'h1;
        GRP1[3:0]<=4'h9;
        end
    end
    6'b010000:
    begin
        if(GRP2[3:0]!=4'h0)
        GRP2[3:0]<=GRP2[3:0]-4'h1;
    else
        begin
        GRP2[7:4]<=GRP2[7:4]-4'h1;
        GRP2[3:0]<=4'h9;
        end
    end
    6'b001000:
    begin
        if(GRP3[3:0]!=0)
        GRP3[3:0]<=GRP3[3:0]-4'h1;
    else
        begin
        GRP3[7:4]<=GRP3[7:4]-4'h1;
        GRP3[3:0]<=4'h9;
        end
    end
    6'b000100:
    begin
        if(GRP4[3:0]!=0)
        GRP4[3:0]<=GRP4[3:0]-4'h1;
    else
        begin
        GRP4[7:4]<=GRP4[7:4]-4'h1;
        GRP4[3:0]<=4'h9;
        end
    end
    6'b000010:
    begin
        if(GRP5[3:0]!=0)
        GRP5[3:0]<=GRP5[3:0]-4'h1;
    else
        begin
        GRP5[7:4]<=GRP5[7:4]-4'h1;
        GRP5[3:0]<=4'h9;
        end
    end
    6'b000001:
    begin
        if(GRP6[3:0]!=0)
        GRP6[3:0]<=GRP6[3:0]-4'h1;
    else
        begin
        GRP6[7:4]<=GRP6[7:4]-4'h1;
        GRP6[3:0]<=4'h9;
        end
    end
    default:
    begin
    GRP1 <= GRP1;GRP2 <= GRP2;
    GRP3 <= GRP3;GRP4 <= GRP4;
    GRP5 <= GRP5;GRP6 <= GRP6;
    end
    endcase
    //bi~~~~~~~~~~~~500+2000hz
    end
    end
    2'b11:///right answer
    begin
    if(checked&over)
    begin
    case({EN1,EN2,EN3,EN4,EN5,EN6})
    6'b100000:
    begin
        if(GRP1[3:0]==4'h9)
        begin
        GRP1[7:4]<=GRP1[7:4]+4'h1;
        GRP1[3:0]<=4'h0;
        end   
    else
        begin
        GRP1[3:0]<= GRP1[3:0]+4'h1;
        end
    end
    6'b010000:
    begin
        if(GRP2[3:0]==9)
        begin
        GRP2[7:4]<=GRP2[7:4]+4'h1;
        GRP2[3:0]<=4'h0;
        end
    else
        begin
        GRP2[3:0]<=GRP2[3:0]+4'h1;
        end
    end
    6'b001000:
    begin
        if(GRP3[3:0]==9)
        begin
        GRP3[7:4]<=GRP3[7:4]+4'h1;
        GRP3[3:0]<=4'h0;
        end
    else
        begin
        GRP3[3:0]<=GRP3[3:0]+4'h1;
        end
    end
    6'b000100:
    begin
        if(GRP4[3:0]==9)
        begin
        GRP4[7:4]<=GRP4[7:4]+4'h1;
        GRP4[3:0]<=4'h0;
        end
    else
        begin
        GRP4[3:0]<=GRP4[3:0]+4'h1;
        end
    end
    6'b000010:
    begin
        if(GRP5[3:0]==4'h9)
        begin
        GRP5[7:4]<=GRP5[7:4]+4'h1;
        GRP5[3:0]<=4'h0;
        end
    else
        begin
        GRP5[3:0]<=GRP5[3:0]+4'h1;
        end
    end
    6'b000001:
    begin
        if(GRP6[3:0]==9)
        begin
        GRP6[7:4]<=GRP6[7:4]+4'h1;
        GRP6[3:0]<=4'h0;
        end
    else
        begin
        GRP6[3:0]<=GRP6[3:0]+4'h1;
        end
    end
    default:
    begin
    GRP1 <= GRP1;GRP2 <= GRP2;
    GRP3 <= GRP3;GRP4 <= GRP4;
    GRP5 <= GRP5;GRP6 <= GRP6;
    end
    endcase
    //bi~~~~~~~~~~~~500+1000hz
    end
     end
    2'b00://not start yet
    begin
    if(EN1|EN2|EN3|EN4|EN5|EN6);
    //bi~~~~~~~~~~~~500hz
    end   
    2'b01://not start yet
    begin
    end   
    endcase
   
end
assign en=en1|en2|en3|en4|en5|en6;
always @(posedge en or negedge UP or posedge check)
begin
    if(check)checked=check;
    case({en1,en2,en3,en4,en5,en6})
    6'b100000:
    begin
    EN1=1'b1&lock;
    end
    6'b010000:
    begin
    EN2=1'b1&lock;
    end
    6'b001000:
    begin
    EN3=1'b1&lock;
    end
    6'b000100:
    begin
    EN4=1'b1&lock;
    end
    6'b000010:
    begin
    EN5=1'b1&lock;
    end
    6'b000001:
    begin
    EN6=1'b1&lock;
    end
    default:
    begin end
    endcase
if(!UP)
    begin
    checked=1'b0;
    lock=~lock;
    EN1=1'b0; EN2=1'b0;
    EN3=1'b0; EN4=1'b0;
    EN5=1'b0; EN6=1'b0;
    end
end
endmodule


相关帖子

沙发
xlhtracy| | 2012-12-13 17:48 | 只看该作者
坐的猴哥

使用特权

评论回复
板凳
jahnson066| | 2012-12-13 19:16 | 只看该作者
猴哥是搞xilinx的,不是altera,哈哈

使用特权

评论回复
地板
528388812| | 2012-12-13 19:23 | 只看该作者
这是一套程序?

使用特权

评论回复
5
jim727|  楼主 | 2012-12-13 21:33 | 只看该作者
本帖最后由 jim727 于 2012-12-13 21:36 编辑
528388812 发表于 2012-12-13 19:23
这是一套程序?

不是,我只是做了编号

使用特权

评论回复
6
jim727|  楼主 | 2012-12-13 21:34 | 只看该作者
jahnson066 发表于 2012-12-13 19:16
猴哥是搞xilinx的,不是altera,哈哈

谢谢提醒,还是希望有人解答,至少给个思路

使用特权

评论回复
7
GoldSunMonkey| | 2012-12-14 22:34 | 只看该作者
哪里觉得不对呢?

使用特权

评论回复
8
jim727|  楼主 | 2012-12-16 21:01 | 只看该作者
GoldSunMonkey 发表于 2012-12-14 22:34
哪里觉得不对呢?

仿真时序图的输出结果不符合预期,我用红色方框标注的位置出现X(undefined value),我想知道为什么

使用特权

评论回复
9
GoldSunMonkey| | 2012-12-16 21:26 | 只看该作者
检查该值的来源

使用特权

评论回复
10
jim727|  楼主 | 2012-12-17 13:16 | 只看该作者
GoldSunMonkey 发表于 2012-12-16 21:26
检查该值的来源

怎么检查  输出不是reg类型么,怎么会未知值

使用特权

评论回复
11
zhaorj8780| | 2013-1-16 18:59 | 只看该作者
多学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝