МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Verilog конфликт драйвера

Verilog конфликт драйвера 3 года 7 мес. назад #3256

Добрый день.
Я только начинающий плисо-кодер. Книжки читаю по VERILOG, кое какие программульки пишу. Вроде все работает, но сталнулся с не предвиденой ошибкой, описание которой нет ни в одной книге:

Как из разных алвайс блоков, или иных операторов - получить доступ к переменной, массива? Да я знаю, если один оператор переменой будет присваивать еденицу, а другой оператор в тот же момент даст ноль - то на чипе выростит небольшей ядерный гриб.
Вот упрощеный кусок кода:
module summator (
input clock,
input button1, //+
input button2, //-
input button3, //<<
input button4, //>>
input button5, //

output reg[7:0] summa
);

always @( posedge clock) // основной алвайс блок срабатывающий раз в секунду
    begin
       summa = summa + 1;
    end

always @(negedge button2)
    begin
       summa = summa - 1;
    end

always @(negedge button3)
    begin
       summa = summa << 1;
    end

always @(negedge button4)
    begin
       summa = summa >> 1;
    end
endmodule

Пробовал делать так: в алвайс бллоке смотреть - нажата ли кнопка?
Код как бы и работает, но хотелось бы чтоб реакция на нажатие кнопок была по шустрее чем в пеериуд 1 секунда.
always @( posedge clock) // основной алвайс блок срабатывающий раз в секунду
    begin
       summa = summa + 1;
   if(button1) summa = summa + 1;
   if(button2) summa = summa << 1;
и.т.д.
    end


Пробовал делать и так: - добавил события нажатия кннопки в алвайс блок
Но код начинает работать не аыкватно, хоть компилируется удачно
always @( clock or button1 or button2 or button...) // основной алвайс блок срабатывающий раз в секунду
    begin
       summa = summa + 1;
   if(button1) summa = summa + 1;
   if(button2) summa = summa << 1;
и.т.д.
    end


