Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить

помогите с VERILOG

Сб сен 06, 2014 15:59:39

Добрый день коты. Выписал из книги строчку генератора. на непрерывном цикле forever. А компилятор чего то матерится.

Код:
module gen (output reg aa)
 initial forever begin aa=0; #50; aa=1; #50; end
endmodule

Error (10170): Verilog HDL syntax error at gen.v(2) near text "initial"; expecting ";"

где я точку с запятой не воткнул?

Re: помогите с VERILOG

Сб сен 06, 2014 21:52:12

Запрос в google: initial forever verilog
Ответ :http://www.asic-world.com/verilog/vbehave3.html

Re: помогите с VERILOG

Вс сен 07, 2014 00:30:49

Ну вот, скопировал от того сайта строчку, и получил по лещам.

Код:
  module forever_example (output reg clk);
     
  initial begin
      #1  clk = 0;
     forever begin
        #5  clk =  ! clk;
     end
  end
 
  initial begin
    $monitor ("Time = %d  clk = %b",$time, clk);
     #100  $finish;
  end
 
 endmodule



Error (10119): Verilog HDL Loop Statement error at gen.v(6): loop with non-constant loop condition must terminate within 250 iterations

Вот такая ошибка на цикл repeat: Error: Can't synthesize current design -- design does not contain any logic

Re: помогите с VERILOG

Вс сен 07, 2014 12:15:23

Вот так компилируется:
Спойлер
Код:
module forever_example (output reg clk);
     
  initial begin
      #1  clk = 0;
//     forever begin
//        #5  clk =  ! clk;
//     end
  end

always  #5  clk =  ! clk;
 
  initial begin
    $monitor ("Time = %d  clk = %b",$time, clk);
     #100  $finish;
  end
 
 endmodule


Почему forever не катит, не знаю. Надо спецов спрашивать, а я тестбенчи ни разу не использовал и не писАл.

Re: помогите с VERILOG

Вс сен 07, 2014 15:27:38

Да ладно с ним, написал счетчик делитель от гена на 48 мгц, и помигал светодиодами. :) правда это заняло 78 вентилей.
Спойлер
Код:
module repeat_example(clk, led);
   
   input clk;
   output led;
   
 reg[26:0] longcnt;
 reg [15:0] led;
 parameter delay_max = 20000000;
 parameter led_max = 65535;
 
 always @(posedge clk)
   begin
      
      if(led == led_max)
         led <= 0;
      if(longcnt == delay_max)
        begin
         longcnt <= 0;
         led <= led +1;
        end
      else
        begin
         longcnt <= longcnt+1;
        end
   end
endmodule


С выше приведенного сайта переписал удачно семпл Verilog UART Model А что с этим делать? там столько лишних пинов, клоков...
Счас расмариваю код, стока непонятного.

