2016-11-30 11 views
0

Я только что начал кодирование VHDL, и я использую XILINX Artix-7/NEXYS 4 для практики. Я только хочу спроектировать семисегментный дисплей и дать ему dsiplay номера от 0 до 9. Мой английский не очень хорошо, пожалуйста, простите меня, я попытался выразить свой вопрос.VHDL. В этом дизайне есть 2 без нагрузки сигнала

В моем коде я разбил архитектуру на четыре шага. Во-первых, я вниз по clk (100MHZ) до 1hz. Во-вторых, я использую счетчик, чтобы подсчитать число от 0 до 9, а затем использовать алгоритм двойного барабана, разделяющий число. Позднее я написал BCD для 7-сегментного декодера и выберет первый анод.

Проблема заключается в том, что предупреждение появляется, когда я реализую схемы, хотя синтез в порядке (но RTL показывает, что сигнал явно не соединяется). Проблема заключается в том, что между алгоритмом двойного барабана и счетчиком? (так как он имеет неправильный код после добавления этого кода) Я действительно хочу знать, как я могу решить эту проблему? И когда появится это предупреждение? Возможно, мой код сильно ошибается?

ВНИМАНИЕ: Параметр: 288 - Сигнал clk_IBUF не имеет нагрузки. PAR не будет пытаться маршрутизировать этот сигнал.

Готовый первоначальный анализ времени. ПРЕДУПРЕЖДЕНИЕ: Параметр: 288 - Сигнал btnD_IBUF не имеет нагрузки. PAR не будет пытаться маршрутизировать этот сигнал.

ВНИМАНИЕ: Параметр: 283 - В этом дизайне есть 2 без нагрузки. Эта конструкция заставит Bitgen выдавать предупреждения DRC.

Кстати, я знаю, что есть много способов достичь моей цели, но я действительно хочу знать, что с этим не так. Если кто-нибудь может мне помочь, СПАСИБО МНОГО.

Вот мой код:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
USE ieee.std_logic_unsigned.all; 
use IEEE.numeric_std.all; 


-- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
--use IEEE.NUMERIC_STD.ALL; 

-- Uncomment the following library declaration if instantiating 
-- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

entity top is 
    Port (clk : in STD_LOGIC; 
      btnD : in STD_LOGIC; 
      an : out STD_LOGIC_VECTOR (7 downto 0); 
      seg : out STD_LOGIC_VECTOR (6 downto 0)); 
end top; 

architecture Behavioral of top is 

signal clk_1hz_s : STD_LOGIC := '1'; 
signal clk_1hz : STD_LOGIC; 
signal counter_clock : integer range 0 to 5000000 := 0; 
signal sec_turth : STD_LOGIC_VECTOR (7 downto 0); 
signal sec_1 : STD_LOGIC_VECTOR (3 downto 0); 

begin 

