2016-02-14 54 views
-1

在我的VHDL代码中,我在sig_out_real <= X"00" & sig_in when sig_in(7)='0' else X"ff" & sig_in;中有一个错误。VHDL顺序条件信号赋值语句错误

我不认为这是一个语法错误。但是Quartus在这一点上显示了一个错误。

我不明白为什么这是一个错误。

任何人都可以提供信息:

- Error--

错误(10500):近文本在S8BT16B.vhd(35)VHDL语法错误 “时”;期待“;”

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; 
+0

在进程语句中使用VHDL'08功能,如'when ... else'时请注意。当您在项目中启用VHDL'08进行综合时,Quartus支持此功能。但是可能不支持其他VHDL'08功能,给出有线错误消息。在问这里时,也总是尝试创建一个最小的,完整的和可验证的例子。 –

回答

1

您的代码不会呈现Minimal, Complete, and Verifiable example

推测含有所述类型声明complex封装fft_package不存在。

signed_converted_input声明也是不存在的。

一个顺序条件信号赋值语句只在VHDL-2008中。

有一个很好的理由可以说,Synopsys软件包std_logic_arith和std_logic_signed与IEEE Std 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声称语法和语义有效性不能绝对做的实际内容当然(对仿包,你的修改后的代码是相互一致)。