Спойлер
Код:
   1 //----------
   2 // Design Name : uart
   3 // File Name   : uart.v
   4 // Function    : Simple UART
   5 // Coder       : Deepak Kumar Tala
   6 //----------
   7 module uart (
   8 reset          ,
   9 txclk          ,
  10 ld_tx_data     ,
  11 tx_data        ,
  12 tx_enable      ,
  13 tx_out         ,
  14 tx_empty       ,
  15 rxclk          ,
  16 uld_rx_data    ,
  17 rx_data        ,
  18 rx_enable      ,
  19 rx_in          ,
  20 rx_empty
  21 );
  22 // Port declarations
  23 input        reset          ;
  24 input        txclk          ;
  25 input        ld_tx_data     ;
  26 input  [7:0] tx_data        ;
  27 input        tx_enable      ;
  28 output       tx_out         ;
  29 output       tx_empty       ;
  30 input        rxclk          ;
  31 input        uld_rx_data    ;
  32 output [7:0] rx_data        ;
  33 input        rx_enable      ;
  34 input        rx_in          ;
  35 output       rx_empty       ;
  36
  37 // Internal Variables
  38 reg [7:0]    tx_reg         ;
  39 reg          tx_empty       ;
  40 reg          tx_over_run    ;
  41 reg [3:0]    tx_cnt         ;
  42 reg          tx_out         ;
  43 reg [7:0]    rx_reg         ;
  44 reg [7:0]    rx_data        ;
  45 reg [3:0]    rx_sample_cnt  ;
  46 reg [3:0]    rx_cnt         ; 
  47 reg          rx_frame_err   ;
  48 reg          rx_over_run    ;
  49 reg          rx_empty       ;
  50 reg          rx_d1          ;
  51 reg          rx_d2          ;
  52 reg          rx_busy        ;
  53
  54 // UART RX Logic
  55 always @ (posedge rxclk or posedge reset)
  56 if (reset) begin
  57   rx_reg        <= 0;
  58   rx_data       <= 0;
  59   rx_sample_cnt <= 0;
  60   rx_cnt        <= 0;
  61   rx_frame_err  <= 0;
  62   rx_over_run   <= 0;
  63   rx_empty      <= 1;
  64   rx_d1         <= 1;
  65   rx_d2         <= 1;
  66   rx_busy       <= 0;
  67 end else begin
  68   // Synchronize the asynch signal
  69   rx_d1 <= rx_in;
  70   rx_d2 <= rx_d1;
  71   // Uload the rx data
  72   if (uld_rx_data) begin
  73     rx_data  <= rx_reg;
  74     rx_empty <= 1;
  75   end
  76   // Receive data only when rx is enabled
  77   if (rx_enable) begin
  78     // Check if just received start of frame
  79     if ( ! rx_busy &&  ! rx_d2) begin
  80       rx_busy       <= 1;
  81       rx_sample_cnt <= 1;
  82       rx_cnt        <= 0;
  83     end
  84     // Start of frame detected, Proceed with rest of data
  85     if (rx_busy) begin
  86        rx_sample_cnt <= rx_sample_cnt + 1;
  87        // Logic to sample at middle of data
  88        if (rx_sample_cnt == 7) begin
  89           if ((rx_d2 == 1) && (rx_cnt == 0)) begin
  90             rx_busy <= 0;
  91           end else begin
  92             rx_cnt <= rx_cnt + 1;
  93             // Start storing the rx data
  94             if (rx_cnt > 0 && rx_cnt < 9) begin
  95               rx_reg[rx_cnt - 1] <= rx_d2;
  96             end
  97             if (rx_cnt == 9) begin
  98                rx_busy <= 0;
  99                // Check if End of frame received correctly
 100                if (rx_d2 == 0) begin
 101                  rx_frame_err <= 1;
 102                end else begin
 103                  rx_empty     <= 0;
 104                  rx_frame_err <= 0;
 105                  // Check if last rx data was not unloaded,
 106                  rx_over_run  <= (rx_empty) ? 0 : 1;
 107                end
 108             end
 109           end
 110        end
 111     end
 112   end
 113   if ( ! rx_enable) begin
 114     rx_busy <= 0;
 115   end
 116 end
 117
 118 // UART TX Logic
 119 always @ (posedge txclk or posedge reset)
 120 if (reset) begin
 121   tx_reg        <= 0;
 122   tx_empty      <= 1;
 123   tx_over_run   <= 0;
 124   tx_out        <= 1;
 125   tx_cnt        <= 0;
 126 end else begin
 127    if (ld_tx_data) begin
 128       if ( ! tx_empty) begin
 129         tx_over_run <= 0;
 130       end else begin
 131         tx_reg   <= tx_data;
 132         tx_empty <= 0;
 133       end
 134    end
 135    if (tx_enable &&  ! tx_empty) begin
 136      tx_cnt <= tx_cnt + 1;
 137      if (tx_cnt == 0) begin
 138        tx_out <= 0;
 139      end
 140      if (tx_cnt > 0 && tx_cnt < 9) begin
 141         tx_out <= tx_reg[tx_cnt -1];
 142      end
 143      if (tx_cnt == 9) begin
 144        tx_out <= 1;
 145        tx_cnt <= 0;
 146        tx_empty <= 1;
 147      end
 148    end
 149    if ( ! tx_enable) begin
 150      tx_cnt <= 0;
 151    end
 152 end
 153
 154 endmodule

