Нужно сделать переключение 4-х клоков, без глитча во время переключения. Это можно сделать с помощью одного мультиплексора 4-в-1 вида
CODE
module clock_switcher4clock
(
clkina ,
clkinb ,
clkinc ,
clkind ,
sel , // clkout = (sel == 0/1/2/3) -> clkina/clkinb/clkinc/clkind
clkout
);
//------------------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------------------
input logic clkina;
input logic clkinb;
input logic clkinc;
input logic clkind;
input logic [1 : 0] sel ; // clkout = (sel == 0/1/2/3) -> clkina/clkinb/clkinc/clkind
output logic clkout;
//------------------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------------------
logic ctrla;
logic ctrlb;
logic ctrlc;
logic ctrld;
logic [1:0] muxa;
logic [1:0] muxb;
logic [1:0] muxc;
logic [1:0] muxd;
//------------------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------------------
// synthesis translate_off
initial begin : ini
muxa = '0;
muxb = '0;
muxc = '0;
muxd = '0;
end
// synthesis translate_on
//------------------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------------------
assign ctrla = ~sel[1] & ~sel[0] & ~muxb[1] & ~muxc[1] & ~muxd[1];
assign ctrlb = ~sel[1] & sel[0] & ~muxa[1] & ~muxc[1] & ~muxd[1];
assign ctrlc = sel[1] & ~sel[0] & ~muxa[1] & ~muxb[1] & ~muxd[1] ;
assign ctrld = sel[1] & sel[0] & ~muxa[1] & ~muxb[1] & ~muxc[1];
always_ff @(negedge clkina) begin
muxa <= {muxa[0], ctrla};
end
always_ff @(negedge clkinb) begin
muxb <= {muxb[0], ctrlb};
end
always_ff @(negedge clkinc) begin
muxc <= {muxc[0], ctrlc};
end
always_ff @(negedge clkind ) begin
muxd <= {muxd[0], ctrld};
end
assign clkout = (muxa[1] & clkina) | (muxb[1] & clkinb) | (muxc[1] & clkinc) | (muxd[1] & clkind);
endmodule
или с помошью четырех мультиплексоров 2-в-1 вида
CODE
assign ctrla = ~sel & ~muxb[1];
assign ctrlb = sel & ~muxa[1];
always_ff @(negedge clkina) begin
muxa <= {muxa[0], ctrla};
end
always_ff @(negedge clkinb) begin
muxb <= {muxb[0], ctrlb};
end
assign clkout = (muxa[1] & clkina) | (muxb[1] & clkinb);
Мне кажеться что оба варианта должны быть работоспособны, но может быть я ошибаюсь. Подскажите какой вариант является более правильным?
ЗЫ. Вариант использовать альтеровскую корку не предлагать, она не может покрыть всех вариантов используемых клоков %)