Счетчики мультиплексора VHDL 7 сегментные
Я новичок в VHDL и мой код может показаться глупым, но я все еще борюсь. Я пытаюсь сделать счетчик BCD, используя комплект Spartan 3. У меня проблема с мультиплексированием 7 сегмента, и я знаю, что должен использовать компоненты, но я пошел по более простому пути. Я получаю эту ошибку в синтезе: "строка 103: один или несколько сигналов отсутствуют в списке чувствительности процесса". Чтобы включить синтез аппаратных средств FPGA/CPLD, XST будет предполагать, что все необходимые сигналы присутствуют в списке чувствительности. Обратите внимание, что результат синтеза может отличаться от первоначальной спецификации проекта. Недостающие сигналы: любая помощь приветствуется. Спасибо.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity lab5 is
port (clk : in std_logic;
x : in std_logic;
--count : inout STD_LOGIC_VECTOR (3 downto 0);
data_out : out std_logic_vector (6 downto 0);
an : out std_logic_vector (3 downto 0)
);
end lab5;
architecture Behavioral of lab5 is
signal counter : std_logic_vector (3 downto 0) := (others => '0');
signal prescaler : std_logic_vector (25 downto 0);
signal prescaler2 : std_logic_vector (11 downto 0);
signal counter2 : std_logic_vector (1 downto 0) := (others => '0');
begin
CounterProcess : process(CLK, x)
begin
--prescaler is used as a clock slower to increment the counter every 50M cycles(1 sec)
if rising_edge(CLK) then
if prescaler < "10111110101111000010000000" then
prescaler <= prescaler+1;
else
prescaler <= (others => '0');
if x = '0' then
if counter = "1001" then
counter <= "0000";
else
counter <= counter+1;
end if;
else
if counter = "0000" then
counter <= "1001";
else
counter <= counter-1;
end if;
end if;
end if;
end if;
end process;
--count<=counter;
Sevensegclock : process(CLK)
begin
if rising_edge(CLK) then
--scale clock to count(which will be the segment selector) every 1024 cycle
if prescaler2 < "010000000000" then
prescaler2 <= prescaler2+1;
else
prescaler2 <= (others => '0');
if counter2 = "11" then
counter2 <= "00";
else
counter2 <= counter2+1;
end if;
end if;
end if;
end process;
sevenseg : process(counter2, clk)
begin
--counter the segment selector used to activate selector and decode data
if counter2 = "00" then
an <= "1110";
if counter(0) = '0' then
data_out <= "0000001";
else
data_out <= "1001111";
end if;
end if;
if counter2 = "01" then
an <= "1101";
if counter(1) = '0' then
data_out <= "0000001";
else
data_out <= "1001111";
end if;
end if;
if counter2 = "10" then
an <= "1011";
if counter(2) = '0' then
data_out <= "0000001";
else
data_out <= "1001111";
end if;
end if;
if counter2 = "11" then
an <= "0111";
if counter(3) = '0' then
data_out <= "0000001";
else
data_out <= "1001111";
end if;
end if;
end process;
end Behavioral;
1 ответ
Для начала каждый процесс должен определить, реализует ли он последовательный элемент (триггер) или комбинаторный элемент (вентили).
Шаблон для процесса, который реализует последовательный элемент (триггер) без асинхронного сброса, может быть:
process (clk) is
begin
if rising_edge(clk) then
-- Code for assign to flip-flop outputs at rising edge
end if;
end process;
Шаблон для процесса, который реализует комбинаторный элемент (элементы), может быть:
process (all) is -- "all" make sensitivity on all used signals
begin
-- Code for assign to gate outputs
end process;
Обратите внимание, что (all)
может использоваться только в синтаксисе VHDL-2008, иначе для синтаксиса предыдущей версии VHDL все сигналы явно указаны в списке чувствительности
Соответствие одному из шаблонов позволяет инструменту синтеза определить, как реализовать проект, описанный в коде VHDL. Однако, если код не соответствует ни одному из шаблонов, у инструмента синтеза могут возникнуть трудности с определением того, как реализовать код VHDL в FPGA, и в результате может появиться сообщение об ошибке, которое вы получаете.
На основе шаблонов процесс Sevensegclock
реализует последовательный элемент (триггер), и не должно быть никаких проблем с этим процессом.
Однако процессы CounterProcess
а также sevenseg
не соответствует ни одному из шаблонов для последовательного или комбинаторного элемента.
Для процесса CounterProcess
похоже, что вы хотите реализовать последовательный элемент (триггер), но список чувствительности имеет x
включен. Решение тогда, вероятно, удалить x
из списка чувствительности.
Для процесса sevenseg
похоже, что вы хотите реализовать комбинаторный элемент (вентили), но список чувствительности не охватывает все сигналы, используемые в процессе, и даже включает в себя clk
который не используется в процессе. Решение, если вы используете VHDL-2008, состоит в том, чтобы заменить список чувствительности на(all)
и при использовании предыдущих версий VHDL список чувствительности должен охватывать все сигналы, используемые в процессе (counter2, counter)
,
Отказ от ответственности: я не проверил логическую правильность кода в процессе; Таким образом, вышесказанное дает только общие рекомендации о том, как писать процессы, чтобы создавать различные виды элементов дизайна в ПЛИС.