2016-02-20 3 views
1

Я очень новичок в кодировании HDL. Я использую Verilog Xilinx для кодирования HDL.Нажатие кнопки с миганием LED

Я пытаюсь реализовать push btn, чтобы активировать светодиодный мигающий код ниже и когда кнопка отпущена, мигает останавливается. Ниже мигающий код LED

`timescale 1ns/1ps 
module blinkyslow(
    input CLOCK, SW, 
    output LED 
    ); 
    reg [24:0] COUNT = 25'b0000000000000000000000000; 
    reg LED=1; 
    always @(posedge CLOCK) begin 
    COUNT <= COUNT + 1; 
    LED <= (COUNT == 25'b0000000000000000000000000)?~LED:LED; 
    end 
endmodule 

Я использую BASYS 3 доски и я пытаюсь связать переменную SW как переключатель

+0

Есть вопрос? – Paebbels

+0

В чем проблема, с которой вы столкнулись? –

ответ

1

Например, вы можете реализовать его, имея счетчик приращения только если кнопка нажата.

(Строго говоря, это не очень хорошо, потому что если COUNT остается нулевой, LED будет переключен на evely часов. Toggling LED только при нажатии кнопки будет решить эту проблему)

`timescale 1ns/1ps 
module blinkyslow(
    input CLOCK, SW, 
    output LED 
    ); 
    reg [24:0] COUNT = 25'b0000000000000000000000000; 
    reg LED=1; 
    always @(posedge CLOCK) begin 
     if (SW) begin 
      COUNT <= COUNT + 1; 
      LED <= (COUNT == 25'b0000000000000000000000000)?~LED:LED; 
     end 
    end 
endmodule 

(не тестировалось, предполагая SW = 1 означает переключатель нажимается на плате)

+0

Этот ответ не решает проблему debouncing. – Paebbels

2

Вы можете использовать этот код:

`timescale 1ns/1ps 
module blinkyslow( 
    input CLOCK, SW,reset, 
    output reg LED 
    ); 
    reg [24:0] COUNT; 
    always @(posedge CLOCK) begin 
     if (reset ==1'b1) 
     LED <= 1'b0; 
     COUNT <= 0; 
     else 
     begin 
    COUNT <= COUNT + 1; 
    LED <= SW & ((COUNT == 25'b0)?~LED:LED); 
     end 
     end 
endmodule 

Поскольку всегда блок чувствителен только к нарастающему фронту сигнала CLOCK, сигнал сброса является синхронным сбросом.

+0

Пожалуйста, отформатируйте свой код и опишите, что он делает. – Paebbels

+0

это работало отлично, я не понимаю, это «если (сброс == 1'b1)». Я установил свои ограничения на сброс на кнопку. Так что я догадываюсь, так как я не нажимаю на кнопку, поэтому она разомкнута и всегда возвращается «1», поэтому мой светодиод не загорается. правый? –

+1

Это очень просто. перед переустройством схемы светодиод имеет неизвестное значение (1'bx). если вы хотите использовать эту схему, вы должны нажать кнопку «Сброс». Предполагается, что «перезагрузка» ACTIVE_HIGH с выпадающей структурой. –

0

@ Николас Чан. В исходном коде вы определили следующую строку не в начальном блоке. Следовательно, светодиод подключен к нулю.

reg LED=1;

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

timescale 1ns/1ps module blinkyslow( input CLOCK, SW, output LED ); initial:begin reg [24:0] COUNT = 25'b0000000000000000000000000; reg LED=1; end always @(posedge CLOCK) begin COUNT <= COUNT + 1; LED <= (COUNT == 25'b0000000000000000000000000)?~LED:LED; end endmodule

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