Перейти к содержанию
    

Warnings от ISE

Имеем ISE 13.3, пишем на VHDL. При синтезе следующего кода

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
library UNISIM;
use UNISIM.VComponents.all;

entity rrd3_top is
   Port ( 
	G1_CLK			: in  STD_LOGIC;	--Тактовый сигнал доп. генератора 10 МГц			  
               EXT_LED_N		: out  STD_LOGIC_VECTOR (5 downto 0) --Управление светодиодами
		);
end rrd3_top;

architecture Structural of rrd3_top is

signal	clk1		: STD_LOGIC := '0';	--Тактовый сигнал доп. генератора 10 МГц

signal	led_n		: STD_LOGIC_VECTOR (5 downto 0) := (others => '1');--Управление светодиодами

signal counter: std_logic_vector (31 downto 0):=(others=>'0');-- объявляем сигнал counter в котором будем считать тики генератора
signal led_temp: std_logic:='0';                      -- триггер выходного сигнала led
signal clr_count: std_logic:='0';                     -- сброс счетчика при совпадении компаратора
begin

ibufg_clk1 :	ibufg	port map(clk1,G1_CLK);	-- 10 MHz
obuf_led_gen:	--светодиоды
for i in 0 to 5 generate
	obuf_led : obuf port map(EXT_LED_N(i),led_n(i));
end generate;

count: process(clk1, clr_count)                 -- процесс"СЧЕТЧИК"
   begin                               
     if(clr_count='1') then             -- если нажата кнопка reset или сигнал сброса счетчика установлен в 1
     counter <= (others=>'0');                       -- обнуляем счетчик 
     elsif(rising_edge(clk1)) then                    -- если нет, то по фронту сигнала clk считаем тики генератора
     counter <= counter + 1;                   
     end if;
end process;

comp: process(counter)                                -- процесс"КОМПАРАТОР"
   begin
     if(counter= 5) then                              -- если счетчик = уставке
     clr_count<='1';                                  -- активируем сигнал сброса счетчика
     led_temp<=not led_temp;                          -- переключаем триггер выходного сигнала
     else 
     clr_count<='0';                                  -- иначе "на всякий" обнуляем сигнал сброса
     end if;
end process;

led_n(0)<=led_temp;    

end Structural;

 

Имеем следующее предупреждение от ISE

 

Xst:737 - Found 1-bit latch for signal <led_temp>. Latches may be generated from incomplete case or if statements. 
We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.

 

Я понял так: синтезатору не нравится неопределенность следующей конструкции

 

     if(counter= 5) then                              -- если счетчик = уставке
     clr_count<='1';                                  -- активируем сигнал сброса счетчика
     led_temp<=not led_temp;                          -- переключаем триггер выходного сигнала
     else 
     clr_count<='0';                                  -- иначе "на всякий" обнуляем сигнал сброса
     end if;

Т. е. led_temp<=not led_temp при counter=5, а вот чему равен led_temp при counter(не равно)5 фиг его знает.

Вопрос.

Правильно ли я понял и во что это может вылиться? Вообще насколько критичны предупреждения выдаваемые компилятором?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забавный Вы :)

Сказано же было, что led_temp не триггер в вашем исполнение.

Синтезатор вам тоже самое сказал.

Как решить проблему смотрите в своем предыдущем посте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор сказал совершенно правильно - получилась защёлка. Это плохой стиль и компилятор выдал предупреждение. Разумеется его можно игнорировать, если такая конструкция сделана сознательно и все последствия Вам ясны.

 

Что есть плохого - процесс comp зависит только от counter, и при переключение counter возможны ложные срабатывания. Здесь возможно два варианта - либо добавить ветку else - тогда получаем комбинационную схему. Либо ставим rising_edge( clk ) и получаем синхронный D-триггер. Второй вариант мне нравиться больше.

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to Mad_max

Забавный Вы :)

Сказано же было, что led_temp не триггер в вашем исполнение.

Синтезатор вам тоже самое сказал.

Как решить проблему смотрите в своем предыдущем посте.

