Перейти к содержанию
    

Verilog. объединить 2 модуля

Здравствуйте. вопрос. такой. (на уровне начинающего но ответа в поиске не нашел)

есть 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

вообще это так правильно? я до этого не приходилось объединять.

спасиб.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код работает? Вроде должен, если типы вход/выход правильно согласованы.

В чём собственно вопрос?

И ещё, по моему незачем вросать сюда без надобности "простыни" кода, который не несёт нагрузки, сделали-бы пару маленьких модулей, которые поясняют суть вопроса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет. не работает. вот в чем вопрос то. как объединяются модули то?

я сделал так.

1) включил модули инклудом

'include "module_1"

'include "module_2"

2) обьявил модуль.

3) внутри его прописал соединительные провода.

4) ими же и соединил эти модули

5) все

модули соединяются внутри какого то глобального модуля? или как-то иначе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет. не работает. вот в чем вопрос то. как объединяются модули то?

я сделал так.

1) включил модули инклудом

'include "module_1"

'include "module_2"

2) обьявил модуль.

3) внутри его прописал соединительные провода.

4) ими же и соединил эти модули

5) все

модули соединяются внутри какого то глобального модуля? или как-то иначе?

п1. не нужен.

 

Извините конечно, а Вы не пробовали смотреть какую документацию, или на худой конец, пример каких исходников, которых в инете много? Да и вместе с софтом идут примеры.

Нашёл за 2 мин, сделайте как там: http://www.altera.com/support/examples/verilog/ver_hier.html

Попробуйте сделать как там, напишите что именно не получается, если не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток, уважаемые форумчане!

Вопрос несколько не по этой теме, но плодить из за этого новую тему не хочется. Вопрос по 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? Или необходимо делать иерархию с передачей параметров (сигналов)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

at89c51ed2:

 

У Вас в строке

if(div == 3'd800)

ошибка.

 

Вам необходимо 10 бит, а Вы указали разрядность = 3.

 

Смените на

if(div == 10'd800)

и все будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 des333

Большое спасибо за замечания :a14: . Я б сам долго тупил :01: . Даже после замечания я некоторое время был уверен, что прав: "трёхразрядное двоичное число, вот же написано 3'd800!!!" Потом только допёрло, что напиисано d, а не b и в бинари не бывает 8!!! За весь день воскресенья уже глаз не то что замылися, вообще стал слеп. Сначала это не помогло, хотя ошибка была однозначно! Присмотревшись к ошибкам, одной из которых было, что то типа: "top-level file was not found" я очистил все временные файлы проекта, закрыл ИСИ. После открытия ИСИ всё заработало :08:. Собираюсь поанализировать рапорт-файлы. Всё же мне интересно, этот сигнал div[9] как попадает на clk триггеров - через шину межсоединений или по глобальным цепям (может я что то неправильно назвал, но думаю, вопрос ясен)? Теперь буду думать как приделать синхронную загрузку в счётчик для изменения коэффициента пересчёта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё же мне интересно, этот сигнал 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте поискать мой "Краткий Курс HDL"...

Вопросов станет меньше.

Где лежит - не пишу, чтобы нервных не беспокоить... Но думаю, что поисковиком "родину" найдете. Там еще много чего для Вас найдется...

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте поискать мой "Краткий Курс HDL"...

Присоединяюсь.

 

Пока не ясно, чем отличается сигнал СЕ (count enable) от ClE(clock enable). Видел, что последний просто реализуется как gate (and или or) с сигналом clk.

Где Вы это видели??? Да, это плохой стиль. Глобальные сигналы позволяют производить такое в большинстве современных семейств, но без осознанной необходимости так делать не стоит. Когда осознаете, зачем это надо, тогда сможете сделать правильно. :) Пока Вам это не надо, поверьте.

 

По поводу enable. По идее, clock enable подается на входы разрешения триггеров и управляет разрешением всех синхронных действий, а count enable управляет разрешением счета, но не запрещает другие синхронные действия, например, сброс. И если аппаратно clock enable вполне напрямую транслируется в архитектуре ПЛИС на соответствующие входы триггеров, то count enable - это просто один из входных сигналов в логику расчета нового значения счетчика, наряду с его текущим состоянием.

 

Получается интересная вещь - если я могу посадить всё на один клок, то тогда всё описание схемы уберётся под один always!?

Если так получится, значит, Вы все сделали... ну по крайней мере, намного правильнее, чем сейчас. Но с точки зрения читаемости и красоты оформления кода... вы сами себе уже ответили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спаибо всем за ответы.

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. Так действительно читабельнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если позволите, вопрос по теме:

В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На первый взгляд:

wire [7:0] ClkTmp;
counter my_counter(.clk(CLKIN), .reset(0), .ena(ENABLE), .result(ClkTmp));

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...