Добрый день.
Я только начинающий плисо-кодер. Книжки читаю по 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