Re: помогите с VERILOG

Вс сен 07, 2014 18:43:51

А что здесь символы #5 означают? (Сам не разбирался с этим.)
Код:
#5  clk =  ! clk;


Учтите, что у верилога есть синтезируемая часть и не синтезируемая (для тестов и отладки). Соответственно, не все директивы можно использовать для описания начинки ПЛИС.

Если не ошибаюсь, то процедурные действия должны для некоторых циклов укладываться в один такт. Если это не выполняется, то - ошибка синтеза. Хотя, могу ошибаться, не уверен.

Re: помогите с VERILOG

Вс сен 07, 2014 19:52:06

для тестов и отладки

Все правильно, потому я и написал про тестбенч.
То есть clk-виртуальный сигнал,а не реальный генератор внутри ПЛИС (как ,наверное считал Автор).
#5 значит, например 5nS, если в начале модуля задан масштаб времени/точность: `timescale 1ns / 1ps.
Т.е. в данном примере- инвертировать clk каждые 5nS.
Насчет UARTa,вот http://www.fpga4fun.com/SerialInterface.html попроще и понятно, как его применить.

Re: помогите с VERILOG

Вс сен 21, 2014 16:32:21

Доброй ночи. Введу кратко в курс дела: Делаю ремейк "народного цапа v2. "
Теперь на борту есть два генератора 24.576 мгц и 22.5792 мгц. Плис умеет определять частотную сетку по пину L/R и отключает невостребованный генератор. Но вот незадача, если в квартусе обьеденить оба пина и подать как один пин_клок далее по схеме, то ругает меня по чем свет ночью стоит.

Написал на верилоге разделитель, так можно делать??? (ну дублировать одно и тоже, только с другой точки зрения)


Код:
module clock_spliter(

input in_24576,  // вход частоты от первого генератора,
input in_225792,  // вход частоты от второго генератора,
 input en_24576,  // включен - выключен первый генератор,
 input en_225792,  // включен - выключен второй генератор,
 
 output wire clock
 );
 
 assign clock = (en_24576 == 1)? in_24576 : in_225792;
 assign clock = (en_225792 == 1)? in_225792 : in_24576;
 
 
 endmodule

Re: помогите с VERILOG

Пт сен 26, 2014 05:21:46

Люди, как прошить FPGA альтеру?
1- Вот написал простенький проект на верилоге светодиодами помигать. указал какие пины что делаают, откомпилировал.
2- как и с CPLD подключил плату по жтаг, залил прошивку.... не работает. В момент прошивки загорается лампочка что идет запись, пишет что 100% залито, а не мигает ни чего.
2а - вычитал что перед прошивкой надо нажать nConfig, это обнулит прошивку и переведет кристалл в режим прошивания. неработает.

3- решил прошить SPI_FLASH микра 25P28V6P (в мануале она описана как M25P128) Ее нет в настройках квартуса, там только EPCS*** EPCQ*** и ничего не подходит.


Не подскажите, где я видел статью в картинках пошаговая инструкция как подготовить и залить прошивку в постоянную память для FPGA альтеру, с описанием всех этих тонкостей.
Последний раз редактировалось WolfTheGrey Пт сен 26, 2014 07:11:05, всего редактировалось 1 раз.

Re: помогите с VERILOG

Пт сен 26, 2014 07:09:00

ПЛИС EP4CE40F23I7
Если по Jtag заливать прошивку, то после успешной прошивки лампочка программирования гаснет. А тестовые светодиоды не мигают. Ведь в демопрошивке (которая залита во флеш память) светодиоды то дрыгаются как китайская елочная гирлянда.
Может набыдлокодил чего то не того?
Спойлер
Код:
module start (input clock, output wire test_clock, output reg[2:0] leds);

assign test_clock = clock;  // передать сигнал с генератора на выход, типо тест.

