我是vhdl的新手(使用ISE项目导航器),我有一个小问题来合成这个程序(sequence.vhd):
LIBRARY ieee ;
USE ieee.std_logic_1164.all;
PACKAGE mypack IS
VARIABLE counter: STD_LOGIC := '0' ;
VARIABLE simultaneous : STD_LOGIC := '0' ;
END PACKAGE mypack;
LIBRARY ieee ;
USE ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--library work;
USE WORK.mypack.ALL;
ENTITY secuencia IS
PORT(
polh : IN STD_LOGIC; --uno
polv : IN STD_LOGIC; --cero
seq : OUT std_logic_vector(8 downto 0):= (others => 'Z')
);
END secuencia;
ARCHITECTURE registro OF secuencia IS
SIGNAL stack : std_logic_vector(1000 downto 0);
BEGIN
PROCESS(polh, polv)
BEGIN
IF (polh'event) and (polh='1') and (polv='0')THEN
stack(counter) <= '1';
counter := counter +1;
ELSE IF (polv'event) and (polv='1') and (polh='0')THEN
stack(counter) <= '0';
counter := counter +1;
ELSE IF (polh'event) and (polh='1') and (polv'event) and
(polv='1') THEN
simultaneous := simultaneous+1;
END IF;
END PROCESS;
END registro;
Run Code Online (Sandbox Code Playgroud)
这些是前两个错误:
第5行.这里只能声明SHARED变量.
第6行.这里只能声明SHARED变量.
所以问题在于我声明的变量......目的是在架构中使用它们.我确定是一个新手问题,但我看不到解决方案.多谢!
PD:抱歉,我无法正确格式化代码
更新:
感谢帮助@Martin Thompson.我做了你的建议,现在我有不同的类型或问题.我一直在寻找它,但它似乎有广泛的使役.这是代码
ENTITY secuencia IS
PORT(
polh : IN STD_LOGIC; --uno
polv : IN STD_LOGIC; --cero
Pedido : IN STD_LOGIC;
DatoListo : OUT STD_LOGIC;
seq : OUT std_logic_vector(1000 downto 0):= (others => 'Z')
);
END secuencia;
ARCHITECTURE registro OF secuencia IS
SIGNAL stack : std_logic_vector(1000 downto 0);
BEGIN
PROCESS(polh, polv, Pedido)
variable counteria : natural;
variable Listo : integer;
variable simultaneo : integer;
BEGIN
IF (counteria < 1000) THEN
IF (polh'event AND polh='1' AND polv='0') THEN
--IF (polh='1' AND polv='0') THEN
stack(counteria) <= '1';
counteria := counteria +1;
ELSIF (polv'event AND polv='1' AND polh='0') THEN
--ELSIF (polv='1' AND polh='0') THEN
stack(counteria) <= '0';
counteria := counteria +1;
ELSIF (polh'event AND polh='1' AND polv'event AND polv='1') THEN
simultaneo := simultaneo+1;
END IF;
ELSIF (counteria = 1000)THEN
DatoListo <='1';
IF (Pedido='1')THEN
Seq <= stack;
counteria := 0;
DatoListo <='0';
END IF;
END IF;
END PROCESS;
END registro;
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误
第25行:信号堆栈>无法合成,同步描述不良.当前软件版本不支持您用于描述同步元素(寄存器,内存等)的描述样式.
更新2:
我做了一些修改并评论了程序的一部分,它综合了:
PROCESS(polh, polv, Pedido)
variable counteria : natural := 0;
variable Listo : integer;
variable simultaneo : integer;
BEGIN
IF (counteria < 1000) THEN
IF rising_edge(polh) THEN
IF (polv='0') THEN
stack(counteria) <= '1';
counteria := counteria + 1;
END IF;
-- ELSIF rising_edge(polv) THEN
-- IF (polh='0') THEN
-- stack(counteria) <= '0';
-- counteria := counteria +1;
-- END IF;
-- END IF;
ELSIF (counteria = 1000)THEN
DatoListo <='1';
IF (Pedido='1')THEN
Seq <= stack;
counteria := 0;
DatoListo <='0';
ENDIF;
END IF;
END PROCESS;
END registro;
Run Code Online (Sandbox Code Playgroud)
这个合成.但是,当我取消注释该ELSIF rising_edge(polv) THEN部件时,它会出现同样的问题:Signal stack<counteria<9:0>> cannot be synthesized...
暂时不要使用共享变量.您首先需要了解一些基础知识.
如果您需要将counterout 的值"发送" 到其他地方,请将项目添加port到该处并将其写入其中.
如果(看起来像)你只想将它用作存储,请在process你使用它的内部声明它.
最后,如果你希望综合这个,你需要通过一个时钟信号进入port,你需要制作一个标准的时钟进程:
如果要查找polh和polv输入何时更改,则必须存储先前的值并检查它是否与当前值不同.
process (clk)
variable vpol_last : std_logic;
begin
if rising_edge(clk) then
if vpol_last /= vpol then -- it's changed
-- do something
end if;
vpol_last := vpol; -- store current value for next time.
-- etc.
end if;
end process;
Run Code Online (Sandbox Code Playgroud)