Крюк 0 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба Как на VHDL в Xilinx-e инициализировать регистр на основе SRL. Регистр описан не как компонент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба Можно сделать так: 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 можно задать любое интересующее Вас значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба попробовал в 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"; (и сдвигающего региста не получаем) поясните пожайлуста? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ClockworkOrange 0 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба Можно сделать так: signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF"; боюсь, что такое понимает только XST Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба боюсь, что такое понимает только 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"; (и сдвигающего региста не получаем) поясните пожайлуста? Это результаты оптимизации. Ее суть и причины см. выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSV 0 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба Попробуйте более общий вариант: 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; И тогда все должно быть правильно с любым инициализирующим значением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба И тогда все должно быть правильно с любым инициализирующим значением. Нужно добавить, что в этом случае DIN не должен быть константой. Если DIN будет константным нулем или единицей, то мы снова вернемся к тому, с чего начали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба Действительно работает :) Спасибо ВСЕМ, за объяснение и готовую реализацию! :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Крюк 0 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF"; это работает только в симуляции, синтезатор игнорирует Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 1 августа, 2008 Опубликовано 1 августа, 2008 · Жалоба signal iSRL_DATA : std_logic_vector(15 downto 0) := x"FFFF"; это работает только в симуляции, синтезатор игнорирует Очень странно. У меня XST из комплекта ISE 10.1 SP2 вполне нормально это переваривает: Какой у Вас синтезатор и как вы определили, что синтезатор игнорирует инициализацию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Крюк 0 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Какой у Вас синтезатор и как вы определили, что синтезатор игнорирует инициализацию? Synplify Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Как на VHDL в Xilinx-e инициализировать регистр на основе SRL. Регистр описан не как компонент. Можно не использовать указания синтезатору. базировать на том, что при инициализации FPGA все регистры устанавливаются в "00000000" Тогда если на выходе регистра поставить инверторы (В тех разрядах, где надо), можно получить любое значение на выходе регистра по включению на любом синтезаторе. А чтобы данные правильно писать в такой регистр, и на входе в тех же разрядах поставить инверторы. В Вашем случае это более чем уместно, потому как судя по rtl используется примитив с выходами на LUT на 15 разрядов и на выходе стоит еще один примитив уже триггера, что в сумме дает 16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Synplify Да, такой код в Synplify не дает сдвигового регистра на базе SRL. Тем не менее в результате синтеза получается сдвиговый регистр на базе FDE инициализированных заданным значением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Крюк 0 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Можно задать в виде INIT атрибута в UCF файле, но это как то криво.Я уже поднимал этот вопрос, касательно тригеров, там та же ситуация. Никто не не смог сказать, как это сделать на VHDL, чтобы синтезировалось, хотя бы в виде атрибута, но в коде программы. Если необходимо проинициалировать внешнее устройство, было бы очень удобно - экономится куча триггеров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 218 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Можно задать в виде 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). Что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться