tomas111 0 23 августа, 2014 Опубликовано 23 августа, 2014 · Жалоба Доброго дня, пишу код точнее перевожу разбираюсь в нем:) По сколько больше нравится мне Verilog пишу на нем. Но код программы на VHDL. Мне не понятны чем можно заменить loop for process ? Судя по всему process можно описать через always или generate. А вот loop и for? Искал схемное изображение что делает, не нашёл :(( Подскажи где можно почитать или пример кода со схематикой. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 августа, 2014 Опубликовано 23 августа, 2014 · Жалоба в верилоге есть просто for циклы в описании ничто иное как просто сокращенная запись. Оговорюсь в той части что синтезируется. то есть for(i=0;i<3;i=i+1) a <= i; равносильно a[0] <= 0; a[1] <= 1; a[2] <= 2; потому как бы и нет схемного выражения, потому что оно меняется в зависимости от того что внутри... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tomas111 0 23 августа, 2014 Опубликовано 23 августа, 2014 · Жалоба Спасибо, а что делать с loop ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 24 августа, 2014 Опубликовано 24 августа, 2014 · Жалоба полупать на него глазами%) и забыть в VHDL for loop, в verilog просто for в верилоге есть еще цикл while и repeat. Но они больше для симуляции чем для синтеза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tomas111 0 24 августа, 2014 Опубликовано 24 августа, 2014 · Жалоба Golikov A. спасибо! Очень помог :)) Допустим такой код: process (сигналы) begin for i in Reg'Range loop pr(i):=(others=>'0'); Res(i):=(others=>'0'); end loop; Reg_res(0)(7 downto 0):=CONV_STD_LOGIC_VECTOR(r_ID,5)&Version; res(1)(7 downto 0):=CONV_STD_LOGIC_VECTOR(D_ID,8); res(2)(7):='1'; pr(2)(4 downto 0):=(others=>'1'); alt_addr<=Reg(2)(4 downto 0); pr(2)(15):='1'; ts_res<=Reg(2)(15); res(2)(14):=ts_err; endprocess С for понятно, а все остальное ? Это можно описать через always или лучше через Generate ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба generate - это создание схем меняющихся по ходу создания. к примеру вы хотите сделать схему которая в параллель перемножает 2 массива чисел. Делаете блок умножителя, и каждый элемент массива шлете на умножитель. Так вот длину массива в этом случае лучше сделать параметром, и получается что вы не можете точно сказать сколько надо умножителей, число зависит от параметра. можно сделать с запасом, а можно по уму создавать столько сколько нужно, вот для этого как раз и нужен генерайте. Он как бы обозначает "нечеткие" или "изменчивые" места. Надеюсь ничего не напутал и не запутал. Может кто получше сможет объяснить. В остальном аналогом process VHDL является скорее always. теперь что делает ваш код 1. он нулит вектора pr(i) = .... Res(i) = .... ... надеюсь res и Res это опечатка... далее он задает какие то значения. Вы опустили какие сигналы у вас под процессом, но складывается впечатление что все значения принимаемые сигналами - константы. Данный кусок кода можно описать и через генерайте, и через просто assign сигналов. А зачем вы сравниваете языки? оба языка обладают достаточными средствами для решения множества задач. Правильнее исходит из того что хотите, а не чем они похожи... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 41 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба generate - это создание схем меняющихся по ходу создания. :blink: А Вы чаcом не попутали generate c generic ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tomas111 0 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба Нет не путаю, просто смотрю, что мне по душе больше. Да сходства есть но есть и различия. Как только я не пробывал не получается у меня его синтаксис на верилог перекинуть у меня проблема в том что в блоке always я не знаю как описывать.... без assign ведь нельзя? И просто в строчку тоже .... Тогда как ? Спасибо. Судя по всему generate довольно сложный блок и поэтому про него так мало везде написано :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба А Вы чаcом не попутали generate c generic стараюсь не путать, но вполне допускаю что могу. А может не могу словами объяснить что хочу. Если вам не трудно опишите вы что есть generate, оно всем полезно будет. Как только я не пробывал не получается у меня его синтаксис на верилог перекинуть надо не менять слова одного языка на такие же по смыслу от другого языка, а надо исходить из того что надо чтобы этот блок делал. Начните с того что он должен делать, и тогда станет понятно как его описать и как преобразовать%)... я вижу в вашем блоке какое то могучее присвоение констант и ничего более, то есть в случае verilog это может быть и простой assign, и always(*) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба Судя по всему generate довольно сложный блок и поэтому про него так мало везде написано :) generate (verilog) как раз довольно простой блок. Он просто в цикле генерирует код, повторяя его сколько-то раз с разным значением какой-то переменной, которая обычно при этом выступает в качестве каких-то параметров (индексов массивов, т.п.). Надо например Вам описать 32 I/O ячейки, указывая для каждой в виде технологических ячеек I/O блоки и триггеры - можете 32 раза сделать copy/paste, а можете - цикл generate на 32 итерации. Блок always внутри блока generate - это все равно, что сделать сколько-то отдельных блоков always. В общем, блок generate обеспечивает генерацию кода методом повторения (как бы тупого копирования текста) сколько-то раз какого-то куска кода с подстановкой изменяющегося параметра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба получается любой конечный цикл может быть записан через generate? Ведь циклы тоже по сути сокращение записи... никогда generate так не использовал, забавно... я всегда думал что generate (название) образовано от начального создания, а не от генерации кода, забавно.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба получается любой конечный цикл может быть записан через generate? Ведь циклы тоже по сути сокращение записи... никогда generate так не использовал, забавно... я всегда думал что generate (название) образовано от начального создания, а не от генерации кода, забавно.... А как же Вы тогда его использовали:)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба в начале схемы создавал блоки, инстансы если их переменное число или много, подключал сигналы... никогда не смотрел на этот процесс как на мультиплицирование кода, и уж точно никогда не заменял им циклы for. Это просто наблюдение... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба Как-то не представляю применение for вне generate? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 августа, 2014 Опубликовано 26 августа, 2014 · Жалоба //инициализируем массив регистров initial begin for(i = 0;i < INTERNAL_REG_COUNT - PREDEFINED_REG_COUNT; i = i + 1) InternalRegs[i] = 0; end или //------------------------------------------ //адреса напрямую выбирают регистр из массива, //предопределенные регистры не из массива и //регистр FSM_STATE с защитой от записи //обрабатываются ниже for(i = 0; i < INTERNAL_REG_COUNT - PREDEFINED_REG_COUNT - 1; i = i + 1) begin if((HaveDataToExchange == 1'b1) && (ReadWriteRegAddr == GetReadAddres(i[INTERFACE_REG_ADDR_SIZE - 2 : 0]))) //чтение begin DataFromReg <= InternalRegs[i]; HaveDataFromReg <= 1'b1; //ставим флаг что есть данные end if((HaveDataToExchange == 1'b1) && (ReadWriteRegAddr == GetWriteAddres(i[INTERFACE_REG_ADDR_SIZE - 2 : 0]))) //запись begin InternalRegs[i] <= DataToReg; DataToRegWasStored <= 1'b1; //ставим флаг что данные записаны end end внутри всех конечных автоматов и прочее у меня обычные for без генерайтов... generate я использую так genvar Param; generate //определяем элементы ФИФО для каждого мотора for (Param=0; Param < MOTOR_COUNT; Param = Param + 1) begin: Fifo FIFOModule FIFOinst ( .clk(clk_pin), .srst(reset), .din(data_in[((Param + 1) * PATH_DATA_SIZE - 1) -: PATH_DATA_SIZE]), .wr_en(fifo_wr_strb_ack [Param]), .rd_en(fifo_rd_strb [Param]), .dout(path_data[Param]), .full(fifo_full[Param]), .empty(fifo_no_data [Param]), .data_count(fifo_data_counter[Param]) ); end endgenerate Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться