在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1809|回复: 9

[讨论] 请问下这个单级的CIC滤波器仿真出来怎么有个尖峰啊?

[复制链接]
发表于 2023-2-26 18:15:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本人小白,刚开始学,这是单级的CIC滤波器的代码,仿真得到的波形总是有个尖峰是怎么回事?有没有大佬知道的

                               
登录/注册后可看大图


另外,想问下在频域怎么看这个的通带、阻带这些指标。麻烦路过的大佬们指教一下,不胜感激

发表于 2023-2-27 09:23:00 | 显示全部楼层
自己手写的?还是用的CIC的IP?
 楼主| 发表于 2023-2-27 10:06:29 | 显示全部楼层


jinj198908 发表于 2023-2-27 09:23
自己手写的?还是用的CIC的IP?



写的代码如下,不知道问题出在哪里,另外想问下,比如我定义这个系统时钟是50MHz,那我怎么验证它是不是50MHz呢
`timescale 1ns / 1ps       

module SingleCIC_Decimation
(
    input sclk,   
    input rst_n,   
    input signed [7:0] din,   
    output tvalid,            
    output signed [10:0] dout  
);

reg tvalid_reg;
reg [2:0] cnt;     
reg signed [10:0] sum, dout_reg;

always @ (posedge sclk or negedge rst_n)
    if (!rst_n) begin
        cnt <= 'd0; tvalid_reg <= 1'b0;
        sum <= 'd0; dout_reg <= 'd0;
    end
    else begin
        if (cnt == 4) begin   
            tvalid_reg <= 1'b1;
            dout_reg <= sum + din;  
            cnt <= 'd0;
            sum <= 'd0;
        end
        else begin
            tvalid_reg <= 1'b0;
            sum <= sum + din;   
            cnt <= cnt + 1'b1;
        end
    end

assign dout = dout_reg;
assign tvalid = tvalid_reg;

endmodule

发表于 2023-2-27 10:49:39 | 显示全部楼层
本帖最后由 jinj198908 于 2023-2-27 11:00 编辑


代码本身好像没啥问题,你测试用例里面是不是定时在复位?
你测试用例里给的时钟是50M,那就是50M
 楼主| 发表于 2023-2-27 11:10:50 | 显示全部楼层


jinj198908 发表于 2023-2-27 10:49
代码本身好像没啥问题,你测试用例里面是不是定时在复位?
你测试用例里给的时钟是50M,那就是50M ...



测试代码是这样的,延时1000ns,复位。是这个延时时间不对是吗
`timescale 1ns / 1ps

module tb();
reg                 sclk            ;
reg                 rst_n           ;
wire                rvalid          ;
reg         [7:0]   din             ;
wire                tvalid          ;
wire        [10:0]  dout            ;     
reg            [7:0] data_mem  [0:255] ;  
reg            [7:0]    i;

initial begin
    sclk            =           1'b0;
    rst_n           <=          1'b0;
    #(1000);
    rst_n           <=          1'b1;
    $readmemh("sin.txt",data_mem);
end

always #(10) sclk = ~sclk;

always @(posedge sclk)

    if(!rst_n)
        begin
        din <= 8'd0;
        i <= 8'd0;
        end
    else
        begin
        din <= data_mem;
        i <= i + 8'd1;
        end

SingleCIC_Decimation cic_dec(
    .sclk                       (sclk                       ),
    .rst_n                      (rst_n                      ),
    .din                        (din                    ),
    .tvalid                     (tvalid                     ),
    .dout                       (dout                       )
);

endmodule

发表于 2023-2-27 11:41:22 | 显示全部楼层
问题原因是你定义的都是有符号数

                               
登录/注册后可看大图

但是你输入的数据是无符号数

                               
登录/注册后可看大图

而且不同位宽的有符号数不能直接相加
发表于 2023-2-27 15:39:39 | 显示全部楼层
看看
 楼主| 发表于 2023-2-27 16:16:29 | 显示全部楼层


jinj198908 发表于 2023-2-27 11:41
问题原因是你定义的都是有符号数
但是你输入的数据是无符号数
而且不同位宽的有符号数不能直接相加


感谢指点,那我直接把符号数的定义给删掉就好了吧,删除后的波形确实没问题了。都定义无符号数会不会导致溢出或者其他情况出现呢?

                               
登录/注册后可看大图

另外想请问下,这个只能算作功能验证吧,我该怎么去看该CIC的通带频率和阻带频率呢

发表于 2023-2-27 16:30:28 | 显示全部楼层


荒何 发表于 2023-2-27 16:16
感谢指点,那我直接把符号数的定义给删掉就好了吧,删除后的波形确实没问题了。都定义无符号数会不会导致 ...


一般都有专门的CIC的IP的,里面可以直接看。自己写的代码是先有算法,再有代码,是根据通带和阻带频率设计相应的算法,然后FPGA去实现,而不是根据FPGA代码去反推
 楼主| 发表于 2023-2-27 19:11:46 | 显示全部楼层


jinj198908 发表于 2023-2-27 16:30
一般都有专门的CIC的IP的,里面可以直接看。自己写的代码是先有算法,再有代码,是根据通带和阻带频率设 ...



打扰您再问下:
1.您说的算法是用matlab建模生成滤波器系数吗?还是什么
2.那这样的话,像我这种直接Verilog写出来的单级的CIC,是没有通带截止频率和阻带截止频率的,那还能算一个滤波器吗

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-5-16 07:13 , Processed in 0.033797 second(s), 8 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表