大家看看我的verilog 程序那里错了
input fp;
input reset;
output[3:0] speed0;
reg[3:0]speed0;
output[3:0]speed1;
reg[3:0]speed1;
output[3:0]speed2;
reg[3:0]speed2;
output[3:0]speed3;
reg[3:0]speed3;
reg c1;
reg c2;
reg c3;
always @(reset or fp)
begin :spd0
if (reset==1'b1)
begin
speed0<=4'b0000;
speed1<=4'b0000;
speed2<=4'b0000;
speed3<=4'b0000;
c1<=1'b0;
c2<=1'b0;
c3<=1'b0;
end
else if(fp==1'b1)
begin
if(speed0==4'b1001)
begin
speed0<=4'b0000;
c1<=1'b1;
end
else
begin
speed0<=speed0+1;
c1<=1'b0;
end
end
end
always @(c1)
begin:spd1
if (c1==1'b1)
begin
if (speed1==4'b1001)
begin
speed1<=4'b0000;
c2<=1'b1;
end
else
begin
speed1<=speed1+1;
c2<=1'b0;
end
end
end
always @(c2)
begin:spd2
if(c2==1'b1)
begin
if(speed2==4'b1001)
begin
speed2<=4'b0000;
c3<=1'b1;
end
else
begin
speed2<=speed2+1;
c3<=1'b0;
end
end
end
always @(c3)
begin:spd3
if(c3==1'b1)
begin
if(speed3==4'b1001)
begin
speed3<=4'b0000;
end
else
begin
speed3<=speed3+1;
end
end
end
endmodule
关于转速检测和报警的设计 用计数器完成但是有错误 不知道那个大侠给修改以下
十分感谢
请大家帮帮忙
拜托了
ms是第一个always的敏感量得不到激发 所以所有的always只能走一次 不能实现持续加速到限定值
麻烦把你的主要信号的含义和这个模块的功能说一下,大家才好帮忙啊。
module speed(fp,reset,speed0,speed1,speed2,speed3);
input fp;
input reset;
output[3:0] speed0;
reg[3:0]speed0;
output[3:0]speed1;
reg[3:0]speed1;
output[3:0]speed2;
reg[3:0]speed2;
output[3:0]speed3;
reg[3:0]speed3;
reg c1;
reg c2;
reg c3;
always @(reset or fp or c1 or c2 or c3)
begin
begin :spd0
if (reset==1'b1)
begin
speed0<=4'b0000;
speed1<=4'b0000;
speed2<=4'b0000;
speed3<=4'b0000;
c1<=1'b0;
c2<=1'b0;
c3<=1'b0;
end
else if(fp==1'b1)
begin
if(speed0==4'b1001)
begin
speed0<=4'b0000;
c1<=1'b1;
end
else
begin
speed0<=speed0+1;
c1<=1'b0;
end
end
end
begin:spd1
if (c1==1'b1)
begin
if (speed1==4'b1001)
begin
speed1<=4'b0000;
c2<=1'b1;
end
else
begin
speed1<=speed1+1;
c2<=1'b0;
end
end
end
begin:spd2
if(c2==1'b1)
begin
if(speed2==4'b1001)
begin
speed2<=4'b0000;
c3<=1'b1;
end
else
begin
speed2<=speed2+1;
c3<=1'b0;
end
end
end
begin:spd3
if(c3==1'b1)
begin
if(speed3==4'b1001)
begin
speed3<=4'b0000;
end
else
begin
speed3<=speed3+1;
end
end
end
end
endmodule
这个可以通过MAX+PLUS11的test,至于能否实现你想要的功能就不知道了.
你的代码错误的原因是把硬件编程语言当作软件语言来写了.verilog中,begin和end之间的语句是从上到下顺序执行的,但之外的都是并行执行的.
你原来的代码执行的时候,当第一个触发条件满足,将给c1赋值,c1出现了变化则第二个触发条件满足了,不等你第一部分begin 和end之间的代码执行完就开始执行第二个触发条件里的语句了,这样一来这两块语句中都有给speed1赋值的语句,所以会报错说不能给speed1赋超过一个的值.
修改后的代码把以前的几个模块都用begin 和end框起来了,这样它们就能顺序执行,不会并发的给speed1后其它赋值了.
我也是初学者,大家多多交流.我的邮箱是:rsail@126.com
描述总是要清楚呀
我的功能就是实现转速检测功能,我用的计数器因为气轮机的最大转速就3600左右速所以需要在四个数码管上显示
我就是用的计数器的清零 进位计数些的
看看学学 啊
看看学学啊!
speed0<=4'b0000;
speed1<=4'b0000;
speed2<=4'b0000;
speed3<=4'b0000;
c1<=1'b0;
c2<=1'b0;
c3<=1'b0;
明显上面的信号多驱动了,你在多个process里面对它们赋值
speed0<=4'b0000;
speed1<=4'b0000;
speed2<=4'b0000;
speed3<=4'b0000;
c1<=1'b0;
c2<=1'b0;
c3<=1'b0;
明显上面的信号多驱动了,你在多个process里面对它们赋值
1、好像存在信号被多驱动
2、既然是计数器,我好像没看到时钟信号。
这么长的代码一句注释都没有让别人怎么看啊。
不能在多个always模块中对同一个寄存器进行赋值,对几个speed寄存器的复位动作必须在各自的赋值模块中进行,也就是说每个模块都要设置自己的复位语句,对相应的寄存器进行复位。