|
本帖最后由 lcytms 于 2016-11-10 09:23 编辑
新建改进的任意分频模块divider2.v。
将改进的任意分频模块divider2.v设置为顶层模块。
将原有的显式建模方式改为隐式建模方式,原有生成out_clk_2时采用~clk作为时钟,现在改用negedge clk触发。
同步由原来的复位信号同步,改为cnt计数器同步。
这样避免了原有的长时间运行后同步出错可能性。
改进的任意分频模块divider2.v代码如下。
module divider2 (clk, rst_n, clk_out);
input clk, rst_n;
output clk_out;
parameter WIDTH = 3; // WIDTH = 3
wire [25:0] HW, LW;
assign HW = WIDTH>>1;
assign LW = (WIDTH+1)>>1;
reg out_clk_1, out_clk_2;
reg state1, state2;
localparam s0 = 1'b0,
s1 = 1'b1;
reg [25:0] cnt;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
cnt <= 0;
out_clk_1 <= 1;
state1 <= s0;
end
else
begin
case (state1)
s0 : begin // HW part
if (cnt < HW - 1)
begin
cnt <= cnt + 26'b1;
out_clk_1 <= 1;
state1 <= s0;
end
else
begin
cnt <= 0;
out_clk_1 <= 1;
state1 <= s1;
end
end
s1 : begin // LW part
if (cnt < LW - 1)
begin
cnt <= cnt + 26'b1;
out_clk_1 <= 0;
state1 <= s1;
end
else
begin
cnt <= 0;
out_clk_1 <= 0;
state1 <= s0;
end
end
default : state1 <= s0;
endcase
end
end
always @ (negedge clk or negedge rst_n)
begin
if (!rst_n)
begin
out_clk_2 <= 1;
state2 <= s0;
end
else
begin
case (state2)
s0 : begin // HW part
if (cnt < HW - 1)
begin
out_clk_2 <= 1;
state2 <= s0;
end
else
begin
out_clk_2 <= 1;
state2 <= s1;
end
end
s1 : begin // LW part
if (cnt < LW - 1)
begin
out_clk_2 <= 0;
state2 <= s1;
end
else
begin
out_clk_2 <= 0;
state2 <= s0;
end
end
default : state2 <= s0;
endcase
end
end
assign clk_out = (WIDTH & 1'b1) ? (out_clk_1 || out_clk_2) : out_clk_1;
endmodule
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册
x
|