Это уже было далеко в прошлом, но представленные решения, возможно, не совсем то, что вы ожидали. Из того, что я мог сделать, все решения считают, что светодиод будет продолжать переключаться, пока нажата кнопка (т. Е. Он будет переключаться с тактовой частотой), что делает его визуально незаметным, если тактовая частота высока. Однако я предполагаю, что вам нужно что-то, что переключает светодиод только один раз при каждом нажатии кнопки, при этом состояние светодиода сохраняется в течение этого периода.
В приведенном ниже примере переключаются состояния 3 светодиодов в зависимости от активности 3 кнопок.
- led0 активируется всякий раз, когда нажимается pbutton0.
- led1 продолжает периодически переключаться (в зависимости от размера clk_div) и сбрасывается при каждом нажатии pbutton1.
- led2 переключается всякий раз, когда нажимается pbutton2.
Обратите внимание, что led0 является комбинационным, а два других светодиода — последовательными. Для переключения led2 необходимо сохранить предыдущее состояние pbutton2; всякий раз, когда pbutton2(t-1)==0 и pbutton2(t)==1, это означает, что кнопка только что перешла от низкого уровня к высокому, и, таким образом, состояние из led2 должны измениться.
Наконец, не обращайте внимания на источник тактового сигнала, так как он использовался только для демонстрации кода комплекта разработки Xilinx SP605.
////////////////////////////////////////////////////
// This project uses 3 pushbuttons and 3 LEDs.
// pbutton0 activates led0
// pbutton1 serves as reset for led1 periodic toggling
// pbutton2 toggles led2
//
// The clock source (divider+buffer) was created using the clocking IP wizard.
//
module xilinx_sp605_board_leds
(
input CLK_IN1_P,
input CLK_IN1_N,
input pbutton0,
input pbutton1,
input pbutton2,
output led0,
output reg led1,
output reg led2
);
// declarations
wire clk;
wire reset = pbutton1;
reg [19:0] clk_div;
reg pbutton2_reg;
// led0 = state of pbutton0
assign led0 = pbutton0;
// differential clock divider+buffer
clk_source CLK_SOURCE (
.CLK_IN1_P(CLK_IN1_P),
.CLK_IN1_N(CLK_IN1_N),
.CLK_OUT1(clk),
.RESET(reset));
// led1, led2 toggling
always @(posedge reset or posedge clk)
begin
if(reset)begin
clk_div <= 0;
led1 <= 0;
pbutton2_reg <= 0;
led2 <= 0;
end else begin
clk_div <= clk_div + 1;
if(clk_div==0)
led1 <= ~led1;
pbutton2_reg <= pbutton2;
if(~pbutton2_reg && pbutton2)
led2 <= ~led2;
end
end
endmodule
person
bupedroni
schedule
06.11.2015