5387|11

17

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

VERILOG一简单程序查错 [复制链接]

这段程序目的是对一个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
此帖出自FPGA/CPLD论坛

最新回复

EEWORD好人多啊  详情 回复 发表于 2011-12-26 16:30
点赞 关注
 

回复
举报

370

帖子

0

TA的资源

纯净的硅(中级)

沙发
 

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

一是testbench中的count和model中的count类型不一样,这个我认为问事不大.只是有点.
二是model中把count=0,要明白一点硬件描述语言不是程序语言,我觉得你的问题可能在这里,删了这句话?
此帖出自FPGA/CPLD论坛
 
 

回复

151

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
initial
    begin
        count=0;


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

如果你要初始化,需要分开来写。循环必须用always才行。
此帖出自FPGA/CPLD论坛
 
 
 

回复

370

帖子

0

TA的资源

纯净的硅(中级)

4
 

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

从你程序的逻辑功能上看,你就个程序从思路上就是错的,不是时序电路能分步做一些事吗?这明显是写程序语言的写法.汗.
此帖出自FPGA/CPLD论坛
 
 
 

回复

370

帖子

0

TA的资源

纯净的硅(中级)

5
 

如果不是时序电路的话,我改成如下(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
这与你想的功能一样吗?你想的功能又是什么?
此帖出自FPGA/CPLD论坛
 
 
 

回复

127

帖子

0

TA的资源

五彩晶圆(中级)

6
 
楼上大哥真好,对了那是组合逻辑,要改成时序的话要重写testbench
此帖出自FPGA/CPLD论坛
 
 
 

回复

370

帖子

0

TA的资源

纯净的硅(中级)

7
 

我自已再问答一下吧,上边这个程序不能实现你所说的对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
给个组合逻辑的示例吧,不过中间有些小错误,逻辑性的啊,呵呵.
此帖出自FPGA/CPLD论坛

赞赏

2

查看全部赞赏

 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 板凳 gauson 的帖子

initial是只执行一次,但我的WHILE语句只是嵌套在里面的一个条件循环
此帖出自FPGA/CPLD论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(高级)

9
 

回复 7楼 qushaobo 的帖子

这种方法我知道,但这种方法很笨重,如果是16位,或32位呢,你不可能用case语句吧。
还有,我觉得WHILE执行这一语句可以的。但不知道为什么, 运行结果始终没有对1进行统计。
你第一个程序我也运行过,结果也不是正确的,count只是简单的累加了三次。
不过还是非常感谢您抽出宝贵的时间帮忙。
此帖出自FPGA/CPLD论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(初级)

10
 
mark                                        .
此帖出自FPGA/CPLD论坛
个人签名年轻,就该充斥着野心.........
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(高级)

11
 
原帖由 jyl 于 2009-9-28 10:58 发表
楼上大哥真好,对了那是组合逻辑,要改成时序的话要重写testbench

同意
此帖出自FPGA/CPLD论坛
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

12
 
EEWORD好人多啊
此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表