реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> память RAM и ROM, Работа с памятью
SolarGuy8
сообщение Oct 10 2017, 17:43
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 10-10-17
Пользователь №: 99 699



Нужно написать программу (на Verilog)или нарисовать схему (в Quartus), которая записывает значение в память RAM, а затем переносит это значение в память ROM и выводит его. Очень нужна ваша помощь!
Go to the top of the page
 
+Quote Post
iosifk
сообщение Oct 10 2017, 18:43
Сообщение #2


Гуру
******

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



Цитата(SolarGuy8 @ Oct 10 2017, 20:43) *
а затем переносит это значение в память ROM и выводит его.


Где должна находиться "программа", где RAM и где ROM?
А что такое по Вашему ROM и как туда "перенести"? Да, и кто кого "выводит"?

PS И вот это - "нужно"... Кому? Не мне точно...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
SolarGuy8
сообщение Oct 10 2017, 19:05
Сообщение #3





Группа: Участник
Сообщений: 6
Регистрация: 10-10-17
Пользователь №: 99 699



Цитата(iosifk @ Oct 10 2017, 21:43) *
Где должна находиться "программа", где RAM и где ROM?
А что такое по Вашему ROM и как туда "перенести"? Да, и кто кого "выводит"?

PS И вот это - "нужно"... Кому? Не мне точно...

Программа пишется в среде Quartus 2 на языке Verilog. ROM - это память, нужно сделать так, чтобы мы подавали значение в память RAM и это значение через блоки памяти переносилось в ROM. Мы в файле Verilog WafeForm выводит нашу полученную симуляцию. Вот и возник вопрос, как туда перенести?

Цитата(iosifk @ Oct 10 2017, 21:43) *
Где должна находиться "программа", где RAM и где ROM?
А что такое по Вашему ROM и как туда "перенести"? Да, и кто кого "выводит"?

PS И вот это - "нужно"... Кому? Не мне точно...

Один из вариантов, но здесь суммирование...
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
iosifk
сообщение Oct 10 2017, 19:27
Сообщение #4


Гуру
******

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



Цитата(SolarGuy8 @ Oct 10 2017, 22:05) *
Программа пишется в среде Quartus 2 на языке Verilog. ROM - это память, нужно сделать так, чтобы мы подавали значение в память RAM и это значение через блоки памяти переносилось в ROM. Мы в файле Verilog WafeForm выводит нашу полученную симуляцию. Вот и возник вопрос, как туда перенести?


Один из вариантов, но здесь суммирование...

Внимательно читайте буквы!
Как расшифровывается термин ROM? Как туда можно "перенести"?
"Программа пишется в среде.." И куда она потом девается?
Откуда берутся " мы подавали значение"?


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
SolarGuy8
сообщение Oct 10 2017, 19:56
Сообщение #5





Группа: Участник
Сообщений: 6
Регистрация: 10-10-17
Пользователь №: 99 699



Цитата(iosifk @ Oct 10 2017, 22:27) *
Внимательно читайте буквы!
Как расшифровывается термин ROM? Как туда можно "перенести"?
"Программа пишется в среде.." И куда она потом девается?
Откуда берутся " мы подавали значение"?

ROM - Read only memory. Просто пишем код или составляем схему и проводим ее симуляцию Эта программа - моя лабораторная работа. Значение подаем через файл verilog waveform.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Oct 10 2017, 20:07
Сообщение #6


Гуру
******

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



Цитата(SolarGuy8 @ Oct 10 2017, 22:56) *
ROM - Read only memory. Просто пишем код или составляем схему и проводим ее симуляцию Эта программа - моя лабораторная работа. Значение подаем через файл verilog waveform.

Так я и хочу услышать, как Вы в "Read only memory" на этапе симуляции что-то хотите "туда перенести"?


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
SolarGuy8
сообщение Oct 10 2017, 21:29
Сообщение #7





Группа: Участник
Сообщений: 6
Регистрация: 10-10-17
Пользователь №: 99 699



Цитата(iosifk @ Oct 10 2017, 23:07) *
Так я и хочу услышать, как Вы в "Read only memory" на этапе симуляции что-то хотите "туда перенести"?

Может неправильно что-то понял, но задание звучало так: из RAM в ROM перенести одно значение.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Oct 10 2017, 22:00
Сообщение #8


Гуру
******

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



