2014-12-08 2 views
0

Я новичок в программировании VHDL, и это мой первый проект - построить двоичный счетчик с возможностью как обычного, так и обратного счета. Мой план прост:Почему Quartus II распознает мою переменную как сигнал?

  1. Написать процесс делителя частоты для выборки необходимую частоту и тактовый выход это новые часы в виде битового сигнала flag.
  2. Поместите «флаг» в список чувствительности другого процесса, подсчитайте его в соответствии с обычным/обратным состоянием - сохранено как curr_s в моем коде.
  3. Третий процесс принимает входной сигнал ctl как чувствительный, затем переключает curr_s и сбрасывает значение count - который установлен для хранения отсчетов моего последнего процесса.

Теперь дело в том, однако, что Quartus II возвращает мне сообщение об ошибке:

Ошибка (10028): Не удается разрешить несколько постоянных драйверов для сети "сосчитать [31]" на bi_counter .vhd (35)

Error (10029): Постоянный водитель на bi_counter.vhd (46)

Error (10028): не удается разрешить несколько постоянных драйверов для сети "рассчитывать [30]" на bi_counter. vhd (35)

...

Ошибка (10028): Не удается разрешить несколько постоянных драйверов для сети "подсчитывать [14]" на bi_counter.vhd (35)

Я гугле немного бит, и есть такие правила, как не разрешено изменять значение signal в нескольких процессах, но проблема в том, что я объявляю свой count как общую переменную вместо сигнала - которая не должна сталкиваться с такой ошибкой. И я намеревался сделать это, потому что хочу использовать count в качестве переменной для обмена информацией между процессами - это имеет смысл, а если нет, есть ли способ обхода?

Вот мой код:

-- 
library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; 
use ieee.numeric_std.all; 
-- 
entity bi_counter is 
    port(
     master_clk, ctl, rst: in std_logic; 
          q: out std_logic_vector(7 downto 0) 
     ); 
end bi_counter; 
-- 
architecture behv of bi_counter is 
    shared variable curr_s: std_logic := '0'; -- 0 for incremental, 1 for reverse counting 
    shared variable count: integer := -1; 
    shared variable master_count: natural := 0; 
    signal flag: std_logic; 
begin 
    p_freq_div: process(master_clk, rst) 
    begin 
     if rst = '0' then 
      master_count := 0; 
     elsif master_clk'event and master_clk='1' then 
      master_count := master_count + 1; 
      if master_count = 24000000 then 
       flag <= not flag; 
       master_count := 0; 
      end if; 
     end if; 
    end process p_freq_div; 

    p_count: process(flag) 
    begin 
     if curr_s = '1' then 
      count := count + 1; 
      q <= conv_std_logic_vector(count, 8); 
     else 
      count := count - 1; 
      q <= conv_std_logic_vector(count, 8); 
     end if; 
    end process p_count; 

    p_switch: process(ctl) 
    begin 
     if ctl'event and ctl='1' then 
      curr_s := not curr_s; 
      if curr_s = '0' then 
       count := 0; 
      else 
       count := 1000; 
      end if; 
     end if; 
    end process p_switch; 
end behv; 
+5

Вот простое правило для VHDL: никогда не требуется два процесса, изменяющих один и тот же сигнал. Выясните другой способ сделать это. Не используйте общие переменные вообще, используйте сигналы. – Russell

+0

@ Russell Можете ли вы объяснить, почему общие переменные не являются хорошим вариантом? Я имею в виду, теперь я думаю, что я знаю, почему одновременное назначение из разных процессов запрещено, но почему вообще использование общих переменных вообще не рекомендуется - тогда почему оно существует? Большое спасибо! –

+0

@DavidKoontz Спасибо, Дэвид, я думаю, что получаю большую часть того, что ты говоришь. Однако, как настоящий новичок в VHDL, я задаюсь вопросом, что означает «быть невозможным когда-либо предоставлять эксклюзивный доступ к общей переменной, как указано в предыдущем пункте b»). Почему это эксклюзивный доступ к общей переменной в моем коде? Thank u –

ответ

3

Вы писали:

Я гугл немного и есть правила, как это не разрешено изменять значение сигнала в нескольких процессах, но проблема в том, что я объявляю свой счет как общую переменную вместо сигнала - которая не должна сталкиваться с такой ошибкой.

Это «правило» не просто для того, чтобы усложнить вашу жизнь.

Подумайте, что вы пытаетесь сделать. Вы пытаетесь синтезировать что-то, чтобы надеть ваше устройство, которое будет хранить значение, которое вы пытаетесь назначить из двух независимых процессов (хотя они могут быть связаны и вы знаете, как они должны работать, все еще независимы). Независимо от того, какой лингвистический элемент вы используете - сигнал, переменная, что угодно - он становится неактуальным, как только вы попадаете на устройство, у которого есть только физические схемы. То есть вы не можете нарушать какие-либо языковые правила, но вы нарушаете физическое правило.

Вывод может быть указан в следующем виде: если какое-либо условие, то вывести что-то, иначе, если какое-либо другое условие, вывести что-то еще и т. Д. И это может быть включено в один процесс, что я предлагаю вам делать.

Кроме того, как предположил Рассел, вам, вероятно, не следует использовать общие переменные, особенно для того, чтобы обойти правила языка, как вы это делали.

+0

Спасибо за это ясное объяснение, теперь я думаю, что знаю, что действительно не так с моими мыслями - это потому, что я придерживался концепции, что «переменные» - это что-то вроде этого термина в других языках программирования. В VHDL все аппаратно, поэтому я лучше планирую свой код с точки зрения схемы в следующий раз. –

+0

В VHDL * для синтеза *, да. Если вы работаете строго в симе, «правила» гораздо более расслаблены. – fru1tbat

+0

, поэтому я думаю, что «работа строго в симе» означает, что в случаях я только компилирую свой код, не синтезируя его в RTL, не так ли? На самом деле, я думаю, мне никогда не сообщают, что в конечном итоге будет исправлен исходный код VHDL. Скажем, я знаю, что в C ваш источник станет инструкциями по сборке и, наконец, будет инструкциями на более низком уровне, но как насчет VHDL? Говорят, что это «язык описания аппаратных средств», поэтому, возможно, RTL - это его окончательная форма? Я знаю, что это выходит за рамки моего вопроса, но я ценю, если опытные инженеры, такие как u, могут выявить некоторые основные механизмы этого языка –

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