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

时间:2015-09-01 20:36:09

标签: vhdl fpga quartus

我需要在两个进程之间共享一个值(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

如何在两个不同的过程中使用相同的信号/变量进行操作?

1 个答案:

答案 0 :(得分:1)

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

如果您想要模拟,您必须修复三个错误:

  • 信号声明的位置,
  • 分配方式(:=),这是变量赋值运算符,而不是信号赋值(<=
  • 以及从两个进程驱动它的事实,它是一个未解析的类型(real)。有关已解析/未解析的VHDL类型,请参阅this other answer

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

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入门。它与您已经知道的编程语言截然不同。硬件和软件是完全不同的世界,即使它们最终有很强的连接。