|

楼主 |
发表于 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【这两个是外接的信号】外都是不确定的,这是什么原因?其实我无非是把上述顶层文件中的时钟信号和复位信号改成了外接具体信号的形式,其它没有什么变化。为什么会出错呢?
各信号依次为:上一时刻累加器量化误差、进位输出、控制时钟、当前量化误差、复位、累加结果 |
|