Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: clk => altera
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
YGin
Доброго времени суток!
И так суть проблемы! Есть некий чип, и звать его "MAX II" EPM570GT100C3 , и есть ,генератор 125 MHz сигнал генератора заведён на GCLK вход микросхемы в проекте это вход назначен как 2.5 Триггер Шмита.
Только вот сам кристалл лежит трупом и не дышит! Для эксперимента я просто вывел частоту на простую ножку там ‘0’ дальше подели её на 2, а в ответ тишина!
Так вот вопрос что я делаю, не так и почему чип не видит частоты?
Просто в основном работаю с Xilinx а вот кристаллы от Altera только начинаю осваивать!
PSP
Сделайте еще более простой проект. Выведите на одну ногу постоянную "1", а на другую "0". Увидели это состояние - поменяйте ноги местами. Если получилось, то значит у Вас работает вся технологическая цепочка - правильный исходник, трансляция, прошивка кристалла. Потом уже нужно разбираться с частотами и т.д. А то с новым инструментом легко можно, например, шить не тот файл который выдает транслятор.
YGin
Проверял, всё работает. Мало того есть заведомо рабочий проект который я шью в ту микросхему и там всё работает, то есть с железом тоже всё в порядке!
Я понимаю, что задача сводится, найдите 10 отличий, только вот тот проект написан на AHDL, в котором я не очень! Может, есть нюанс при описание входных клоков в Altera который я не учёл!
Вопрос можно задать по-другому, как правильно описать входной клок в проекте?
AlexanderX
1. Проверьте назначение входного пина. Скорее всего Вы его или не назначили или назначили неправильно.
2. Возможно Вы в качестве VCCIO используете 3.3V, а сигнал с генератора идет 2.5V. Такая конфигурация может не работать.
YGin
Цитата(AlexanderX @ Oct 31 2007, 10:06) *
1. Проверьте назначение входного пина. Скорее всего Вы его или не назначили или назначили неправильно.

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

Цитата(AlexanderX @ Oct 31 2007, 10:06) *
2. Возможно Вы в качестве VCCIO используете 3.3V, а сигнал с генератора идет 2.5V. Такая конфигурация может не работать.

VCCIO = 3.3V
Генератор 3.3 V я смотрел на сигнал он вроде нормальный, амплитуда сигнала 1V
AlexanderX
Я бы сказал что генератор вроде НЕНОРМАЛЬНЫЙ 1V - это мало. Амплитуда должна быть не менее 2.5V. wink.gif
YGin
Цитата(AlexanderX @ Oct 31 2007, 10:49) *
Я бы сказал что генератор вроде НЕНОРМАЛЬНЫЙ 1V - это мало. Амплитуда должна быть не менее 2.5V. wink.gif

Мне, честно говоря тоже не очень нравится, но успокаивает то что тот проект работает на той же частоте и работает нормально.
DSIoffe
Сигнал генератора 125 МГц на осциллографе с полосой 100 МГц, например, и должен иметь размах не больше вольта.
А есть уверенность, что в рабочем проекте задействован именно глобальный тактовый вход, а не простая ножка? Может, тот глобальный уже пробит давно, и надо попробовать другой?
sazh
Цитата(YGin @ Oct 31 2007, 11:29) *
Я его назначил, так же как и в рабочем проекте. Правда есть одно, но там вход разведен на два пина, один глобальный, а другой обычный!


Посмотрите в опциях проекта, как ассигнованы неиспользуемые в проекте пины. (По умочанию как выходф на gnd наверное)
И посмотрите в редакторе ассигнований, описан ли там дублирующий клок пин.
Если физически на этот пин приходит клок. по идее его надо обозначит как вход по третьему состоянию.
EvgenyNik
Я бы сделал так:
1. состояние этого входа вывел бы на другой выход.
2. включил и посмотрел - что творится на выходе-повторителе.
3. откинул сигнал с генератора.
4. вместо него (сигнала генератора) подпаял бы резистор порядка 1кОм.
5. попробовал бы подать второй вывод резистора VCC, GND - будет ли менять своё состояние вывод-повторитель.
Если от резистора всё работает, то проблема в уровне сигнала генератора, т.к. С3 частоту 125 должна тянуть.
А если и от резистора не работает, то проблема внутри.
Iouri
assignments -> device -> <device and pin option> -> unused pins -> as input tri-stated
YGin
Ну что тут скажешь одна голова хорошо, а коллектив бесценно!
Всем ОГРОМНЕЙШЕЕ спасибо! beer.gif
А особый a14.gif a14.gif a14.gif Iouri
поставил опцию и всё встало на место!
YGin
А может, кто объяснить, что хоть за грабли были?
Я так понимаю вся проблема была в том, что было два входа с клоком.
sazh
Цитата(YGin @ Oct 31 2007, 16:47) *
А может, кто объяснить, что хоть за грабли были?
Я так понимаю вся проблема была в том, что было два входа с клоком.

