|
генератор ПСП (m-последовательности) на XC9536 |
|
|
|
Dec 15 2005, 21:29
|
Группа: Новичок
Сообщений: 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 имеют низкий уровень.
|
|
|
|
|
Dec 15 2005, 22:49
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 19-11-05
Пользователь №: 11 103

|
вполне логично, у тебя ведь не определены значения регистров по умолчанию, надо ввести цепь начального сброса и не мучаться с flag и конечно присвоение вроде DOUT(0) <= regA(0) необходимо вынести за процесс иначе получишь задержку в один такт. впрочем и шины лучше присваивать сразу без индексов DOUT <= regA; в общем причина в том что у тебя по включению сразу flag = 1, а regA = "000000000"  удачи в освоениии
|
|
|
|
|
Dec 16 2005, 12:37
|

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

|
Цитата(sazh @ Dec 16 2005, 14:21)  To Victor //И еще, совет - используйте отдельный сброс// Хочу еще раз акцентировать. В нормальной схеме (если не нужны конкретные установки регистров в нужный момент времени) отдельный сброс только вреден. (Меня всегда умиляла кнопочка сброс на макетках с микроконтроллерами). В данном случае сброс на тригггер flag действительно сделает эту схему независимой от установок синтезатора. И больше ничего. Как была схема некорректной так и останется. Внешний сброс источник всех сбоев. И в данной схеме он не нужен. По дешифрации состояния все нули загружать в регистр константу все 1. В СИСТЕМЕ должет быть сброс\инициализация для приведение в нормальное состояние после сбоя. Только не убеждайте меня, что несбоящих систем не бывает  Ну не будете же Вы ездить, например, на необслуживаемый объект, чтобы питание перебросить... А watchdog - поможет. И все узлы, входящие в систему должны иметь возможность сброс\инициализации без обесточивания... И еще не согласен, что внешний сброс - источник всех сбоев, его надо правильно проектировать....
Сообщение отредактировал Victor® - Dec 16 2005, 12:39
--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
|
|
|
|
|
Dec 16 2005, 19:41
|
Группа: Новичок
Сообщений: 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" ...
|
|
|
|
|
Dec 17 2005, 18:07
|

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

|
Проверил Ваш код на Aldec'е - никаких проблем не обнаружил, всё моделируется и при count=1, и при count=2. Вы на какой системе моделируете, если опять в этом глючном моделсиме - то дело, скорее всего, в нём?
--------------------
"О наслажденье ходить по краю. Замрите, ангелы, смотрите: я играю. Разбор грехов моих оставьте до поры, Вы оцените красоту игры!"
|
|
|
|
|
Dec 17 2005, 18:48
|
Местный
  
Группа: Свой
Сообщений: 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.: И поудаляй свои ники-смайлики.
--------------------
Лень - это не врожденное чувство русского человека, а средство борьбы с неуемной, но бестолковой энергией начальника.
|
|
|
|
|
Dec 17 2005, 19:38
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

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