reg[25:0] ints;
always @(clock)
   begin
     if(leds == 3) leds <= 0;
   
      if(ints == 50000000)
        begin
          ints <=0;
          leds <= leds + 1;
        end
      else
        begin
         ints = ints + 1;
        end
   end

endmodule


Но ведь компилятор не ругается?! должно же работать.

Re: помогите с VERILOG

Пт сен 26, 2014 11:50:46

У меня компилятор выдал более 100 предупреждений! В симуляторе код тоже не работает.
Подправил немного – должно работать.

Спойлер
Код:
module start (input clock, output wire test_clock, output reg[2:0] leds);

assign test_clock = clock;  //

reg[25:0] ints;


//Timer
always @(posedge clock)
begin
  if(ints < 50000000)
    ints = ints + 26'h1;
  else
    ints <= 0;
end

//Led
always @(posedge clock)
begin
  if(ints == 1)
    if(leds == 7)
      leds <= 0;
    else
      leds = leds + 3'h1;
end


endmodule

Re: помогите с VERILOG

Пт сен 26, 2014 23:31:01

Тоже ошибок стало всего 13, а не 370. Всего добавил одно слово: always@(posedge clock)

Закончил скачивать семплы на доску, но чето проект на светодиодах не открывается. Не открываются страницы с проектом, а некоторые проекты совсем не открываются. Максимум что могу, загрузить по жтаг прошивку в ФПГА.
Изображение

Все извилины утром напряг, чтоб ввести в проект кнопку reset. Получается что все кнопки надо дублировать регистрами?

так не бро:
Спойлер
Код:

module led( input clock, input reset, output reg [7:0] leds)

always @(posedge klock or posedge reset)
 begin
  if(!reset)
     leds <=0;
  else
     leds <= leds + 1;
 
 end
endmodule



Надо в отдельном алвайс блоке присвоить переменной REG RES значение кнопки RESET

Спойлер
Код:

module start
(
input reset,
input clock,
output wire enable_clock,
output reg[7:0] leds
);

assign enable_clock = clock;

reg[30:0] ints;
reg res;

always @(reset)
  begin
    if(reset) res <=0;
    else res = 1;
  end