Вот сам код из проекта (если поможет)
module timer(
	input clk_1k,
	input clk_1c,
	input k1_Minut, k2_Dminut, k3_Xors, k4_Dxors, //кнопки установа часов и минут
	input setup, // разрешающая кнопка вношения изменений времени часов
	input alarm, // разрешающая кнопка вношения изменений времени будильника	
	output clock_alarm1, clock_alarm2, // пины пищалки (будильник)	
	output reg[71:0] LCD_massiv, // вывод дисплейной информации 
	
	output reg[7:0] leds // мигающие светодиоды, пустая информация 
);
//leds 
  reg [7:0] led;
  always @(posedge clk_1c)
     begin
	     
		  if(led == 256) led <=0;
		  else
		    begin  
		      led = led + 1;	  
				leds = ~led;
			 end 
	  
	  end
	  

	  
	  //счетчик часов и минут.
	  reg[3:0] sek;
	  reg[3:0] dsek;
	  reg[3:0] min;     //минуты
	  reg[3:0] dmin;   //десятые минуты
	  reg[3:0] xors;    //часы
	  reg[3:0] dxors;  //десятые часов
	  reg pig; 	  //мигающая точка
	
	// будильник
	  reg[3:0] bmin;     //минуты
	  reg[3:0] bdmin;   //десятые минуты
	  reg[3:0] bxors;    //часы
	  reg[3:0] bdxors;  //десятые часов
	  reg gip; 	  //звонок
	  assign clock_alarm1 =(!gip)? 0 : clk_1k;
	  assign clock_alarm2 = (!gip)? 0 : ~clock_alarm1;
	  
	 
	  initial begin 
	     sek = 0; dsek = 5; 
		  min = 9; dmin = 5; 
		  xors = 4; dxors = 2;
		  
		  bmin = 1; bdmin = 0; 
		  bxors = 0; bdxors = 0; 
		  end 
	  
	  
	  
	  reg[6:0] LCD_massiv_count;  //72 такта вывода дисплейной информации 
	  
	 
	/*		
	always @(negedge k1_Minut)  // кнопка минут
	begin 
		if(!setup) // настройки:
			if(alarm)
				if(!min) min = min + 1; else;
			else 
				bmin = bmin + 1;
	end 
	
	always @(negedge k2_Dminut)  // кнопка минут
	begin 
		if(!setup) // настройки:
			if(alarm)
				dmin = dmin + 1;
			else 
				bdmin = bdmin + 1;
	end 
				
	always @(negedge k3_Xors)  // кнопка минут
	begin 
		if(!setup) // настройки:
			if(alarm)
				xors = xors + 1;
			else 
				bxors = bxors + 1;
	end 
				
	always @(negedge k4_Dxors) // кнопка минут
	begin 
		if(!setup) // настройки:
			if(alarm)
				dxors = dxors + 1;
			else 
				bdxors = bdxors + 1;
	end 
	  */
	always @(posedge clk_1c)    //такт одна секунда
	begin 
		   LCD_massiv = 0;
			 sek = sek + 1;
			 
			 
			 //секунды:
			 if(sek >=10) begin dsek = dsek + 1; sek = 0;  end
					 
	       if((dsek >= 6)&& (sek >=0))begin min = min + 1; dsek = 0; sek = 0;  end 
					  
					  // минуты:			 
	       if(min >=10) begin dmin = dmin + 1; min = 0;  end
					 
	       if((dmin >= 6)&& (min >=0))begin xors = xors + 1; dmin = 0; min = 0; end 
					  
					  // часы:					  
	       if((xors >=10)||(dmin >= 6)&&(min >=0)) begin dxors = dxors + 1; xors = 0;  end 
	       if((dxors == 2)&&(xors >= 4)||(dmin >= 6)&& (min >=0)) 
			    begin min = 0; dmin = 0; xors = 0; dxors = 0; LCD_massiv = 0; end 
	  
	          // будильник
	        if((bmin == min)&&(bdmin == dmin)&&(bxors == xors)&&(bdxors == dxors))
					begin 
						LCD_massiv[22] = 1;
							if(gip == 0)  gip = 1; 
							else gip = 0; 
					end 
				else 
					begin LCD_massiv[22] = 0; gip = 0; end    
				
	if(alarm)
     begin	
	  LCD_massiv[8:0] = encoder_binaru(sek);
	  LCD_massiv[17:9] = encoder_binaru(dsek);
	  LCD_massiv[35:27] = encoder_binaru(min);
	  LCD_massiv[44:36] = encoder_binaru(dmin);
	  LCD_massiv[62:54] = encoder_binaru(xors);
	  LCD_massiv[71:63] = encoder_binaru(dxors);
	  
	  pig = ~pig;                 // мигающая точка.
	  LCD_massiv[51] = pig;
	  end
	else
     begin 	
	  LCD_massiv[8:0] = encoder_binaru(bmin);
	  LCD_massiv[17:9] = encoder_binaru(bdmin);
	  LCD_massiv[35:27] = encoder_binaru(bxors);
	  LCD_massiv[44:36] = encoder_binaru(bdxors);
	  end 
	  
	if(!setup) // настройки:
	   if(alarm)
			begin  // установка часов
			   if(!k1_Minut) min = min + 1;
				if(!k2_Dminut) dmin = dmin + 1;
				if(!k3_Xors) xors = xors + 1;
				if(!k4_Dxors) dxors = dxors + 1; 
				LCD_massiv[28] = 1; 
				LCD_massiv[37] = 1;
				LCD_massiv[55] = 1;
				LCD_massiv[64] = 1;
			end 
		else
			begin  //установка будильника
			   if(!k1_Minut) bmin = bmin + 1;
				if(!k2_Dminut) bdmin = bdmin + 1;
				if(!k3_Xors) bxors = bxors + 1;
				if(!k4_Dxors) bdxors = bdxors + 1; 
				LCD_massiv[1] = 1; 
				LCD_massiv[10] = 1;
				LCD_massiv[28] = 1;
				LCD_massiv[37] = 1;
	   	end 
	
		
	end 
	
	function reg[9:0] encoder_binaru; input wire[4:0] decimal; 
    
	 case(decimal)
	    0: encoder_binaru = 444;
		 1: encoder_binaru = 12;
		 2: encoder_binaru = 472;
		 3: encoder_binaru = 348;
		 4: encoder_binaru = 108;
		 5: encoder_binaru = 372;
		 6: encoder_binaru = 500;
		 7: encoder_binaru = 28;
		 8: encoder_binaru = 508;
		 9: encoder_binaru = 380;
	   10: encoder_binaru = 444;
		default: encoder_binaru = 511;
	 endcase
 endfunction
  
endmodule 

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от WolfTheGrey.

Verilog конфликт драйвера 3 года 7 мес. назад #3260

  • Falcon
  • Falcon аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 8
Сделайте вот так:
При нажатие на кнопку будет меняться одно значение
module summator (
input clock100Mhz,
input button1, //+
input button2, //-
input button3, //<<
input button4, //>>
input button5, //

output reg[7:0] summa
);

reg flag;

always @( posedge clock100Mhz) // основной алвайс блок срабатывающий при нажатии кнопки
    begin
       if (!flag & button1)
       begin
        summa = summa + 1;
        flag <= 1'b1;
       end

       if (!flag & button2)
       begin
        summa = summa - 1;
        flag <= 1'b1;
       end

       if (!button1 & !button2) flag <= 0;

и.т.д и и т.п.

    end
endmodule

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Falcon.

Verilog конфликт драйвера 3 года 7 мес. назад #3261

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 631
  • Спасибо получено: 51
Чтобы реакция на кнопки была шустрее, лучше увеличить частоту клока, а секундные интервалы формировать сигналом разрешения клока. Тогда кнопки можно опрашивать с большей частотой.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Verilog конфликт драйвера 3 года 7 мес. назад #3264

