微弱信号二次谐波检测的FPGA的实现-总结
首先还是把握大的系统框架:
我要实现的部分不包括DA以及AD的转换,主要是将SSP接收到的数据送入到FIFO中,然后经过FIR带通滤波器的处理后对该信号计算幅值并做PSD,然后处理的信号经过积分够一方面送入到FIFO一方面进行均值滤波(实际上就是在一定的积分门时间内做累加操作)。最后结果通过通信模块RS232 送入到上位机,此外信号源2经过缓冲放大然后AD转换后送入到FIFO,也是通过RS232送入到上位机。
二次谐波幅值计算
先计算二次谐波幅值。
二次谐波的计算主要利用的是正余弦信号的周期性;信号经FIR带通滤波后主要含有8kHz的二次谐波,可用公式表示为
(4.5.1)
其中,是二次谐波幅值,,
将各次采样的点编号为1,2,3,4,5,6,7,8,那么这8采样的表达式的相位之间满足相差90度
A/D转换器的采样频率为64kHz而二次谐波频率为8kHz,即一个周期采样8个点,所以有
A0^2+A2^2=A^2,而且A1^2+A3^2=A^2;
通过40次定时中断采样40个点,32阶的FIR带通滤波器滤波后的最后8个点作为计算二次谐波幅值的数据点,因此可求得二次谐波幅值实际上就是这8次采样点的数据分别平方求和以后开根号,然后除以2(右移一位)来实现的
检波与积分反馈
在调试试验阶段预先调整好传感器输出信号与定时器匹配输出的8kHz检波信号同相(通过设置定时器计数器的初值),而设计的FIR带通滤波器不改变8kHz二次谐波的相位,在以后的测量中通过检波程序判断这两个信号是否还同相,就可知道所测信号的方向。
具体检波过程:在二次谐波的一个周期8个点内,找出最大值x[count],如果对应的检波信号c[count]为1(同相)则信号为正,如果c[count]为0(反相)则信号为负。
系统的积分是对每次计算出的二次谐波幅值进行累加求和。本系统反馈的是8K的幅值。假定幅值也是有正负的,当通过检波判断信号为正时幅值也为正,反之为负。每循环一次,计算一次二次谐波幅值,接着进行累加,然后把累加量通过D/A转换器反馈出去,直至使二次谐波幅值小于一个很小的预定值反馈才中止。此时,最后一次反馈的积分值可代表信号大小与方向。
理想情况下,预定值为0,实际情况中预定值不可能设置为0,否则系统一直反馈下去。增大预定值可以减小每次测量的反馈次数,从而使系统的测量时间更短,但是预定值也不能太大,否则积分值不能真实反映实际大小。预定值大小可以在调试程序过程中根据系统要求进行选择。
总结:这里边涉及到的主要的FPGA设计的关键部分主要有
1)多个输入的平方和开根号的问题(cordic算法来实现开根号的处理)
2)FIR带通滤波器的FPGA实现()
3)SPI传输信号的FPGA实现(FPGA作为主机,往从机发送数据的过程)
4)系统在门控时间内积分的实现(累加的过程实际上可以达到均值滤波的效果)
5)FIFO做数据缓冲模块的实现。(主要用在AD转换以及DA转换的时候两个不同类型之间的数据的缓冲的问题)
关于cordic实现求幅值的计算(开方根)
module cordic
(
//input signals
clk,
rst,
Data_i,
Data_q,
//output signals
Z_valid,
Magnitude,
y,
Phase
); /*****************************************************/
/*------- Input and Output Ports declaration --------*/
/*****************************************************/
input clk;
input rst;
input [:] Data_i;
input [:] Data_q; output Z_valid;
output [:] Magnitude;
output [:] Phase;
output [:] y;
/*****************************************************/
/*------- Ports Type declaration --------*/
/*****************************************************/
reg Z_valid;
reg [:] Magnitude;
wire [:] Phase;
reg [:] y;
/*****************************************************/
/*------- Parameters declaration --------*/
/*****************************************************/ parameter Coef0 = 'h20000; //arctan(1/2^0 ) = 45
parameter Coef1 = 'h12e40; //arctan(1/2^1 ) = 26.565051
parameter Coef2 = 'h09fb4; //arctan(1/2^2 )
parameter Coef3 = 'h05111; //arctan(1/2^3 )
parameter Coef4 = 'h028b1; //arctan(1/2^4 )
parameter Coef5 = 'h0145d; //arctan(1/2^5 )
parameter Coef6 = 'h00a2f; //arctan(1/2^6 )
parameter Coef7 = 'h00518; //arctan(1/2^7 )
parameter Coef8 = 'h0028c; //arctan(1/2^8 )
parameter Coef9 = 'h00146; //arctan(1/2^9 )
parameter Coef10 = 'h000a3; //arctan(1/2^10)
parameter Coef11 = 'h00051; //arctan(1/2^11)
parameter Coef12 = 'h00029; //arctan(1/2^12)
parameter Coef13 = 'h00014; //arctan(1/2^13)
parameter Coef14 = 'h0000a; //arctan(1/2^14)
parameter Coef15 = 'h00005; //arctan(1/2^15)
parameter Coef16 = 'h00003; //arctan(1/2^16)
parameter Coef17 = 'h00001; //arctan(1/2^17) /*****************************************************
---- Variable declaration
*****************************************************/
reg [:] Cnt; wire [:] Data_i_inv;
wire [:] Data_q_inv; reg [:] X_in_reg;
reg [:] Y_in_reg; reg [:] Data_in_reg; wire [:] X_in[:];
wire [:] Y_in[:];
wire [:] Z_in[:];
wire [:] a_in[:]; wire [:] X_out[:];
wire [:] Y_out[:];
wire [:] Z_out[:]; reg [:] Phase_reg0;
reg [:] Phase_reg1;
wire [:] Phase_carry;
reg [:] Magnitude_reg; /*****************************************************/
/*------- Main Code --------*/
/*****************************************************/ assign a_in[ ] = Coef0;
assign a_in[ ] = Coef1;
assign a_in[ ] = Coef2;
assign a_in[ ] = Coef3;
assign a_in[ ] = Coef4;
assign a_in[ ] = Coef5;
assign a_in[ ] = Coef6;
assign a_in[ ] = Coef7;
assign a_in[ ] = Coef8;
assign a_in[ ] = Coef9;
assign a_in[] = Coef10;
assign a_in[] = Coef11;
assign a_in[] = Coef12;
assign a_in[] = Coef13;
assign a_in[] = Coef14;
assign a_in[] = Coef15;
assign a_in[] = Coef16;
assign a_in[] = Coef17; always @ ( posedge clk or posedge rst )
begin
if ( rst )
Cnt <= 'b0;
else if ( Cnt < 'd20 )
Cnt <= Cnt + 'b1;
else
;
end always @ ( posedge clk or posedge rst )
begin
if ( rst )
Z_valid <= 'b0;
else if ( Cnt >= 'd20 )
Z_valid <= 'b1;
else
Z_valid <= 'b0;
end genvar i;
generate
for ( i = ; i < ; i = i + )
begin : U_Cordic_pipe
cordic_pipe cordic_pipe
(//input signals
.clk ( clk ),
.rst ( rst ),
.X_in ( X_in[i] ),
.Y_in ( Y_in[i] ),
.Z_in ( Z_in[i] ),
.Iteration ( a_in[i] ),
.Shiftbit ( i ),
//output signals
.X_out ( X_out[i] ),
.Y_out ( Y_out[i] ),
.Z_out ( Z_out[i] )
);
end
endgenerate assign Data_i_inv = ~Data_i + 'b01;
assign Data_q_inv = ~Data_q + 'b01; always @ ( posedge clk or posedge rst )
begin
if ( rst )
begin
X_in_reg <= 'b0;
Y_in_reg <= 'b0;
end
else if ( Data_q[] == 'b1 )
begin
X_in_reg <= { {{Data_q_inv[]}}, Data_q_inv };
Y_in_reg <= { {{Data_i[]}}, Data_i };
end
else
begin
X_in_reg <= { {{Data_q[]}}, Data_q };
Y_in_reg <= { {{Data_i_inv[]}}, Data_i_inv };
end
end assign Z_in[] = 'b0;
assign X_in[] = X_in_reg;
assign Y_in[] = Y_in_reg; genvar j;
generate
for ( j = ; j < ; j = j + )
begin : XYZ_IN
assign X_in[j] = X_out[j-];
assign Y_in[j] = Y_out[j-];
assign Z_in[j] = Z_out[j-];
end
endgenerate always @ ( posedge clk or posedge rst )
begin
if ( rst )
Data_in_reg[] = 'b0;
else
Data_in_reg[] = Data_q[];
end genvar k;
generate
for ( k = ; k < ; k = k + )
begin : Rotate_back
always @ ( posedge clk or posedge rst )
begin
if ( rst == 'b1 )
Data_in_reg[k] <= 'b0;
else
Data_in_reg[k] <= Data_in_reg[k-];
end
end
endgenerate always @ ( posedge clk or posedge rst )
begin
if ( rst )
Phase_reg0 <= 'b0;
else if ( Data_in_reg[] == 'b0 )
Phase_reg0 <= { Z_out[][], Z_out[] } + 'h40000;
else
Phase_reg0 <= { Z_out[][], Z_out[] } - 'h40000;
end assign Phase_carry = ( Phase_reg0[] == 'b0 ) ? ( Phase_reg0 + 21'b010 ) : ( Phase_reg0 + 'b00001 ); always @ ( posedge clk or posedge rst )
begin
if ( rst)
Phase_reg1 <= 'b0;
else if ( ( Phase_carry[:] == 'b00 ) || ( Phase_carry[20:19] == 2'b11 ) )
Phase_reg1 <= Phase_carry[:];
else if ( Phase_carry[] == 'b0 )
Phase_reg1 <= 'h3ffff;
else
Phase_reg1 <= 'h20000;
end assign Phase = ( Z_valid == 'b1 ) ? Phase_reg1 : 18'b0; always @ ( posedge clk or posedge rst )
begin
if ( rst )
Magnitude_reg <= 'b0;
else
begin
Magnitude_reg <= X_out[][:];
y <=Y_out[][:];
end
end always @ ( posedge clk or posedge rst )
begin
if ( rst)
Magnitude <= 'b0;
else
Magnitude <= Magnitude_reg;
end endmodule module cordic_pipe
(
//input signals
clk,
rst,
X_in,
Y_in,
Z_in,
Iteration,
Shiftbit,
//output signals
X_out,
Y_out,
Z_out
); /*****************************************************/
/*------- Input and Output Ports declaration --------*/
/*****************************************************/
input clk;
input rst;
input [:] X_in;
input [:] Y_in;
input [:] Z_in;
input [:] Iteration;
input [:] Shiftbit; output [:] X_out;
output [:] Y_out;
output [:] Z_out; /*****************************************************/
/*------- Ports Type declaration --------*/
/*****************************************************/
reg [:] X_out;
reg [:] Y_out;
reg [:] Z_out; wire [:] X_in_shift;
wire [:] Y_in_shift; /*****************************************************
---- Variable declaration
*****************************************************/ /*****************************************************/
/*------- Main Code --------*/
/*****************************************************/ cordic_shift U_cordic_shift
(
.X_in ( X_in ),
.Y_in ( Y_in ),
.Shiftbit ( Shiftbit ), .X_in_shift ( X_in_shift ),
.Y_in_shift ( Y_in_shift )
); always @ ( posedge rst or posedge clk )
begin
if( rst )
begin
X_out <= 'b0;
Y_out <= 'b0;
Z_out <= 'b0;
end
else if ( Y_in[] == 'b0 )
begin
X_out <= X_in + Y_in_shift;
Y_out <= Y_in - X_in_shift;
Z_out <= Z_in + Iteration;
end
else
begin
X_out <= X_in - Y_in_shift;
Y_out <= Y_in + X_in_shift;
Z_out <= Z_in - Iteration;
end
end endmodule module cordic_shift
(
//input signals
X_in,
Y_in,
Shiftbit,
//output signals
X_in_shift,
Y_in_shift
); /*****************************************************/
/*------- Input and Output Ports declaration --------*/
/*****************************************************/
input [:] X_in;
input [:] Y_in;
input [:] Shiftbit; output [:] X_in_shift;
output [:] Y_in_shift; /*****************************************************/
/*------- Ports Type declaration --------*/
/*****************************************************/ reg [:] X_in_shift;
reg [:] Y_in_shift; always @ ( X_in or Shiftbit )
begin
case ( Shiftbit )
'b0 : X_in_shift = X_in;
'd1 : X_in_shift = { {1{X_in[19]}}, X_in[19:1] };
'd2 : X_in_shift = { {2{X_in[19]}}, X_in[19:2] };
'd3 : X_in_shift = { {3{X_in[19]}}, X_in[19:3] };
'd4 : X_in_shift = { {4{X_in[19]}}, X_in[19:4] };
'd5 : X_in_shift = { {5{X_in[19]}}, X_in[19:5] };
'd6 : X_in_shift = { {6{X_in[19]}}, X_in[19:6] };
'd7 : X_in_shift = { {7{X_in[19]}}, X_in[19:7] };
'd8 : X_in_shift = { {8{X_in[19]}}, X_in[19:8] };
'd9 : X_in_shift = { {9{X_in[19]}}, X_in[19:9] };
'd10 : X_in_shift = { {10{X_in[19]}}, X_in[19:10] };
'd11 : X_in_shift = { {11{X_in[19]}}, X_in[19:11] };
'd12 : X_in_shift = { {12{X_in[19]}}, X_in[19:12] };
'd13 : X_in_shift = { {13{X_in[19]}}, X_in[19:13] };
'd14 : X_in_shift = { {14{X_in[19]}}, X_in[19:14] };
'd15 : X_in_shift = { {15{X_in[19]}}, X_in[19:15] };
'd16 : X_in_shift = { {16{X_in[19]}}, X_in[19:16] };
'd17 : X_in_shift = { {17{X_in[19]}}, X_in[19:17] };
default : X_in_shift = 'b0;
endcase
end always @ ( Y_in or Shiftbit )
begin
case ( Shiftbit )
'b0 : Y_in_shift = Y_in;
'd1 : Y_in_shift = { {1{Y_in[19]}}, Y_in[19:1] };
'd2 : Y_in_shift = { {2{Y_in[19]}}, Y_in[19:2] };
'd3 : Y_in_shift = { {3{Y_in[19]}}, Y_in[19:3] };
'd4 : Y_in_shift = { {4{Y_in[19]}}, Y_in[19:4] };
'd5 : Y_in_shift = { {5{Y_in[19]}}, Y_in[19:5] };
'd6 : Y_in_shift = { {6{Y_in[19]}}, Y_in[19:6] };
'd7 : Y_in_shift = { {7{Y_in[19]}}, Y_in[19:7] };
'd8 : Y_in_shift = { {8{Y_in[19]}}, Y_in[19:8] };
'd9 : Y_in_shift = { {9{Y_in[19]}}, Y_in[19:9] };
'd10 : Y_in_shift = { {10{Y_in[19]}}, Y_in[19:10] };
'd11 : Y_in_shift = { {11{Y_in[19]}}, Y_in[19:11] };
'd12 : Y_in_shift = { {12{Y_in[19]}}, Y_in[19:12] };
'd13 : Y_in_shift = { {13{Y_in[19]}}, Y_in[19:13] };
'd14 : Y_in_shift = { {14{Y_in[19]}}, Y_in[19:14] };
'd15 : Y_in_shift = { {15{Y_in[19]}}, Y_in[19:15] };
'd16 : Y_in_shift = { {16{Y_in[19]}}, Y_in[19:16] };
'd17 : Y_in_shift = { {17{Y_in[19]}}, Y_in[19:17] };
default : Y_in_shift = 'b0;
endcase
end endmodule
微弱信号二次谐波检测的FPGA的实现-总结的更多相关文章
- 利用过采样技术提高ADC测量微弱信号时的分辨率
1. 引言 随着科学技术的发展,人们对宏观和微观世界逐步了解,越来越多领域(物理学.化学.天文学.军事雷达.地震学.生物医学等)的微弱信号需要被检测,例如:弱磁.弱光.微震动.小位移.心电.脑电等[1 ...
- 【原创】MHA二次检测功能测试
MHA提供了很多扩展的功能,其中有一个参数是secondary_check_script,这个参数可以使我们自定义扩展多路由,多链路的二次检测功能.减少网络故障切换,降低脑裂的发生. 在虚拟机上做了如 ...
- 边沿检测方法-FPGA入门教程
本节实验主要讲解FPGA开发中边沿检测方法,我们在设计中会经常用到.这个地方大家一定要理解. 1.1.1.原理介绍 学习HDL语言设计与其他语言不一样,HDL语言设计需要考虑更多的信号的电气特性,时序 ...
- ECG信号读出,检测QRS,P,T 波(小波去噪,并根据检测),基于BP辨识的神经网络
这学期的课程选择神经网络.最后的作业处理ECG信号,并利用神经网络识别. 1 ECG引进和阅读ECG信号 1)ECG介绍 详细ECG背景应用就不介绍了,大家能够參考百度 谷歌.仅仅是简单说下ECG ...
- Python公众号开发(二)—颜值检测
上篇文章,我们把自己的程序接入了微信公众号,并且能把用户发送的文本及图片文件原样返回.今天我们把用户的图片通过腾讯的AI平台分析后再返回给用户. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造 ...
- AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3
1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...
- 视频场景切换检测的FPGA实现
本文将继续讲述图像处理算法的FPGA实现,后续可能更新图像旋转(1080P).画中画.快速DCT等算法.视频场景切换检测常用于视频编解码领域,我选用的算法是双阈值灰度直方图检测法,起初在MATLAB上 ...
- 谈谈MySQL死锁之二 死锁检测和处理源码分析
这一篇主要是通过一个实验来进行描述,过程是比较枯燥的. 实验准备 create table test_lock(id int auto_increment primary key ,stock int ...
- Netty实践二(心跳检测)
我们使用Socket通信一般经常会处理多个服务器之间的心跳检测,一般来讲,我们去维护服务器集群,肯定要有一台或几台服务器主机(Master),然后还应该有N台(Slave),那么我们的主机肯定要时时刻 ...
随机推荐
- UVALive 4329 树状数组第二题
大白书上的题目,比较巧妙的是其分析,为了求某个i点做裁判的时候的情况数,只要知道左边有多少比它小的记为ansc,右边有多少比它小的记为ansd,则总种数,必定为 ansc*(右边总数-ansd)+an ...
- linux messages日志出现kernel: nf_conntrack: table full, dropping packet
上述结果会让业务访问很慢!各种网络服务耗时大幅上升,各种time out,各种丢包,完全无法正常提供服务,大并发业务场景下,开防火墙很容易出现这种问题. 解决方法1:关闭分防火墙服务 解决方法2:修改 ...
- 汪慧和201771010123《面向对象程序设计JAVA》第四周实验总结
第一部分:理论知识学习部分 1.类 类(class)是具有相同属性和行为的一组对象的集合,是构造程序的基本单元,是构造对象的模板或蓝图. 2.对象 对象:即数据,对象有三个特性——1.行为 2.状态 ...
- softmax和分类模型
softmax和分类模型 内容包含: softmax回归的基本概念 如何获取Fashion-MNIST数据集和读取数据 softmax回归模型的从零开始实现,实现一个对Fashion-MNIST训练集 ...
- 第22章 Makefile基础
一.自动处理头文件的依赖关系 在Makefile中插入如下代码: include $(sources:.c=.d) %.d: %.c set -e; rm -f $@; \ $(CC) -MM $(C ...
- Cracking Digital VLSI Verification Interview 第四章
目录 Hardware Description Languages Verilog SystemVerilog 对Cracking Digital VLSI Verification Intervie ...
- Hibernate(三)--关联映射
1.多对一 product----category category.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibern ...
- jquery判断字符串中是否包含特定字符的方法总结
方法一:使用indexOf() 和lastIndexOf()方法 案例: var Cts = "bblText"; if(Cts.indexOf("Text") ...
- PAT Basic 1023 组个最⼩数 (20) [贪⼼算法]
题目 给定数字0-9各若⼲个.你可以以任意顺序排列这些数字,但必须全部使⽤.⽬标是使得最后得到的数尽可能⼩(注意0不能做⾸位).例如:给定两个0,两个1,三个5,⼀个8,我们得到的最⼩的数就是1001 ...
- UML-FURPS+与补充性规格说明
1.FURPS+ 在统一过程(UP)中,需求按照“FURPS+”模型进行分类. 功能性(Functional):特性.功能.安全性: 可用性(Usability):人性化因素.帮助.文档: 可靠性(R ...