Цитата(SolarGuy8 @ Oct 11 2017, 00:29) *
Может неправильно что-то понял, но задание звучало так: из RAM в ROM перенести одно значение.

Тогда надо сделать два шага.
1. Подойти к преподавателю и потребовать объяснений еще раз. А лучше письменно.
2. Любая лабораторная может быть выполнена только на том уровне знаний, которые уже получил студент. А потому в задании четко должно быть прописано, что "задано" и какими средствами это надо выполнить. Так что составьте для себя "задание", в котором четко обозначьте что и как "задано". А пока Ваша задача выглядит так: "жарьте ребята, масло подвезут..." После этого нарисуйте блок-схему того устройства, которое Вы хотите реализовать и обсудите это с преподавателем. И вот только после этого имеет смысл браться за верилог и квартус...

А что касается нас, то может так оказаться, что наша помощь не будет Вам полезна. Я бы сделал FSM и чтение-запись данных из файла, но возможно что Вы и не знаете что это такое.


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
predator
сообщение Oct 13 2017, 00:16
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 30-04-09
Из: Ростов-на-Дону
Пользователь №: 48 505



чтобы не плодить темы, попрошу помощи здесь:
имею Cyclon5, в нём генеренную двухпортовую ОЗУ на одном модуле m10k.
один порт для записи:
тактовая частота 60 МГц, пишется константа (докатился при урезании проекта), адрес по счетчику, записи единичные.
т.е. идея такая: клоки тикают стационарно, изредка приходит сигнал WR (по переднему фронту клока взводится на один такт), заставляет записать константу в ОЗУ, и тот-же WR перщелкивает счетчик адреса (для следующей записи).
второй порт для чтения, тактовая частота 44,25 МГц, читается по счетчику в цикле всё время (вот совсем всегда).
суть проблемы - примерно 20% записей не проходит, счетчик перещелкивает, а запись не проходит, суть не в соревновании счетчик-запись, входной адрес я формировал отдельно, да и бывает по несколько пропущенных записей подряд.
Go to the top of the page
 
+Quote Post
x736C
сообщение Oct 13 2017, 00:26
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 130
Регистрация: 3-03-06
Пользователь №: 14 942



Стоит поделиться кодом, чтобы можно было вам помочь. Так трудно сказать с уверенностью.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 13 2017, 06:33
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 222
Регистрация: 17-02-06
Пользователь №: 14 454



А какой режим 2 портовой памяти, как решается конфликт одновременного чтения-записи в один адрес?
Как проверяете, симулятор или железо?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Oct 13 2017, 08:09
Сообщение #12


Гуру
******

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



Цитата(Golikov A. @ Oct 13 2017, 09:33) *
А какой режим 2 портовой памяти, как решается конфликт одновременного чтения-записи в один адрес?

Для памяти должно использовать атрибуты, чтобы компилятор знал, что делать при одновременном обращении в одну и ту же ячейку:
Читать вперед
Писать вперед
Безразлично

Правильно ли выполнено CDC между двумя сторонами памяти. И Память д.б. двухклоковая...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
alexadmin
сообщение Oct 13 2017, 10:13
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965



Цитата(iosifk @ Oct 13 2017, 11:09) *
Для памяти должно использовать атрибуты, чтобы компилятор знал, что делать при одновременном обращении в одну и ту же ячейку:
Читать вперед
Писать вперед
Безразлично
Правильно ли выполнено CDC между двумя сторонами памяти. И Память д.б. двухклоковая...


Если память двухклоковая, то обращение из разных портов к одному адресу приводит к неопределенному результату. Вроде как запись гарантируется, а чтение - нет.
Go to the top of the page
 
+Quote Post
predator
сообщение Oct 13 2017, 10:15
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 30-04-09
Из: Ростов-на-Дону
Пользователь №: 48 505



Цитата(x736C @ Oct 13 2017, 04:26) *
Стоит поделиться кодом, чтобы можно было вам помочь. Так трудно сказать с уверенностью.

Код
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity mem_buf_kadr is
    port
        (
        -- in side
        DIN             : in     std_logic_vector (15 downto 0);
        WR             : in     std_logic;
        clk_in        : in std_logic;
        adr_str_in     : std_logic_vector (8 downto 0);
        --- out side
        clk_out        : in std_logic;
        DOUT             : out std_logic_vector (15 downto 0);
        adr_str_out    : in std_logic_vector (8 downto 0);
        adr_col_out    : in std_logic_vector (8 downto 0);
        -- debug
        deb_dat    : out std_logic_vector (7 downto 0)
        );
