2017-02-20 2 views
0

Прежде всего, я должен сказать, что я являюсь завершающим новичком в VHDL, поэтому, если это действительно глупый вопрос, я хочу извиниться заранее. Я пытаюсь заставить IP-адрес ADC работать. Я хочу использовать только АЦП, поэтому нет FIFO или чего-либо еще. Поэтому я сгенерировал ядро ​​IP с qsys-файлом и включил его в свой проект. Я также активировал канал 8 с предделителем. Im пытается прочитать значение от переменного резистора, подключенного к каналу 8, и распечатать 5 наиболее значимых бит с помощью светодиода. Оператор case должен создать шаблон, необходимый для активации adc, как указано в руководстве MAX 10 ADC.MAX 10 ADC с оптимизацией кода VHDL/Quartus Prime Lite

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 



entity main is 
    port (CLK_50 : in std_logic; 
      LEDR : out std_logic_vector(4 downto 0)); 
end; 


architecture behave of main is 

    signal Cnt : integer := 0; 
    signal pCnt : integer := 0; 

    signal lock : std_logic; 
    signal CLK_10 : std_logic; 
    signal CLK_1 : std_logic; 
    signal set : std_logic ; 

    signal RESET : std_logic ; 

    signal CMDVal : std_logic; 
    signal CMDCH : std_logic_vector (4 downto 0); 
    signal CMDSOP : std_logic; 
    signal CMDEOP : std_logic; 
    signal CMDRDY : std_logic; 
    signal RESVal : std_logic; 
    signal RESCH : std_logic_vector (4 downto 0); 
    signal RESData : std_logic_vector (11 downto 0); 
    signal RESSOP : std_logic; 
    signal RESEOP : std_logic; 

    component myadc is 
     port (
      clock_clk    : in std_logic      := 'X';    -- clk 
      reset_sink_reset_n  : in std_logic      := 'X';    -- reset_n 
      adc_pll_clock_clk  : in std_logic      := 'X';    -- clk 
      adc_pll_locked_export : in std_logic      := 'X';    -- export 
      command_valid   : in std_logic      := 'X';    -- valid 
      command_channel  : in std_logic_vector(4 downto 0) := (others => 'X'); -- channel 
      command_startofpacket : in std_logic      := 'X';    -- startofpacket 
      command_endofpacket : in std_logic      := 'X';    -- endofpacket 
      command_ready   : out std_logic;          -- ready 
      response_valid   : out std_logic;          -- valid 
      response_channel  : out std_logic_vector(4 downto 0);      -- channel 
      response_data   : out std_logic_vector(11 downto 0);     -- data 
      response_startofpacket : out std_logic;          -- startofpacket 
      response_endofpacket : out std_logic           -- endofpacket 
     ); 
    end component myadc; 

begin 

    CMDCH <= "01000"; 
    RESET <= '0'; 
    set <= '1'; 

    mPLL : entity work.pll 
     port map(
     areset => set, 
     inclk0 => CLK_50, 
     c0 => CLK_10, 
     c1 => CLK_1, 
     locked => lock 
    ); 


    mADC : component myadc 
     port map (
      clock_clk    => CLK_50,     --   clock.clk 
      reset_sink_reset_n  => RESET,      --  reset_sink.reset_n 
      adc_pll_clock_clk  => CLK_10,     -- adc_pll_clock.clk 
      adc_pll_locked_export => lock,       -- adc_pll_locked.export 
      command_valid   => CMDVal,     --  command.valid 
      command_channel  => CMDCH,     --    .channel 
      command_startofpacket => CMDSOP,     --    .startofpacket 
      command_endofpacket => CMDEOP,     --    .endofpacket 
      command_ready   => CMDRDY,     --    .ready 
      response_valid   => RESVal,     --  response.valid 
      response_channel  => RESCH,      --    .channel 
      response_data   => RESData,    --    .data 
      response_startofpacket => RESSOP,     --    .startofpacket 
      response_endofpacket => RESEOP     --    .endofpacket 
     ); 

process 
begin 

    wait until rising_edge(CLK_50); 

    pCnt <= pCnt + 1; 

    case pCnt is 
     when 1 => CMDSOP <= '1'; 
        CMDVal <= '1'; 
     when 114 => CMDRDY <= '1'; 
     when 115 => CMDSOP <= '0'; 
         CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 214 => CMDRDY <= '1'; 
     when 215 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 314 => CMDRDY <= '1'; 
     when 315 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 414 => CMDRDY <= '1'; 
     when 415 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 514 => CMDRDY <= '1'; 
     when 515 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 614 => CMDRDY <= '1'; 
     when 615 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 714 => CMDRDY <= '1'; 
     when 715 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 814 => CMDRDY <= '1'; 
     when 815 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 914 => CMDRDY <= '1'; 
     when 915 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7); 
     when 1014 => CMDRDY <= '1'; 
     when 1015 => CMDRDY <= '0'; 
         LEDR <= RESData(11 downto 7);  
     when 1114 => CMDRDY <= '1'; 
     when 1115 => CMDRDY <= '0'; 
         CMDEOP <= '1'; 
     when 1116 => CMDEOP <= '0'; 
         CMDVal <= '0'; 


     when 2000 => pCnt <= 0; 
     when others => Cnt <= pCnt ; 
    end case; 
end process; 