По поводу триггера понял, спасибо. По поводу кода, который Вы предложили:

USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Example1 is
Port ( 
clk : in STD_LOGIC; -- входной сигнал генератора
led : out STD_LOGIC); -- выходной сигнал на светодиод
end Example1;

architecture Behavioral of Example1 is
signal counter: std_logic_vector (31 downto 0):=(others=>'0');-- объявляем сигнал counter в котором будем считать тики генератора
signal led_temp: std_logic:='0'; -- вспомогательный сигнал
signal clr_count: std_logic:='0'; -- сигнал сброса счетчика при совпадении компаратора
signal end_count: std_logic:='0';
begin

count: process(clk, clr_count) -- процесс"СЧЕТЧИК"
begin
if(clr_count='1') then -- если сигнал сброса счетчика установлен в 1
counter <= (others=>'0'); -- обнуляем счетчик
elsif(rising_edge(clk)) then -- если нет, то по фронту сигнала clk считаем тики генератора
counter <= counter + 1;
end if;
end process;

end_count <= '1' when (counter = 5) else '0'; --компаратор

process(clk) -- выходной триггер
begin
if (rising_edge(clk)) then
led_temp <= end_count;
end if;
end process;

clr_count <= led_temp; -- сигнал сброса

led<=led_temp; -- соединяем  led_temp с выходным сигналом led
end Behavioral; 

Логика работы этого кода отлична от заданной (мигание светодиодом). К примеру вот результат моей программы:

post-69968-1334737220_thumb.png post-69968-1334737240_thumb.png

 

Вот Ваш вариант

 

post-69968-1334737266_thumb.png post-69968-1334737278_thumb.png

Или я чего-то не понял или неверно изложил? Тогда прошу поправить меня.

На всякий ссылка на предъидущий пост

 

to dsmv

Компилятор сказал совершенно правильно - получилась защёлка. Это плохой стиль и компилятор выдал предупреждение. Разумеется его можно игнорировать, если такая конструкция сделана сознательно и все последствия Вам ясны.

 

Что есть плохого - процесс comp зависит только от counter, и при переключение counter возможны ложные срабатывания. Здесь возможно два варианта - либо добавить ветку else - тогда получаем комбинационную схему. Либо ставим rising_edge( clk ) и получаем синхронный D-триггер. Второй вариант мне нравиться больше.

Попробовал второй вариант.

comp: process(counter)     -- процесс"КОМПАРАТОР"
begin
if(rising_edge(clk)) then
if(counter= 5) then            -- если счетчик = уставке
clr_count<='1';                 -- активируем сигнал сброса счетчика
led_temp<=not led_temp; -- переключаем вспомогательный сигнал
else
clr_count<='0';                 -- иначе "на всякий" обнуляем сигнал сброса
end if;
end if;
end process;

Синтезеатор снял свое предупреждение, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал второй вариант.
Этот вариант неправильный.

Синтезеатор снял свое предупреждение
В неправильном коде это ни о чём не говорит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

entity test is 
    port (    
        clk    : in std_logic;
        reset : in std_logic
    );
end test;


architecture test_arch of test is    

signal counter : std_logic_vector(7 downto 0);
signal led_temp    : std_logic;         
signal nled_temp : std_logic;         
signal clr_count : std_logic;
signal clr_count_d : std_logic;


begin
    
    count: process(clk) 
    begin 
        if (rising_edge(clk)) then
            counter <= counter + 1;
        elsif (reset='0' or clr_count='1') then 
            counter <= (others=>'0'); 
        end if;
    end process;

    
    clr_count_d <= '1' when (counter = 4) else '0';

    process(clk) 
    begin 
        if (rising_edge(clk)) then 
            clr_count <= clr_count_d;
        end if;    
    end process;
                
    nled_temp <= not(led_temp);    
        
    process(clk) 
    begin 
        if (rising_edge(clk)) then 
            if ( reset = '0' ) then
                led_temp <= '0';
            elsif ( clr_count = '1' ) then
                led_temp <= nled_temp;
            end if;    
        end if;
    end process;

end architecture;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...