always @( posedge clock)
   begin
     if(res)
       begin
          leds <= 7`b10101100;
          ints <= 1;
       end
    
     if(leds == 255) leds <= 1;
   
      if(ints == 10000000)
        begin
          ints <= 0;
          leds <= leds + 1;
        end
      else
         ints <= ints + 1;       
   end

endmodule



Re: помогите с VERILOG

Вс сен 28, 2014 02:19:39

Регистр res, похоже не нужен.
Компилятор его вообще игнорирует!

Спойлер
Код:
module start
(
input reset,
input clock,
output wire enable_clock,
output reg[7:0] leds
);

assign enable_clock = clock;

reg[30:0] ints;
reg res;

//always @(reset)
//  begin
//    if(reset) res <=0;
//    else res = 1;
//  end

always @( posedge clock)
   begin
     if(reset) //if(res)
       begin
          leds <= 8'b10101100;
          ints <= 1;
       end
     
     if(leds == 255) leds <= 1;
   
      if(ints == 10)
        begin
          ints <= 0;
          leds <= leds + 1;
        end
      else
         ints <= ints + 1;       
   end

endmodule

Вложения
main_cr.jpg
(149.81 KiB) Скачиваний: 660

Re: помогите с VERILOG

Вс сен 28, 2014 15:41:19

Не подскажите, что за нелепый наезд со стороны компилятора? Вроде какбы подправляет масиврегиистров, по сути сумма масива неизменяется: Warning (10230): Verilog HDL assignment warning at timer.v(65): truncated value with size 32 to match size of target (8)

Спойлер
Код:

   reg[7:0] ints_1; // 1 КГц.
reg clk_1k;
always @(posedge clk_500k)
  begin
    if(ints_1 == 249)
      begin
       ints_1 <=0;
       clk_1k <= ~clk_1k;
      end
    else ints_1 <= ints_1 + 1;
  end




Вот еще, нелепая поправка кода: Warning (10230):
Verilog HDL assignment warning at timer.v(122): truncated value with size 10 to match size of target (9)
Verilog HDL assignment warning at timer.v(123): truncated value with size 10 to match size of target (9)
Verilog HDL assignment warning at timer.v(124): truncated value with size 10 to match size of target (9)
Verilog HDL assignment warning at timer.v(125): truncated value with size 10 to match size of target (9)
Спойлер
Код:
               LCD_massiv[8:0] <= encoder_binaru(min);
          LCD_massiv[17:9] <= encoder_binaru(d_min);
          LCD_massiv[26:18] <= encoder_binaru(xors);
          LCD_massiv[35:27] <= encoder_binaru(d_xors);

Re: помогите с VERILOG

Вс сен 28, 2014 21:04:46

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

Максимум что могу, загрузить по жтаг прошивку в ФПГА.

Квартус сильно не любит русских букв в путях. Переместите проект в каталог с латинским именем.

Re: помогите с VERILOG

Пн сен 29, 2014 02:54:26

MisterDi писал(а):Квартус сильно не любит русских букв в путях. Переместите проект в каталог с латинским именем.

D:\altera\PROJEKT\ep4ce40 Скореее в настройках что то не то.

Опять какая то непонятная ошибка.
Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[6]" at timer.v(140)
Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[5]" at timer.v(140)
Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[4]" at timer.v(140)
Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[3]" at timer.v(140)
Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[2]" at timer.v(140)
Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[1]" at timer.v(140)
Error (10028): Can't resolve multiple constant drivers for net "LCD_massiv_count[0]" at timer.v(140)
Спойлер
Код:
     // LCD_driver
     initial LCD_load = 1;
     always @(posedge clk_1k)    //такт одна микросекунда
        begin
          if(LCD_massiv_count == 72)
            begin
               LCD_din  <= LCD_massiv[LCD_massiv_count];
               LCD_massiv_count <= LCD_massiv_count + 1;
               LCD_dclk <= 1;               
            end    
        end
      always @(negedge clk_1k) begin LCD_dclk <= 0; end   //  Error (10028): Can't resolve multiple constant drivers for net "LCD_dclk" at timer.v(150)


Драйвер 8 знакового LCD дисплея TIC8148 Там три контакта:
LCD_load, - можно просто поставить 1, это чтоб символы отображались, не блолее.
LCD_dclk, - тактовая частота.
LCD_din - информация.

Вот по отдельности оба алвайс блока работающих на разных частотах компилируются спокойно.

Спойлер
Код:

module Timer
(
input clk_1c // такт одна секунда
input clk_1k // такт 1 киллогерц

output reg LCD_load,
output reg  LCD_dclk,
output reg  LCD_din
)
     //счетчик часов и минут.
     reg[4:0] min;     //минуты
     reg[4:0] d_min;   //десятые минуты
     reg[4:0] xors;    //часы
     reg[4:0] d_xors;  //десятые часов
     reg pig;          //мигающая точка
    
     reg[71:0] LCD_massiv;
     reg[6:0] LCD_massiv_count;  //72 такта
     reg[5:0] clk_minuta;
    
   always @(negedge clk_1c)    //такт одна секунда
   begin
     if(clk_minuta == 60)
        begin
          if(min >=10) begin d_min <= d_min + 1; min <= 0; end
              else min <= min + 1;
          if((d_min == 5)&& (min ==10))begin xors <= xors + 1; d_min <= 0; min <= 0; end
               else d_min <= d_min +1;
          if(xors >=10) begin d_xors <= d_xors +1; xors <= 0; end
               else xors <= xors +1;
          if((d_xors == 2)&&(xors == 3)&&(d_min == 5)&& (min ==10)) begin min <= 0; d_min <=0; xors <= 0; d_xors <= 0; end
    
          
    
          //дешифровка десатичных чисел в бинарный код матрицы, и присоединение в массив.
    
          LCD_massiv[8:0] <= encoder_binaru(min);
          LCD_massiv[17:9] <= encoder_binaru(d_min);
          LCD_massiv[26:18] <= encoder_binaru(xors);
          LCD_massiv[35:27] <= encoder_binaru(d_xors);
          LCD_massiv[71:36] <= 0;
         
          clk_minuta <=0;
        end
       
     clk_minuta <= clk_minuta + 1;    
     pig <= ~pig;                 // мигающая точка.
     LCD_massiv[17] <= pig;
     LCD_massiv_count <= 0;       // взвести работу LCD драйвера, вот эта строчка не дает коду откомпелироваться.
   end
   
 
     // LCD_driver
     initial LCD_load = 1;
     always @(posedge clk_1k)    //такт одна микросекунда
        begin
          if(LCD_massiv_count <= 72)
            begin
                    LCD_din  <= LCD_massiv[LCD_massiv_count];
               LCD_massiv_count <= LCD_massiv_count + 1;
               LCD_dclk <= 1;               
            end    
        end
      always @(negedge clk_1k) begin LCD_dclk <= 0; end   // Error (10028): Can't resolve multiple constant drivers for net "LCD_dclk" at timer.v(150)

    


 function[9:0] encoder_binaru; input wire[4:0] decimal;
   
    case(decimal)
            0: encoder_binaru=9`b111101100;
       1: encoder_binaru=9`b110000000;
       2: encoder_binaru=9`b011011100;
       3: encoder_binaru=9`b111010100;
       4: encoder_binaru=9`b110110000;
       5: encoder_binaru=9`b101110100;
       6: encoder_binaru=9`b101111100;
       7: encoder_binaru=9`b111000000;
       8: encoder_binaru=9`b111111100;
       9: encoder_binaru=9`b111110100;
          10: encoder_binaru=9`b000000000;
    endcase
 
  endfunction
 
  /*
   task pot(x,y);
    input  x; output  y;
  endtask
  */
  endmodule

