我写的任意奇数分频,大家挑一下毛病
时间:10-02
整理:3721RD
点击:
module divide(clk,reset,clk_out,clk_out1,clk_out2);
input clk,reset;
output clk_out,clk_out1,clk_out2;
parameter N=7;
reg[N/2:0] qq,dq;
reg clk_out1,clk_out2;
always @(posedge clk)
begin
if(!reset)
qq<=0;
else
qq<=qq+1;
if(qq==N-1)
begin
qq<=0;
end
end
always @(qq)
begin
if(qq<N/2)
clk_out1<=1;
else
clk_out1<=0;
end
always @(negedge clk)
begin
if(!reset)
dq<=0;
else
dq<=dq+1;
if(dq==N-1)
begin
dq<=0;
end
end
always @(dq)
begin
if(dq<N/2)
clk_out2<=1;
else
clk_out2<=0;
end
assign clk_out=clk_out1||clk_out2;
endmodule
input clk,reset;
output clk_out,clk_out1,clk_out2;
parameter N=7;
reg[N/2:0] qq,dq;
reg clk_out1,clk_out2;
always @(posedge clk)
begin
if(!reset)
qq<=0;
else
qq<=qq+1;
if(qq==N-1)
begin
qq<=0;
end
end
always @(qq)
begin
if(qq<N/2)
clk_out1<=1;
else
clk_out1<=0;
end
always @(negedge clk)
begin
if(!reset)
dq<=0;
else
dq<=dq+1;
if(dq==N-1)
begin
dq<=0;
end
end
always @(dq)
begin
if(dq<N/2)
clk_out2<=1;
else
clk_out2<=0;
end
assign clk_out=clk_out1||clk_out2;
endmodule
怎么没人说呀?
我学vhdl的,不懂你的东东。
呵呵,我也是学vhdl看不懂啊,能给个vhdl的么?
大概看了看,应该是50%的duty cycle
不错不错,
就是不应该在always的触发事件中用negedge,
所有dff都应该用一样的edge触发,
可以用时钟取反再去count,用“clk_neg”来做dq,
还有一个always下用两套if-else会不会不太好,
不大清楚,但是很少见这样写code
可以只用一个if-else,但是多层嵌套
一家之言,呵呵
以前面试写过一个19分频,
要求近似50%dutycycle,
所以做了两个14,15counter,
没有用反沿来做
不错,粘下来研究研究
always 中可以使用negedge的吧,如果如上所说修改时钟的话反而不好,无故的增加时钟树的难度
另外,always触发条件中用电平触发容易产生锁存器,是不好的编码风格吧
我也只学了1年半哈,有不对的地方大家多指教哈
我写过三分频的,认为任意奇数分频不成问题
reg[N/2:0] qq,dq;
这是什么?N=7,7/2=3.5吗?
他们的宽度是3,还是4,还是3.5,
汗,我搞了3年FPGA了,这个问题现在才考虑到!
ISE上的综合结果是4个位宽
看回复才知,这个论坛上的人多数"很傻很天真",可能也包括我自己!
总觉的这种实现方式不大好
既然用到时钟的双沿,其实就相当于了倍频
首先要考虑输入时钟的稳定性
再者要考虑实际器件是否能达到倍频的时钟频率,如果器件比较低端,输入时钟很高,这种方式就不大可行.
奇数分频时钟要达到50%的占空比不大好实现.
尽量减少奇数分频的情况