完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、FPGA工程搭建
1.采用的是Basys3开发板,芯片型号为:xc7a35tcpg236-1 2.调用block ram,生成IP,ram位宽为8bit,深度为1024. 3.采用matlab生成波形文件: %---------------------------------% width = 8; %设置bram的位宽 depth = 1024; %设置bram的深度 %---------------------------------% x=linspace(0,2*pi,depth); %在一个周期内产生depth个采样点 y_cos=cos(x); %生成余弦函数 %y_cos=sin(x); %生成正弦函数 %y_cos=round(y_cos*(2^(width-1)-1))*2^(width-1)-1; %将数据转换成整数,生成无符号数 y_cos=round(y_cos*(2^(width-1)-1)); %将数据转换成整数,生成有符号数 plot(x,y_cos); %绘图 fid = fopen('C:Users10242Desktop2018_1_21_DDScos_8_1024_signed.coe','wt'); fprintf(fid,'memory_initialization_radix = 10;n'); fprintf(fid,'memory_initialization_vector = '); for i = 1 : depth if mod(i-1,8)==0 fprintf(fid,'n'); end fprintf(fid,'%6d,',y_cos(i)) ; end fclose(fid); %关闭文件 4.正弦波代码生成编写 module dds_cos( input clk, input rst_n, output reg [7:0] cos_a, output reg signed [7:0] cos_b ); //---------------------------------------// //FreqWord = 2^32 * freq / sysclk parameter freq_a = 32'd4294967; //----->100k parameter freq_b = 32'd42949673; //----->1M parameter cnt_width = 8'd32; parameter rom_addr_width = 10; //---------------------------------------// //---------------------------------------// reg [cnt_width-1:0] cnt_a; reg [cnt_width-1:0] cnt_b; wire [rom_addr_width-1:0] addr_a; wire [rom_addr_width-1:0] addr_b; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin cnt_a <= 0; cnt_b <= 0; end else begin cnt_a <= cnt_a + freq_a; cnt_b <= cnt_b + freq_b; end end assign addr_a = cnt_a[cnt_width-1:cnt_width-rom_addr_width]; assign addr_b = cnt_b[cnt_width-1:cnt_width-rom_addr_width]; //------------------------------------------// //-------------调用ROM核---------------------// wire signed [7:0] cos_a_r; wire signed [7:0] cos_b_r; ROM ROM_inst( .clka (clk), .addra (addr_a), .douta (cos_a_r), .clkb (clk), .addrb (addr_b), .doutb (cos_b_r) ); //-------------------------------------------// //-------------------------------------------// always @(posedge clk or negedge rst_n) begin if(!rst_n) begin cos_a <= 0; cos_b <= 0; end else begin //加128会将有符号数据变为无符号数据; //正常ILA看波形数据时都是看有符号数据才是正弦波,DA识别的也是有符号数据; //但是有时候数据在进行处理时是进行无符号数据的处理,此时就需要加128 cos_a <= cos_a_r + 8'd128; cos_b <= cos_b_r; end end endmodule 二、AM调制原理 1.A0是一个直流分量,m(t)是需要调制的信号(AD采样进来的信号),cos(wt)是载频(10M、50M的那种,FPGA内部产生的正弦波),载频是一个有符号型的 2.直流分量是有要求的,要求必须大于信号的1/2峰峰值,使得加入直流分量后整个信号都在x轴上方。否则解调出来的会不对,造成失真。 3.包络解波: 模拟电路的方法是:一个二极管加一个电阻、电容实现的包络解波。 数字电路的方法是:接收到信号进行取绝对值,将负信号转为正信号,然后经过低通滤波器将载频滤掉。 4.频域分量有一个w+wc和一个w-wc,解调的时候滤波器的截至频率要低于w-wc 三、FM调制原理 FM与AM的非官方定义: AM:载波 幅度 随着调制信号 频率 的变化而变化; FM:载波 频率 随着调制信号 幅度 的变化而变化; 1. 2.FM:载波 频率 随着调制信号 幅度 的变化而变化…过程解析: 当调制信号的幅值为0时,载波的频率等于原载波的频率; 当调制信号的幅值为+1/2峰峰值时,载波的频率小于原载波的频率; 当调制信号的幅值为正峰值时,载波的频率达到最小; 当调制信号的幅值为负峰值时,载波的频率达到最大; 3.例子: (图片中2的14次方与2的n次方,需要注意),下图可以理解为一个14bit的AD,采集一个50khz的正弦波数据。最终得出来得N为在任意时刻得频率控制字 FreqWord = 2^32 * freq / sysclk 所以:freq_word为载波的频率控制字,N为任意时刻的频率控制字 4.解调 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1874 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1658 浏览 1 评论
1143 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
759 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1963浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
788浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
610浏览 3评论
628浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
590浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 03:50 , Processed in 0.941617 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号