Uso del divisor de reloj y el multiplexor.
si bien sabemos, podemos hacer uso de un multiplexor para seleccionar entre varias frecuencias, como ya se habia mencionado anteriormente en otros modulos, en este caso, simplemente seguimos la explicacion del modulo: multiplexor de frecuencia que nos indica que podemos crear varios divisores de reloj y mandarlos al multiplexor, veamos el ejemplo.
Código Verilog
module frecuencia_selector(
input clk,
input [1:0] s,
output reg out
);
reg [27:0] contador0 = 28'd0;
reg [27:0] contador1 = 28'd0;
reg [27:0] contador2 = 28'd0;
reg [27:0] contador3 = 28'd0;
reg frecuencia0 = 0;
reg frecuencia1 = 0;
reg frecuencia2 = 0;
reg frecuencia3 = 0;
parameter divisor0 = 28'd50_000_000; // 2 Hz
parameter divisor1 = 28'd25_000_000; // 4Hz
parameter divisor2 = 28'd12_500_000; //8 Hz
parameter divisor3 = 28'd6_250_000; // 16 Hz
always @(posedge clk) begin
// Generar frecuencia0
if (contador0 >= divisor0) begin
contador0 <= 28'd0;
frecuencia0 <= ~frecuencia0;
end else begin
contador0 <= contador0 + 28'd1;
end
// Generar frecuencia1
if (contador1 >= divisor1) begin
contador1 <= 28'd0;
frecuencia1 <= ~frecuencia1;
end else begin
contador1 <= contador1 + 28'd1;
end
// Generar frecuencia2
if (contador2 >= divisor2) begin
contador2 <= 28'd0;
frecuencia2 <= ~frecuencia2;
end else begin
contador2 <= contador2 + 28'd1;
end
// Generar frecuencia3
if (contador3 >= divisor3) begin
contador3 <= 28'd0;
frecuencia3 <= ~frecuencia3;
end else begin
contador3 <= contador3 + 28'd1;
end
end
always @(*) begin
out = (s == 2'b00) ? frecuencia0 :
(s == 2'b01) ? frecuencia1 :
(s == 2'b10) ? frecuencia2 :
(s == 2'b11) ? frecuencia3 :
1'b0;
end
endmodule
esto seria todo espero les haya gustado.