_ANDREW 0 19 декабря, 2009 Опубликовано 19 декабря, 2009 · Жалоба здравствуйте. искал,но не нашёл как на vhdlнаписать модуль памяти с разной разрядностью входной и выходной шины данных. не понятно каким образом объявлять сигнал, если писать в него данные одной разрядности(допустим 8), а читать из него данные другой разрядности(допустим 1). знаю что можно сгенерировать такой модуль в coregenerator, но меня это не устраивает. надо на языке написать. зараннее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 19 декабря, 2009 Опубликовано 19 декабря, 2009 · Жалоба память должна быть двухпортовой, в первом порту шина 8 бит, во втором - 1. соответственно, шина адреса во втором порту на 3 разряда шире. пример двухпортовой памяти(шаблон из квартуса): library ieee; use ieee.std_logic_1164.all; entity true_dual_port_ram_single_clock is generic ( DATA_WIDTH : natural := 8; ADDR_WIDTH : natural := 6 ); port ( clk : in std_logic; addr_a : in natural range 0 to 2**ADDR_WIDTH - 1; addr_b : in natural range 0 to 2**ADDR_WIDTH - 1; data_a : in std_logic_vector((DATA_WIDTH-1) downto 0); data_b : in std_logic_vector((DATA_WIDTH-1) downto 0); we_a : in std_logic := '1'; we_b : in std_logic := '1'; q_a : out std_logic_vector((DATA_WIDTH -1) downto 0); q_b : out std_logic_vector((DATA_WIDTH -1) downto 0) ); end true_dual_port_ram_single_clock; architecture rtl of true_dual_port_ram_single_clock is -- Build a 2-D array type for the RAM subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0); type memory_t is array(addr_a'high downto 0) of word_t; -- Declare the RAM signal. signal ram : memory_t; begin -- Port A process(clk) begin if(rising_edge(clk)) then if(we_a = '1') then ram(addr_a) <= data_a; -- Read-during-write on the same port returns NEW data q_a <= data_a; else -- Read-during-write on the mixed port returns OLD data q_a <= ram(addr_a); end if; end if; end process; -- Port B process(clk) begin if(rising_edge(clk)) then if(we_b = '1') then ram(addr_b) <= data_b; -- Read-during-write on the same port returns NEW data q_b <= data_b; else -- Read-during-write on the mixed port returns OLD data q_b <= ram(addr_b); end if; end if; end process; end rtl; надо только на разные разрядности порты переделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 декабря, 2009 Опубликовано 19 декабря, 2009 · Жалоба искал,но не нашёл как на vhdlнаписать модуль памяти с разной разрядностью входной и выходной шины данных. не понятно каким образом объявлять сигнал, если писать в него данные одной разрядности(допустим 8), а читать из него данные другой разрядности(допустим 1). для моделирования легко, для синтеза никак. используйте различные генераторы памяти. надо только на разные разрядности порты переделать. попробуйте сами для начала ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 20 декабря, 2009 Опубликовано 20 декабря, 2009 · Жалоба попробуйте сами для начала ;) а в чем проблема? в этом, что ли? для моделирования легко, для синтеза никак. так о синтезе речи и не шло Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 декабря, 2009 Опубликовано 20 декабря, 2009 · Жалоба так о синтезе речи и не шло я конечно не телепат, но с вероятностью 99% следующий вопрос будет, почему при синтезе описанного модуля он занимает не 1 блок памяти, а N %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 20 декабря, 2009 Опубликовано 20 декабря, 2009 · Жалоба я конечно не телепат, но с вероятностью 99% следующий вопрос будет, почему при синтезе описанного модуля он занимает не 1 блок памяти, а N %) я тоже не телепат :laughing: но этот вопрос достаточно разжеван в разделах coding-style в справочниках по средам разработки, там же говорится и про генераторы памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 21 декабря, 2009 Опубликовано 21 декабря, 2009 · Жалоба я тоже не телепат :laughing: но этот вопрос достаточно разжеван в разделах coding-style в справочниках по средам разработки, там же говорится и про генераторы памяти. ткните носом в Quartus II Handbook Version 9.0 где описано coding-style на DWC память ? В Section II. Design Guidelines -> 6. Recommended HDL Coding Styles -> Inferring Memory Functions from HDL Code ни слова о DWC памяти. Может быть я что то упустил ? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 21 декабря, 2009 Опубликовано 21 декабря, 2009 · Жалоба ткните носом в Quartus II Handbook Version 9.0 где описано coding-style на DWC память ? В Section II. Design Guidelines -> 6. Recommended HDL Coding Styles -> Inferring Memory Functions from HDL Code ни слова о DWC памяти. Может быть я что то упустил ? :) уели :) читать надо не только в справочнике: http://www.alteraforum.com/forum/showthread.php?t=5695 там есть пример, написано почему может работать, а может и не работать(если ширины портов не согласованы). понравилась вот эта фраза As a point of note: Xilinx, synopsis and Mentor tools cant do it either. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 21 декабря, 2009 Опубликовано 21 декабря, 2009 · Жалоба уели :) читать надо не только в справочнике: http://www.alteraforum.com/forum/showthread.php?t=5695 там есть пример, написано почему может работать, а может и не работать(если ширины портов не согласованы). понравилась вот эта фраза я может быть не понимаю по английски, но пример приведен Tricky который отмечен как Altera Guru. И если я правильно понимаю его то 1. (this infers dual port ram fine when addr_a/b and data_a/q_b sizes match) : Код прекрасно инферит рам, кода параметры портов А/В совпадают, т.е. момент DWC тут опущен 2. This is the point, you cannot currently infer a memory with missmatched in/out port sizes. The code was one suggested way it "might" be done. The synthesiser would have to look at the behaviour around the code rather than the declarations, to infer the memory correctly. Еще одно подтверждение что этот DWC поведенческий код не может инферить DWC память при синтезе. 3. Когда martin.xrm приводит код не DWC памяти, как это сделали в своем посте вы, Tricky пишет That will never work - the mem_type stores 8 bit values, while data in is 64 bits wide. Насколько я могу судить, синтезируемого поведенческого кода который инферит память с использованием ее DWC возможностей, нет. О чем и говорит и Altera Guru и хендбук на софт от альтеры. И что является дальнейшим предметом обсуждения данной темы %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 21 декабря, 2009 Опубликовано 21 декабря, 2009 (изменено) · Жалоба пример приведен Tricky который отмечен как Altera Guru. И если я правильно понимаю его то Offtop: Когда-то, увидев на форуме Альтеры ответ на интересующий меня вопрос от человека, отмеченного как "Altera Teacher", я очень обрадовался - мол, представитель Альтеры, наконец-то я узнаю ответ. К сожалению, оказалось, что точного ответа он не знал, а лишь высказывал свои предположения, а надписи типа "Altera Teacher" оказались лишь форумными подписями. Изменено 21 декабря, 2009 пользователем des333 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 21 декабря, 2009 Опубликовано 21 декабря, 2009 · Жалоба Насколько я могу судить, синтезируемого поведенческого кода который инферит память с использованием ее DWC возможностей, нет. таки да. и в том примере, что в конце 2-й страницы, хотя и инферится в двухпортовую память, но с одинаковой разрядностью + еще и мультиплексоры. вот еще момент: The synthesiser would have to look at the behaviour around the code rather than the declarations, to infer the memory correctly. т.е. синтезатор в код даже не глядит, только на декларации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 21 декабря, 2009 Опубликовано 21 декабря, 2009 · Жалоба т.е. синтезатор в код даже не глядит, только на декларации? в контексте той темы, я бы перевел эту фразу так "синтезатору потребовалось бы больше смотреть на окружение, а не на декларацию памяти для ее инферирования". Ну или по колхозному не умеет синтезатор оценивать такие ситуации. Все что может это простые чтения/записи, а такие выверты нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kas 0 22 декабря, 2009 Опубликовано 22 декабря, 2009 · Жалоба entity ramNxM is generic( AddrWidht : integer := 4; DataWidht : integer := 2); port ( clk : in std_logic; we : in std_logic; AddrA : in std_logic_vector(AddrWidht-1 downto 0); DataIn : in std_logic_vector(DataWidht-1 downto 0); AddrB : in std_logic_vector(AddrWidht-1 downto 0); DataOutA : out std_logic_vector(DataWidht-1 downto 0); DataOutB : out std_logic_vector(DataWidht-1 downto 0) ); end ramNxM; architecture Behavioral of ramNxM is type ram_type is array ((2**AddrWidht - 1) downto 0) of std_logic_vector (DataWidht-1 downto 0); signal RAM : ram_type; begin process (clk) begin if rising_edge(Clk) then if we = '1' then RAM(conv_integer(AddrA)) <= DataIn; end if; end if; end process; DataOutA <= RAM(conv_integer(AddrA)); DataOutB <= RAM(conv_integer(AddrB)); end Behavioral; У меня такой код синтезируется в ISE'е. Память правда распределенная, но мне такую и надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться