# cic_filter **Repository Path**: springlevi/cic_filter ## Basic Information - **Project Name**: cic_filter - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-14 - **Last Updated**: 2025-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cic_filter - 通信IC设计里面有CIC滤波器的原理和code,写一个真正可用可综合的CIC,指标如下 - 输入4bit信号 - 输入96M clock - 降采样到4M clock - 做5阶 - SDADC工作在96M - num=[1,-2.994219815030523,2.994219815030523,-1] - den=[1,-2.33063271405379,1.866676648819709,-0.508718943549610] - matlab产生一个400K的sin wave信号s,采样率是96M - x = awgn(s, snr) - y = filter(num,den,x) - y就是SDM的输出,画频谱 - y量化成4bit的信号,给到CIC - num=[1,-2.994219815030523,2.994219815030523,-1] - den=[1,-2.33063271405379,1.866676648819709,-0.508718943549610] - matlab产生一个400K的sin wave信号s,采样率是96M - x = awgn(s, snr) - y = filter(num,den,x) - y就是SDM的输出,画频谱 - notice - 可能需要分级 - 输入是无符号数 - 输出是有符号数 - 问题 - matlab里面,不管积分还是差分,输出要做wrap - 做wrap,需要知道数据位宽,我增加了output_bit的计算,原理论文上面有 - wrap的意义是,累加超过最大的时候,wrap回0.对应到matlab的code就是mod(取模). - CIC一般输入是无符号数,在做完差分之后,输出再转成有符号数 - RTL里面,无符号数转有符号数(偏移二进制转补码)的方法是,高位取反.同理,补码转偏移二进制也是高位取反 > y = filter(num,den,x)频率响应 ![image-20250424160547792](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20250424160547792.png) ![image-20250424162214880](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20250424162214880.png) > %实际输出和参考输出数值对比(无符号) > > plot(t_temp,cic_output/(1e7),t_temp,output_ref/(1e7)) ![image-20250424220024402](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20250424220024402.png) 放大: ![image-20250424220113068](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20250424220113068.png) ![image-20250424220424298](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20250424220424298.png) > RTL里面,无符号数转有符号数(偏移二进制转补码)的方法是,高位取反.同理,补码转偏移二进制也是高位取反 ![image-20250427150637045](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20250427150637045.png) **偏移二进制**:通过无符号值减去偏移量(如 2n−12^{n-1}2n−1)表示有符号数。 **补码**:通过符号位和取反加一规则表示有符号数。 **转换原理**:在 RTL层面,偏移二进制和补码之间的转换只需将最高位取反。 二进制数的“表示形式”取决于变量的类型,而非计算过程本身 因为`dat_out` 被声明为有符号数,那么赋值给它的任何数值都会被自动解释为补码表示。 减去 2^{26} 后的值 S=U− 2^{26}一个有符号的数值,直接赋值给 `dat_out` 时,Verilog 会将其存储为补码形式,无需额外操作 ```verilog always @(posedge clk or negedge rstn) begin if (!rstn) dat_out <= 27'sd0; else if (phase_1) dat_out <= section_out10 - 27'd67108864; // 减去 2^26 //dat_out <= {~section_out10[26], section_out10[25:0]}; en ```