Если Вы сделали assignments -> device -> <device and pin option> -> unused pins -> as input tri-stated,
то погорячились.
Если посомтреть рапорт *.pin, то он должен выдать типа

RESERVED_INPUT : Pin is tri-stated and should be connected to the board.
Наверно предыдущее было лучше. Но коротило на клок.
Наверно корректно будет в редакторе ассигнований присвоить индивидуально этому пину
в разделе pin => as input tri-stated
Iouri
объяснить незнаю как была похожая проблма еще в Quartus 4.1
поговорил с альтерой они толком ничего обьяснить не смогли,
но сказали что делать с тех пор так всегда делаю
YGin
Знаю немножко не в тему, но раз уж начал! Подскажите, как в этом чипе сделать деление двух 32 битных векторов, и влезет ли оно в чип?
Iouri
думаю что не получится
tools - Megawizard plug-in manager -> create new custom megafunction variation -> arithmetic -> LPM-divide


а дальше по шагам
YGin
Цитата(Iouri @ Nov 2 2007, 13:48) *
думаю что не получится
tools - Megawizard plug-in manager -> create new custom megafunction variation -> arithmetic -> LPM-divide
а дальше по шагам

Спасибо.
И честно последний вопрос. Почему этот процесс не работает, я хоть застрелите не понимаю!

port data_out : out std_logic_vector(31 downto 0);-- знаю что не правельно это так для наглядности!
clk1 = 125MHz
clk2 = 100MHz


signal base_counter : std_logic_vector(31 downto 0);
signal measuring_counter : std_logic_vector(31 downto 0);

process(clk1)
begin
if rising_edge(clk1) then
base_counter <= base_counter + 1;
if base_counter = "ffffffff" then
en = '1';
else
en = '0';
end if;
end if;
end process;


process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;
else
measuring_counter <= measuring_counter + 1;
end if;
end if;
end if;
end process;
AlexanderX
Цитата(YGin @ Nov 2 2007, 17:17) *
if base_counter = "ffffffff" then
en = '1';
else
en = '1';
end if;

Это примерно как свет то потухнет, то погаснет. smile.gif
В каком-то из условий должнобыть присваивание '0'. Стандартная ошибка копирования.
YGin
Цитата(AlexanderX @ Nov 2 2007, 17:47) *
Это примерно как свет то потухнет, то погаснет. smile.gif
В каком-то из условий должнобыть присваивание '0'. Стандартная ошибка копирования.

В точку с копированием! Да только это я сделал когда копировал кусок кода с проектa на форум в проекте всё честно там ‘0’
sazh
Цитата(YGin @ Nov 2 2007, 19:23) *
В точку с копированием! Да только это я сделал когда копировал кусок кода с проектa на форум в проекте всё честно там ‘0’

process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;


Может статься, что в интервал en уложатся два передних фронта clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).
YGin
Цитата(sazh @ Nov 2 2007, 18:29) *
process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;
Может статься, что в интервал en уложатся два передних фронта clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).


Возможно! Но тогда на выходе должны были б быть нули ну или константа если изменить код.

process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"11111111";
data_out <= measuring_counter;

а у меня Аltera просто отказывается работать когда я включаю этот код и нормально работает когда я его коментарю.
sazh
Цитата(YGin @ Nov 2 2007, 19:37) *
Возможно! Но тогда на выходе должны были б быть нули ну или константа если изменить код.

process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"11111111";
data_out <= measuring_counter;

а у меня Аltera просто отказывается работать когда я включаю этот код и нормально работает когда я его коментарю.


