[讨论] VERILOG一简单程序查错

yuji0boy   2009-9-27 16:57 楼主
这段程序目的是对一个8位二进制数的1的个数进行统计。
但我运行的时候,count结果始终为0,如果把count赋1,结果就会是1.也就是说这个数貌似没进入while循环。我实在搞不明白错在哪里,希望哪位大虾能指点一二。
`timescale 1ns/1ns
module account_test;
    reg [7:0]a;
    wire [3:0]count;
    initial
    begin
        a=8'b1111_1111;
        #10 a=8'b1001_0011;
        #10 a=8'b0100_1001;
    end
    account acc(.tempreg(a),.count(count));
    initial
    begin
        $monitor($time,,,"the number of 1 in %b is %d,",a,count);
        #30 $finish;
    end
endmodule


module account(tempreg,count);
    input [7:0]tempreg;
    output [3:0]count;
    reg [3:0]count;
    reg [7:0]tem;
    initial
    begin
        count=0;
        tem=tempreg;
        while(tem)
        begin
            if(tem[0])
            count=count+1;
            tem=tem>>1;
        end
    end
endmodule

回复评论 (11)

我看到两个地方让我不明白:

一是testbench中的count和model中的count类型不一样,这个我认为问事不大.只是有点.
二是model中把count=0,要明白一点硬件描述语言不是程序语言,我觉得你的问题可能在这里,删了这句话?
点赞  2009-9-28 10:13
initial
    begin
        count=0;


错误,initial只能执行一次,所以无法循环。

如果你要初始化,需要分开来写。循环必须用always才行。
点赞  2009-9-28 10:14

晕,再看一下你的问题真不少啊

从你程序的逻辑功能上看,你就个程序从思路上就是错的,不是时序电路能分步做一些事吗?这明显是写程序语言的写法.汗.
点赞  2009-9-28 10:31

如果不是时序电路的话,我改成如下(model上仿真过的)

`timescale 1ns/1ns
module account_test;
    reg [7:0]a;
    wire [3:0]count;
    initial
    begin
        a=8'b1111_1111;
        #10 a=8'b1001_0011;
        #10 a=8'b0100_1001;
    end
    account acc(.tempreg(a),.count(count));
    initial
    begin
        $monitor($time,,,"the number of 1 in %b is %d,",a,count);
        #30 $finish;
    end
endmodule

module account(tempreg,count);
    input [7:0]tempreg;
    output [3:0]count;
    reg [3:0]count;
    reg [7:0]tem;
    initial
    begin
        count=0;  
    end
    always @(tempreg)
    begin
         tem=tempreg;
        if(tem[0])
        begin
            count=count+1;
            tem=tem>>1;
        end
    end
endmodule
这与你想的功能一样吗?你想的功能又是什么?
点赞  2009-9-28 10:50

6楼 jyl 

楼上大哥真好,对了那是组合逻辑,要改成时序的话要重写testbench
点赞  2009-9-28 10:58

我自已再问答一下吧,上边这个程序不能实现你所说的对1计数,

module account(tempreg,count);
    input [3:0]tempreg;
    output [1:0]count;
    reg [1:0]count;
    reg [3:0]tem;
    initial
    begin
       // count=0;  
    end
    always @(tempreg)
    begin
        tem=tempreg;
       /*if(tem[0])
        begin
            count=count+1;
            tem=tem>>1;
        end*/
     case(tem)
     4'b0000:count=0;
     4'b0001:count=1;  
     4'b0010:count=1;  
     4'b0011:count=2;
     4'b0100:count=1;
     4'b0101:count=2;  
     4'b0110:count=2;  
     4'b0111:count=3;
   
     4'b1000:count=1;
     4'b1001:count=2;  
     4'b1010:count=2;  
     4'b1011:count=3;
     4'b1100:count=2;
     4'b1101:count=3;  
     4'b1110:count=3;  
     4'b1111:count=4;
endcase  
    end
endmodule
给个组合逻辑的示例吧,不过中间有些小错误,逻辑性的啊,呵呵.
点赞  2009-9-28 11:09

回复 板凳 gauson 的帖子

initial是只执行一次,但我的WHILE语句只是嵌套在里面的一个条件循环
点赞  2009-9-28 17:00

回复 7楼 qushaobo 的帖子

这种方法我知道,但这种方法很笨重,如果是16位,或32位呢,你不可能用case语句吧。
还有,我觉得WHILE执行这一语句可以的。但不知道为什么, 运行结果始终没有对1进行统计。
你第一个程序我也运行过,结果也不是正确的,count只是简单的累加了三次。
不过还是非常感谢您抽出宝贵的时间帮忙。
点赞  2009-9-28 17:16
mark                                        .
年轻,就该充斥着野心.........
点赞  2009-9-29 14:17
引用: 原帖由 jyl 于 2009-9-28 10:58 发表
楼上大哥真好,对了那是组合逻辑,要改成时序的话要重写testbench

同意
点赞  2011-12-24 14:59
EEWORD好人多啊
一个为理想不懈前进的人,一个永不言败人! http://shop57496282.taobao.com/ 欢迎光临网上店铺!
点赞  2011-12-26 16:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复