vhdl 中的变量或信号用于不同进程之间的共享值

Variable or signal in vhdl for shared value between different process

我需要在两个进程之间共享一个值 (real),但是当我尝试 运行 我的代码时,quartus 给我一个错误。

library IEEE;
USE ieee.std_logic_1164.all; 
USE ieee.std_logic_arith.all; 
USE ieee.std_logic_unsigned.all; 
use IEEE.MATH_REAL.ALL;

entity de0nano is
port (
 CLOCK_50      : in  std_logic;
KEY           : in  std_logic_vector(1 downto 0);
 SW            : in  std_logic_vector(3 downto 0);
 LED           : out std_logic_vector(7 downto 0);
 GPIO           : inout std_logic_vector(35 downto 0)


  );
end de0nano;

architecture struct of de0nano is
--declarations
signal   PN                 :  real :=0.0 ;
signal   PR                 :  real :=0.0 ;
signal   RC             :  integer :=1;
signal   NC             :  integer :=1;
signal   BET                :  integer :=1;


begin
count : process (CLOCK_50, GPIO)
begin 
 --A <= KEY(0);
 GPIO(24) <= '1';
--functional coding
LED <= "00011000";
 if (pn > pr) then
GPIO(26) <= '1';
LED <= "00000001";
else
GPIO(26) <= '0';                    
    end if;
 if (pn = pr) then
GPIO(26) <= '1';
LED <= "00000010";
else
GPIO(26) <= '0';                    
end if;
 if (pn < pr) then
GPIO(26) <= '1';
LED <= "00000011";
else
GPIO(26) <= '0';                    
end if;

end process;

probabilityController : process (CLOCK_50, KEY)
begin
--stato iniziale
if((RC + NC + BET)=1) then
pr <= 0.5;
pn <= 0.5;
end if;
--sequenza rossi consecutivi
if(RC>0) then
pr <= (5)**RC;
pn <= 1- (5)**RC;
end if;
--sequenza neri consecutivi
if(NC>0) then
pr <= (5)**NC;
pn <= 1- (5)**NC;
end if;

end process;

betController : process (CLOCK_50)
begin

end process;

colorController : process (CLOCK_50, KEY)
begin
if(KEY(0)='1') then
NC<=0;
RC <= RC+1;
end if;

if(KEY(1)='1') then
RC<=0;
NC <= NC+1;
end if;


end process;

end str

如何从两个不同的进程在同一个 signal/variable 中操作?

VHDL是一种硬件描述语言。 VHDL 描述可以被模拟(执行有点像您使用大多数编程语言所做的那样)或合成(在互连的简单硬件元素的网络中转换)。一些工具是纯粹的模拟器(Mentor Graphics Modelsim、Cadence ncsim...),另一些是纯粹的合成器(Mentor Graphics Precision RTL、Cadence RTL 编译器...),还有一些工具可以两者兼顾。 Quartus 属于最后一类。所以,首先要做的是决定是要模拟、综合还是两者兼而有之。

如果你想模拟你必须修正三个错误:

  • 你的信号声明的位置,
  • 你赋值的方式(:=)是变量赋值运算符,不是信号赋值(<=)
  • 以及您从两个进程驱动它而它是未解析类型 (real) 的事实。请参阅 了解已解决/未解决的 VHDL 类型。

你的代码可能看起来像这样(但我不知道你想做什么,这可能不是你想要的):

architecture V1 of AOI is
    Signal foobar : real := 0.0;
begin
    OneTwo : process (clk)
    Begin
         Foobar <= foobar + 2.0;
    End process;
end V1;

如果你想合成你将不得不解决更多的问题:

  • 您正在使用 real 类型,它是浮点 VHDL 类型。这是我所知道的合成器无法合成的。事实上,您希望合成器做什么?实例化一个完整的浮点单元?什么牌子?因此,您必须将 real 替换为其他类型(整数、位向量...)。
  • 你在我认为是你的时钟 (clk) 的两个边缘分配你的信号。这可能不是你想要的。
  • 您正在声明时初始化信号。这通常不是我所知道的合成器可以合成的。其实这个initialization time对于模拟的意义很明确:是模拟的开始。但是硬件呢?一个硬件的beginning是什么?制造业?充电?因此,如果您希望信号在某个时候被初始化,您将必须添加一个由 reset 输入驱动的硬件复位。

总而言之,你可以得到类似的东西:

architecture V1 of AOI is
    Signal foobar : natural range 0 to 255;
begin
    OneTwo : process (clk)
    Begin
         if rising_edge(clk) then
              if reset = '1' then
                  foobar <= 0;
              else
                  foobar <= foobar + 2;
              end if;
         end if;
    End process;
end V1;

备注:

  • VHDL 不区分大小写,但您应该尽量保持一致,它会对您有所帮助。
  • 在尝试使用该语言之前,您可能应该参加 VHDL 课程或阅读 VHDL 入门书。它与您已知的编程语言截然不同。硬件和软件是完全不同的世界,即使它们最终紧密相连。