我需要在两个进程之间共享一个值(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
如何在两个不同的过程中使用相同的信号/变量进行操作?
答案 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;
注意: