赞
踩
首先是顶层文件(实践中就是原理草图,大概的实现原理)
从左到右分别是时钟接口->分频器->正弦波发生器/M序列发生器->开关选通(实验中时钟为20M),下面是各个模块代码:
分频器:(N代表分频数,为了让结果清晰,所以M序列的分频数很高,因为要让一个上升沿有好几个周期才行)
- module fenpin(clk_out,clk_in);
- output clk_out;
- input clk_in;
- reg[13:0] cnt;
- reg clk_out;
- parameter N=1024;
- always@(posedge clk_in)
- begin
- begin
- if(cnt==N/2-1)
- begin clk_out<=!clk_out;
- cnt<=0;
- end else
- cnt<=cnt+1;
- end
- end
- endmodule
仿真结果:
M序列发生器:
- module MXL(clk ,out);
- input clk;
- output out;
- reg[3:0] tmp=4'b0;
- reg out;
- always @(posedge clk )
- begin
- if(tmp > 4'd15)
- tmp=4'd0;
- else tmp=tmp+1'b1;
- case(tmp)
- 4'd0:out<=0;
- 4'd1:out<=1;
- 4'd2:out<=0;
- 4'd3:out<=0;
- 4'd4:out<=1;
- 4'd5:out<=1;
- 4'd6:out<=0;
- 4'd7:out<=1;
- 4'd8:out<=1;
- 4'd9:out<=0;
- 4'd10:out<=1;
- 4'd11:out<=0;
- 4'd12:out<=0;
- 4'd13:out<=0;
- 4'd14:out<=0;
- 4'd15:out<=0;
- endcase
- end
- endmodule
仿真结果:
重点,正弦波发生器:(这是这个实验难点,需要使用IP,所谓正弦波发生器,就是计数器+ram核,将正弦波抽样128个点,然后随着计数器计数逐个输出,ps,并口),调用IP核流程和mif文件的参数设置参考TOP文件,就是顶层文件图。mif文件导入在ram核的创建中。下面也带上C语言产生mif文件(也就是正弦波的序列)
内部结构图:
C语言mif文件代码(用VC或者devc++运行即可,摘自:点击打开链接)这个代码浅显易懂,读懂为好。
- #include <stdio.h>
- #include <math.h>
-
- #define PI 3.141592
- #define DEPTH 128 /*数据深度,即存储单元的个数*/
- #define WIDTH 8 /*存储单元的宽度*/
-
- int main(void)
- {
- int i,temp;
- float s;
-
- FILE *fp;
- fp = fopen("TestMif.mif","w"); /*文件名随意,但扩展名必须为.mif*/
- if(NULL==fp)
- printf("Can not creat file!\r\n");
- else
- {
- printf("File created successfully!\n");
- /*
- * 生成文件头:注意不要忘了“;”
- */
- fprintf(fp,"DEPTH = %d;\n",DEPTH);
- fprintf(fp,"WIDTH = %d;\n",WIDTH);
- fprintf(fp,"ADDRESS_RADIX = HEX;\n");
- fprintf(fp,"DATA_RADIX = HEX;\n");
- fprintf(fp,"CONTENT\n");
- fprintf(fp,"BEGIN\n");
-
- /*
- * 以十六进制输出地址和数据
- */
- for(i=0;i<DEPTH;i++)
- {
- /*周期为128个点的正弦波*/
- s = sin(PI*i/64);
- /*将-1~1之间的正弦波的值扩展到0-255之间*/
- temp = (int)((s+1)*255/2);
- /*以十六进制输出地址和数据*/
- fprintf(fp,"%x\t:\t%x;\n",i,temp);
- }//end for
-
- fprintf(fp,"END;\n");
- fclose(fp);
- }
- }
仿真结果:
选通开关代码:
- module KAIGUAN(din0,dout,din1,sel);
- parameter N=12;
- input[N-1:0] din0;
- output[N-1:0] dout;
- input[N-1:0] din1;
- input sel;
- wire[N-1:0] MW_din0l;
- wire[N-1:0] MW_din1l;
- reg[N-1:0] MW_dtempl;
- always@(MW_din0l or MW_din1l or sel)
- begin
- case(sel)
- 1'd0:MW_dtempl=MW_din0l;
- default:MW_dtempl=MW_din1l;
- endcase
- end
- assign dout=MW_dtempl;
- assign MW_din0l=din0;
- assign MW_din1l=din1;
- endmodule
整体系统的仿真结果:
仿真成功!
下载到FPGA中接上示波器:(FFT中有两个高峰,实验成功,具体速率大家可以自己算哦)
2ASK比较简单,至于要信号发生器的分频器分频数目一致,然后改任意一个波形发生器的mif文件(中心范围缩小,可改代码得,记得有个直流偏置),其他不用变。
过程写的比较简单粗暴,有问题可留言或者私信,我都会看的!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。