Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: XC9572 Binary Counter
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
shell_inspector
Мужики, делаю элементарный 8-и битовый двоичный счетчик на ISE7.1 для XC9572-PC44 CPLD. Сигналы счетчика вывожу через IO выходы. По идее, частота каждого следущего бита досжна делиться на два. У меня же частота всех равна половине CLK (CLK/2) плюс некоторые биты "дергаются" словно шум по фазе. Не могу понять в чем дело. Вроде нет ни ошибок с компиляцией ни с загрузкой.
С сигналом CLEAR и CLK Все нормально. Исходник взят из справочника на инете:
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity counter is
Port (
CLEAR: in std_logic;
Q5: out std_logic_vector(7 downto 0);
CLK : in std_logic);
end counter;

architecture Behavioral of counter is

signal Q5_IN : std_logic_vector(7 downto 0); -- Defines internal signals
begin
Q5 <= Q5_IN; -- Set output
process(CLEAR, CLK) begin
if CLEAR='1' then -- Clear counter ?
Q5_IN <= "00000000"; -- Yes. Clear counter
elsif CLK='1' and CLK'event then -- Clock rising edge ?

if Q5_IN=128 then -- Yes. Count = 4 ?
Q5_IN <= "00000000"; -- Yes. Clear counter
else -- No
Q5_IN <= Q5_IN + '1'; -- Count-up
end if;

end if;
end process;
end Behavioral;
Elresearch
Вот два примера из Active-HDL. попробуйте их.

--library IEEE;
--use IEEE.std_logic_1164.all;
--use IEEE.STD_LOGIC_UNSIGNED.all;
-- CLK: in STD_LOGIC;
-- RESET: in STD_LOGIC;
-- CE: in STD_LOGIC;
-- LOAD: in STD_LOGIC;
-- DIR: in STD_LOGIC;
-- DIN: in STD_LOGIC_VECTOR (3 downto 0);
-- COUNT: out STD_LOGIC_VECTOR (3 downto 0)
signal COUNT_INT: STD_LOGIC_VECTOR(3 downto 0);
begin
process (CLK, RESET)
begin
if RESET = '1' then
COUNT_INT <= (others => '0');
elsif CLK'event and CLK='1' then
-- elsif rising_edge(CLK) then
if LOAD = '1' then
COUNT_INT <= DIN;
else
if CE = '1' then
if DIR = '1' then --count up
COUNT_INT <= COUNT_INT + 1;
else --count down
COUNT_INT <= COUNT_INT - 1;
end if;
end if;
end if;
end if;
end process;
COUNT <= COUNT_INT;

=========================


-- 0 to 15 Synchronous Counter (for INTEGERS)
-- CLK: in STD_LOGIC;
-- RESET: in STD_LOGIC;
-- CE, LOAD, DIR: in STD_LOGIC;
-- DIN: in INTEGER range 0 to 15;
-- COUNT: out INTEGER range 0 to 15;

--auxiliary signal COUNTER declaration
--the output port "COUNT" cannot appear on the right side of assignment
--statements
signal COUNTER: INTEGER range 0 to 15;

begin
process (CLK, RESET)
begin
if RESET='1' then
COUNTER <= 0;
elsif CLK='1' and CLK'event then
if LOAD='1' then
COUNTER <= DIN;
else
if CE='1' then
if DIR='1' then
if COUNTER = 15 then
COUNTER <= 0;
else
COUNTER <= COUNTER + 1;
end if;
else
if COUNTER = 0 then
COUNTER <= 15;
else
COUNTER <= COUNTER - 1;
end if;
end if;
end if;
end if;
end if;
end process;
COUNT <= COUNTER;
sazh
//Мужики, делаю элементарный 8-и битовый двоичный счетчик на ISE7.1 для XC9572-PC44 CPLD. Сигналы счетчика вывожу через IO выходы. По идее, частота каждого следущего бита досжна делиться на два. У меня же частота всех равна половине CLK (CLK/2) плюс некоторые биты "дергаются" словно шум по фазе. Не могу понять в чем дело. Вроде нет ни ошибок с компиляцией ни с загрузкой.
С сигналом CLEAR и CLK Все нормально. Исходник взят из справочника на инете://

В Quartuse все работат. Нормальный делитель на 129 с асинхронной установкой в ноль.
Где дергаются биты? Если при временном моделировании, проверьте установленный в тестбенче период клока. Может на такой частоте кристалл не работает.
shell_inspector
Спасибо,