В VHDL я не силен. Выложите полный проект. За длинные выходные ктонибудь да посмотрит.
В RTL просмотрщике все сразу видно. Ясно дело, что Квартус тут непричем.
YGin
Да я особо на Квартус и не грешу! Если руки кривые машинка, то тут при чём (или программка)! Вопрос то в другом код, то простой как угол дома а работать не хочет!
И думается мне, что проблема тут в частоте может Макс не может скушать 125MHz?
sazh
Цитата(YGin @ Nov 2 2007, 19:50) *
Да я особо на Квартус и не грешу! Если руки кривые машинка, то тут при чём (или программка)! Вопрос то в другом код, то простой как угол дома а работать не хочет!
И думается мне, что проблема тут в частоте может Макс не может скушать 125MHz?


MAX может скушать 125 mHz. Потому что это циклон без памяти с внутренним загрузочным ПЗУ.
Про код я тоже ничего не знаю. Не программист. Могу оперировать понятием схема.
YGin
Ну, тогда я совсем ничего не понимаю!
Резюме!
Буду искать в проекте в целом, наверно грабли там! Если у кого будут советы, всегда радо выслушаю.
Iouri
Код
process(clk1)
begin
if rising_edge(clk1) then
base_counter <= base_counter +1;
end if;
end process
en <= '1' when base_counter = x"FFFFFF" else '0'

process(clk2)
begin
if rising_edge(clk2) then
en_sr(3 downto 0) <= en_sr(2 downto 0) & en;
end if;
end process;

en1 <= en_sr{3};

process(clk2)
begin
if rising_edge(clk2) then
if en1 = '1' then
measuring_counter <= x"00000000";
else
measuring_counter <= measuring_counter + 1;
end if;
end if;
end process;

process(clk2,en)
begin
if rising_edge(clk2) then
if en1= '1' then
data_out <= measuring_counter;
else
data_out <= data_out;
end if;
end if;
end process;
sazh
Цитата(sazh @ Nov 2 2007, 19:29) *
process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;
Может статься, что в интервал en уложатся два передних фронта clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).


Вчера я вас ввел в заблуждение. Частота clk1 выше, чем clk2
Поэтому может статься, что сфомированный по clk1 интервал en может пропускаться триггером, работающим по фронту clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).
Примерно так.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity count is
Port (
clk125, clk100 : in std_logic;
data_out : out std_logic_vector(3 downto 0));
end count;

architecture Behavioral of count is
signal base_counter: std_logic_vector(4 downto 0);
signal measuring_counter: std_logic_vector(3 downto 0);
signal en_sr: std_logic_vector(2 downto 0);
signal en, dff_a, en_a: std_logic;
begin

process(clk125)
begin
if rising_edge(clk125) then
if base_counter = "10000" then
base_counter <= "00001";
else
base_counter <= base_counter + 1;
end if;
end if;
end process;

en <= base_counter(4);

process(clk100, en)
begin
if en = '1' then
dff_a <= '1';
elsif rising_edge(clk100) then
dff_a <= '0';
end if;
end process;

en_a <= NOT en_sr(2) AND en_sr(1);

process(clk100)
begin
if rising_edge(clk100) then
en_sr <= en_sr(1 downto 0) & dff_a;
if en_a = '1' then
data_out <= measuring_counter;
end if;
if en_a = '1' then
measuring_counter <= x"0";
else
measuring_counter <= measuring_counter + 1;
end if;
end if;
end process;

end Behavioral;
YGin
Всем большое спасибо beer.gif beer.gif beer.gif проблема решена проект работает!
И так в двух словах, что было и почему не работало! Бои шли с переменным успехом!
Оказалось что хомут не один а несколько!
Прав был sazh в том что интервал en может пропускался триггером, работающим по фронту clk2 просто я забыл уточнить что clk2 может меняться от 5 до 200 MHz! И в целом вся схема это обычный измеритель частоты! Вот, а другой баг был уже в другом месте проекта, но влиял на работу в целом!
А я грешным делом подумал на Altera(у), ещё раз подтвердился девиз(если руки кривые нечего грешить на магнитные бури на солнце)
Ещё раз всем спасибо за помощь!!!! a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.