EETOP 创芯网论坛 (原名:电子顶级开发网)
标题:
求教一个fpga复位的问题
[打印本页]
作者:
xduryan
时间:
2016-7-11 09:25
标题:
求教一个fpga复位的问题
模块代码:module fpga_rst(
input clk,
input rst,
output [7:0] dout
);
reg [7:0] data = 8'h5a;
always @ (posedge clk or negedge rst)begin
if(rst==1'b0)begin
data <= 8'h0;
end
else begin
data <= data + 1;
end
end
assign dout = data;
endmodule
测试代码:
module tb_fpga_test;
reg clk;
reg rst;
wire [7:0] dout;
fpga_rst uut (
.clk(clk),
.rst(rst),
.dout(dout)
);
initial begin
clk = 0;
forever #5 clk = ~ clk;
end
initial begin
rst = 0;
#111;
rst = 1;
end
endmodule
实际的仿真波形:
[attach]660822[/attach]
问题:
为什么从一开始 输出就被复位了?我的理解是dout的初始值应该为5a,然后在clk的第一个上升沿的时候检测到rst=0才复位到0;但是实际的仿真结果给我的感觉是negedge rst这个条件被触发了,但是我给的rst信号一开始就是0然后才为1,就没有下降沿,怎么会触发呢?
作者:
harry_hust
时间:
2016-7-11 09:33
寄存器貌似不能设置初始值的,只能通过复位才能置位或复位;
wire型是可以设置初始值的。
作者:
xduryan
时间:
2016-7-11 09:41
回复
2#
harry_hust
xilinx的fpga的FF是可以设置初始值的,初始值是FF的一个属性,编译工具也可以识别。xilinx的fpga的FF的初始值和复位值并不一样。
另外,wire型不能设置初值。
我试过:如果一开始不给rst=0,也就是不复位,仿真结果是:一开始FF加载的是初始值5a,谢谢。
请回答我问的问题,谢谢~
作者:
xduryan
时间:
2016-7-11 09:42
原帖中仿真图没加进去,请看我的回复中添加的图
作者:
vongy
时间:
2016-7-11 09:47
从unknown到0,仿真工具也认为是下降沿
作者:
xduryan
时间:
2016-7-11 09:51
回复
5#
vongy
谢谢~ 你的意思是我虽然在仿真时刻0给rst=0,但是仿真工具依然认为rst是从一个unkonwn状态转换为0的,然后认为它是一个下降沿,从而触发always块的执行对吗?
作者:
harry_hust
时间:
2016-7-11 09:54
回复
6#
xduryan
你可以基于5楼的,换成高电平复位试试
作者:
xduryan
时间:
2016-7-11 10:00
回复
7#
harry_hust
结果一样,可能仿真器也认为从未知态到1是上升沿
作者:
YYFFLLMMNN
时间:
2016-7-11 10:02
寄存器变量你赋了一个初始值,这种情况只能用于仿真,是不能用来跑程序的,程序运行的时候,寄存器的值是默认值,Xilinx与Altera都是默认为0。
作者:
xduryan
时间:
2016-7-11 10:03
回复
5#
vongy
[attach]660823[/attach]我刚截的图,从图中约么可以看出在仿真最开始的时候clk和rst的电平处在中间的位置,但是放大的话就看不出来,必须得缩小了才能看到。
这一部分是不是就是你说的unkown状态
作者:
xduryan
时间:
2016-7-11 10:07
回复
5#
vongy
作者:
xduryan
时间:
2016-7-11 10:08
回复
9#
YYFFLLMMNN
那这段话怎么理解
作者:
xduryan
时间:
2016-7-11 10:17
回复
9#
YYFFLLMMNN
[attach]660827[/attach]这是我把帖子里的程序简单实现了一下,用fgpa editor看了最后实现的结果,图中FF的INIT属性难道不是FF的上电初始值吗?难道这个属性不起作用?任何FF在上电的初始值都是0?求确定,这个对我很重要,这两天调程序遇到一个跟复位和初始值有一定关系的bug
作者:
YYFFLLMMNN
时间:
2016-7-11 10:54
我以前看的书确实是告知我不行的,至少在verilog里面我还没见过。
你可以用程序跑一下(不是仿真),观察非复位的初始化(不要设置为全0)是否成功了。
图中初始化的值为全0,与Xilinx/Altera公司的上电默认寄存器的值(全0)是一样的。
这样初始化看起来当然是成功了。
作者:
vongy
时间:
2016-7-11 17:01
reg [3:0] a = 4'd2;
这种情况用在没有复位信号但需要有上电初始值的情况。
always @(posedge clk) begin
a <= b;
end
如果接口中已经有复位信号,那么就不需要上电初始值了,直接在复位中给定复位值就行了。
作者:
YYFFLLMMNN
时间:
2016-7-12 10:12
FF在上电时的默认值是0还是1?
答:我记得在Xilinx与Altera都是默认为0,因为它们都是掉电要丢数据的芯片;
只有Actel公司的是掉电不丢的,所以寄存器保持上次修改后的值。
PS.默认值到底是多少,你上电之后引出来看灯亮不亮或者用Chipscope看不就行了,用得着这么纠结?
作者:
vigorkylin
时间:
2016-7-12 10:28
本帖最后由 vigorkylin 于 2016-7-12 10:35 编辑
你在测试程序initial语句开始时加入
force uut.data = 8'ha5;
试试
在module中给reg赋初是没用的,仿真器在分析设计的时候就会把它忽略掉的
你碰到的上电初始值问题是什么问题,何不说出来,也许跟你这里的问题有很大不同只是你理解偏差呢
作者:
iyama
时间:
2016-7-12 11:33
本帖最后由 iyama 于 2016-7-12 11:34 编辑
fpga 里面寄存器给一个初始值应该是可以的
因为是异步复位,所以跟clock没关系
rst 先设为1 再试试?
initial begin
rst = 1;
#111;
rst = 0;
#111;
rst = 1;
end
作者:
yt920419
时间:
2016-7-12 16:38
你写的代码中复位形式是: 异步复位。同步复位和异步复位的比较
一、特点:
同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用Verilog描述如下:
always @ (posedge clk) begin
if (!Rst_n)
...
end
异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下:
always @ (posedge clk or negedge Rst_n) begin
if (!Rst_n)
...
end
二、各自的优缺点:
1、总的来说,同步复位的优点大概有3条:
a、有利于仿真器的仿真。
b、可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高。
c、因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。他的缺点也有不少,主要有以下几条:
a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。
b、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
2、对于异步复位来说,他的优点也有三条,都是相对应的
a、大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
b、设计相对简单。
c、异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
缺点:
a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
b、复位信号容易受到毛刺的影响。
三、总结:
所以说,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了。
欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/)
Powered by Discuz! X3.5