Перейти к содержанию
    

MAZZI

Свой
  • Постов

    113
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные MAZZI


  1. Что ещё мы тут выяснили опытным путем: :)

    Вначале данные заходят на так называемый мини-скремблер (то что уже называли XOR, он то и делал сигнал похожим на NRZI), и после идут на кодировку AMI или NRZ. Поэтому и получилось у меня что данные якобы идут с инверсией через фрейм (это в том режиме, когда не вставляется единица перед фреймом, если вставляется, то кодировка была бы более менее одинакова). Не кодируется по XOR сам синхросигнал, т.к. его видно отчетливо везде одинаково.

    Теперь следующий вопрос, другие биты в нулевом тайм-слоте кодируются по XOR: мультифреймовая, сигнализация, резерв (кстати что туда вставлять, единицу?) ?

    И ещё заодно подскажите чем заполнять биты сигнализации, если она не используется и мы полностью генерим нулевой тайм-слот?

    И если фреймовая метка не кодируется, то первый бит первого таймслота по XOR какое состояние берет, то что было перед фреймовой меткой или какое-то фиксированное число?

  2. 4 cdq

    ты, кстати, не ответил по поводу рисунка и NRZI.

    ещё скажи ты с AMI свое устройство проверял? а то такое чувство, что ты сам это додумал по поводу единицы на последнем бите фрейма перед следующей передачей, в силу того что не было описания...

    и по поводу какая разница, то разница есть, ведь необходимо добиться совместимости с другими устройствами, а не только с нашими, поэтому и следует работать по общим правилам.

  3. Никто ничего не усложняет :). Делал этот проект очень давно, лет 5 тому назад, рабирался по схме БГ стойки, старой засаленой и затертой... которая не дожила до наших дней, проект был еще в MAXPLUS сейчас под рукой нет, надо искать гдето в архивах(???).

    Если можешь, то дай пожалуйста архив :), самое идеальное, если ты его ещё в письменном виде дополнишь пояснениями, если не сложно.

    При передаче данных используется упрощенный вид скремблирования - разностное кодирование (XOR текущего бита с предыдущим), которое позволяет избежать длинной последовательности нулей и единиц, синхрокомбинация в сремблировании не участвует.

    Вот картинка с NRZ и NRZI, из выше описанного я понял что это код NRZI

    http://www.intuit.ru/department/network/baslocnet/3/3-17.gif

    Отличие кодировок в том, что в одном случае производится принудительная установка начала отсчета скремблирующей последовательности в 1, т.е. последний бит предыдущего фрейма для начала следующего всегда принимается равным 1. Вот и все.

    Вот это совсем тяжело!!! Это и есть NRZ+ ??? И что будет если передача идет без фрейма? Куда мне эту 1 засунуть? :) Умоляю нарисуйте временную диаграмму с пояснениями где, что, куда!!!

    Могу точно сказать, что никаких таких наворотов не делал и не встречал, могу сказать только если станция гонит в TS фиксированный код, то надо извращаться чтобы встречная сторона правильно от тебя засинхронизировалась, вот тут простор для фантазии просто необъятный.

    Согласен, возможно это наворот, но он проявляется да анализаторе, когда просматриваем линию и вполне логичен для фреймовой синхронизации, иначе если будет фиксированный код в тайм-слоте (а это вполне вероятно, к примеру, флаги HDLC) можно будет только на более высоком уровне определить ошибку, а это не есть хорошо!!! Да и по поиску/потери фрейма (110) четыре подряд поймал/четыре подряд потерял такие ложные ловли фреймов будут всегда...

    Вообще раздражает такой стандарт, мало того что нигде не описан, ещё в NRZ(I), если передавать длинные последовательности нулей умирает выходной трансформатор при передачи длинного положительного импульса (проверяли в AMI нормально, в NRZ(I) умер), прям сырой дальше некуда, не зря не получил распространения, но сделать то его надо...

    Я ещё не говорил с начальством, но кто готов продать стандарт? мож у кого есть?

    :help:

  4. To MAZZI

    Зашивку для ИКМ-15 довелось проектировать очень давно, почти 10 лет назад, поэтому никаких материалов не сохранилось, да вобщем их и не было. Что касается разностного кодирования, то это XOR текущего бита с предыдущим (кроме синхрокомбинации).

    Я правильно понял, то что ты описал XOR текущего с предыдущим, по человечески это называется NRZI кодировка (есть перепад = 1, хранение = 0)? И это не одно и тоже NRZ+ и NRZI? Если нет, напишите, пожалуйста чем отличается NRZ+ от NRZ?

    В силу того, что нет нормального описанного стандарта, сейчас мы анализируем два решения от разных производителей (у них тоже на свои устройства нет описания), выяснилось, что по крайней мере они действительно в линию передают не RZ, как я предполагал ранее, а NRZ (или NRZI, что более вероятно). Прикольно ещё то, что у одного производителя кодировка пишется NRZ, у второго NRZI, но оба прекрасно друг друга понимают.

     

    И вот тут ещё один момент требующий пояснения и который ввел меня просто в тупик :) .

    Мы использовали фреймовый режим и задавали IDLE код во все тайм-слоты кроме нулевого, тут обнаружился прикол, из поведения сигнала похоже он данные через каждый фрейм инвертирует, это вполне возможно для того, чтобы более корректно было отлавливание фрейма, не изменяя фреймовый тайм-слот через фрейм инвертировать все остальные (мы такую фишку уже используем, чтобы с похожим протоколом на E1 передавать большее кол-во тайм-слотов, не реализуя E2 или E3).

    НИГДЕ в документации об этом даже намека нет, причем два разных производителя спокойно друг друга понимают и PING проходит. Это значит, что информация наверняка в нулевом слоте. Какой бит за это отвечает? Дайте ссылку, где взять информацию? А возможно и не в бите дело, а он обязательно ищет Мультикадровую синхронизацию (Сверх цикловая) и там смотрит четный/нечетный, чтобы поставить инверсию?

    Причем это мы проверяли как в NRZ(I) так и в AMI, поведение одинаково, кодировка физического уровня не причем.

  5. Ищите схему ячеек ЦПРД ЦПРМ на Борисоглебскую полустойку ИКМ-15, может у кого есть в электронном виде, у меня нет :(

     

    Погодите, не усложняем ли мы что-то?

    Поясните, если передается NRZ, то можем ли мы передать через выходной трансформатор длинную последовательность единиц? Или же на самом деле там используется код RZ, а не NRZ?

    Может я что-то не правильно понимаю? Разъясните :).

    :help:

  6. Парни, помогите обогатиться документицией по ИКМ-15, не очень понятны варианты с NRZ, NRZ+; как они реально на линию передаются в какой форме, если AMI нормально документирован, то на "русском" NRZ появляются сомнения, т.к. у разных устройств по разному формы сигналов...

    Где правда жизни, Братья? :)

    если можно пришлите на [email protected]

  7. По многочисленным просьбам коллег выложил на рапидшару несколько книг по Verilog:

     

    h**p://rapidshare.de/files/6989805/Palnitkar_Verilog.HDL.rar.html

     

    h**p://rapidshare.de/files/6989949/Bhasker_-_Verilog_HDL_Synthesis-A_Practical_Primer.rar.html

     

    h**p://rapidshare.de/files/6990035/Thomas_Moorby_-_The_Verilog_HDL.rar.html

     

    пароль на все архивы: electronix.ru

     

    подскажи пожалуйста, где находятся данные книги (1 и 3) на серваке electronix? а то что-то я не очень понял как с твоего места куда ты положил закачивать :)

  8. Столкнулся с ситуацией, в 200 Spartan II всего 14 BLOCKRAM, у меня один модуль использует 3584 байт RAM и если реально посмотреть в разводку, то он занимает 4096, т.е. при адрессной шине с шириной = 12, он сожрал ещё один неиспользуемый блок. Я подозреваю, что это как-то связанно с дешифратором на Блок RAM, я ему глубину памяти передаю корректно ровно от 0 до 3583.

    кто как разбирался с такой ерундой?

    Память в проекте для меня критична, не влезает проект в ПЛИС.

  9. правда на ВХДЛ но смысл бумаю будет понятен

    entity RAM_16_DWC_Dev is 
       generic (WIDTH : integer := 16);
       port 
           (
           in_clock      : in std_logic;
           in_reset_b    : in std_logic;
           in_wr_data    : in std_logic_vector(4*WIDTH-1 downto 0);              
           in_wr_strobe  : in std_logic;
     in_wr_addr   : in std_logic_vector(3 downto 0);
           in_rd_addr   : in std_logic_vector(5 downto 0);
           out_rd_data   : out std_logic_vector(WIDTH-1 downto 0)
           ); 
    end entity RAM_16_DWC_Dev;

    Ты изначально заложил то, что у тебя не может быть вход данных in_wr_data однобитовым

        mem_read_proc : 
        process(in_clock) is 
       variable reg0, reg1, reg2, reg3 : std_logic_vector(WIDTH-1 downto 0); 
        variable mem_data : std_logic_vector(4*WIDTH-1 downto 0);
        begin
           if (rising_edge(in_clock)) then 
         if (in_reset_b = '0') then
             out_rd_data <= (others => '0');
           else 
       mem_data := mem(conv_integer(in_rd_addr(5 downto 2)));  
       demux_data(mem_data, reg0, reg1, reg2, reg3);
       case (in_rd_addr(1 downto 0)) is 
                 when "00" => out_rd_data <= reg0;
                 when "01" => out_rd_data <= reg1;
                 when "10" => out_rd_data <= reg2;
                 when "11" => out_rd_data <= reg3;
           when others => null;
       end case;
         end if;
           end if;
       end process mem_read_proc;

    Вот и мультиплексор вылез о котором ты и упоминал ранее

     

    насчет корректности твоего описания

    reg R_tmp_mem [(WIDTH_WR_DATA*DEPTH_WR-1):0];

    reg [(WIDTH_RD_ADDR-1): 0] R_rd_addr;

    вот здесь ты объявляешь не память а регистр. А тебе нужна именно память, а не набор регистров.

    Поправь меня, если я не прав, память с разрядностью шины данных в один бит не существует? R_tmp_mem - длинная однобитовая память, с которой я и работаю в дальнейшем по записи и по чтению.

     

    А теперь скажи как ты будешь адресовать 8 ми битные слова ?

    для меня в этот момент важен перевод последовательный в параллельный, и ты прав для записи многоразрядных слов это описание некорректно

     

    Мы разговариваем про разные вещи, память это двумерный массив. У памяти может быть 1-2 порта чтения записи, если же их больше, то это приведет к памяти на регистрах. Если у тебя их много то ......

    а если нет ??

    Что то ты здесь перемудрил :) в моем случае R_tmp_mem - двумерный массив [1]x[4096]. Запись reg R_tmp_mem [(WIDTH_WR_DATA*DEPTH_WR-1):0]; как раз это отображает.

  10. мне бежать надо по этому вкратце

    1. порт записи 32 бита, адрес 8 бит. порт чтения 16 бит адресс 9 бит

    пишем просто по входным адресам, когда читаем

    первые 8 бит это адрес памяти, младший бит на выходной мультиплексор.

    2. если наоборотт, то мультиплексируем сигнал разрешения записи.  младшим битом а старшие 8 бит на адресс.

     

    В твоем описании (подробно не смотрел) симплифай ругаеться, т.к. у тебя есть массив пр.32 по 32 бита а ты почему то решил из него сделать 64 на 16 бит, адреса не совпадають :)

    удачи

     

    то что ты вкратце описал, не очень красивое решение, т.к. все равно обращаешься на компоненты памяти, или я не прав?

    Да и было бы интереснее если бы ты показал на примере <== что ты имеешь ввиду

     

    Моё описание корректно:

    parameter

    WIDTH_WR_DATA = 1,

    WIDTH_WR_ADDR = 12,

    DEPTH_WR = (1<<WIDTH_WR_ADDR), // это будет 2**12=4096 <==

    WIDTH_RD_DATA = 8,

    WIDTH_RD_ADDR = 9

     

    reg R_tmp_mem [(WIDTH_WR_DATA*DEPTH_WR-1):0];

    reg [(WIDTH_RD_ADDR-1): 0] R_rd_addr;

     

    отсюда:

    reg R_tmp_mem [(1*4096-1):0];

    reg [(9-1): 0] R_rd_addr; // 9 разрядный счетчик (2**9=512) по WIDTH_RD_DATA = 8

    получается, что бит я покрываю 512*8=4096 при чтении, всё корректно.

  11. Возможно ты прав, возможно я и ленивый, если ты ставишь вопрос таким образом, то:

    1) помоги найди некорректность в моем описании на Verilog выложенное выше.

    2) расскажи ещё раз принцип описания на языке, я его что-то не увидел здесь.

  12. На харр дал ссылки это очень хорошо, спасибо, только вернемся к вопросу, необходимо не ручками брать "готовый компоненты библиотеки унисим типа RAMB_X_X" и конфигурить их, а было бы классно, чтобы синтезатор сам понимал, что из описания модели RAM сделать блочную память, к примеру, как есть описание из Language Templates ISE, которое он в дальнейщем понимает как Block Ram, так и здеcь хотелось бы тоже самое.

    Это делает код более мобильным и переносимым на другие ПЛИС, ASIC.

  13. Если это обсуждалось (в чем я сильно сомневаюсь), дайте ссылочку, пожалуйста, то же и по appnotes, использовал для примера CORE Generator, он сослался на библиотечный элемент BLKMEMDP_V6_1.v, слишком все тяжело описано в нем, разобраться не могу, сам придумал реализацию, по крайней мере в моделе всё как и задумывалось:

    <==================================================

    /* ОБЪЯВЛЕНИЕ МОДУЛЯ */

    module C_DPINDEP_RAM

    /*-----------------------------------------------------------------------------

    * Объявление параметров:

    */

    #(

    parameter

    WIDTH_WR_DATA = 1,

    WIDTH_WR_ADDR = 12,

    DEPTH_WR = (1<<WIDTH_WR_ADDR),

     

    WIDTH_RD_DATA = 8,

    WIDTH_RD_ADDR = 9

    )

    /*-----------------------------------------------------------------------------

    * Объявление портов:

    */

    (

    // порт записи

    input

    i_WR_CLK, // тактовый импульс записи

     

    i_WR_EN, // строб разрешения записи

     

    input [(WIDTH_WR_DATA-1): 0]

    i_WR_DATA,// шина данных записи

     

    input [(WIDTH_WR_ADDR-1): 0]

    i_WR_ADDR,// адресная шина записи

     

    // порт чтения

    input

    i_RD_CLK, // тактовый импульс чтения

     

    input [(WIDTH_RD_ADDR-1): 0]

    i_RD_ADDR, // адресная шина чтения

     

    output reg [(WIDTH_RD_DATA-1): 0]

    o_RD_DATA // шина данных чтения

    );

    /*-----------------------------------------------------------------------------

    * Объявление сигналов:

    */

    reg R_tmp_mem [(WIDTH_WR_DATA*DEPTH_WR-1):0];

    reg [(WIDTH_RD_ADDR-1): 0] R_rd_addr;

    integer j, k;

     

    /* synthesis translate_off */

    integer i;

    initial begin

    for (i = 0; i < WIDTH_WR_DATA*DEPTH_WR; i= i + 1)

    R_tmp_mem <= 1'b0;

     

    R_rd_addr <= {WIDTH_RD_ADDR{1'b0}};

    end

    /* synthesis translate_on */

     

    /*-----------------------------------------------------------------------------

    * Основной код:

    */

    always @(posedge i_WR_CLK) begin

    if (i_WR_EN)

    for (j = 0; j < WIDTH_WR_DATA; j = j + 1)

    R_tmp_mem[(i_WR_ADDR * WIDTH_WR_DATA) + j] <= i_WR_DATA[j];

    end

     

    always @(posedge i_RD_CLK) begin

    R_rd_addr <= i_RD_ADDR;

    end

     

    always @*//(posedge i_RD_CLK) <=== пробовал и в комментарии и без

    for (k = 0; k < WIDTH_RD_DATA; k = k + 1)

    o_RD_DATA[k] = R_tmp_mem[(R_rd_addr * WIDTH_RD_DATA) + k];

     

    endmodule

    <==================================================

     

    только вот беда, синтезатор (Symplify_pro8.1) не берет это описание как БЛОЧНУЮ ПАМЯТЬ, и пишет: Could not implement Block RAM. Is the read address registered using the same clock as the RAM?

     

    Как правильно описать такую модель для Блочной памяти?

  14. Интересен пример описания блочной памяти, где были бы два независимых конфигурируемых порта по записи и по чтению, с такой синтезируемой моделью можно легко будет делать преобразователи из последовательного в параллельный код, минуя сдвиговые регистры (сейчас я с ними делаю).

    Какие есть решения по данной реализации на Verilog (VHDL), чтобы ещё и понятно было :)? выкладывайте.

  15. У Вас имеется изрядное количество неиспользованных BUFT. Если в проекте есть мультиплексоры или память (disttributed), то их можно развести на BUFT.

    что ты имеешь ввиду?

    Map Properties\Map Slice Logic into Unused Block RAMs

    этот аттрибут разводки в Xilinx или что-то другое?

  16. 1) Русифицировал согласно инструкции в прикрепленном файле, возможно этот способ многие знают. Русский нормально показывает в UltraEdit других эдиторах, что мне изначально и хотелось, и даже могу писать на русском в ModelSim, но вот беда! :) Когда просматриваю комментарии написанные в UltraEdit, то в ModelSim_6.0d байда полнейшая, тоже самое и наоборот, но писать то я их могу.

    Как это можно синхронизировать, чтобы и там и там все читалось?

    2) И ещё, где можно поставить, чтобы ModelSim автоматически открывал другой эдитор?

    Возможно что это уже обсуждалось ранее, дайте ссылку, спасибо.

    Codepages_Change.txt

  17. Установил, полностью с первым сервис паком, признаюсь меня он даже разочаровал, проекты, сделаные в 6.3 не разводятся, ругается на уровне MAP (xc2s200-5pq208):

    -----

    ERROR:MapLib:30 - LOC constraint P106 on RST is invalid: No such site on the device. To bypass this error set the environment variable 'XIL_MAP_LOCWARN'.

     

    << это оказалось моей ошибкой, точнее тех людей, кто составлял UCF файл назначения пинов.

    -----

    от чего не понятно, новые библиотеки видно желают лучшего.

    Сделал примитивный модуль:

    module proba(input a, output B);

    assign b = a;

    endmodule

    ругнулся на PAR:

    -----

    Started process "Generate Post-Place & Route Simulation Model".

    An error occurred while executing E:/XilinxISE71/data/projnav/scripts/TclFileWrapper4Halite.tcl

     

    << Вот этот глюк вроде как говориться убирается SP1, но он у меня почему-то остался, хотя, если нажмешь повторно на "Generate Post-Place & Route Static Timing" доделает всё до конца.

    -----

    и ещё отстой, синтезатор XST как ранее не понимал constant function в verilog, так и не понимает :(, печально...

  18. ага и если ты работаешь в Verilog, то в файле описания плис, либо в тест бенче прописать строчку:

    initial $sdf_annotate("имя_файла.sdf");

    более подробнее см. описание $sdf_annotate.

  19. когда делаю ADD to WAVE любого сигнала,

    слетает без ругани, без каких-либо предупреждений весь проект моделсима,

    с лицензией всё впорядке, сломался спокойно (ModelSim_KG_by_EFA_2004-07-28).

     

    компиляция проекта тоже прошла, с варнингами, но только на те сигналы, которые я и не использую...

×
×
  • Создать...