这段程序目的是对一个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
我看到两个地方让我不明白:
一是testbench中的count和model中的count类型不一样,这个我认为问事不大.只是有点.
二是model中把count=0,要明白一点硬件描述语言不是程序语言,我觉得你的问题可能在这里,删了这句话?
initial
begin
count=0;
错误,initial只能执行一次,所以无法循环。
如果你要初始化,需要分开来写。循环必须用always才行。
晕,再看一下你的问题真不少啊
从你程序的逻辑功能上看,你就个程序从思路上就是错的,不是时序电路能分步做一些事吗?这明显是写程序语言的写法.汗.
如果不是时序电路的话,我改成如下(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
这与你想的功能一样吗?你想的功能又是什么?
楼上大哥真好,对了那是组合逻辑,要改成时序的话要重写testbench
我自已再问答一下吧,上边这个程序不能实现你所说的对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
给个组合逻辑的示例吧,不过中间有些小错误,逻辑性的啊,呵呵.
回复 板凳 gauson 的帖子
initial是只执行一次,但我的WHILE语句只是嵌套在里面的一个条件循环
回复 7楼 qushaobo 的帖子
这种方法我知道,但这种方法很笨重,如果是16位,或32位呢,你不可能用case语句吧。
还有,我觉得WHILE执行这一语句可以的。但不知道为什么, 运行结果始终没有对1进行统计。
你第一个程序我也运行过,结果也不是正确的,count只是简单的累加了三次。
不过还是非常感谢您抽出宝贵的时间帮忙。
引用: 原帖由 jyl 于 2009-9-28 10:58 发表
楼上大哥真好,对了那是组合逻辑,要改成时序的话要重写testbench
同意
EEWORD好人多啊
一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!