end mem_buf_kadr;

architecture mem_buf_kadr_a of mem_buf_kadr is
    -- signal
    
    signal ct_pix: std_logic_vector(8 downto 0):=(others=>'0');
    signal adr_col_in: std_logic_vector(8 downto 0):=(others=>'0');
    signal wrz,wr0,wr1,wr2: std_logic;
    signal DOUT0,DOUT1,DOUT2: std_logic_vector(15 downto 0):=(others=>'0');
    
    component block_ozu IS
    PORT
    (
        data            : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
        rdaddress    : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
        rdclock        : IN STD_LOGIC;
        wraddress    : IN STD_LOGIC_VECTOR (8 DOWNTO 0);
        wrclock        : IN STD_LOGIC  := '1';
        wren            : IN STD_LOGIC  := '0';
        q                : OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
    );
END component;

begin
    
u0:block_ozu
port map (
        
        rdaddress (8 downto 0)    =>adr_col_out,
        rdclock                        =>clk_out,
        q                                =>DOUT0,
        
        data                            => "0010000000000000",--DIN,
        wraddress(8 downto 0)    =>adr_col_in,
        wrclock                        =>clk_out,
        wren                            =>WR
        
        );
        
--u1:ram_kadr
--port map (
--        data            =>DIN,
--        rdaddress (8 downto 0)=>adr_col_out,
--        rdaddress (15 downto 9)=>adr_str_out(6 downto 0),
--        rdclock    =>clk_out,
--        
--        wraddress    (8 downto 0)=>adr_col_in,
--        wraddress    (15 downto 9)=>adr_str_in(6 downto 0),
--        wrclock        =>clk_out,
--        wren            =>WR1,
--        q                =>DOUT1
--        );

--u2:ram_kadr
--port map (
--        data            =>DIN,
--        rdaddress (8 downto 0)=>adr_col_out,
--        rdaddress (15 downto 9)=>adr_str_out(6 downto 0),
--        rdclock    =>clk_out,
--    
--        wraddress    (8 downto 0)=>adr_col_in,
--        wraddress    (15 downto 9)=>adr_str_in(6 downto 0),
--        wrclock        =>clk_out,
--        wren            =>WR2,
--        q                =>DOUT2
--        );


    process (clk_in)
    begin
        if (clk_in'event and clk_in='1') then
            if wr='1' then
                if ct_pix="101111111" then
                    ct_pix<=(others=>'0');
                else -- ct_pix="101111111"
                    ct_pix<=ct_pix+1;
                end if; -- ct_pix="101111111"
            end if; --wr=1
            --wrz<=wr;
        end if; --(clk'event and clk='1')
    end process;
    adr_col_in<=ct_pix;    

--wr0<=wr and (not adr_str_in(8)) and (not adr_str_in(7));
--wr1<=wr and (not adr_str_in(8)) and (adr_str_in(7));
--wr2<=wr and (adr_str_in(8)) and (not adr_str_in(7));

process (clk_out)
begin
  if (clk_out'event and clk_out='1') then
    if (adr_str_out(8 downto 7)="00") then
     DOUT<=DOUT0;
     elsif (adr_str_out(8 downto 7)="01") then
     DOUT<="0000000000000000";--DOUT1;
     else
     DOUT<="0000000000000000";--DOUT2;
     end if; -- adr_str_out
     end if; --clk
end process;
    
    deb_dat<=adr_col_in(8 downto 1);
            
end mem_buf_kadr_a;

проверяю в железе, в симуляторе всё красиво.
память двухклоковая, если верить датащиту Read first и write first вообще не существует, может быть параметр на тему что читать old data или Don’t Care, да и то такую настройку у генератора я не нашел...
P.S. первый раз с квартусом развлекаюсь, у меня 15.1
Go to the top of the page
 
+Quote Post
predator
сообщение Oct 13 2017, 16:37
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 30-04-09
Из: Ростов-на-Дону
Пользователь №: 48 505



перегенерил макрос с rden, вообще отключаю чтение на время прогрузки - не полегчало...

updt: я тормоз
вот это меня подвело и сутки в напряжении держало:
wrclock =>clk_out,


Сообщение отредактировал predator - Oct 13 2017, 16:58
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd October 2017 - 06:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01347 секунд с 7
ELECTRONIX ©2004-2016