VHDL-如何使用;重置";工作和如何使用?

VHDL-如何使用;重置";工作和如何使用?,vhdl,reset,fpga,xilinx,Vhdl,Reset,Fpga,Xilinx,我是VHDL新手,正在尝试理解reset是如何工作的——特别是在Xilinx Spartan6中。我已经浏览了这个网站和其他网站,一两份白皮书,但我的问题似乎没有得到解决(所以我担心这个问题是如此基本,以至于一切都是假设的!) 无论如何,我继承了一些示例代码,并对其进行了重大更改,成功地获得了一些不错的功能,但使用重置使我感到困惑 代码如下所示: architecture Behavioral of BigProject is ... signal reset : std_logic :

我是VHDL新手,正在尝试理解
reset
是如何工作的——特别是在Xilinx Spartan6中。我已经浏览了这个网站和其他网站,一两份白皮书,但我的问题似乎没有得到解决(所以我担心这个问题是如此基本,以至于一切都是假设的!)

无论如何,我继承了一些示例代码,并对其进行了重大更改,成功地获得了一些不错的功能,但使用重置使我感到困惑

代码如下所示:

architecture Behavioral of BigProject is
...
    signal reset : std_logic := 0;
...
begin
...
    reset <= '0';
...

    process(clk_1MHz, reset) is
    begin
        if reset = '1' then
            foo_flag <= '0';
            fsm_a <= FSM_FIRST_STATE;
        elsif rising_edge(clk_1MHz) then
            case fsm_a is
                when FSM_FIRST_STATE =>
                    <do stuff>
                when FSM_SECOND_STATE =>
                    <do other stuff>
                when others =>
                    null;
            end case;
        end if;
    end process;
大型项目的架构行为是
...
信号复位:标准逻辑:=0;
...
开始
...
重置
无效的
终例;
如果结束;
结束过程;
我使用
reset
的实际用途是什么


谢谢。

您的重置实际上什么都没有完成;)在您的代码中,重置绑定到“0”,因此您的时钟进程始终处于重置状态

通常,复位信号是一个输入端口。因此,模块外部的某个人会对时钟周期或更长时间进行重置,然后将其释放。之后,您的所有寄存器都(或应该)处于knowns状态,并且您的设计已经准备好执行它所执行的任何操作


编辑:抱歉,重设为高激活状态,因此重设的连接0实际上确保时钟进程未重设。曾经所以每次你的设计都是从未知状态开始的。这将是您在模拟波形中看到的红色x。

对于Xilinx工具,信号的初始值适用于通电状态。例如:

signal a : std_logic := '0';
signal b : std_logic := '1';
信号
a
的上电重置值为“0”,信号
b
的上电重置值为“1”

现在,ASIC的情况通常不是这样,Microsemi部件也不是这样

此外,强烈建议您仅将重置限制为实际需要重置的位。例如,如果您有一个对管道中的某些数据进行数学运算的数据路径,是否需要重置数据本身?重置在逻辑(取决于逻辑库,它可能需要多路复用器)、路由(重置必须到达任何需要的地方)方面都有成本,并且在释放重置时可能会很复杂


因此,尽可能限制您的重置。如果不需要外部重置,请不要使用外部重置。如果需要,将其使用限制为基本位。

信号重置:标准逻辑:=***'0'***

在您的代码中,重置绑定到“0”,因此您的时钟进程始终处于重置状态

@贾诺:那不对。对于Altera的合成模块,这并不重要。。。即使重置时会出现
1

如果您合成代码,您将看到合成器忽略该值。也许您甚至会收到一条警告,说明init值被忽略

[


PS:对不起,我还不能写评论。

这不是一个VHDL问题,而是一个(是的,基本的)数字硬件问题……一本好的逻辑设计教科书在这里会很有用。通常,在通电后,你会安排“重置”变为激活状态,然后,当你解除断言时,电路处于已知的启动状态(例如,时钟闪烁00:00)我理解重置是什么…当然。我的问题在于示例代码中的构造(从未说过它是好的或有效的!)以及如何实现实际重置-也就是说,没有输入端口。谢谢。通常,有输入端口。然而,Xilinx也有“全局重置”您可以在顶层设计中实例化的组件,它将在适当的时刻驱动“重置”信号。ISE还允许您在声明中初始化信号,因此在配置后设计将处于此状态,但您以后无法重置它(通过重新配置除外).在Xilinx网站上搜索XAPP appnotes on reset,至少有一个有详细信息。我想你的意思是我的开发板似乎没有任何类型的“硬件”重置,我可以用它来驱动FPGA输入端口(这同样很麻烦)如果你的开发板有一个连接到按钮的FPGA输入引脚,那么如果你愿意,它就有可以使用的硬件如果需要重置,请在移动到原型硬件时执行此操作。我所处理的某些应用程序需要由看门狗计时器驱动的外部重置,例如,如果辐射引起的故障停止,则重新启动硬件。Re:your edit.Hmm.OK。这是我的问题;)那么,我如何实现上电复位的等效功能?或者我只是初始化所有内容?使用测试台,我看到我进入FSM_FIRST_状态(几乎)马上。那我该怎么做呢?我的意思是,我很高兴我这么做了-我的设计很有效-但无法解释原因。抱歉这么晚的评论。基本上你是从你的测试台上驱动重置引脚的,它在你的大项目实体之外。激活重置,等待几个时钟,然后释放它。注意“重置,那么你是对的,我错过了第二个lin。”e、 …除了测试台,我不使用这样的初始值。正如您所看到的(Altera&Xilinx)合成器对初始值的反应不同。