集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2990|回复: 9

一道fpga笔试题 4.5分频

[复制链接]
IPO 发表于 2011-6-30 06:00:10 | 显示全部楼层 |阅读模式
我的方案,上下沿都计数,最后实现的代码如下,代码风格可能不好!
大家一起品评下,是否还有好的方案!
希望拍转!


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
 楼主| 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[2]==1)?1:0;),虽然你的代码等效于(assign divout =counter[2];),其实并不是组合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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-23 15:01 , Processed in 0.088313 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表