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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> генератор ПСП (m-последовательности) на XC9536
8-)
сообщение Dec 15 2005, 21:29
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 7-12-05
Пользователь №: 11 948



Доброе время суток. Помогите чайнику решить проблему, pls.
Никак не могу понять в чём проблема. Провожу моделирование в modelsim - всё работает. Прошиваю XC9536 - не работает. Вот код на vhdl:

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

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

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

architecture Behavioral of counter is
signal regA: std_logic_vector(8 downto 0);
signal flag: std_logic;
begin

process (CLK)
begin

if (CLK'event and CLK='1') then

if flag = '1' then
regA <= (regA(4) xor regA(0)) & regA(8 downto 1);

DOUT(0) <= regA(0);
DOUT(1) <= regA(1);
DOUT(2) <= regA(2);
DOUT(3) <= regA(3);
DOUT(4) <= regA(4);
DOUT(5) <= regA(5);
DOUT(6) <= regA(8);
DOUT(7) <= regA(7);
else
flag <= '1';
regA(0) <= '1';
regA(1) <= '1';
regA(2) <= '1';
regA(3) <= '1';
regA(4) <= '1';
regA(5) <= '1';
regA(6) <= '1';
regA(7) <= '1';
regA(8) <= '1';
end if;
end if;
end process;

end Behavioral;

После прошивания микросхемы все сигналы DOUT имеют низкий уровень.
Go to the top of the page
 
+Quote Post
Laptop
сообщение Dec 15 2005, 22:49
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 19-11-05
Пользователь №: 11 103



вполне логично, у тебя ведь не определены значения регистров по умолчанию, надо ввести цепь начального сброса и не мучаться с flag и конечно присвоение вроде DOUT(0) <= regA(0) необходимо вынести за процесс иначе получишь задержку в один такт.
впрочем и шины лучше присваивать сразу без индексов DOUT <= regA;
в общем причина в том что у тебя по включению сразу flag = 1, а regA = "000000000" smile.gif
удачи в освоениииsmile.gif
Go to the top of the page
 
+Quote Post
sazh
сообщение Dec 16 2005, 07:26
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Никакого ресета (в глобальном смысле) для работоспособности счетчика не надо.
Ясно дело, не корректна схемная реализация.
VHDL не знаю. Работаю в Quartuse
Выдается ошибка при синтезе:
Error (10481): VHDL Use Clause error at counter.vhd(9): design library "UNISIM" does not contain primary unit "VComponents"
Сделал так:
--library UNISIM;
--use UNISIM.VComponents.all;
Получил предупреждение:
Warning: Reduced register "flag" with stuck data_in port to stuck value VCC
По включению питания триггер flag устанавливается в ноль. Только вот на d входе триггера 1, по этому при включенной опции по умолчанию
Power-up don’t care синтезатор игнорирует этот триггер (считает его за константу), выбрасывает часть схемы и благодаря этому на выходе все нули.
Если отключить минимизацию Power-up don’t care, все работает, как? Вам виднее.
Резюме. Схема некорректна в части формирования сигнала триггером flag.
Go to the top of the page
 
+Quote Post
Victor®
сообщение Dec 16 2005, 09:23
Сообщение #4


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Странный какой-то у Вас генератор M-последовательности...
А где регистр сдвига? Или это какая-то "необычная" реализация?
И еще, совет - используйте отдельный сброс

to sazh по поводу
--library UNISIM;
--use UNISIM.VComponents.all;
это библиотеки под XILINX :-), а Вы работаете в QUARTUS

Сообщение отредактировал Victor® - Dec 16 2005, 09:26


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
vitus_strom
сообщение Dec 16 2005, 09:41
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 553
Регистрация: 15-10-04
Пользователь №: 877



Каким софтом собираете проект, посмотрите к нему сервис пак, потому как 7 версия софта работает не корректно с ЦПЛД...
Go to the top of the page
 
