论坛» 嵌入式开发» FPGA

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

菜鸟
2010-02-26 23:40 1楼



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

高工
2010-02-27 12:40 2楼

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

菜鸟
2010-02-27 14:07 3楼

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

高工
2010-02-27 20:03 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 5楼

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

菜鸟
2010-03-03 14:50 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 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 8楼
非常感谢Jason zhang,,,我已经仿真了,这样做能够通过综合。但是如果想在清零的上升沿(即a的上升沿)加一个端口输出(port)output,综合又通不过,应该怎么做啊?
高工
2010-03-04 20:10 9楼

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

菜鸟
2010-03-05 13:57 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 跳转至

回复

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