我是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
实际使用了什么?
感谢。
答案 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值。
PS:对不起,我还不能写评论。