+Quote Post
:-)
сообщение Dec 16 2005, 09:51
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 23-10-05
Из: Мск
Пользователь №: 10 006



to Laptop: Тогда вопрос такой: Почему если убрать строчку

regA <= (regA(4) xor regA(0)) & regA(8 downto 1);

то регистр regA инициализируется (regA="111111111") ?

to Victor®: так строчка

regA <= (regA(4) xor regA(0)) & regA(8 downto 1);

и выполняет сдвиг всех значений регистра. Таким образом определяются Shift Registers в Code Templates (WebPack ISE 4.1).

P.S. Спасибо за ваши ответы.
Go to the top of the page
 
+Quote Post
sazh
сообщение Dec 16 2005, 10:21
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



To Victor
//И еще, совет - используйте отдельный сброс//
Хочу еще раз акцентировать. В нормальной схеме (если не нужны конкретные установки регистров в нужный момент времени) отдельный сброс только вреден. (Меня всегда умиляла кнопочка сброс на макетках с микроконтроллерами). В данном случае сброс на тригггер flag действительно сделает эту схему независимой от установок синтезатора. И больше ничего. Как была схема некорректной так и останется. Внешний сброс источник всех сбоев. И в данной схеме он не нужен. По дешифрации состояния все нули загружать в регистр константу все 1.
Go to the top of the page
 
+Quote Post
Victor®
сообщение Dec 16 2005, 12:30
Сообщение #8


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(:-) @ Dec 16 2005, 13:51) *
to Victor®: так строчка
regA <= (regA(4) xor regA(0)) & regA(8 downto 1);
и выполняет сдвиг всех значений регистра. Таким образом определяются Shift Registers в Code Templates (WebPack ISE 4.1).


Блин, спутал AHDL и VHDL операторы wacko.gif


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
vitus_strom
сообщение Dec 16 2005, 12:35
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 553
Регистрация: 15-10-04
Пользователь №: 877



Предлагаю модифицировать код следующим образом:

process (CLK)
begin

if (CLK'event and CLK='1') then

if flag = '1' then
flag <= flag;
regA <= (regA(4) xor regA(0)) & regA(8 downto 1);
DOUT(7 downto 0) <= regA(7) & regA(8) & regA(5 downto 0);
else
flag <= '1';
regA(8 downto 0) <= (others => '1');
DOUT(7 downto 0) <= DOUT(7 downto 0); --Например
end if;
end if;
end process;

end Behavioral;

писать в одной ветке сигнал и не писать его в другой значит оставлять ее на откуп синтезатору, а что он там насинтезит одному разработчику известно, ну еще может что то про Это в стандарте написано.
Но проой бывают такие неприятности что и найти сложно....
Go to the top of the page
 
+Quote Post
Victor®
сообщение Dec 16 2005, 12:37
Сообщение #10


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(sazh @ Dec 16 2005, 14:21) *
To Victor
//И еще, совет - используйте отдельный сброс//
Хочу еще раз акцентировать. В нормальной схеме (если не нужны конкретные установки регистров в нужный момент времени) отдельный сброс только вреден. (Меня всегда умиляла кнопочка сброс на макетках с микроконтроллерами). В данном случае сброс на тригггер flag действительно сделает эту схему независимой от установок синтезатора. И больше ничего. Как была схема некорректной так и останется. Внешний сброс источник всех сбоев. И в данной схеме он не нужен. По дешифрации состояния все нули загружать в регистр константу все 1.


В СИСТЕМЕ должет быть сброс\инициализация для приведение в нормальное состояние после сбоя. Только не убеждайте меня, что несбоящих систем не бывает smile.gif Ну не будете же Вы ездить, например, на необслуживаемый объект, чтобы питание перебросить... А watchdog - поможет. И все узлы, входящие в систему должны иметь возможность сброс\инициализации без обесточивания...
И еще не согласен, что внешний сброс - источник всех сбоев, его надо правильно проектировать....

Сообщение отредактировал Victor® - Dec 16 2005, 12:39


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
disel
сообщение Dec 16 2005, 14:20
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 610
Регистрация: 22-04-05
Пользователь №: 4 410



Я когда-то делал универсальный генератор m-последовательностей следующим образом:

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;


entity GaloisPRNG is
generic(
PN : std_logic_vector := O"325"
);
port(
CLK : in STD_LOGIC;
PRN : in STD_LOGIC;
Q : out STD_LOGIC
);
end GaloisPRNG;


architecture rtl of GaloisPRNG is

function calcN (P : std_logic_vector) return natural is
variable tN : natural;
begin
tN := 0;
for i in P'Length-1 downto 0 loop
if P(i) = '1' then
tN := i;
end if;
end loop;
return P'Length - tN - 1;
end;

constant N : natural := calcN(PN);
signal A, X : STD_LOGIC_VECTOR(N-1 downto 0);
constant P : STD_LOGIC_VECTOR (N downto 0) := PN (PN'Length-N-1 to PN'Length-1);

begin

A(N-1) <= X(0);

process ( X )
begin
for i in N-2 downto 0 loop
if P(i+1) = '0' then
A(i) <= X(i+1);
elsif P(i+1) = '1' then
A(i) <= X(i+1) xor X(0);
end if;
end loop;
end process;

process ( CLK, PRN )
begin
if PRN = '0' then
X <= ( others => '1' );
elsif CLK'event and CLK = '1' then
X <= A;
end if;
end process;

Q <= X(0);

end rtl;

Задаешь нужный полином (PN) и получаешь желаемый генератор.
Go to the top of the page
 
+Quote Post
8-)
сообщение Dec 16 2005, 19:41
Сообщение #12