end; 

Однако при компиляции Quartus всегда удаляет весь мой код. Таким образом, в конце он тянет светодиоды к GND, и ни один из них не использует АЦП или PLL. Если у кого-то есть идея, я был бы очень благодарен, если бы вы могли сказать мне, что это за нарушение.

С уважением.

Редактировать: Я не был достаточно ясен с описанием проблемы, которую у меня есть. Он правильно синтезирует, но он думает, что pll не является необходимым и поэтому удаляет его, оставляя ядро ​​adc ip без часов и так же удаляя его. Ошибки:

Warning (14284): Synthesized away the following node(s): 
    Warning (14285): Synthesized away the following RAM node(s): 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[0]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[1]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[2]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[3]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[4]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[5]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[6]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[7]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[8]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[9]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[10]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[11]" 
Warning (14284): Synthesized away the following node(s): 
    Warning (14285): Synthesized away the following RAM node(s): 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[0]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[1]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[2]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[3]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[4]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[5]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[6]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[7]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[8]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[9]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[10]" 
     Warning (14320): Synthesized away node "madc:myadc|madc_modular_adc_0:modular_adc_0|altera_modular_adc_control:control_internal|altera_modular_adc_control_fsm:u_control_fsm|altera_modular_adc_control_avrg_fifo:ts_avrg_fifo|scfifo:scfifo_component|scfifo_ds61:auto_generated|a_dpfifo_3o41:dpfifo|altsyncram_rqn1:FIFOram|q_b[11]" 
Warning (14284): Synthesized away the following node(s): 
    Warning (14285): Synthesized away the following PLL node(s): 
     Warning (14320): Synthesized away node "mpll:myPLL|altpll:altpll_component|mpll_altpll:auto_generated|wire_pll1_clk[0]" 
+0

Когда ваша логика съедается во время оптимизации, а выходы связаны с рельсом, это обычно является признаком ошибки логического дизайна или ошибки использования инструмента. в этом случае сосредоточено на ResData из myadc, используемого для управления значениями LEDR. В дополнение к потенциальной логической проблеме с myadc она может быть развязана в процессе разработки, в результате чего ResData не управляется, а весь оставшийся элемент дизайна, который будет использоваться водителю (LEDR - единственный выход). Вам необходимо изучить выходные данные консоли (или журналы) для предупреждений и ошибок во время синтеза. – user1155120

+0

Да, я понял, что проблема в том, что выход не управляется, поэтому я попытался сохранить данные adc в отдельном std_logic_vector и вывести вывод с каждым тактовым циклом, однако это не изменило проблему. Недостатком является то, что я не знаю, как изменить что-либо внутри логики adc, потому что это ядро ​​altera ip. Я мог найти только учебники для управления adc с выборочным хранением. Насколько я понял документацию altera, логика для управления ADC должна быть правильной, но, к сожалению, я не могу подтвердить, что это так. – nuclear

+0

Невозможно, чтобы ваши читатели могли заглянуть в черный ящик и рассказать вам, что случилось, не будучи подобным образом укушенным. Похоже, вы работаете с конфигурацией IP-ядра во время генерации.Вы сказали, что вы не используете FIFO, в объявлении компонента myadc есть PLL. – user1155120

ответ

1

В VHDL (и в основном на всех языках описания аппаратуры), вы должны иметь в виде, что ваш код должен быть synthetizable: он должен описать аппаратные компоненты, имеющиеся в вашей программируемой компоненте. Это не так в вашем процессе.

Следующая строка: wait until rising_edge(CLK_50); не может быть синтезирована из-за инструкции wait.

Чтобы создать последовательный процесс, необходимый вам это:

my_seq_proc : process (clk, rst) 
begin 
    if (rst = '1') then 
     ... -- reset your signals 
    elsif (rising_edge(clk)) then 
     ... -- what you need to do 
    end if; 
end process; 

Обратите внимание, что вы не обязаны использовать сигнал сброса. Кроме того, обратите внимание, что вам нужен список чувствительности в объявлении процесса (clk, rst) с вашими часами (clk_50) и вашим возможным сигналом сброса.

Я еще не проверял, есть ли другая ошибка. Вы должны сначала попытаться сделать это.

+0

Существует разница между рекомендуемыми стилями кодирования и поддерживаемыми стилями для вывода регистров. Рекомендуемые стили содержатся в Руководстве по дизайну и синтезу тома 1. Поддерживаемые стили находятся в изъятом стандарте IEEE Std 1076.6-2004 IEEE для синтеза уровня переноса регистра VHDL (RTL). В этом конкретном случае 6.1.3.2. Среда, чувствительная к краю, с использованием одного оператора ожидания, соответствующего использованию OP. Можно ожидать, что инструмент синтеза Altera будет соответствовать стандарту IEEE, снятому с производства. – user1155120

+1

насколько я знаю Дождитесь, пока ris_edge (clk) - это совершенно допустимый вариант, если вы не хотите сбросить. В любом случае, он сделал синтетизацию без проблем. Однако, хотя sythetizing он удалил pll по какой-то причине, и поэтому, конечно, вся логика вообще не работает. Но я также изменил его, как вы его рекомендовали, но он все еще не работает. – nuclear

+0

Не знал, что 'wait до' был поддержан Altera для синтеза. Тогда мои извинения. –

Смежные вопросы