IPO 发表于 2011-6-30 06:00:10

一道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

IPO 发表于 2011-6-30 06:00:24

这样的话占空比不是50%的吧

IPO 发表于 2011-6-30 06:00:51

不可以先倍频然后直接9分频么·?还是只能用代码实现不能用FPGA内部工具?

IPO 发表于 2011-6-30 06:01:10

首先语法就不对。verilog要求同一个reg不能同时在不同的always块里赋值。

IPO 发表于 2011-6-30 06:01:22

1.always中要加rst吧
2.得到的是九分频,占空比为4/9

IPO 发表于 2011-6-30 06:01:39

,为什么不把上升下降沿写到同一个always模块中,两个always模块使用同一个reg变量很容易出错。

IPO 发表于 2011-6-30 06:01:53

错误1:同一个reg(即couter)在两个always里面赋值!!!
错误2:两个always还一个上升沿,一个下降沿!!!
错误3:对clock进行组合选择(assign divout =(counter==1)?1:0;),虽然你的代码等效于(assign divout =counter;),其实并不是组合logic,但是这样的设计观念是错误的!!!

所以根本不用看你的design function是不是4.5分频。

IPO 发表于 2011-6-30 06:02:15

计数器未清零.
没有用两个计数器.
没有考虑组合逻辑可能引入的问题, 最终输出没有用时钟同步.

IPO 发表于 2011-6-30 06:02:30

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

IPO 发表于 2011-6-30 06:02:52

对于非整数分频器,推荐使用2钟方法:
1、分频比交错法;
2、累加器分频法;
而且这2种方法占空比基本达不到50%,而是统计意义上的非整数分频。
页: [1]
查看完整版本: 一道fpga笔试题 4.5分频