реклама на сайте
подробности

 
 
> Warnings от ISE, Как победить предупреждения?
Rock87
сообщение Apr 17 2012, 14:39
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 30-01-12
Из: Нижний Новгород
Пользователь №: 69 968



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

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

CODE

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.


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

CODE

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 фиг его знает.
Вопрос.
Правильно ли я понял и во что это может вылиться? Вообще насколько критичны предупреждения выдаваемые компилятором?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rock87
сообщение Apr 18 2012, 08:34
Сообщение #2





Группа: Участник
Сообщений: 10
Регистрация: 30-01-12
Из: Нижний Новгород
Пользователь №: 69 968



to Mad_max
Цитата(Mad_max @ Apr 17 2012, 19:08) *
Забавный Вы sm.gif
Сказано же было, что led_temp не триггер в вашем исполнение.
Синтезатор вам тоже самое сказал.
Как решить проблему смотрите в своем предыдущем посте.

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

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;

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


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

Прикрепленное изображение
Прикрепленное изображение

Или я чего-то не понял или неверно изложил? Тогда прошу поправить меня.
На всякий ссылка на предъидущий пост

to dsmv
Цитата(dsmv @ Apr 17 2012, 19:13) *
Компилятор сказал совершенно правильно - получилась защёлка. Это плохой стиль и компилятор выдал предупреждение. Разумеется его можно игнорировать, если такая конструкция сделана сознательно и все последствия Вам ясны.

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

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

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;

Синтезеатор снял свое предупреждение, спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 17:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016