4.5分频
我的方案,上下沿都计数,最后实现的代码如下,代码风格可能不好!
大家一起品评下,是否还有好的方案!
希望拍转!
module Div(clk,rst,divout);
input clk,rst;
output divout;
reg[3:0] counter;
always @(posedge clk) begin
if (rst)
counter=0;
else if(counter==8)
counter=0;
else
counter=counter+1;
end
always @(negedge clk)
begin
if (rst)
counter=0;
else if(counter==8)
counter=0;
else
counter=counter+1;
end
assign divout =(counter[2]==1)?1:0;
endmodule
这个
不知道你是否验证过了?没报什么错误么?
这样的话占空比不是50%的吧?
不可以先倍频然后直接9分频么·?还是只能用代码实现不能用FPGA内部工具?
1.always中要加rst吧
2.得到的是九分频,占空比为4/9
首先语法就不对。verilog要求同一个reg不能同时在不同的always块里赋值。
6# wycawyc
是 是
我就是这个意思~
同意5楼的说法,另外,为什么不把上升下降沿写到同一个always模块中,两个always模块使用同一个reg变量很容易出错。
同意8楼,写在同一个always里会好些吧。
错误1:同一个reg(即couter)在两个always里面赋值!
错误2:两个always还一个上升沿,一个下降沿!
错误3:对clock进行组合选择(assign divout =(counter[2]==1)?1:0;),虽然你的代码等效于(assign divout =counter[2];),其实并不是组合logic,但是这样的设计观念是错误的!
所以根本不用看你的design function是不是4.5分频。
同一个always模块能对同一个时钟信号的上升沿河下降沿触发?比如
always @(posedge clk, negedge clk),这个不对吧。
学习学习!
这电路做的,仿真呢都通不过
这样做明显有问题.
计数器未清零.
没有用两个计数器.
没有考虑组合逻辑可能引入的问题, 最终输出没有用时钟同步.
三分频电路, 小编考虑过没?
三分频电路, 可以采用类似的做法.
always @(posege clk or rst)
begin
if (rst)
div3_reg <= 1'b0;
else begin
if (cnt==2'b00 || cnt ==2'b01) div3_reg <= 1'b0;
else if (cnt == 2'b10) div3_reg <= 1'b1;
else div3_reg <= 1'b0;
end
end
alwasy @(posedge clk or rst)
begin
if (rst)
cnt <= 2'b00;
else if (cnt <=2'b10)
cnt <= cnt + 1;
else
cnt <= 2'b00;
end
always @(negedge clk or posedge rst)
begin
if (rst)
neg_cnt <= 2'b00;
else if (neg_cnt <= 2'b10)
neg_cnt <= neg_cnt + 1;
else
neg_cnt <= 2'b00;
end
余下的稍后补充.
楼上正解,学习了
xuexiexuexi
用一个计数器行不?然后后面两个T出发,一个上升,一个下降!
对于非整数分频器,推荐使用2钟方法:
1、分频比交错法;
2、累加器分频法;
而且这2种方法占空比基本达不到50%,而是统计意义上的非整数分频。
学习了 谢谢
LZ,你上下边沿均采集的话,在FPGA中是实现不了的,在FPGA中最基本的单元是LUT或者是SLICE,存储单元是FF或者是LATCH,这些东西是不支持双边沿采集的。所以小编的思路就有问题。4.5分频的方法有多种,可以先实现4分频,就是模4计数器,然后再实现0.5.
小编,建议你看一下这篇文章。clock dividers made easy
里边的分频方案就很好。
