这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » 两个always模块的变量赋值问题

共12条 1/2 1 2 跳转至

两个always模块的变量赋值问题

菜鸟
2010-02-26 23:40:00     打赏



接这位楼主的提问,看了许多大虾们的解答,想提问一下,考虑到a的高电平会持续一段时间。如果要求非要在a的上升沿将count清零,如何实现呢?谢谢各位的支持!!!




关键词: 两个     always     模块     变量     赋值     问题    

高工
2010-02-27 12:40:28     打赏
2楼

楼主的意思是:b是计数时钟,上升沿有效;a是清零信号,上升沿有效吗?


菜鸟
2010-02-27 14:07:09     打赏
3楼

是的啊,a是清零信号,但是仅仅在a上升沿将计数器清零。谢谢jason zhang的支持,你的资料很好,我看了很多


高工
2010-02-27 20:03:19     打赏
4楼
楼主看看下面的方法是否可行。我还没做仿真
引入一个锁存器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

高工
2010-02-27 20:05:39     打赏
5楼

不客气,希望这些资料对你的学习和工作能有所帮助


菜鸟
2010-03-03 14:50:18     打赏
6楼
jason zhang,你好,你给的程序我已经仿真过了,可以通过,但是在综合的时候遇到了问题,它在always单词上面涂红,错误原因是the logic for...does not match a standard flip-flop.我在其他论坛上面看到的是在每个always模块里面一定要有always@(posedge... or posedge rst),有个复位的操作,那么应该怎么改符合这个呢?

高工
2010-03-03 18:37:44     打赏
7楼
Lock要定义成Reg类型的。

一般对于寄存器,复位是需要的,所以我这里省略了。

或者可以拆成两个写。这里采用同步复位

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

菜鸟
2010-03-04 14:18:44     打赏
8楼
非常感谢Jason zhang,,,我已经仿真了,这样做能够通过综合。但是如果想在清零的上升沿(即a的上升沿)加一个端口输出(port)output,综合又通不过,应该怎么做啊?

高工
2010-03-04 20:10:24     打赏
9楼

没看明白你的意思。可以把代码贴出来看看吗?


菜鸟
2010-03-05 13:57:07     打赏
10楼

好的。下面是我的程序,红色部分是增加的东西,增加了后就通过不了综合了。综合的问题是在第二个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


共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]