Заработало. Сделал два алвайс блока:
в первый - Согнал все в один алвайс блок, сделал два флага: флаг кнопок, и флаг секунд.
во втором - дешифрация цифр в знакосигментныую последовотельность бит для экранчика TIC3321
reg[6:0] LCD_massiv_count;  //72 такта вывода дисплейной информации 
	  reg button_flag;
	  reg timer_flag;
	 
		
	always @(posedge clk_1k)  
	begin 
	if(!setup) // настройки:
		begin 
			if (!button_flag & !k1_Minut) // кнопка минут
				begin
					if(alarm)
						min = min + 1;
					else 
						bmin = bmin + 1;
					button_flag = 1'b1;
				end 
				
			if (!button_flag & !k2_Dminut) // кнопка десятых минут
				begin
					if(alarm)
						dmin = dmin + 1;
					else 
						bdmin = bdmin + 1;
					button_flag = 1'b1;
				end 
			
			if (!button_flag & !k3_Xors) // кнопка часов
				begin
					if(alarm)
						xors = xors + 1;
					else 
						bxors = bxors + 1;
					button_flag = 1'b1;
				end 
				
				
			if (!button_flag & !k4_Dxors) // кнопка десятых часов
				begin
					if(alarm)
						dxors = dxors + 1;
					else 
						bdxors = bdxors + 1;
					button_flag = 1'b1;
				end 	
				
			if(k1_Minut && k2_Dminut && k3_Xors && k4_Dxors) button_flag = 1'b0; //сброс флага кнопок
			
		end 
		
		if(!button_flag && !timer_flag && clk_1c) //флаг отсчета времени + положительный периуд тактовой частоты
				begin 
					
					timer_flag = 1'b1;
					sek = sek + 1;		 
					//секунды:
					if(sek >=10) begin dsek = dsek + 1; sek = 0;  end
					 
					if((dsek >= 6)&& (sek >=0))begin min = min + 1; dsek = 0; sek = 0;  end 
					  
					  // минуты:			 
					if(min >=10) begin dmin = dmin + 1; min = 0;  end
					 
					if((dmin >= 6)&& (min >=0))begin xors = xors + 1; dmin = 0; min = 0; end 
					  
					  // часы:					  
					if((xors >=10)||(dmin >= 6)&&(min >=0)) begin dxors = dxors + 1; xors = 0;  end 
					if((dxors == 2)&&(xors >= 4)||(dmin >= 6)&& (min >=0)) 
						begin min = 0; dmin = 0; xors = 0; dxors = 0; end 
				end 
		if(!clk_1c)timer_flag = 1'b0;
	end 
	

	  
	always @(posedge clk_1c)    //такт одна секунда
	begin 
		LCD_massiv = 1'b0;
		
	          // будильник
	        if((bmin == min)&&(bdmin == dmin)&&(bxors == xors)&&(bdxors == dxors))
					begin 
						LCD_massiv[22] = 1;
							if(gip == 0)  gip = 1; 
							else gip = 0; 
					end 
				else 
					begin LCD_massiv[22] = 0; gip = 0; end    
				
	if(alarm)
     begin	
	  LCD_massiv[8:0] = encoder_binaru(sek);
	  LCD_massiv[17:9] = encoder_binaru(dsek);
	  LCD_massiv[35:27] = encoder_binaru(min);
	  LCD_massiv[44:36] = encoder_binaru(dmin);
	  LCD_massiv[62:54] = encoder_binaru(xors);
	  LCD_massiv[71:63] = encoder_binaru(dxors);
	  
	  pig = ~pig;                 // мигающая точка.
	  LCD_massiv[51] = pig;
	  end
	else
     begin 	
	  LCD_massiv[8:0] = encoder_binaru(bmin);
	  LCD_massiv[17:9] = encoder_binaru(bdmin);
	  LCD_massiv[35:27] = encoder_binaru(bxors);
	  LCD_massiv[44:36] = encoder_binaru(bdxors);
	  end 	
	end 
	
	function reg[9:0] encoder_binaru; input wire[4:0] decimal; 
    
	 case(decimal)
	    0: encoder_binaru = 444;
		 1: encoder_binaru = 12;
		 2: encoder_binaru = 472;
		 3: encoder_binaru = 348;
		 4: encoder_binaru = 108;
		 5: encoder_binaru = 372;
		 6: encoder_binaru = 500;
		 7: encoder_binaru = 28;
		 8: encoder_binaru = 508;
		 9: encoder_binaru = 380;
	   10: encoder_binaru = 444;
		default: encoder_binaru = 511;
	 endcase
 endfunction

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от WolfTheGrey.

Verilog конфликт драйвера 3 года 7 мес. назад #3265

Люди, раз записывать в регистр может только один алвйс блок, вот допустим есть задача:

Хочу сделать цифровой фильтр с функцией передискретизации и выравниванию возрастающих фронтов клоков согласно даташиту I2S шины.
Имеем I2S шину с потоком данных I2S_mode с частотной сеткой 48 КГц. Надо записать в память некоторое колличество точек, потом по Котельникову преобразовать данные под 2х или 4х кратную частотную секу, затем подогнать восходящие фронты клоков согласно даташиту I2S шины.

И все это делать в одном алвайс блоке?



Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от WolfTheGrey.
  • Страница:
  • 1
Время создания страницы: 0.165 секунд

facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Языки программирования Verilog конфликт драйвера