Сигнал дергается во времени на осцилоцграфе, по типу: ..1,0,1,0,1,0 и врдуг опять 0,1,0... Частота "клока" маленькая - не больше 1кHz.
Тест бенч на ISE 7.1.1 я писать не умею, не знаю где что вставлять. Раньше в унив. делал что то подобное в Xilinx Foundation. В принципе подобный делитеь можно записать и в другом духе, что я и пробовал, работает нормально. Ошибки в моем исходнике нет точно, так как такими же (почти) исходниками полон и интернет и книги по VHDL. Я подозреваю ошибку в прогр. обеспечении ISE 7.1. или сам чип тормозит. Или какие установки типа user time cosntraints и прочее. Обидно, не хочется просто так бросить этот пустяк так и не разобравшись в чем дело. Два дня уже на это потратил.
Elresearch, попробую твои вещи завтра, но почти уверен что тоже не пойдет. Что то он не любит конструкцию типа:
COUNT_INT <= COUNT_INT + 1;
sazh
//Сигнал дергается во времени на осцилоцграфе, по типу: ..1,0,1,0,1,0 и врдуг опять 0,1,0... Частота "клока" маленькая - не больше 1кHz.
Тест бенч на ISE 7.1.1 я писать не умею, не знаю где что вставлять. Раньше в унив. делал что то подобное в Xilinx Foundation. В принципе подобный делитеь можно записать и в другом духе, что я и пробовал, работает нормально. Ошибки в моем исходнике нет точно, так как такими же (почти) исходниками полон и интернет и книги по VHDL. Я подозреваю ошибку в прогр. обеспечении ISE 7.1. или сам чип тормозит. Или какие установки типа user time cosntraints и прочее. Обидно, не хочется просто так бросить этот пустяк так и не разобравшись в чем дело. Два дня уже на это потратил.
Elresearch, попробую твои вещи завтра, но почти уверен что тоже не пойдет. Что то он не любит конструкцию типа:
COUNT_INT <= COUNT_INT + 1//
К Вашему ISE нужен моделсим. Это лучше, чем осциллограф. (Наверно на внутренней синхронизации смотрите. Сколько ему лет). ISE точно не причем. И ограничения тут нет. На одной частоте все работает.
И конструкция эта самая любимая. Скачайте с сайта xilinx xst.pdf (синтезабельное hdl описание библиотечных элементов).
des00
Цитата(sazh @ Jan 11 2006, 16:31) *
И конструкция эта самая любимая. Скачайте с сайта xilinx xst.pdf (синтезабельное hdl описание библиотечных элементов).


Имхо не самая хорошая smile.gif я бы заменил clr на синхронный ресет + в зависимости от частоты работы счетчика, сделал бы конвееризированный сброс.

Хотя ИМХО это для FPGA хорошо smile.gif
sazh
В зависимости от частоты работы счетчика, сделал бы конвееризированный сброс.
Поясните пожалуйста.
Hilter
возможная проблема Вашего кода - это именование сигнала,
Q5 - не очень удачное название для вектора (названия векторов
не должны заканчиваться на цифру) при этом возможно разный
синтез на разных синтезаторах (некоторые из них образуют
названия сигналов вектора дописыванием цифры к имени вектора)
des00
Цитата(sazh @ Jan 12 2006, 02:24) *
В зависимости от частоты работы счетчика, сделал бы конвееризированный сброс.
Поясните пожалуйста.


Хмм ну как, в данной конкретной схеме на выходе счетчика сидит компаратор и уже с его выхода сигнал идет на сброс.
тут есть +, есть минусы, в зависимости от разрядности счечтика. Если разрядность большая, то получаеться "большая" многовходовая функция, что не есть хорошо для ФПГА, но нормально для ЦПЛД, т.к. увеличиваеться кол-во уровнй логики + сигнал же еще на тригеры тащить, по этому ИМХО сравниваем с числом на 1 меньше и на тригер, след. тактом будет нормальный "сильный" сигнал с тригера и времянка этой цепи ИМХО улучшиться.

smile.gif
shell_inspector
Ну вот так, я и знал! Версия Webpack ISE7.1.x имеет ошибки. Как только запустил версию 8.1 сразу все заработало.
Elresearch
Мне кажется что в Вашем коде "чудит" в строке

if Q5_IN=128 then -- Yes. Count = 4 ?
Q5_IN <= "00000000"; -- Yes. Clear counter

т.к. в двоичном виде 128=10000000 , то после этого значения счетчика становится 00000000
вот вам и два идущих подряд 0 (проверять не проверял, но уж больно похоже ;-))

попробуйте

if Q5_IN=127 then -- Yes. Count = 4 ?
Q5_IN <= "00000000"; -- Yes. Clear counter

и посмотрите что произойдет.
kas
IMXO. Может и ISE тут не причем. У Вас асинхронный сброс счетчика. Вам уже на это указывали. Сменив версию софта, вероятнее всего немного изменилась прошивка для ПЛИС. Переделайте свой проект на синхронный.
alexr22b
Надеюсь что хоть частота клока и небольшая, но фронты у него крутые ? Даташит по-моему говорит 5-10нс. Иначе будут ложные срабатывания.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.