非法顺序语句错误
Illegal sequential statement error
谁能告诉我如何修复此代码?
Illegal_sequential_statement 错误是什么(在 modelSim 中)?
为什么在需要时说 near ';' (在 quartus 中)?
LIBRARY ieee ;
USE ieee.std_logic_1164.all;
ENTITY Shift_reg IS
PORT( Par_LD: IN std_logic_vector(7 DOWNTO 0);
Serial_In: IN std_logic;
Serial_Out:OUT std_logic;
RST, LD, EN, CLK: IN std_logic);
END Shift_reg;
ARCHITECTURE shiftRegARCH OF Shift_reg IS
SIGNAL TEMP_REG : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL TEMP_SOUT : STD_LOGIC;
BEGIN
process(CLK,RST)
BEGIN
TEMP_REG <= (OTHERS => '0') WHEN (RST = '1') ELSE
Par_LD WHEN (EN = '0' AND LD = '1')ELSE
(Serial_In & TEMP_REG(7 DOWNTO 1)) WHEN (EN = '1')ELSE
TEMP_REG ;
TEMP_SOUT <= TEMP_REG(0) WHEN (EN = '1') ELSE TEMP_SOUT;
Serial_Out <= TEMP_SOUT;
END PROCESS;
END shiftRegARCH ;
条件信号赋值
TEMP_REG <= (OTHERS => '0') WHEN (RST = '1') ELSE
Par_LD WHEN (EN = '0' AND LD = '1')ELSE
(Serial_In & TEMP_REG(7 DOWNTO 1)) WHEN (EN = '1')ELSE
TEMP_REG ;
仅对 VHDL 2008 有效。您可能将编译器设置设置为 VHDL 2002 或 VHDL 93
除了 lasplund 注意到顺序条件信号分配仅在 VHDL -2008 兼容工具中受支持,有时可以通过工具配置或命令行参数解决,您没有使用公认的结构来指示顺序(时钟) ) 硬件。
Synthesis 不会将敏感列表中 CLK
的存在解释为推断时钟存储,并且 CLK
上将同时存在上升沿和下降沿事件。
这几乎说明您应该使用具有可识别形式的等效 if 语句来推断时钟硬件:
library ieee;
use ieee.std_logic_1164.all;
entity shift_reg is
port (
par_ld: in std_logic_vector(7 downto 0);
serial_in: in std_logic;
serial_out: out std_logic;
rst, ld,
en, clk: in std_logic
);
end entity shift_reg;
architecture shiftregarch of shift_reg is
signal temp_reg: std_logic_vector(7 downto 0);
-- signal temp_sout: std_logic;
begin
process(clk,rst)
begin
-- temp_reg <= (others => '0') when (rst = '1') else
-- par_ld when (en = '0' and ld = '1') else
-- serial_in & temp_reg(7 downto 1)
-- when (en = '1');
-- -- temp_reg ;
if rst = '1' then
temp_reg <= (others => '0');
serial_out <= '0';
elsif rising_edge(clk) then
if en = '0' and ld = '1' then
temp_reg <= par_ld;
elsif en = '1' then
temp_reg <= serial_in & temp_reg( 7 downto 1);
serial_out <= temp_reg(0);
end if;
end if;
-- temp_sout <= temp_reg(0) when (en = '1') else temp_sout;
-- serial_out <= temp_sout;
end process;
end architecture shiftregarch;
请注意缺少最终的 else
s,它们在顺序存储中是多余的,并且丢弃不需要的 temp_sout
并重置 serial_out
并将其包含在 en
伞.
Quartus II 手册中有一个标题为推荐的 HDL 编码风格 的部分显示了 Altera 对表达时钟逻辑的推荐。它不是包罗万象的,因为现已撤销的 IEEE 标准 1076.6-2004 提供了其他几种形式。
它包含几个移位寄存器示例并讨论了默认值和辅助控制。
在 1076.6 中找到 rising_edge 函数显示的方法。
虽然 Lars 解决了您的直接错误,但您可能会遇到其他错误。
谁能告诉我如何修复此代码?
Illegal_sequential_statement 错误是什么(在 modelSim 中)?
为什么在需要时说 near ';' (在 quartus 中)?
LIBRARY ieee ;
USE ieee.std_logic_1164.all;
ENTITY Shift_reg IS
PORT( Par_LD: IN std_logic_vector(7 DOWNTO 0);
Serial_In: IN std_logic;
Serial_Out:OUT std_logic;
RST, LD, EN, CLK: IN std_logic);
END Shift_reg;
ARCHITECTURE shiftRegARCH OF Shift_reg IS
SIGNAL TEMP_REG : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL TEMP_SOUT : STD_LOGIC;
BEGIN
process(CLK,RST)
BEGIN
TEMP_REG <= (OTHERS => '0') WHEN (RST = '1') ELSE
Par_LD WHEN (EN = '0' AND LD = '1')ELSE
(Serial_In & TEMP_REG(7 DOWNTO 1)) WHEN (EN = '1')ELSE
TEMP_REG ;
TEMP_SOUT <= TEMP_REG(0) WHEN (EN = '1') ELSE TEMP_SOUT;
Serial_Out <= TEMP_SOUT;
END PROCESS;
END shiftRegARCH ;
条件信号赋值
TEMP_REG <= (OTHERS => '0') WHEN (RST = '1') ELSE
Par_LD WHEN (EN = '0' AND LD = '1')ELSE
(Serial_In & TEMP_REG(7 DOWNTO 1)) WHEN (EN = '1')ELSE
TEMP_REG ;
仅对 VHDL 2008 有效。您可能将编译器设置设置为 VHDL 2002 或 VHDL 93
除了 lasplund 注意到顺序条件信号分配仅在 VHDL -2008 兼容工具中受支持,有时可以通过工具配置或命令行参数解决,您没有使用公认的结构来指示顺序(时钟) ) 硬件。
Synthesis 不会将敏感列表中 CLK
的存在解释为推断时钟存储,并且 CLK
上将同时存在上升沿和下降沿事件。
这几乎说明您应该使用具有可识别形式的等效 if 语句来推断时钟硬件:
library ieee;
use ieee.std_logic_1164.all;
entity shift_reg is
port (
par_ld: in std_logic_vector(7 downto 0);
serial_in: in std_logic;
serial_out: out std_logic;
rst, ld,
en, clk: in std_logic
);
end entity shift_reg;
architecture shiftregarch of shift_reg is
signal temp_reg: std_logic_vector(7 downto 0);
-- signal temp_sout: std_logic;
begin
process(clk,rst)
begin
-- temp_reg <= (others => '0') when (rst = '1') else
-- par_ld when (en = '0' and ld = '1') else
-- serial_in & temp_reg(7 downto 1)
-- when (en = '1');
-- -- temp_reg ;
if rst = '1' then
temp_reg <= (others => '0');
serial_out <= '0';
elsif rising_edge(clk) then
if en = '0' and ld = '1' then
temp_reg <= par_ld;
elsif en = '1' then
temp_reg <= serial_in & temp_reg( 7 downto 1);
serial_out <= temp_reg(0);
end if;
end if;
-- temp_sout <= temp_reg(0) when (en = '1') else temp_sout;
-- serial_out <= temp_sout;
end process;
end architecture shiftregarch;
请注意缺少最终的 else
s,它们在顺序存储中是多余的,并且丢弃不需要的 temp_sout
并重置 serial_out
并将其包含在 en
伞.
Quartus II 手册中有一个标题为推荐的 HDL 编码风格 的部分显示了 Altera 对表达时钟逻辑的推荐。它不是包罗万象的,因为现已撤销的 IEEE 标准 1076.6-2004 提供了其他几种形式。
它包含几个移位寄存器示例并讨论了默认值和辅助控制。
在 1076.6 中找到 rising_edge 函数显示的方法。
虽然 Lars 解决了您的直接错误,但您可能会遇到其他错误。