输入和输出端口的行为是否像触发器一样? (超高密度语言)
Do input and output ports behave like flip-flops? (VHDL)
VHDL 中的输入和输出端口是否像触发器一样工作,即它们是在时钟的上升沿还是下降沿更新?这是我的意思的一个例子。
entity main is
port(
clk : in std_logic; -- FPGA clock
x : in std_logic; -- input signal
y : out std_logic -- sampled input signal
);
end entity main;
architecture RTL of main is
signal y_q : std_logic;
begin
y <= y_q; -- set the output
copy : process(clk, x) is
variable y_d : std_logic;
begin
y_d := x; -- continuously sample x
if rising_edge(clk) then -- synchronous logic
y_q <= y_d; -- update flip-flop
end if;
end process copy;
end architecture RTL;
上面的程序只是对输入信号 x
进行采样,并将其发送到输出 y
。信号 y_q
是采样输入信号 x
,而采样是在时钟 clk
的每个上升沿进行的。但是,我对 y
信号感到困惑 - 该信号与 y_q
完全相同,还是延迟了一个时钟周期?
y <= y_q
只是 "wires up" y
到 y_q
。没有暗示额外的逻辑,所以没有延迟。
或者,您可以只查看为此模块生成的 RTL!下面的屏幕截图来自 Xilinx ISE。 ("fd" 是 D 型触发器的 Xilinx 名称。)
因为你问了。
Intel/Altera 和 Xilinx 综合接受以下代码。
entity main is
port(
clk : in std_logic; -- FPGA clock
x : in std_logic; -- input signal
y : out std_logic -- sampled input signal
);
end entity main;
architecture RTL of main is begin
y <= x when rising_edge(clk);
end architecture RTL;
是的,您可以使用 when
。你不能在 2008 年之前的进程中使用它。
至于你的问题,信号y和信号y_q是一样的吗,答案是肯定的。
y <= y_q;
是任何进程的并发分配,它只是说两个信号 y 和 y_q 应该连接在一起,所以当然,它们是相同的。
尽管您的代码在逻辑上看起来是正确的,但您不应该以这种方式编写寄存器。你可以查看xilinx XST用户指南,它会告诉你如何描述几种寄存器。
VHDL 中的输入和输出端口是否像触发器一样工作,即它们是在时钟的上升沿还是下降沿更新?这是我的意思的一个例子。
entity main is
port(
clk : in std_logic; -- FPGA clock
x : in std_logic; -- input signal
y : out std_logic -- sampled input signal
);
end entity main;
architecture RTL of main is
signal y_q : std_logic;
begin
y <= y_q; -- set the output
copy : process(clk, x) is
variable y_d : std_logic;
begin
y_d := x; -- continuously sample x
if rising_edge(clk) then -- synchronous logic
y_q <= y_d; -- update flip-flop
end if;
end process copy;
end architecture RTL;
上面的程序只是对输入信号 x
进行采样,并将其发送到输出 y
。信号 y_q
是采样输入信号 x
,而采样是在时钟 clk
的每个上升沿进行的。但是,我对 y
信号感到困惑 - 该信号与 y_q
完全相同,还是延迟了一个时钟周期?
y <= y_q
只是 "wires up" y
到 y_q
。没有暗示额外的逻辑,所以没有延迟。
或者,您可以只查看为此模块生成的 RTL!下面的屏幕截图来自 Xilinx ISE。 ("fd" 是 D 型触发器的 Xilinx 名称。)
因为你问了。 Intel/Altera 和 Xilinx 综合接受以下代码。
entity main is
port(
clk : in std_logic; -- FPGA clock
x : in std_logic; -- input signal
y : out std_logic -- sampled input signal
);
end entity main;
architecture RTL of main is begin
y <= x when rising_edge(clk);
end architecture RTL;
是的,您可以使用 when
。你不能在 2008 年之前的进程中使用它。
至于你的问题,信号y和信号y_q是一样的吗,答案是肯定的。 y <= y_q; 是任何进程的并发分配,它只是说两个信号 y 和 y_q 应该连接在一起,所以当然,它们是相同的。
尽管您的代码在逻辑上看起来是正确的,但您不应该以这种方式编写寄存器。你可以查看xilinx XST用户指南,它会告诉你如何描述几种寄存器。