|  | 
 
 楼主|
发表于 2010-12-8 19:19:47
|
显示全部楼层 
| 本帖最后由 mustangyhz 于 2010-12-8 20:34 编辑 
 想做小数分频的PLL.准备用一阶的sigma-delta modulator[累加器]输出控制2/3分频器,后面接100分频,实现200~201分频。单独在ius里仿真累加器和2/3分频器都没有问题:
 
   【累加器】各信号依次为输出平均值、输出值、输出总和、复位
 
   【分频器】各信号依次为分频系数切换使能、分频输入、分频输出、切换控制输入、切换控制输出
 但是我把累加器做成一个cellview,做混合仿真的时候就其输出怎么都不对了,输出不再是0、1交替变化,而是一直为0,一样的代码,为什么?谁能解释下吗?
  累加器 分频器.rar
            
            (93.78 KB , 下载次数:
                25 ) 累加器代码:
 module modulator(clk, rst, v_out);
 input clk, rst;
 //input [28:0] k_in;
 output  v_out;
 reg  v_out;
 reg [28:0] a1;
 wire [28:0] s1,q1;
 wire  c1;
 assign s1 = 29'b00100110011010011010110101000 + a1;
 assign c1 = {s1[28]};
 assign q1={s1[27:0] };
 always@(posedge clk or posedge rst)
 begin
 if(rst) a1<=29'h0;
 else a1<=q1;
 end
 always@(posedge clk or posedge rst)
 begin
 if(rst)
 begin
 v_out<=1'b01;
 end
 else
 begin
 v_out<=c1;
 end
 end
 endmodule
 仿真顶层文件
 `timescale 1ps / 1ps
 
 module test;
 
 reg clk;
 
 reg rst;
 
 reg [31:0] bout_sum, clk_sum, averange;
 wire bout;
 
 modulator M1(clk, rst, bout);
 
 always #1 clk = ~clk;
 
 initial
 
 begin
 
 bout_sum = 32'b0;
 
 clk_sum = 32'b0;
 
 averange = 32'b0;
 
 clk = 1'b0;
 
 rst = 1'b1;
 
 #2 rst=1'b0;
 
 #10000 $stop;
 
 end
 
 always@(posedge clk or posedge rst)
 
 begin
 
 if (rst)
 begin
 
 bout_sum = 32'b0;
 
 clk_sum = 32'b0;
 
 averange = 32'b0;
 
 end
 
 else
 
 begin
 bout_sum = bout_sum + bout ;
 clk_sum = clk_sum + 1;
 averange = {bout_sum,28'b0}/clk_sum;
 
 end
 
 end
 
 endmodule
 我查看了下cellview内部信号,除了clk和rst【这两个是外接的信号】外都是不确定的,这是什么原因?其实我无非是把上述顶层文件中的时钟信号和复位信号改成了外接具体信号的形式,其它没有什么变化。为什么会出错呢?
 
   各信号依次为:上一时刻累加器量化误差、进位输出、控制时钟、当前量化误差、复位、累加结果
 | 
 |