2016-02-14 51 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聲稱語法和語義有效性不能絕對做的實際內容當然(對仿包,你的修改後的代碼是相互一致)。