麻烦指点一下Verilog写的可清零计数器程序错误
本帖最后由 liudingding 于 2023-5-31 22:11 编辑Verilog只知道点毛而不知皮,不要笑话我不懂,
Quartus13,EPM240,写了个可清零计数器,时钟20M,LED几秒钟闪烁一次,有些不规律,除掉清零部分程序,LED闪烁极快的,麻烦指点一下怎么改,
我的本意是计数器计数到10M(10M=0x989680,二进制24位),清零,重新计数,
reg jz;
always @(posedge ckz or negedge l8)
begin
if(ckz) jz<=jz+1;
else jz<=0;
end
wire l8;
assign l8=(jz==10000000)?0:1;
assign led=jz;
l8直接用jz取反就行了,计数的时候先判断一下l8再加1 一般的,verilog我记得复位要写到前面。此外,逻辑的组合逻辑不应直接作为异步复位输入,这会带来毛刺并会造成意外的复位。 wye11083 发表于 2023-6-1 01:03
一般的,verilog我记得复位要写到前面。此外,逻辑的组合逻辑不应直接作为异步复位输入,这会带来毛刺并会 ...
(引用自3楼)
谢谢啊,复位在前正常了,你说的“逻辑的组合逻辑不应直接作为异步复位输入”我都不知什么意思,我说了,我只知道毛,而不知皮,{:lol:} {:lol:} wire ckz;
wire led;
wire l8;
reg jz;
always @(posedge ckz or negedge l8)
begin
if(!l8)
jz <= 24'd0;
else
jz <= jz + 1'b1;
end
assign l8 = jz != 24'd10000000;
assign led = jz;
本帖最后由 zxq6 于 2023-6-2 20:18 编辑
我一般这么写的,更接近c语言的理解,运行正常。
我属于野生V程序猿,也没考究过资源占用和运行效率的情况。
`timescale 1 ps / 1 ps
module dbgLed(
input wire sysClk,//100Mhz,10ns
output reg led
);
reg ledTimer;
always @ (posedge sysClk)begin
if(ledTimer>=100_000_000)begin
ledTimer<=1'b0;
end
else begin
ledTimer<=ledTimer+1'b1;
end
if(ledTimer==10_000_000)begin
led<=12'hfff;
end
else if(ledTimer==60_000_000) begin
led<=1'b0;
end
end
endmodule liudingding 发表于 2023-6-1 08:19
谢谢啊,复位在前正常了,你说的“逻辑的组合逻辑不应直接作为异步复位输入”我都不知什么意思,我说了, ...
(引用自4楼)
我的理解如下:
这个话的意思是,
jz 是模块里面的变量
l8 来源于 jz
而 i8 又作为模块的输入去影响 jz
这样蛇头咬蛇尾的方式容易出问题。
页:
[1]