Группа: Новичок
Сообщений: 4
Регистрация: 7-12-05
Пользователь №: 11 948



Спасибо всем за ответы. Проблема, наконец, решилась. Всё дело было в начальной инициализации. Поменял её на другой вариант и всё заработало. Вот такие чудеса. Вот что получилось, если кому интересно:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity counter is
Port ( CLK : in std_logic;
DOUT : inout std_logic_vector(7 downto 0));
end counter;

architecture Behavioral of counter is
signal regA: std_logic_vector(8 downto 0);
signal count : integer range 0 to 2;
begin

process (CLK)
begin
if (CLK'event and CLK='1') then
if count = 2 then--причём если указать "count=1", то ничего не заработает
regA <= (regA(4) xor regA(0)) & regA(8 downto 1);
-- DOUT(7 downto 0) <= not regA(7 downto 0);
DOUT <= ( not regA(2) ) & DOUT(7 downto 1);
else--теперь здесь инициализация. Хотя выглядит грубовато...
count <= count + 1;
regA(8 downto 0) <= (others => '1');
DOUT(7 downto 0) <= (others => '1');
end if;
end if;
end process;

end Behavioral;

Вот только интересно: почему же не работает при "count=1" ...
Go to the top of the page
 
+Quote Post
evgeniy_s
сообщение Dec 17 2005, 18:07
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 3-09-05
Из: Россия, Москва
Пользователь №: 8 195



Проверил Ваш код на Aldec'е - никаких проблем не обнаружил, всё моделируется и при count=1, и при count=2. Вы на какой системе моделируете, если опять в этом глючном моделсиме - то дело, скорее всего, в нём?


--------------------
"О наслажденье ходить по краю.
Замрите, ангелы, смотрите: я играю.
Разбор грехов моих оставьте до поры,
Вы оцените красоту игры!"
Go to the top of the page
 
+Quote Post
maksya
сообщение Dec 17 2005, 18:48
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-08-04
Из: Ленинград
Пользователь №: 562



На лицо явные признаки классического последовательного программирования. Отрекитесь Вы от него, ну хотя бы на время проектирования на VHDL. Забудьте про флаги, вспомните про триггеры! Теперь по порядку...

Насчет инициализации содержимого регистра, т.е. о начальном значении, которое по сути и определяет M-последовательность: Триггер есть сущность, способная находиться в одном из допустимых устойчивых состояний (в простейшем случае 0 или 1). Стало быть необходимо задавать начальное значение самостоятельно (входы асинхронной установки/сброса) или надеять на волю всевышних электротехнических сил. Вот мне интересно, в каком состоянии будет ваш регистр после включения питания? В testbench'е при работе с ModelSim'ом небось задавали начальное значение. А кто за вас будет этим заниматься при реальной работе?..

Вы же аппаратуру проектируете. Так и опирайтесь на неё при разработке. А ежели фантазии не хватает представить во что выльется Ваш код, то используйте RTL Viewer.

Вот Я тут накидал ваш ПСП за минут 5:

Код

LIBRARY IEEE;
    USE IEEE.std_logic_1164.all;

ENTITY psp IS
PORT(       clk : in std_logic;
          reset : in std_logic;
     init_value : in std_logic_vector(8 downto 0); -- начальное значение; задается вне блока
           dout : out std_logic);
END psp;

ARCHITECTURE rus OF psp IS

   SIGNAL reg: std_logic_vector(8 downto 0); -- это, собственно сдвигающий регистр

BEGIN

process(clk, reset, init_value)
begin
   if reset = '1' then
      reg <= init_value;
   elsif rising_edge(clk) then
      reg <= (reg(4) xor reg(0)) & reg(8 downto 1);
   end if;
end process;

dout <= reg(0);

END rus;


Еще по поводу counter'а хотел сказать. Пустяк конечно, но в каком, извините за выражение, месте вы там счетчик увидели? Теория ПСП, основанная на M-последовательностях, реализуется с помощью сдвиговых регистров, а не счетчиков. Счетчики конечно строятся из тех же триггеров, но назначение этих цифровых устройств различны. А иначе стали бы давать им различные имена?

Чуть не забыл, если Я правильно помню курс "Методы защиты информации", то генератор ПСП на каждом такте (шаге алгоритма для программиста будет, наверное, понятней) выдает 1 бит. Если же выдается число, то такая штука носит название - генератор псевдослучайных чисел.

P.S.: И поудаляй свои ники-смайлики.


--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
Go to the top of the page
 
+Quote Post
sazh
сообщение Dec 17 2005, 19:38
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Действительно, интересно. Обсудили Вашу проблему со всех сторон.
Вам даже выкатили готовую мегафункцию формирователя псевдослучайной последовательности.
И что у вас на выходе. Неужели у вас нет под рукой RTL просмотрщика, чтобы посмотреть что Вы напроектировали. Ведь наверняка получили кучу замечаний. И не устранили.
Основа Вашей схемы – один регистр и элементы XOR. Инициализация может быть только двумя способами
Или с помощью внешнего сигнала установки начального значения на этом регистре, или с помощью дешифрации состояния регистра по включению и синхронной загрузки в регистр нужного начального значения. Если хотите защититься от сбоев, продешифрируйте запрещенные состояния вашего полинома и грузите по сбою нужное состояние в регистр. Хотите простробировать полученную шину, поставьте на выходе просто регистр.
Что касается схемотехники, нужно с умом использовать схемные решения, которые используются в ограниченном интервале времени и всего один раз (Например по включению питания выработать интервал определенной длительности ( то что Вы называете инициализацией)) и потом на выходе всегда какой то неизменный уровень. Без установок синтезатора не обойтись. По умолчанию такие куски схем игнорируются синтезатором. А значит и выбрасывается та часть схемы, которая управляется этим триггером (константной) или в Вашем случае счетчиком. Вы же уже второй раз напоролись на это. "count=1".
Что касается элементов BIDIR. Они могут использоваться только совместно с шинными формирователями по третьему состоянию. Хотя вообще не понятно, зачем здесь двунаправленная шина.
Go to the top of the page
 
+Quote Post

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

 


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


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