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

[复制链接]
3228|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
tear086 发表于 2011-5-4 17:57 | 显示全部楼层
哪里有什么可控分频器。你要写n个分频器,然后给出不同控制字,选择不同分频器。
 楼主| playjian 发表于 2011-5-4 18:08 | 显示全部楼层
4# sxhhhjicbb 我看看~~理解一下你的意思~~应该如你说的那样~~~再主时钟里面去采样~~我晚点写好了试一试~~谢谢了~~O(∩_∩)O
 楼主| playjian 发表于 2011-5-4 18:08 | 显示全部楼层
5# tear086 ??能说的具体点么~?
tear086 发表于 2011-5-4 23:25 | 显示全部楼层
可以参考一下俺的pwm,自己修改一个吧。
http://www.cnblogs.com/yuphone/archive/2011/04/16/2017680.html
 楼主| playjian 发表于 2011-5-5 15:19 | 显示全部楼层
8# tear086 谢谢~我先看看~~O(∩_∩)O
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

107

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部