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

Инициализация регистра на основе SRL

Как на VHDL в Xilinx-e инициализировать регистр на основе SRL.

Регистр описан не как компонент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно сделать так:

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

entity sample_srl is
    Port ( 
        CLK     : IN    std_logic;
        CE      : IN    std_logic;
        DOUT    : OUT   std_logic
    );
end sample_srl;

architecture Behavioral of sample_srl is
    signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF";
begin
    process( CLK )
    begin
        if rising_edge(CLK) then
            if CE='1' then
                iSRL_DATA <= iSRL_DATA(14 downto 0) & '0';
            end if;
        end if;
    end process;

    DOUT <= iSRL_DATA(15);
end Behavioral;

 

Вместо FFFF можно задать любое интересующее Вас значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

попробовал в Xilinx ISE 8.02.03 и синтезатор выдал следующее см вложения

(файл sys - c iSRL_DATA := x"FFFF"; файл sys_0000 - c iSRL_DATA := x"0000").

 

Теперь вопрос :)

Почему появляются защелки, а их количество меняется при изменении строки

 

signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF";

 

на

 

signal iSRL_DATA : std_logic_vector(15 downto 0) := x"0000"; (и сдвигающего региста не получаем)

 

поясните пожайлуста?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно сделать так:
    signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF";

боюсь, что такое понимает только XST

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

боюсь, что такое понимает только XST

 

Не бойтесь. Поясните, пожалуйста, почему Вы так считаете?

 

 

попробовал в Xilinx ISE 8.02.03 и синтезатор выдал следующее см вложения

(файл sys - c iSRL_DATA := x"FFFF"; файл sys_0000 - c iSRL_DATA := x"0000").

 

Все правильно. Вполне ожидаемый результат. Задумайтесь, что будет на выходе сдвигового регистра, если его инициализировать нулями в вдвигать в него нули? Думаю, что не ошибусь, если скажу про постоянное нулевое значение выхода в этом случае. Подобного же результата Вы можете добиться, если при инициализации в FFFF замените строку

iSRL_DATA <= iSRL_DATA(14 downto 0) & '0';

на

iSRL_DATA <= iSRL_DATA(14 downto 0) & '1';

 

Теперь вопрос :)

Почему появляются защелки, а их количество меняется при изменении строки

signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF";

на

signal iSRL_DATA : std_logic_vector(15 downto 0) := x"0000"; (и сдвигающего региста не получаем)

поясните пожайлуста?

 

Это результаты оптимизации. Ее суть и причины см. выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте более общий вариант:

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

entity sample_srl is
    Port (
        DIN     : IN    std_logic;
        CLK     : IN    std_logic;
        CE      : IN    std_logic;
        DOUT    : OUT   std_logic
    );
end sample_srl;

architecture Behavioral of sample_srl is
    signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF";
begin
    process( CLK )
    begin
        if rising_edge(CLK) then
            if CE='1' then
                iSRL_DATA <= iSRL_DATA(14 downto 0) & DIN;
            end if;
        end if;
    end process;

    DOUT <= iSRL_DATA(15);
end Behavioral;

И тогда все должно быть правильно с любым инициализирующим значением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И тогда все должно быть правильно с любым инициализирующим значением.

 

Нужно добавить, что в этом случае DIN не должен быть константой. Если DIN будет константным нулем или единицей, то мы снова вернемся к тому, с чего начали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно работает :) Спасибо ВСЕМ, за объяснение и готовую реализацию! :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF";

это работает только в симуляции, синтезатор игнорирует

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF";

это работает только в симуляции, синтезатор игнорирует

 

Очень странно. У меня XST из комплекта ISE 10.1 SP2 вполне нормально это переваривает:

post-904-1217611888_thumb.jpg

 

Какой у Вас синтезатор и как вы определили, что синтезатор игнорирует инициализацию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой у Вас синтезатор и как вы определили, что синтезатор игнорирует инициализацию?

 

Synplify

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как на VHDL в Xilinx-e инициализировать регистр на основе SRL.

Регистр описан не как компонент.

 

Можно не использовать указания синтезатору. базировать на том, что при инициализации FPGA все регистры устанавливаются в "00000000"

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

А чтобы данные правильно писать в такой регистр, и на входе в тех же разрядах поставить инверторы.

В Вашем случае это более чем уместно, потому как судя по rtl используется примитив с выходами на LUT на 15 разрядов и на выходе стоит еще один примитив уже триггера, что в сумме дает 16.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Synplify

 

Да, такой код в Synplify не дает сдвигового регистра на базе SRL. Тем не менее в результате синтеза получается сдвиговый регистр на базе FDE инициализированных заданным значением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно задать в виде INIT атрибута в UCF файле, но это как то криво.Я уже поднимал этот вопрос, касательно тригеров, там та же

ситуация. Никто не не смог сказать, как это сделать на VHDL, чтобы синтезировалось, хотя бы в виде атрибута, но в коде программы. Если необходимо проинициалировать внешнее устройство, было бы очень удобно - экономится куча триггеров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно задать в виде INIT атрибута в UCF файле, но это как то криво.Я уже поднимал этот вопрос, касательно тригеров, там та же

ситуация. Никто не не смог сказать, как это сделать на VHDL, чтобы синтезировалось, хотя бы в виде атрибута, но в коде программы. Если необходимо проинициалировать внешнее устройство, было бы очень удобно - экономится куча триггеров.

 

Ок. Используется Synplify 9.4. Вот пример кода:

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

entity dead_fdr is
    Port ( 
        DIN        : IN     std_logic_vector(15 downto 0);
        CLK     : IN    std_logic;
        CE      : IN    std_logic;
        DOUT    : OUT   std_logic_vector(15 downto 0)
    );
end dead_fdr;

architecture Behavioral of dead_fdr is
    signal iFDR : std_logic_vector(15 downto 0) := x"DEAD";
   
begin
    process( CLK )
    begin
        if rising_edge(CLK) then
            if CE='1' then
                iFDR <= DIN;
            end if;
        end if;
    end process;

    DOUT <= iFDR;
end Behavioral;

 

В репорте синтезатора находим следующую информацию:

Synplicity Xilinx Technology Mapper, Version 9.4.0, Build 086R, Built Jul 11 2008 20:49:49

Copyright © 1994-2008, Synplicity Inc. All Rights Reserved

Product Version Version 9.4

@N: MF249 |Running in 32-bit mode.

@N: MF257 |Gated clock conversion enabled

Reading Xilinx I/O pad type table from file <F:\Synplicity\fpga_94\lib\xilinx\x_io_tbl.txt>

Reading Xilinx Rocket I/O parameter type table from file <F:\Synplicity\fpga_94\lib\xilinx\gttype.txt>

@W: FX474 |User specified initial value found in some of the sequential elements in the design. Applying an initial value to a register may not deliver the best synthesis results. For example, registers with initial values may be preserved and retiming/pipelining may not be performed. To improve synthesis results you may want to remove the register initialization from the RTL code

 

@N|Applying Initial value "1101111010101101" on instance: iFDR[15:0]

@N: MT206 |Autoconstrain Mode is ON

Finished RTL optimizations (Time elapsed 0h:00m:01s; Memory used current: 94MB peak: 94MB)

 

Finished factoring (Time elapsed 0h:00m:01s; Memory used current: 94MB peak: 94MB)

 

Это сообщение полностью подтверждается в Technology View в Synplify, если заглянуть в Properties соответствующего триггера (атрибут INIT). Что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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