--new clk-- 
process(clk,btnD) 
begin 

    if (clk' event and clk='1') then 
     if (btnD = '1') then 
      counter_clock <= 0; 
      clk_1hz_s <= '1'; 
     elsif (counter_clock = 5000000 - 1) then 
      counter_clock <= 0; 
      clk_1hz_s <= NOT(clk_1hz_s); 
     else 
      counter_clock <= counter_clock + 1; 
     end if; 
    end if; 

end process; 
clk_1hz <= clk_1hz_s; 

--counter-- 

process(clk_1hz) 

variable sec :integer range 0 to 9 :=0; 

begin 

    if (clk_1hz' event and clk_1hz='1') then 
     if sec > 8 then 
      sec := 0; 
     else 
      sec := sec + 1; 
     end if; 
    end if; 

sec_turth <= STD_LOGIC_VECTOR(to_unsigned(sec,8)(7 downto 0)); 
end process; 

--double dabble algorithm-- 

process(sec_turth) 

variable temp_sec : STD_LOGIC_VECTOR (7 downto 0); 
variable bcd_sec : unsigned (7 downto 0):= (others => '0'); 

begin 

temp_sec := sec_turth; 
bcd_sec := (others => '0'); 

    for i in 0 to 7 loop 

    if bcd_sec(3 downto 0) > 4 then 
     bcd_sec(3 downto 0) := bcd_sec(3 downto 0) + 3; 
    end if; 

-- if bcd_sec(7 downto 4) > 4 then 
--  bcd_sec(7 downto 4) := bcd_sec(7 downto 4) + 3; 
-- end if; 

    bcd_sec := bcd_sec(7 downto 1) & temp_sec(7); 
    temp_sec := temp_sec(7 downto 1) & '0'; 

    end loop; 

sec_1 <= STD_LOGIC_VECTOR(bcd_sec(3 downto 0)); 
--sec_2 <= STD_LOGIC_VECTOR(bcd_sec(7 downto 4)); 

end process; 

--decoder-- 

with sec_1 select 
    seg <= "1000000" when "0000",--0 
      "1111001" when "0001",--1 
      "0100100" when "0010",--2 
      "0110000" when "0011",--3 
      "0011001" when "0100",--4 
      "0010010" when "0101",--5 
      "0000010" when "0110",--6 
      "1011000" when "0111",--7 
      "0000000" when "1000",--8 
      "0011000" when "1001",--9 
      "0001110" when "1111",--F 
      "1111111" when others;--close all 

an <= "11111110";--choose the first anode 

end Behavioral; 

ответ

0

Предупреждений означает, что в вашем коде оба входа не влияют на любой выход и, таким образом, не стоит быть подключен к любому внутреннему компоненту.

Пожалуйста, ознакомьтесь с концепцией переменных. В частности, с процессом sec -counter вы должны знать, что не можете предположить, что переменная сохраняет свое значение между двумя прогонами процесса, то есть каждый передний фронт на clk_1hz сбрасывает переменную sec. Лучше объявите его как сигнал, как и для counter_clock. Тогда вы, конечно, также необходимо процедуру перезагрузки внутри процесса счетчика:

-- In the architecture header: 
signal current_value: integer range 0 to 9; 

-- one-digit counter -- 
process(clk_1hz) 
begin 
    if (clk_1hz'event and clk_1hz='1') then 
     if (btnD = '1') then 
      current_value <= 0; 
     elsif current_value > 8 then 
      current_value <= 0; 
     else 
      current_value <= current_value + 1; 
     end if; 
    end if; 
end process; 
-- I assume, you really need 8 bits here: 
sec_turth <= STD_LOGIC_VECTOR(to_unsigned(current_value,8)); 

Для одного-значного числа от 0 до 9, ваш двойной плескаться алгоритм со всеми переменными является необходимым, так как значения уже присутствуют в BCD. Если удалить этот процесс и просто подключить младшие 4 бита sec_turth в sec_1 то предупреждения исчезают, и я могу просмотреть схему:

sec_1 <= sec_turth(3 downto 0); 

Некоторые другие вопросы:

Ваш процесс делитель часы определяется быть чувствительным к входам clk и btnD. Обычно это относится к асинхронному режиму сброса, который не реализован внутри процесса.Если вы хотите асинхронный сброс, сделать что-то вроде этого:

clk_div: process(clk,btnD) 
begin 
    if btnD = '1' then 
     -- do the reset 
     counter_clock <= 0; 
     clk_1hz_s <= '1'; 
    elsif clk'event and clk = '1' then 
     -- do the synchronous operations 
     if (counter_clock = 5000000 - 1) then 
      counter_clock <= 0; 
      clk_1hz_s <= NOT(clk_1hz_s); 
     else 
      counter_clock <= counter_clock + 1; 
     end if; 
    end if; 
end process clk_div; 

Если это должно быть тактовой синхронизации сброса, пожалуйста, удалите btnD из списка чувствительности, как я сделал в первом листинге кода.

Кроме того, я видел, что у вас есть пробел после галочки ' в атрибуте clk'event, который по меньшей мере делает код выделенным по-другому, чем без пробела. Исправьте это, и вы можете избавиться от предупреждения clk. Редактировать: Нет, если переменные удалены, пространство не имеет значения.

Надеюсь, что смогу помочь, пожалуйста, дайте мне знать, если я смогу улучшить ответ!

+0

Спасибо за ваш ответ и посоветуйте, это очень полезно для меня. После изменения моего кода это выглядит более разумным, , что я должен заметить?. Спасибо снова. –

+0

@HankLin: да, это возможно. Если вы поместите 'STD_LOGIC_VECTOR' в список чувствительности, тогда процесс будет комбинаторно реагировать на каждое изменение на каждом элементе вектора (при синтезе, неиспользованные будут оптимизированы). – Sanyok

+0

Теперь я смог синтезировать ваш код и воспроизводить предупреждения (которые действительно такие же серьезные, как ошибки) – Sanyok

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

  • Нет связанных вопросов^_^