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

时间:2016-09-28 14:08:36

标签: vhdl reset fpga xilinx

我是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;

我对reset实际使用了什么?

感谢。

3 个答案:

答案 0 :(得分:1)

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

signal a : std_logic := '0';
signal b : std_logic := '1';

信号a的上电复位值为'0',信号b的上电复位值为'1'。

现在,这通常不是ASIC的情况,而且不是Microsemi部件的情况。

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

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

答案 1 :(得分:0)

您的重置实际上什么都没有;)在您的代码中,重置与&#39; 0&#39;因此,您的时钟进程始终处于复位状态。

通常复位信号是输入端口。因此,模块外部的某个人会在时钟周期或更长时间内置位复位然后释放它。在此之后,所有寄存器都处于(或应该)处于已知状态,并且您的设计已准备好执行它所做的事情。

编辑:抱歉,复位为高电平有效,因此复位的tie-0实际上确保时钟进程复位。永远。所以每次你的设计从未知状态开始。这将是你在模拟波形中看到的红色x。

答案 2 :(得分:0)

curl -v https://api.sandbox.paypal.com/v1/payments/payment \ -H "Content-Type:application/json" \ -H "Authorization: Bearer Access-Token" \ -d '{ "intent": "sale", "payer": { "payment_method": "credit_card", "funding_instruments": [ { "credit_card": { "number": "4012888888881881", "type": "mastercard", "expire_month": 12, "expire_year": 2018, "cvv2": 111, "first_name": "Betsy", "last_name": "Buyer" } }] }, "transactions": [ { "amount": { "total": "7.47", "currency": "USD" }, "description": "This is the payment transaction description." }] }'

  

在您的代码中,重置与&#39; 0&#39;因此,您的时钟进程始终处于复位状态。

@Jarno:那不对。对于Altera的合成模块,这并不重要......即使复位有signal reset : std_logic := ***'0'***;
如果您合成代码,您将看到合成器忽略该值。也许您甚至会收到一条警告,即忽略init值。

[http://quartushelp.altera.com/14.0/mergedProjects/msgs/msgs/wvrfx2_vhdl_warning_initial_value_for_signal_is_ignored.htm][1]

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