基于fpga时钟切换电路设计,为避免glitch产生clk时钟寄存变量clk_get_r需被赋值为clk与clk_r相与,主体代码如下:
module clk_switch#(parameter size=3)(
input [size-1:0]clk, //时钟输入
input rst_n, //复位信号
input [size-1:0]sel, //选择信号
output clk_get //时钟输出
);
wire [size-1:0]clk_get_r; //时钟寄存变量
reg [size-1:0]clk_r1; //选择寄存变量
reg [size-1:0]clk_r; //选择寄存变量
wire [size-1:0]sel_r={{size-1{1'b0}},1'b1};
generate
begin:xhdl
genvar i;
for(i=0;i<size;i=i+1)
begin:value
always@(posedge clk[i] or negedge rst_n)
begin
if(!rst_n)begin
clk_r1[i]<=(i==0);
end
else begin
clk_r1[i]<=(&{((~clk_r)|(sel_r<<i)),sel[i]});
end
end
always@(negedge clk[i] or negedge rst_n)
begin
if(!rst_n)begin
clk_r[i]<=(i==0);
end
else begin
clk_r[i]<=clk_r1[i];
end
end
end
end
endgenerate
assign clk_get_r=clk&clk_r;
assign clk_get=|(clk_get_r);
endmodule