2012-01-19 5 views
1

Как часть более крупной программы, я хотел бы активировать зеленые светодиоды по одному на моей плате DE2 в порядке (от 0 до 8), когда я нажимаю KEY [1]. Они должны отключать по одному в обратном порядке, когда я нажимаю KEY [2]. Я уверен, что клавиши платы DE2 активны. Это мой код:Всегда блокировать игнорирование

[email protected](negedge KEY[1], negedge KEY[2]) 
begin 

    if(~KEY[1]) 
    begin 
     LEDGValue <= LEDGValue << 1; 
     LEDGValue[0] <= 1; 
    end 

    else if(~KEY[2]) 
     LEDGValue[0] <= LEDGValue >> 1; 

end 

Вместо все зеленые светодиоды загораются, как только я загрузить программу. В этот момент KEY [1] и KEY [2] не действуют. Кто-нибудь видит что-то не так с моим кодом?

ответ

2

Вот детектор края.

module edge_detector (
    input wire clk, 
    input wire in, 
    output wire negedge_out 
); 

reg in_reg= 1'b0; 

wire in_next = in; 

assign negedge_out = ({in_reg,in) == 2'b10); 

always @(posedge clk) in_reg <= in_next; 

endmodule 

Вот как вы используете детектор кромок.

reg [8:0] LEDGValue = 0, LEDGValue_next; 

wire key1_edge; 
wire key2_edge; 

edge_detector 
key1_edge_detector_inst (
    .clk(clk), 
    .in(KEY[1]), 
    .negedge_out(key1_edge) 
); 

edge_detector 
key2_edge_detector_inst (
    .clk(clk), 
    .in(KEY[2]), 
    .negedge_out(key2_edge) 
); 

always @* begin : combinational_logic 
    LEDGValue_next = LEDGValue; 
    if (key1_edge) 
     LEDGValue_next = {LEDGValue[7:0], 1'b1}; 
    else if (key2_edge) 
     LEDGValue_next = {1'b0, LEDGValue[8:1]}; 
end 

always @(posedge clk) begin : sequential_logic 
    LEDGValue <= LEDGValue_next; 
end 

Ключ в том, что key1_edge и key2_edge сигналы утверждаться только на один тактовый цикл.

+0

Код был очень полезным; он исправил проблему.Спасибо. – Andrew

+0

То, что вы пытались сделать, называется асинхронной логикой, потому что нет часов. Оказывается, FPGA спроектированы с предположением, что вся логика будет синхронной и будет использовать часы. На FPGA можно реализовать асинхронную логику, но сейчас это тяжелая битва и лучше всего для экспертов. –

0

Я не Verilogger, но похоже, что вы просите код вызывать края двух разных сигналов. Это не в моем опыте синтеза, но синтезатор, возможно, попытался сделать что-то и предупредил вас (среди множества других предупреждений) о том, что он сделал что-то другое, чем вы действительно имели в виду.


EDIT: Следующий не применяется к плате упоминается как это дребезг оборудования на борту (благодаря NathanFarrington для указывая, что из), но я оставляю его здесь, в случае это полезным для других читателей:


Даже если синтезатор удался, край запуска на входе коммутатора является ужасной идеей: the switch will bounce several times когда вы нажимаете, и FPGA легко достаточно быстро, чтобы увидеть все эти края.

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

Держите счетчик для каждого сигнала, увеличивайте его каждый раз, когда сигнал 1, уменьшайте его каждый раз, когда сигнал 0. Закрепите эти счетчики на 0 и некоторое максимальное время, которое позволяет достаточно времени для переключения коммутатора (вероятно, будет достаточно нескольких миллисекунд).

Как только счетчик достиг любого конца «путешествия», только , то вы предпринимаете какое-либо действие (например, смещение LEDGValue). Не забудьте дождаться, когда коммутатор будет выпущен после этого (ожидая, когда счетчик перейдет к другому концу).

+0

Эта ссылка говорит, что четыре кнопки уже дебютируют с использованием триггера Schmitt, поэтому в FPGA ничего не должно быть сделано: http://courses.engr.illinois.edu/ece385/documents/DE2_UserManual.pdf –

+0

@NathanFarrington : Спасибо, я не знал о деталях этой доски ... Я обновлю свой ответ –

-1

Должна ли она быть

[email protected](negedge KEY[1] OR negedge KEY[2]) 
+1

2 очка: 1. Verilog чувствителен к регистру: 'OR' должен быть' или '. 2. Синтаксис с запятой поддерживается спецификацией IEEE 1364-2001. – toolic

+0

На самом деле я не использовал Verilog для возрастов – xucheng

Смежные вопросы