Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 为什么有必要使用内部信号进行处理?_Vhdl - Fatal编程技术网

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;

我从根本上学习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;

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,其中允许读取输出(从而保存一个信号)。