помогите с VERILOG

Программируемая логика - это не так уж и сложно. Разберемся вместе.
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

помогите с VERILOG

Сообщение WolfTheGrey »

Добрый день коты. Выписал из книги строчку генератора. на непрерывном цикле 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 ";"

где я точку с запятой не воткнул?
Реклама
mikhail_kmm61
Родился
Сообщения: 13
Зарегистрирован: Вс окт 07, 2012 20:12:58

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

Сообщение mikhail_kmm61 »

Запрос в google: initial forever verilog
Ответ :http://www.asic-world.com/verilog/vbehave3.html
Реклама
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

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

Код: Выделить всё

  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
mikhail_kmm61
Родился
Сообщения: 13
Зарегистрирован: Вс окт 07, 2012 20:12:58

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

Сообщение mikhail_kmm61 »

Вот так компилируется:
Спойлер

Код: Выделить всё

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 не катит, не знаю. Надо спецов спрашивать, а я тестбенчи ни разу не использовал и не писАл.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

Да ладно с ним, написал счетчик делитель от гена на 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
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

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

Код: Выделить всё

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

Если не ошибаюсь, то процедурные действия должны для некоторых циклов укладываться в один такт. Если это не выполняется, то - ошибка синтеза. Хотя, могу ошибаться, не уверен.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
mikhail_kmm61
Родился
Сообщения: 13
Зарегистрирован: Вс окт 07, 2012 20:12:58

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

Сообщение mikhail_kmm61 »

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

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

Сообщение WolfTheGrey »

Доброй ночи. Введу кратко в курс дела: Делаю ремейк "народного цапа 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 
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

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

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


Не подскажите, где я видел статью в картинках пошаговая инструкция как подготовить и залить прошивку в постоянную память для FPGA альтеру, с описанием всех этих тонкостей.
Последний раз редактировалось WolfTheGrey Пт сен 26, 2014 07:11:05, всего редактировалось 1 раз.
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

ПЛИС 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 
Но ведь компилятор не ругается?! должно же работать.
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

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

Сообщение wss60 »

У меня компилятор выдал более 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
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

Тоже ошибок стало всего 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 



Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

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

Сообщение wss60 »

Регистр 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 КБ) 723 скачивания
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

Не подскажите, что за нелепый наезд со стороны компилятора? Вроде какбы подправляет масиврегиистров, по сути сумма масива неизменяется: 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);
MisterDi
Встал на лапы
Сообщения: 85
Зарегистрирован: Сб мар 13, 2010 13:52:10

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

Сообщение MisterDi »

Это стандартные предупреждения о несоответствии размеров регистров. Вполне можно игнорировать. На всякий случай проверьте объявление для encoder_binaru.
Максимум что могу, загрузить по жтаг прошивку в ФПГА.
Квартус сильно не любит русских букв в путях. Переместите проект в каталог с латинским именем.
misterdi<@>i.ua
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

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 
sobs
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт авг 09, 2013 15:16:14

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

Сообщение sobs »

Нельзя присваивать значение регистру в разных always блоках. Вы по фронту тактовой присваиваете LCD_dclk 1, а по спаду 0. Так работать не будет.
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

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

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

Не подскажете, что за харек: (выписал из книги, а компилироваться ни в какую не хочет)
task pot(x,y);
input x; output y;
endtask
sobs
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт авг 09, 2013 15:16:14

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

Сообщение sobs »

Попробуйте применить машину состояний (сделайте через 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
По идее должно работать. Сам недавно начал изучать ПЛИСки :))
Аватара пользователя
WolfTheGrey
Потрогал лапой паяльник
Сообщения: 370
Зарегистрирован: Вс май 06, 2012 09:58:33
Откуда: Магадан

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

Сообщение WolfTheGrey »

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

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

Вернуться в «ПЛИС»