一道fpga笔试题 4.5分频
我的方案,上下沿都计数,最后实现的代码如下,代码风格可能不好!大家一起品评下,是否还有好的方案!
希望拍转!
module Div(clk,rst,divout);
input clk,rst;
output divout;
reg 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==1)?1:0;
endmodule 这样的话占空比不是50%的吧 不可以先倍频然后直接9分频么·?还是只能用代码实现不能用FPGA内部工具? 首先语法就不对。verilog要求同一个reg不能同时在不同的always块里赋值。 1.always中要加rst吧
2.得到的是九分频,占空比为4/9 ,为什么不把上升下降沿写到同一个always模块中,两个always模块使用同一个reg变量很容易出错。 错误1:同一个reg(即couter)在两个always里面赋值!!!
错误2:两个always还一个上升沿,一个下降沿!!!
错误3:对clock进行组合选择(assign divout =(counter==1)?1:0;),虽然你的代码等效于(assign divout =counter;),其实并不是组合logic,但是这样的设计观念是错误的!!!
所以根本不用看你的design function是不是4.5分频。 计数器未清零.
没有用两个计数器.
没有考虑组合逻辑可能引入的问题, 最终输出没有用时钟同步. 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 对于非整数分频器,推荐使用2钟方法:
1、分频比交错法;
2、累加器分频法;
而且这2种方法占空比基本达不到50%,而是统计意义上的非整数分频。
页:
[1]