Vhdl 为什么有必要使用内部信号进行处理?
我从根本上学习VHDL,除了这个,一切都很好。我在网上找到的。这是左移位寄存器的代码Vhdl 为什么有必要使用内部信号进行处理?,vhdl,Vhdl,我从根本上学习VHDL,除了这个,一切都很好。我在网上找到的。这是左移位寄存器的代码 library ieee; use ieee.std_logic_1164.all; entity lsr_4 is port(CLK, RESET, SI : in std_logic; Q : out std_logic_vector(3 downto 0); SO : out std_logic); end lsr_4;
library ieee;
use ieee.std_logic_1164.all;
entity lsr_4 is
port(CLK, RESET, SI : in std_logic;
Q : out std_logic_vector(3 downto 0);
SO : out std_logic);
end lsr_4;
architecture sequential of lsr_4 is
signal shift : std_logic_vector(3 downto 0);
begin
process (RESET, CLK)
begin
if (RESET = '1') then
shift <= "0000";
elsif (CLK'event and (CLK = '1')) then
shift <= shift(2 downto 0) & SI;
end if;
end process;
Q <= shift;
SO <= shift(3);
end sequential;
ieee库;
使用ieee.std_logic_1164.all;
实体lsr_4为
端口(时钟、复位、SI:std_逻辑中;
Q:输出标准逻辑向量(3到0);
SO:输出标准(U逻辑);
末端lsr_4;
lsr_4的体系结构是
信号移位:标准逻辑向量(3到0);
开始
过程(重置,时钟)
开始
如果(重置='1'),则
移位在所示代码的情况下,lsr_4
实体的Q
输出来自寄存器(shift
表示寄存器级并连接到Q
)。如果您按照建议编写代码,SI
输入直接(即组合)连接到Q
输出。这也可以工作(假设您保留其余代码),它将执行相同的操作,逻辑上消除一个时钟周期延迟。然而,(通常)认为良好的设计实践是注册实体的输出,以避免引入长的“隐藏”组合路径,这些路径在不查看实体内部时不可见。它通常使设计更容易,并避免遇到时序问题。首先,这只是一个移位寄存器,因此不应推断组合块(输入和输出缓冲器除外,它们与I/O相关,与电路本身无关)
其次,通过将Q指定为“缓冲区”而不是“输出”,可以完全消除称为“移位”的信号(这是必要的,因为Q将出现在表达式的两侧;“缓冲区”对推断电路没有副作用)。下面是对代码的建议
注意:编译代码后,请在Netlist Viewer/Technology Map Viewer工具中检查实际实现的内容
library ieee;
use ieee.std_logic_1164.all;
entity generic_shift_register is
generic (
N: integer := 4);
port(
CLK, RESET, SI: in std_logic;
Q: buffer std_logic_vector(N-1 downto 0);
SO: out std_logic);
end entity;
architecture sequential of generic_shift_register is
begin
process (RESET, CLK)
begin
if (RESET = '1') then
Q <= (others => '0');
elsif rising_edge(CLK) then
Q <= Q(N-2 downto 0) & SI;
end if;
end process;
SO <= Q(N-1);
end architecture;
ieee库;
使用ieee.std_logic_1164.all;
实体通用移位寄存器为
一般的(
N:整数:=4);
港口(
时钟、复位、SI:标准逻辑中;
Q:缓冲器标准逻辑向量(N-1向下至0);
SO:输出标准(U逻辑);
终端实体;
通用移位寄存器的顺序结构是
开始
过程(重置,时钟)
开始
如果(重置='1'),则
Q‘0’;
elsif上升沿(CLK)则
问:你是在问为什么你不能删除shift
信号,而只在整个过程中使用Q
?是的。这是我的问题。。。。。。。在这种情况下,请看pedroni的回答:)@pedroni.好的..现在我明白了..我还有一个问题。据我所知,进程中的语句按顺序执行(一个接一个)…在我的代码中,如果语句之间的重置很高“重要的是,不要将VHDL视为一个程序,而应将其视为一个代码。因此,您可以将问题分为两个问题:1)询问将从代码中推断出什么电路;2) 接下来,询问当(无论您想问什么…)发生时,这个电路将做什么。在您的例子中,从代码推断出的电路是一个具有异步复位的移位寄存器。因此,每当复位信号被断言时,触发器被复位,而不管其他任何事情。我希望此评论有助于…@user3255764请务必注意,buffer关键字可能会给某些供应商工具带来麻烦,因为buffer关键字在VHDL-87和VHDL-93中有点致命:buffer端口只能连接到其他缓冲端口,一旦在层次结构中使用其中一个缓冲端口,就会导致整个设计需要缓冲端口。常见的解决方法实际上是使用中间信号或使用VHDL-2008,其中允许读取输出(从而保存一个信号)。