VHDL时序条件信号赋值语句错误
VHDL sequential conditional signal assignment statement error
在我的 VHDL 代码中 sig_out_real <= X"00" & sig_in when sig_in(7)='0' else X"ff" & sig_in;
有一个错误。
我认为这不是语法错误。但是 Quartus 在那个时候显示错误。
我不明白为什么会出错。
谁能提供资料:
-- 错误--
Error (10500): VHDL syntax error at S8BT16B.vhd(35) near text "when"; expecting ";"
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_arith.all;
use work.fft_package.all;
entity S8BT16B is
port(
clk_50 : in std_logic;
clk_baud : in std_logic;
main_reset : in std_logic;
enable : in std_logic;
sig_in : in signed (7 downto 0);
sig_out : out complex;
valid_output : out std_logic
);
end S8BT16B;
architecture Behavioral of S8BT16B is
type state is (idle,start);
signal state_reg, next_state_reg : state;
signal sig_out_real : signed(15 downto 0);
begin
state_change : process(clk_50, main_reset)
begin
if (main_reset = '1' or enable = '0') then
state_reg <= idle;
elsif (main_reset ='0' and enable = '1') then
state_reg <= next_state_reg;
end if;
end process;
S8BT16B_active : process(clk_baud, state_reg)
begin
if (state_reg = idle) then
sig_out_real <="0000000000000000";
sig_out <=(sig_out_real,"0000000000000000");
next_state_reg <= start;
valid_output <= '0';
elsif (state_reg = start and enable = '1') then
sig_out_real <= X"00" & sig_in when sig_in(7)='0' else X"ff" & sig_in;
sig_out <= (signed_converted_input, "0000000000000000");
next_state_reg <= idle;
valid_output <= '1';
end if;
end process;
end Behavioral;
您的代码没有 Minimal, Complete, and Verifiable example。
可能包含 complex
类型声明的包 fft_package 不存在。
signed_converted_input
的声明也不存在。
顺序条件信号赋值语句仅在 VHDL-2008 中可用。
Synopsys 包 std_logic_arith 和 std_logic_signed 与 IEEE 标准 1076-2008 定义的包 std_logic_1164 不兼容是有道理的。有可能它们已经被重写以适应 std_logic_vector 和 std_ulogic 向量的新定义,尽管如果它们在没有 -2008 兼容性的情况下工作,并且在 ALDEC 方面没有一些严重的自动化,则不会。
如果传递 -2008 兼容性标志不能为您解决问题,您可以做的最简单的事情就是用 if 语句中的两个简单信号赋值语句替换顺序条件信号赋值语句:
library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
package fft_package is
type complex is record
sig_real: signed (15 downto 0);
sig_imaginary: signed (15 downto 0);
end record;
constant signed_converted_input: signed (15 downto 0) := (others => '0');
end package;
library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use work.fft_package.all;
entity S8BT16B is
port(
clk_50: in std_logic;
clk_baud: in std_logic;
main_reset: in std_logic;
enable: in std_logic;
sig_in: in signed (7 downto 0);
sig_out: out complex;
valid_output: out std_logic
);
end S8BT16B;
architecture Behavioral of S8BT16B is
type state is (idle,start);
signal state_reg, next_state_reg: state;
signal sig_out_real: signed(15 downto 0);
begin
state_change:
process(clk_50, main_reset)
begin
if (main_reset = '1' or enable = '0') then
state_reg <= idle;
elsif (main_reset ='0' and enable = '1') then
state_reg <= next_state_reg;
end if;
end process;
S8BT16B_active:
process(clk_baud, state_reg)
begin
if state_reg = idle then
sig_out_real <= "0000000000000000";
sig_out <=(sig_out_real,"0000000000000000");
next_state_reg <= start;
valid_output <= '0';
elsif state_reg = start and enable = '1' then
-- sig_out_real <= X"00" & sig_in when sig_in(7)='0' else
-- X"ff" & sig_in;
if sig_in(7) = '0' then
sig_out_real <= X"00" & sig_in;
else
sig_out_real <= X"ff" & sig_in;
end if;
sig_out <= (signed_converted_input, "0000000000000000");
next_state_reg <= idle;
valid_output <= '1';
end if;
end process;
end Behavioral;
此代码分析、阐述和模拟(以显示在不考虑 sig_in(7) = '0'
的情况下不存在长度不匹配),但未对其功能作出任何声明。长度在 sig_out_real
.
的分配中看起来是正确的
当然,在没有看到您的包的实际内容的情况下,fft_package 不能绝对保证语法和语义有效性(伪包和您修改后的代码彼此一致)。
在我的 VHDL 代码中 sig_out_real <= X"00" & sig_in when sig_in(7)='0' else X"ff" & sig_in;
有一个错误。
我认为这不是语法错误。但是 Quartus 在那个时候显示错误。
我不明白为什么会出错。
谁能提供资料:
-- 错误--
Error (10500): VHDL syntax error at S8BT16B.vhd(35) near text "when"; expecting ";"
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_arith.all;
use work.fft_package.all;
entity S8BT16B is
port(
clk_50 : in std_logic;
clk_baud : in std_logic;
main_reset : in std_logic;
enable : in std_logic;
sig_in : in signed (7 downto 0);
sig_out : out complex;
valid_output : out std_logic
);
end S8BT16B;
architecture Behavioral of S8BT16B is
type state is (idle,start);
signal state_reg, next_state_reg : state;
signal sig_out_real : signed(15 downto 0);
begin
state_change : process(clk_50, main_reset)
begin
if (main_reset = '1' or enable = '0') then
state_reg <= idle;
elsif (main_reset ='0' and enable = '1') then
state_reg <= next_state_reg;
end if;
end process;
S8BT16B_active : process(clk_baud, state_reg)
begin
if (state_reg = idle) then
sig_out_real <="0000000000000000";
sig_out <=(sig_out_real,"0000000000000000");
next_state_reg <= start;
valid_output <= '0';
elsif (state_reg = start and enable = '1') then
sig_out_real <= X"00" & sig_in when sig_in(7)='0' else X"ff" & sig_in;
sig_out <= (signed_converted_input, "0000000000000000");
next_state_reg <= idle;
valid_output <= '1';
end if;
end process;
end Behavioral;
您的代码没有 Minimal, Complete, and Verifiable example。
可能包含 complex
类型声明的包 fft_package 不存在。
signed_converted_input
的声明也不存在。
顺序条件信号赋值语句仅在 VHDL-2008 中可用。
Synopsys 包 std_logic_arith 和 std_logic_signed 与 IEEE 标准 1076-2008 定义的包 std_logic_1164 不兼容是有道理的。有可能它们已经被重写以适应 std_logic_vector 和 std_ulogic 向量的新定义,尽管如果它们在没有 -2008 兼容性的情况下工作,并且在 ALDEC 方面没有一些严重的自动化,则不会。
如果传递 -2008 兼容性标志不能为您解决问题,您可以做的最简单的事情就是用 if 语句中的两个简单信号赋值语句替换顺序条件信号赋值语句:
library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
package fft_package is
type complex is record
sig_real: signed (15 downto 0);
sig_imaginary: signed (15 downto 0);
end record;
constant signed_converted_input: signed (15 downto 0) := (others => '0');
end package;
library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use work.fft_package.all;
entity S8BT16B is
port(
clk_50: in std_logic;
clk_baud: in std_logic;
main_reset: in std_logic;
enable: in std_logic;
sig_in: in signed (7 downto 0);
sig_out: out complex;
valid_output: out std_logic
);
end S8BT16B;
architecture Behavioral of S8BT16B is
type state is (idle,start);
signal state_reg, next_state_reg: state;
signal sig_out_real: signed(15 downto 0);
begin
state_change:
process(clk_50, main_reset)
begin
if (main_reset = '1' or enable = '0') then
state_reg <= idle;
elsif (main_reset ='0' and enable = '1') then
state_reg <= next_state_reg;
end if;
end process;
S8BT16B_active:
process(clk_baud, state_reg)
begin
if state_reg = idle then
sig_out_real <= "0000000000000000";
sig_out <=(sig_out_real,"0000000000000000");
next_state_reg <= start;
valid_output <= '0';
elsif state_reg = start and enable = '1' then
-- sig_out_real <= X"00" & sig_in when sig_in(7)='0' else
-- X"ff" & sig_in;
if sig_in(7) = '0' then
sig_out_real <= X"00" & sig_in;
else
sig_out_real <= X"ff" & sig_in;
end if;
sig_out <= (signed_converted_input, "0000000000000000");
next_state_reg <= idle;
valid_output <= '1';
end if;
end process;
end Behavioral;
此代码分析、阐述和模拟(以显示在不考虑 sig_in(7) = '0'
的情况下不存在长度不匹配),但未对其功能作出任何声明。长度在 sig_out_real
.
当然,在没有看到您的包的实际内容的情况下,fft_package 不能绝对保证语法和语义有效性(伪包和您修改后的代码彼此一致)。