Re: помогите с VERILOG

Пн сен 29, 2014 08:31:27

Нельзя присваивать значение регистру в разных always блоках. Вы по фронту тактовой присваиваете LCD_dclk 1, а по спаду 0. Так работать не будет.

Re: помогите с VERILOG

Пн сен 29, 2014 15:18:32

Вы по фронту тактовой присваиваете LCD_dclk 1, а по спаду 0

Ну, с этим ладно, чего придумаю.Хотя непонятно в чем кофликт, если оба блока тактируются от одного сигнала.
А вот как быть с спусковым крючком LCD_massiv_count <= 0; в одном алвайс блоке, чтоб заработал другой блок. По сути конфликта (внутри кристального короткого замыкания) не должно быть. Как же тогда пишутся сложнейшие схемы?, есть же способ как легально обойти этот запрет.

Написать новый модуль, куда передать нужные параметры, и запустить его из первого алвайс блока?

Не подскажете, что за харек: (выписал из книги, а компилироваться ни в какую не хочет)
task pot(x,y);
input x; output y;
endtask

Re: помогите с VERILOG

Пн сен 29, 2014 15:59:49

Попробуйте применить машину состояний (сделайте через case).
И что Вам мешает написать так?
Код:
// LCD_driver
     initial LCD_load = 1;
     always @(posedge clk_1k)    //такт одна микросекунда
        begin
          if(LCD_massiv_count == 72)
            begin
               LCD_din  <= LCD_massiv[LCD_massiv_count];
               LCD_massiv_count <= LCD_massiv_count + 1;
               LCD_dclk <= 1;               
            end else LCD_dclk <= 0;   
        end

По идее должно работать. Сам недавно начал изучать ПЛИСки :))

Re: помогите с VERILOG

Пн сен 29, 2014 23:43:40

И что Вам мешает написать так?

Потому что алвайс блок LCD_driver должен заработать по команде от алвайс блока где все эти числа собираются.
Вот интересно
always 1
LCD_massiv <= данные;
LCD_massiv_count <=0;

always 2
if(LCD_massiv_count <= 72) так делать нельзя, конфликт блоков,
а вот LCD_massiv, пришедшая с того же блока работает на ура.
Ответить