verilog实现5分频,要求输出50%占空比?(附代码)

本文详细介绍了如何使用Verilog语言实现时钟分频器的三种不同方法:计数器与或运算、计数器与异或运算以及状态机方法。每种方法都通过构建计数器并在特定条件翻转输出信号,最终通过或运算得到50%占空比的分频时钟信号。
摘要由CSDN通过智能技术生成

回答:一般有3种思路:一是通过计数器和或运算实现,二是计数器和xor运算实现,三是通过状态机实现。下面分别写出上述三种思路对应的代码

//方法1:一是通过计数器、或运算实现
Module		AAA(
Input	clk,
Input	rst_n,
Output	clk_out
);

Reg				clk_pos ;
Reg				clk_neg ;
Reg		[2:0]	cnt_pos;
Reg		[2:0]	cnt_neg;
//进行pos计数器构造
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
cnt_pos <= 3’b000 ;
end
else
if(cnt_pos ==4)
begin
cnt_pos <= 3’b000 ;
end
else
begin
cnt_pos <= cnt_pos +1’b1 ;
end

end
//进行neg计数器构造
always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
cnt_neg <= 3’b000 ;
end
else
if(cnt_neg ==4)
begin
cnt_neg <= 3’b000 ;
end
else
begin
cnt_neg <= cnt_neg +1’b1 ;
end

end
//下面进行分频技术pos
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
clk_pos <= 0 ;
end
else
if(cnt_pos ==0 || cnt_pos ==2) //此处需要注意翻转的时刻
begin
clk_pos <= ~clk_pos ;
end
else
begin
clk_pos <= clk_pos ;
end

end

always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
clk_neg <= 0 ;
end
else
if(cnt_neg ==0 || cnt_neg ==2)
begin
clk_neg <= ~ clk_neg ;
end
else
begin
clk_neg <= clk_neg ;
end

end

assign clk_out <= clk_pos | clk_neg ; //或运算
endmodule
//方法2:通过计数器和xor运算实现
Module		AAA(
Input	clk,
Input	rst_n,
Output	clk_out
);

Reg				clk_pos ;
Reg				clk_neg ;
Reg		[2:0]	cnt_pos;
Reg		[2:0]	cnt_neg;
//进行pos计数器构造
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
cnt_pos <= 3’b000 ;
end
else
if(cnt_pos ==4)
begin
cnt_pos <= 3’b000 ;
end
else
begin
cnt_pos <= cnt_pos +1’b1 ;
end

end
//进行neg计数器构造
always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
cnt_neg <= 3’b000 ;
end
else
if(cnt_neg ==4)
begin
cnt_neg <= 3’b000 ;
end
else
begin
cnt_neg <= cnt_neg +1’b1 ;
end

end
//下面进行分频技术pos
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
clk_pos <= 0 ;
end
else
if(cnt_pos ==0) //此处需要注意翻转的时刻
begin
clk_pos <= ~clk_pos ;
end
else
begin
clk_pos <= clk_pos ;
end

end

always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
clk_neg <= 0 ;
end
else
if(cnt_neg ==2) //此处需要注意翻转的时刻
begin
clk_neg <= ~ clk_neg ;
end
else
begin
clk_neg <= clk_neg ;
end

end

assign clk_out <= clk_pos ^clk_neg ; //或运算
endmodule

//方法3:使用状态机实现分频
//原理上可以理解成:首先实现的是6+4效果,再利用posedge和negedge相差半个时钟即1个山峰,最后利用或运算将6+4变成了5+5效果。实现50%占空比的效果。
Module(
Input	clk,
Input	rst_n,
Output	clk_out
);

Reg		[3:0]	state1 ;
Reg		[3:0]	state2 ;

//构造上升沿的5分频
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
state1 <= 4’b0000 ;
end
else
begin
case(state1)
4’b0000: state1 <= 4’b0010;
4’b0010: state1 <= 4’b0110;
4’b0110: state1 <= 4’b0001;
4’b0001: state1 <= 4’b0011;
4’b0011: state1 <= 4’b0000;
Default: state1 <= 4’b0000;
endcase

end
end
//构造下降沿的5分频
always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
state2 <= 4’b0 ;
end
else
begin
case(state2)
4’b0000: state2 <= 4’b0010;
4’b0010: state2 <= 4’b0110;
4’b0110: state2 <= 4’b0001;
4’b0001: state2 <= 4’b0011;
4’b0011: state2 <= 4’b0000;
Default: state2 <= 4’b0000;
endcase

end
end

assign clk_out = state1[0] | state2[0] ;//进行或运算得到50%分频效果
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值