
接这位楼主的提问,看了许多大虾们的解答,想提问一下,考虑到a的高电平会持续一段时间。如果要求非要在a的上升沿将count清零,如何实现呢?谢谢各位的支持!!!
两个always模块的变量赋值问题
引入一个锁存器Lock,用来区分a的上升沿和高电平。
always @(posedge a or posedge b)
begin
if ( a==1 && Lock==0 )
begin
count <= 0;
Lock <= 1;
end
else
begin
count <= count + 1;
if ( a==0 )
Lock <= 0;
end
end
一般对于寄存器,复位是需要的,所以我这里省略了。
或者可以拆成两个写。这里采用同步复位
always @(posedge a or posedge b)
begin
if(rst==0)
begin
count <= 0;
end
else
begin
if ( a==1 && Lock==0 )
begin
count <= 0;
end
else
begin
count <= count + 1;
end
end
end
always @(posedge a or posedge b)
begin
if(rst==0)
begin
count <= 0;
end
else
begin
if ( a==1 && Lock==0 )
begin
Lock <= 1;
end
else
begin
if ( a==0 )
Lock <= 0;
end
end
end
好的。下面是我的程序,红色部分是增加的东西,增加了后就通过不了综合了。综合的问题是在第二个always上面涂红,问题是the logic for gpshighclkcnt [15:0] does  not match a standard flip-flop.
module fuzhugen(gps,
                gpshighclk,
                rst,
                fuzhu,
                fuzhu1);      
input  gps;
input  gpshighclk;
input  rst;
output fuzhu;                      //增加一个fuzhu输出端口信号
output fuzhu1;                  //增加一个fuzhu1输出端口信号
reg        fuzhu;
reg        fuzhu1;
reg        lockgpshigh;
reg [15:0] gpshighclkcnt;
always @ (posedge gps or posedge gpshighclk)
begin
    if(rst)
        begin            
            gpshighclkcnt<=16'd0;
            fuzhu1<=(1==0);
            fuzhu<=(0==1);
        end
    else
        begin
            if(gps && !lockgpshigh)
                begin
                    gpshighclkcnt<=16'd0;
                    fuzhu<=(0==1);  
                    fuzhu1<=(0==1);                  
                end                 //gps信号上升沿时候,计数器清零,fuzhu和fuzhu1输出port清零
            if(gps && gpshighclkcnt==16'd239)
                begin
                    fuzhu <=(1==1);
                end            //当gps信号为高时并且计数器计数到239的时候fuzhu信号输出高电平
            if(gps && gpshighclkcnt==16'd240)
                begin
                    fuzhu1<=(1==1);                 
                end          //当gps信号为高时并且计数器计数到240的时候fuzhu1信号输出高电平
            else
                begin
                    gpshighclkcnt<=gpshighclkcnt+16'd1;                
                end
        end
end
always @ (posedge gps or posedge gpshighclk)
begin
    if(rst)
        begin
            gpshighclkcnt<=16'd0;            
        end
    else
        begin
            if(gps && !lockgpshigh)
                begin
                    lockgpshigh<=(1==1);
                end
            else
                begin
                    if(!gps)
                        begin
                            lockgpshigh<=(1==0);
                        end
                end
        end
end
endmodule
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
			
			
			
						
			
 我要赚赏金
