liudingding 发表于 2023-5-31 20:51:27

麻烦指点一下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;

aammoo 发表于 2023-5-31 22:53:45

l8直接用jz取反就行了,计数的时候先判断一下l8再加1

wye11083 发表于 2023-6-1 01:03:18

一般的,verilog我记得复位要写到前面。此外,逻辑的组合逻辑不应直接作为异步复位输入,这会带来毛刺并会造成意外的复位。

liudingding 发表于 2023-6-1 08:19:24

wye11083 发表于 2023-6-1 01:03
一般的,verilog我记得复位要写到前面。此外,逻辑的组合逻辑不应直接作为异步复位输入,这会带来毛刺并会 ...
(引用自3楼)

谢谢啊,复位在前正常了,你说的“逻辑的组合逻辑不应直接作为异步复位输入”我都不知什么意思,我说了,我只知道毛,而不知皮,{:lol:} {:lol:}

hecat 发表于 2023-6-1 08:34:10

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:13:54

本帖最后由 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

zxq6 发表于 2023-6-2 20:17:26

liudingding 发表于 2023-6-1 08:19
谢谢啊,复位在前正常了,你说的“逻辑的组合逻辑不应直接作为异步复位输入”我都不知什么意思,我说了, ...
(引用自4楼)

我的理解如下:
这个话的意思是,
jz 是模块里面的变量
l8 来源于 jz
而 i8 又作为模块的输入去影响 jz
这样蛇头咬蛇尾的方式容易出问题。
页: [1]
查看完整版本: 麻烦指点一下Verilog写的可清零计数器程序错误