troll80 0 11 января, 2010 Опубликовано 11 января, 2010 · Жалоба Здравствуйте. вопрос. такой. (на уровне начинающего но ответа в поиске не нашел) есть 2 модуля. нужно объединить их в один. сделал так . //CELL KCKAM KCBK 'include "kckkm.v" 'include "ksbk.v" module CELL ( GCLK, _SRESET,_LERR,GOE, _GCLR,_SSEL,_SAS, _SBG, SPA, SPA18, BV_in,BVP_in0, PKK, NVU, _SBR, _CS, _PWR, _PRD, OEPSD, _U0SH, _PRSH,PRM, _SBRM, DB, DBP, SD, SDP, SRD, SSIZ, _SACK, A16, A, _S,ALE, _BHE,_RD, PZU, _GCLR, _RABK,_VBRK,_RVBK, _ADRK, _UPRK, _INFK, _BLKK, _DKK, _DK, L1, AP, RDY, _CSP, _OEP,RABA,VBRA,TRBA,ADRA,UPRA,INFA, DAK,DA,NVU0,RASK,INT,AD, //? tapa, y1raba, y0avi //-- OTJIADKA ) //--kcbk-- input GCLK,_SRESET; input _LERR,GOE; input _GCLR; input _SSEL; input _SAS; input _SBG; input [16:0] SPA; input SPA18; input [7:0] BV_in; input BVP_in0; input PKK; input [3:0] NVU; output _SBR; output [3:0] _CS; output _PWR; output _PRD; output OEPSD; output _U0SH; output _PRSH; output PRM; output _SBRM; inout [31:0] DB; inout [3:0] DBP; inout [31:0] SD; inout SDP; inout SRD; inout [2:0] SSIZ; inout [2:0] _SACK; //---------------KCKAM------- input A16; input [19:18] A; juf input [2:0] _S; input ALE; input _BHE; input _RD; input PZU; input _RABK; input _VBRK; input _RVBK; input _ADRK; input _UPRK; input _INFK; input _BLKK; input _DKK; input [7:0] _DK; output L1; output [15:0] AP; output RDY; output _CSP; output _OEP; output RABA; output VBRA; output TRBA; output ADRA; output UPRA; output INFA; output DAK; output [7:0] DA; output NVU0; output RASK; output INT ; output tapa; output y1raba; output y0avi; //-------------------connect module wire wABP; wire [14:0] wAB; wire wPBBV; wire wPKO; wire wKM; wire wFM; wire wZM; wire wRBM; wire wRES; wire wBV_in; wire wGCLK; wire [7:0] wBV; wire wBVP; wire wDRQ3; wire [3:0] wNVU; wire wERRA; //---------------input------------------ wire wAD; wire wSHA; wire wSHAK; wire wRABA; wire wVBRA; wire wADRA; wire wUPRA; wire wTRBA; wire wOTKA; wire wINFA; wire wDANA; wire wA16; wire wA; wire wS; wire wALE; wire wBHE; wire wRD; wire wBV_IP; wire wPZU; wire wGCLR; wire wAP; wire wL1; wire wINT; wire wSHK; wire wSHKK; wire wRABK; wire wRVBK; wire wVBRK; wire wADRK; wire wUPRK; wire wBLKK; wire wIZMK; wire wINFK; wire wDANK; wire wRDY; wire wCSP; wire wOEP; // wire wSRESET; wire wLERR; wire wGOE; wire wGCLR; wire wSSEL; wire wSAS; wire wSBG; wire [16:0] wSPA; wire wSPA18; wire [7:0] wBV_in; wire wPKK; wire wSBR; wire wABP; wire [3:0] wCS; wire wPWR; wire wPRD; wire wOEPSD; wire wU0SH; wire wABOZU; wire wPRSH; wire wPRM; wire wSBRM; wire [31:0] wDB; wire [3:0] wDBP; wire [31:0] wSD; wire wSDP; wire wSRD; wire [2:0] wSSIZ; wire [2:0] wSACK; // assign wGCLK = GCLK; assign wSRESET = _SRESET; assign wLERR = _LERR; assign wGOE = GOE; assign wGCLR = GCLR; assign wSSEL = _SSEL; assign wSAS = _SAS; assign wSBG = _SBG; assign wSPA[16:0]= SPA[16:0]; assign wSPA18 = SPA18; assign wBV_in[7:0] = BV_in[7:0]; assign wBVP_in0 = BVP_in0; assign wPKK = PKK; assign wNVU[3:0] = NVU[3:0]; assign wSBR = _SBR; assign wCS[3:0] = _CS[3:0]; assign wPWR = PWR; assign wPRD = _PRD; assign wOEPSD = OEPSD; assign wU0SH = U0SH; assign wPRSH = _PRSH; assign wPRM = PRM; assign wSBRM = _SBRM; assign wDB[31:0] = DB[31:0]; assign wDBP[3:0] = DBP[3:0]; assign wSD[31:0] = SD[31:0]; assign wSDP = SDP; assign wSRD = SRD; assign wSSIZ[2:0] = SSIZ[2:0]; assign wSACK[2:0] = _SACK[2:0]; assign wA16 = A16; assign wA[19:20] = A[19:20]; assign wS[2:0] = _S[2:0]; assign wALE = ALE; assign wBHE = _BHE; assign wRD = _RD; assign wPZU = PZU; assign wRABK = _RABK; assign wVBRK =_VBRK; assign wADRK = _ADRK; assign wUPRK = _UPRK; assign wINFK = _BLKK; assign wDKK = _DKK; assign wDK[7:0] = _DK[7:0]; assign wL1 = L1; assign wAP[15:0] = _AP[15:0]; assign wRDY = RDY; assign wCSP = _CSP; assign wOEP = _OEP; assign wRABA = RABA; assign wVBRA = VBRA; assign wTRBA = TRBA; assign wADRA = ADRA; assign wUPRA = UPRA; assign wINFA = INFA; assign wDAK = DAK; assign wDA[7:0] = DA[7:0]; assign wNVU0 = NVU0; assign wRASK =RASK; assign wINT = INT; assign wTapa = tapa; assign wy1raba = y1raba; assign wy0avi = y0avi; kckam module_kskkm( .ABP(wABP), .AB(wAB), .PBBV(wPBBV), .PKO(wPKO), .KM(wKM), .FM(wFM), .ZM(wZM), .RBM(wRBM), .AD(wAD), .RES(wRES), .BV_IN(wBV_IN), ._SHA(wSHA), . _SHAK(wSHAK), ._RABA(wRABA), . _VBRA(wVBRA), ._ADRA(wADRA), ._UPRA(wUPRA), ._TRBA(wTRBA), ._OTKA(wOTKA), ._INFA(wINFA), . _DANA(wDANA), .A16(wA16), .A(wA), ._S(wS), .ALE(wALE), ._BHE(wBHE), ._RD(wRD), .BV_IP(wBV_IP), .PZU(wPZU), .GCLK(GCLK)), ._GCLR(), .AP(wAP), .L1(wL1), .BV(wBV), .BVP(wBVP), ._DRQ3(wDRQ3), .NVU(wNVU), .INT(wINT), .SHK(wSHK), .SHKK(wSHKK), .RABK(wRABK), .RVBK(wRVBK), .VBRK(wVBRK), .ADRK(wADRK), .UPRK(wUPRK), .BLKK(wBLKK), .IZMK(wIZMK), .INFK(wINFK), .DANK(wDANK), .RDY(wRDY), ._CSP(wCSP), ._OEP(wOEP), .ERRA(wERRA) ); kcbkm module_kcbk( .GCLK(GCLK), ._SRESET (_SRESET), ._LERR (_LERR), .GOE (GOE), ._GCLR (GCLR), ._SSEL (SSEL), ._SAS (SAS), ._SBG (_SBG), .SPA (SPA), .SPA18 (wSPA18), .ZM (wZM), .FM (wFM), .BV_in (wBV_in[7:0]), .BVP_in0 (wBVP_in), .ERRA (wERRA), .NVU (wNVU[3:0]), ._DRQ3 (wDRQ), .PKK (wPKK), .BV (wBV[7:0]), .BVP0 (wBVP), ._SBR (wSBR), .ABP (wABP[1:0]), .AB (wAB[14:0]), ._CS (wCS[3:0]), ._PWR (wPWR), ._PRD (wPRD), .OEPSD (wOEPSD), ._U0SH (wU0SH), .KM (wKM), .RBM (wRBM), .PBBV (wPBBV), .RES (wRES), .PKO (wPKO), .ABOZU (wABOZU), ._PRSH (wPRSH), .PRM (wPRM), ._SBRM (wSBRM), .DB (wDB[31:0]), .DBP (wDBP[3:0]), .SD (wSD[31:0]), .SDP (wSDP), .SRD (wSRD), .SSIZ (wSSIZ[2:0]), ._SACK (wSACK[2:0]) ); endmodule вообще это так правильно? я до этого не приходилось объединять. спасиб. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 1 11 января, 2010 Опубликовано 11 января, 2010 · Жалоба Код работает? Вроде должен, если типы вход/выход правильно согласованы. В чём собственно вопрос? И ещё, по моему незачем вросать сюда без надобности "простыни" кода, который не несёт нагрузки, сделали-бы пару маленьких модулей, которые поясняют суть вопроса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
troll80 0 11 января, 2010 Опубликовано 11 января, 2010 · Жалоба нет. не работает. вот в чем вопрос то. как объединяются модули то? я сделал так. 1) включил модули инклудом 'include "module_1" 'include "module_2" 2) обьявил модуль. 3) внутри его прописал соединительные провода. 4) ими же и соединил эти модули 5) все модули соединяются внутри какого то глобального модуля? или как-то иначе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Builder 1 11 января, 2010 Опубликовано 11 января, 2010 · Жалоба нет. не работает. вот в чем вопрос то. как объединяются модули то? я сделал так. 1) включил модули инклудом 'include "module_1" 'include "module_2" 2) обьявил модуль. 3) внутри его прописал соединительные провода. 4) ими же и соединил эти модули 5) все модули соединяются внутри какого то глобального модуля? или как-то иначе? п1. не нужен. Извините конечно, а Вы не пробовали смотреть какую документацию, или на худой конец, пример каких исходников, которых в инете много? Да и вместе с софтом идут примеры. Нашёл за 2 мин, сделайте как там: http://www.altera.com/support/examples/verilog/ver_hier.html Попробуйте сделать как там, напишите что именно не получается, если не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
troll80 0 11 января, 2010 Опубликовано 11 января, 2010 · Жалоба Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
at89c51ed2 0 7 февраля, 2010 Опубликовано 7 февраля, 2010 · Жалоба Доброго времени суток, уважаемые форумчане! Вопрос несколько не по этой теме, но плодить из за этого новую тему не хочется. Вопрос по Verilog, касательно описания счётчиков. Только начал изучать, это мой первый проект на V. Почитал XST, сделал 28 разрядный счётчик, что бы на "ките" (S3esk) светодиодами мигать. Насмотревшись на ЛЕДы, решил пойти дальше - сделать предделитель частоты и делитель частоты с переменным коэффициентом деления. С принципом работы схемы вопросов нет, могу синтезировать вручную, думаю, получилось бы без особых проблем в схематике, но надо изчать V. Поэтому, первая затычка, которая встала передо мной - как передать сигнал из предыдущего счётчика на клок последующего. Есть ли разница - комбинационный это сигнал (сигнал переполнения или другой терм) или выход последнего триггера. С точки зрения коэффициента деления предделителя это неважно, вопрос в описании этого сигнала. Сейчас коэффициент предделителя 800 (или 801 потом разберусь). Пробовал напрямую вставлять выход последнего разряда: always @(posedge div[9] or posedge RES) , не получилось, через assign, wire, buf пока не получается :laughing: . Думаю, должен быть какой то специальный механизм передачи клока. Может ли быть тактовый сигнал, полученный внутри ПЛИС, глобальным? Или только внешние сигналы? Привожу свой код, сразу говорю - он НЕ РАБОЧИЙ :crying: ! module cnt28 (CLK, RES, LED); input CLK, RES; output [7:0] LED; reg [17:0] tmp; reg [9:0] div; //wire clk_div; always @(posedge CLK or posedge RES) begin if (RES) div <= 10'b0; else if(div == 3'd800) div <= 10'b0; else div <= div + 1'b1; end //buf(clk_div, div[9]); always @(posedge div[9] or posedge RES) begin if (RES) tmp <= 18'b0; else tmp <= tmp - 1'b1; end assign LED = tmp[17:10]; endmodule По отдельности то счётчики скорее всего рабочие. Возможно тут написана полная ересь, я пока не знаю почти ничего. Можно ли вообще в один module включать процессы с разными частотами, т.е. в одном module иметь несколько always? Или необходимо делать иерархию с передачей параметров (сигналов)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 7 февраля, 2010 Опубликовано 7 февраля, 2010 · Жалоба at89c51ed2: У Вас в строке if(div == 3'd800) ошибка. Вам необходимо 10 бит, а Вы указали разрядность = 3. Смените на if(div == 10'd800) и все будет работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
at89c51ed2 0 7 февраля, 2010 Опубликовано 7 февраля, 2010 · Жалоба 2 des333 Большое спасибо за замечания :a14: . Я б сам долго тупил :01: . Даже после замечания я некоторое время был уверен, что прав: "трёхразрядное двоичное число, вот же написано 3'd800!!!" Потом только допёрло, что напиисано d, а не b и в бинари не бывает 8!!! За весь день воскресенья уже глаз не то что замылися, вообще стал слеп. Сначала это не помогло, хотя ошибка была однозначно! Присмотревшись к ошибкам, одной из которых было, что то типа: "top-level file was not found" я очистил все временные файлы проекта, закрыл ИСИ. После открытия ИСИ всё заработало :08:. Собираюсь поанализировать рапорт-файлы. Всё же мне интересно, этот сигнал div[9] как попадает на clk триггеров - через шину межсоединений или по глобальным цепям (может я что то неправильно назвал, но думаю, вопрос ясен)? Теперь буду думать как приделать синхронную загрузку в счётчик для изменения коэффициента пересчёта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 8 февраля, 2010 Опубликовано 8 февраля, 2010 · Жалоба Всё же мне интересно, этот сигнал div[9] как попадает на clk триггеров - через шину межсоединений или по глобальным цепям (может я что то неправильно назвал, но думаю, вопрос ясен)? Теперь буду думать как приделать синхронную загрузку в счётчик для изменения коэффициента пересчёта. Сам сигнал div[9] формируется с задержкой относительно clk, а потом любом случае сначала пройдет по общим межсоединениям, даже если потом попадет на глобальную шину. Поэтому у него будет в момент поступления на триггеры немаленький перекос (причем опоздание) относительно clk. Это перспектива получить нарушение clock hold, если триггер-источник работает по clk, а триггер-приемник по div[9]. Поэтому хорошим тоном для ПЛИС было бы использовать сигнал от счетчика div, как enable, а не как ТИ. Если схему можно сделать на одном ТИ, лучше сделать так. assign ena = (div == DIVISOR_COEF); always @(posedge clk or negedge reset) begin if (!reset) ... else if (ena) begin ... end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
at89c51ed2 0 8 февраля, 2010 Опубликовано 8 февраля, 2010 · Жалоба 2 Sergey'F Спасибо за ответ :a14: ! Да, я понимаю, что будет задержка на выходе синхронного счётчика относительно клока. Тут такая ситуация. Я сейчас работаю с "китом", там 50 МГц. Мне столько не нужно, вот я и хочу сделать предделитель, от которого потом получать синхронные последовательности и ещё с регулируемой длительностью импульса. Эта одновременно и учебная задача (всё таки это первый мой проект на V), но и некоторая подготовка к написанию этого узла уже в составе большего проекта. Есть понимание, как строить схему на бумаге, в примитивах и даже в схематике, но надо учить V :01: . Есть возможность посмотреть на этот формирователь "в железе" с устройством, которым он будет управлять, да и босу надо уже хоть что показать, кроме мигающих ледов и заствки на ЖКИ! Он хоть и понимает, что только учусь, но терпенье его не безгранично :maniac: ! В дальнейшем, когда определюсь с частотой общего (главного, системного и т.д.) клока, тогда уже окончательно буду делать, как Вы и советуете - с одним глобальным клоком на весь девайс и формрованием сигналов разрешения счёта. Пока не ясно, чем отличается сигнал СЕ (count enable) от ClE(clock enable). Видел, что последний просто реализуется как gate (and или or) с сигналом clk. А разве глобальные сигналы позволяют производить с собой такое? И не является ли это плохим стилем, в том смысле, что "натягивается" комбинаторика на сигнал клока? Получается интересная вещь - если я могу посадить всё на один клок, то тогда всё описание схемы уберётся под один always!? Это хороший стиль (если такое возможно) или лучше каждое устройство описывать под своим always? А в Вашем коде действительно будет коэффициент пересчёта счётчика DIVISOR_COEF или DIVISOR_COEF+1? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 10 февраля, 2010 Опубликовано 10 февраля, 2010 · Жалоба Попробуйте поискать мой "Краткий Курс HDL"... Вопросов станет меньше. Где лежит - не пишу, чтобы нервных не беспокоить... Но думаю, что поисковиком "родину" найдете. Там еще много чего для Вас найдется... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 10 февраля, 2010 Опубликовано 10 февраля, 2010 · Жалоба Попробуйте поискать мой "Краткий Курс HDL"... Присоединяюсь. Пока не ясно, чем отличается сигнал СЕ (count enable) от ClE(clock enable). Видел, что последний просто реализуется как gate (and или or) с сигналом clk. Где Вы это видели??? Да, это плохой стиль. Глобальные сигналы позволяют производить такое в большинстве современных семейств, но без осознанной необходимости так делать не стоит. Когда осознаете, зачем это надо, тогда сможете сделать правильно. :) Пока Вам это не надо, поверьте. По поводу enable. По идее, clock enable подается на входы разрешения триггеров и управляет разрешением всех синхронных действий, а count enable управляет разрешением счета, но не запрещает другие синхронные действия, например, сброс. И если аппаратно clock enable вполне напрямую транслируется в архитектуре ПЛИС на соответствующие входы триггеров, то count enable - это просто один из входных сигналов в логику расчета нового значения счетчика, наряду с его текущим состоянием. Получается интересная вещь - если я могу посадить всё на один клок, то тогда всё описание схемы уберётся под один always!? Если так получится, значит, Вы все сделали... ну по крайней мере, намного правильнее, чем сейчас. Но с точки зрения читаемости и красоты оформления кода... вы сами себе уже ответили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
at89c51ed2 0 10 февраля, 2010 Опубликовано 10 февраля, 2010 · Жалоба Спаибо всем за ответы. 2 iosifk Звонил в редакцию журнала, говорят все диски кончились, если ещё и будут, то не раньше лета. предложил им "оплатить штраф на месте", ну, извините взятку дать и залить на болванку, так говорят у самих нету ни одного образца :laughing: ! Так что пока поиски не увечались успехом. 2 Sergey'F По поводу Clock Enable это я ложанулся :cranky: . Видимо в 3 часа ночи почитывая XST, перепутал конструкцию из VHDL "C'event and C='1'", с V. Вот мне и показалось, что клок енабле так и реализуется :laughing: . Сейчас хлопалки разресничил :07: , действительно нет ничего: Following is the Verilog code for a 4-bit unsigned Up counter with asynchronous clear and clock enable. always @(posedge C or posedge CLR) begin if (CLR) tmp = 4'b0000; else if (CE) tmp = tmp + 1'b1; end assign Q = tmp; endmodule Видимо, Clock Enable и Count Enable в тексте программы особо не отличишь, а отличаются они только своим положением в какой либо ветви конструкции if-else, что приводит к разному их действию - т.е. как Вы и писали - Clock Enable должен заблокировать все синхонные операции, а Count Enable только счёт. Мне пока не ясно, чем отличается asynchronous clear от asynchronous reset? Для первого есть V-реализация, для второго в XST пишут следующее: "There is no equivalent Verilog code. No constraints are available.". По поводу always уже где то здесь прочитал - лучше описывать каждое устройство (счётчик, регистр сдвига или даже Т-триггер, если он нужен как функциональное устройство - делитель на 2 для получения меандра например) под своим always. Так действительно читабельнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 февраля, 2010 Опубликовано 18 февраля, 2010 · Жалоба Если позволите, вопрос по теме: В Quartus 9.0 пытаюсь использовать counter.v, скачанный с сайта Altera. Сам по себе работает, естественно. Но когда хочу завернуть в свой модуль, и вывести, например, только несколько выходов счетчика наружу, то или ошибки лезут, или выводятся все выходы. Наверное, я какой-то мелочи не знаю. module Library(input CLKIN, input ENABLE, output[3:0] CLKOUT); wire [7:4] ClkTmp; Counter (.clk(CLKIN), .reset(0), .ena(ENABLE), .result(ClkTmp)); assign CLKOUT = ClkTmp[7:4]; endmodule module counter ( clk, reset, result, ena ); input clk; input reset; input ena; output [7:0] result; reg [7:0] result; always @(posedge clk or posedge reset) begin if (reset) result = 0; else if (ena) result = result + 1; end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 18 февраля, 2010 Опубликовано 18 февраля, 2010 · Жалоба На первый взгляд: wire [7:0] ClkTmp; counter my_counter(.clk(CLKIN), .reset(0), .ena(ENABLE), .result(ClkTmp)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться