打印

用verilog写的可控分频器的出错的疑问

[复制链接]
1948|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
playjian|  楼主 | 2011-5-3 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这段代码~~输入一个时钟,默认情况下对clk10分频后从clkout输出

fdown来一个上升沿那么变成12分频,再来一个变成14分频。
fup来一个上升沿~~就减少分频比,比如原来是12分频,来一个fup的上升沿变成10分频
module text(clk,clkout,fdown,fup);
    input clk;
    input fdown;
    input fup;
    wire clk;
    wire fdown;
    wire fup;
    output clkout;
    reg clkout;
    integer count;         
    integer countcp;
        
    initial
        begin
            count = 0;
            countcp = 4;
        end
   
    always @(posedge clk)
        begin
            if(count == countcp)
                begin
                    count = 0;
                    clkout = ~clkout;
                end
            else
                begin
                    count = count + 1;
                end
        end
    always @(posedge fdown,posedge fup)
        begin
            if(fdown)
                begin
                    countcp = countcp + 1;
                end
            else
                begin
                    countcp = countcp - 1;
                end
        end
endmodule

但是用quartus仿真出来后~~fup可以实现功能,但是如果用fdown不能实现预想的功能
能分析下为什么么~~谢谢大家~~弄了一个下午了~

相关帖子

沙发
sxhhhjicbb| | 2011-5-4 00:09 | 只看该作者
always @(posedge fdown,posedge fup)这种受二个时钟沿控制的触发器,一般不这样用.FPGA中的D触发器都是一个钟控制的,LZ想像一下硬件电路,看是否合理.还是按硬件电路的习惯做成单主时钟的同步逻辑吧.

使用特权

评论回复
板凳
playjian|  楼主 | 2011-5-4 12:59 | 只看该作者
2# sxhhhjicbb
要是改成不同的时钟去控制,用两个always模块
   always @(posedge fdown)
        begin
            if(fdown)
                begin
                    countcp = countcp + 1;
                end
        
        end

  always @(posedge fup)
        begin
            if(fup)
                begin
                    countcp = countcp - 1;
                end
        
        end
编译的时候还是错~~貌似是说在两个并行的always里面对同一个变量进行赋值~~也是不可以的~~楼主能说说你的想法么~这种问题怎么样能解决~~刚接触fpga~~还在入门呢~谢谢了~

使用特权

评论回复
地板
sxhhhjicbb| | 2011-5-4 17:28 | 只看该作者
首先countcp = countcp - 1;这个要改成阻塞式赋值,"<=",
然后countcp = countcp - 1;中的countcp 不能在二个always中被赋值.编译出错应该是重复赋值问题.
在一个alwyas(posedge sys_clk)中用主时钟sys_clk去采样fup,fdown.
采样上升沿的方法可以这样实现:
reg [1:0] cap_fup;
always @(posedge sys_clk)
begin
  cap_fup <= {cap_fup[0],fup}
  if(cap_fup == 2'b01)
  begin
    countcp = countcp - 1;
  end
end

使用特权

评论回复
5
tear086| | 2011-5-4 17:57 | 只看该作者
哪里有什么可控分频器。你要写n个分频器,然后给出不同控制字,选择不同分频器。

使用特权

评论回复
6
playjian|  楼主 | 2011-5-4 18:08 | 只看该作者
4# sxhhhjicbb 我看看~~理解一下你的意思~~应该如你说的那样~~~再主时钟里面去采样~~我晚点写好了试一试~~谢谢了~~O(∩_∩)O

使用特权

评论回复
7
playjian|  楼主 | 2011-5-4 18:08 | 只看该作者
5# tear086 ??能说的具体点么~?

使用特权

评论回复
8
tear086| | 2011-5-4 23:25 | 只看该作者
可以参考一下俺的pwm,自己修改一个吧。
http://www.cnblogs.com/yuphone/archive/2011/04/16/2017680.html

使用特权

评论回复
9
playjian|  楼主 | 2011-5-5 15:19 | 只看该作者
8# tear086 谢谢~我先看看~~O(∩_∩)O

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

107

帖子

2

粉丝