verilog实现bpsk的发送并与matlab的bpsk仿真进行对比

这篇具有很好参考价值的文章主要介绍了verilog实现bpsk的发送并与matlab的bpsk仿真进行对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

verilog的设计文件:



module BPSK(
		input clk,
		input [7:0] indata,
		output reg [15 : 0] myout,
		output wire [15:0] fir_out_my
		);
wire m_axis_data_tvalid;

wire s_axis_data_tready;
reg [9 : 0] addra = 0;
wire [19 : 0] outdata;

fir_compiler_0 fir_compiler_0 (
	.aclk(clk),                               // input wire aclk           输入时钟        
	.s_axis_data_tvalid(1),  // input wire s_axis_data_tvalid
	.s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready
	.s_axis_data_tdata(indata),    // input wire [7 : 0] s_axis_data_tdata(输入数据) 8.m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid
	.m_axis_data_tdata(fir_out_my)    // output wire [15 : 0] fir_out_my(输出数据16位)
);
/*
aresetn:复位引脚,低电平复位FIR IP核;
aclk:时钟引脚,工程中输入500MHz时钟信号;
s_axis_data_tdata:输入采样数据;
s_axis_data_tready:1 表示IP核准备好接收采样数据;
s_axis_data_tvalid:1 表示s_axis_data_tdata输入的采样数据有效;
fir_out_my:输出滤波后的数据;
m_axis_data_tvalid:1 表示fir_out_my输出的数据有效。

*/
//生成正弦波
wire [9 : 0] sin_out;

blk_mem_gen_0 blk_mem_gen_0 (
		.clka(clk),    // input wire clka
		.ena(1),      // input wire ena
		.addra(addra),  // input wire [9 : 0] addra
		.douta(sin_out)  // output wire [9 : 0] 
);
//乘法器
sinmult sinmult (
	.CLK(clk),  // input wire CLK
	.A(fir_out_my),      // input wire [9 : 0] A
	.B(sin_out),      // input wire [9 : 0] B
	.P(outdata)      // output wire [19 : 0] P
);
always@(posedge clk)begin
				addra 	<= 	addra		 +	 256;
				myout		<=	outdata[17:2];
end

endmodule

tb文件:

`timescale 1ns / 1ps
// fclk = 500MHZ

module tb();

    reg [7:0] indata = 7'b0;
    wire [15 : 0] myout;
    reg clk;
    reg [5-1:0] sps = 5'd0;
     wire [15:0] fir_out_my;
    reg  	[1-1:0]	 DataMem [0:8000-1];
    reg 	[13-1:0] AddrMem = 13'd0;   //8064
BPSK BPSK(
    .clk        (   clk     ),
    .indata     (   indata  ),
    .myout       (   myout ),
    .fir_out_my(fir_out_my)
);

always #1 clk = ~ clk;
integer dout_file1;
initial begin
	clk = 0;
	
	$readmemh("../../../../SimData/CSV/FrmBin.txt", DataMem);   

	dout_file1=$fopen("../../../../SimData/CSV/rcos.txt");    //打开所创建的文件

	  if(dout_file1 == 0)begin 
				$display ("can not open the file!");    //创建文件失败,显示can not open the file!
				$stop;
	   end  
end

    always@(posedge clk)begin
        //$fdisplay(dout_file1,"%d",$signed(myout));

        $fdisplay(dout_file1,"%d",  $signed(fir_out_my));

        if(sps==0)begin
            indata  <=  {5'd0,DataMem[AddrMem],1'b1};
            sps     <=  sps + 1;
            AddrMem <= AddrMem + 1;
        end
        else if(sps<15)begin
            indata  <=  7'd0;
            sps     <=  sps + 1;
            
        end
        else if(sps == 15)begin
            indata  <= 7'd0;
            sps     <= 0;
            
        end
    end
endmodule

verilog的fir实现的根升余弦滤波器的输出与matlab的根升余弦滤波器输出的代码:

clc;
close all;
clear;

b = rcosdesign(0.35,6,16,'sqrt');
bb = round(255.*b./max(b));
fs = 500*10e6;
fc = fs/4;

msg_source = load('D:\vivado_document\project_3\SimData\CSV\FrmBin.txt');

bipolar_msg_source = -2.*msg_source'+1;%0,1映射为1,-1
rcos_msg_source = upfirdn(bipolar_msg_source,bb,16);
n = 1:length(rcos_msg_source);

verilog_seq = load('D:\vivado_document\project_3\SimData\CSV\rcos.txt');

xmin = 1;
xmax = 500;
ymax = 500;
delay = 59;
xend = 500;%为了确保matlab的结果和verilog的结果长度一致能够作差
verilog_seq_delay = verilog_seq(delay:end)';

figure;
subplot(3,1,1)
plot(rcos_msg_source);%%%
axis([xmin xmax -ymax ymax]);
title('matlab的结果')
xlabel('时间(1/fs)');
ylabel('幅度值(滤波器已量化)');

subplot(3,1,2)
plot(verilog_seq_delay);%%%
axis([xmin xmax -ymax ymax]);
title('verilog的结果')
xlabel('时间(1/fs)');
ylabel('幅度值');

subplot(3,1,3)
y=rcos_msg_source(1:xend) - verilog_seq_delay(1:xend);

plot(y);
axis([xmin xmax -ymax ymax]);
title('matlab结果和verilog结果的差值');
xlabel('时间(1/fs)');
ylabel('差值');


csdn bpsk verilog,matlab,fpga开发,开发语言
接下来是最终的发送波形的对比

clc;
close all;
clear;

b = rcosdesign(0.35,6,16,'sqrt');
bb = round(255.*b./max(b));
fs = 500*10e6;
fc = fs/4;

msg_source = load('D:\vivado_document\project_3\SimData\CSV\FrmBin.txt');

bipolar_msg_source = -2.*msg_source'+1;%0,1映射为1,-1,因为verilog就是这么弄得
rcos_msg_source = upfirdn(bipolar_msg_source,bb,16);
n = 1:length(rcos_msg_source);
rcos_msg_source_carrier = rcos_msg_source.*cos(2*pi*fc.*n/fs);
%存放verilog载波乘法器的输出的地方
verilog_seq = load('D:\vivado_document\project_3\SimData\CSV\myFrmBin.txt');


xmin = 1;
xmax = 1500;
ymax = 500;
delay = 62;
xend = 1500;%为了确保matlab的结果和verilog的结果长度一致能够作差
verilog_seq_delay = verilog_seq(delay:end)'/64;

figure;
subplot(3,1,1)
plot(rcos_msg_source_carrier);%%%
axis([xmin xmax -ymax ymax]);
title('matlab的结果')
xlabel('时间(1/fs)');
ylabel('幅度值(滤波器已量化)');

subplot(3,1,2)
plot(verilog_seq_delay);%%%
axis([xmin xmax -ymax ymax]);
title('verilog的结果')
xlabel('时间(1/fs)');
ylabel('幅度值');

subplot(3,1,3)
y=rcos_msg_source_carrier(1:xend) - verilog_seq_delay(1:xend);

plot(y);
axis([xmin xmax -ymax ymax]);
title('matlab结果和verilog结果的差值');
xlabel('时间(1/fs)');
ylabel('差值');


结果如下:

csdn bpsk verilog,matlab,fpga开发,开发语言文章来源地址https://www.toymoban.com/news/detail-732924.html

到了这里,关于verilog实现bpsk的发送并与matlab的bpsk仿真进行对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通信系统中基于matlab的BPSK信噪比检测算法及实现

    根据是否需要辅助数据,信噪比估计算法可以分为数据辅助类算法(Data aided, DA)和非数据辅助类算法(No Data aided, NDA)。DA估计算法准确性较高,但是需要提供先验信息,需要牺牲信道传输效率。NDA方法在传输数据信息的同时进行信噪比估计,不影响信息传输效率,适用范围较广

    2024年02月04日
    浏览(45)
  • ADOV路由和DSR路由matlab对比仿真

    目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 ADOV路由(Ad hoc On-demand Distance Vector Routing) 4.2 DSR路由(Dynamic Source Routing) 5.完整程序         ADOV路由和DSR路由的仿真,仿真输出网络的路由路径,跳数,路由长度,并对比ADOV和DSR的性能。

    2024年02月02日
    浏览(34)
  • 学习如何独立的使用Modelsim进行仿真验证?——编写verilog文件并查看仿真波形

    本篇记录如何独立的使用Modelsim进行仿真,便于之后查看。 Modelsim独立仿真的步骤: 创建工作文件夹——编译设计文件——导入及运行仿真——调试结果 具体的: 1、新建一个工程 指定工程名称、路径和默认库名称。一般情况下,设定Default Library Name默认库名称为work。 指定的

    2023年04月08日
    浏览(42)
  • 用Verilog编写1位全加器,并进行波形仿真

    Quartus II+ModelSiml 全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。

    2024年02月11日
    浏览(43)
  • 基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树

    目录 1.算法理论概述 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程        情绪识别是一种重要的情感分析任务,旨在从文本、语音或图像等数据中识别出人的情绪状态,如高兴、悲伤、愤怒等。本文介绍一种基于机器学习的情绪识别算法,

    2024年02月15日
    浏览(228)
  • 基于GRU门控循环网络的时间序列预测matlab仿真,对比LSTM网络

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 LSTM:     GRU     matlab2022a         门控循环单元(Gated Recurrent Unit,简称GRU)是一种用于序列建模和预测的递归神经网络(RNN)变体。GRU通过引入门控机制,克服了传统RNN在处

    2024年02月11日
    浏览(41)
  • pid算法的MATLAB仿真 - 用MATLAB进行pid算法仿真实验

    PID算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。PID算法已经有100多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。 PID算法:就是“比例(proportional)、积分(integral)、微分(derivativ

    2024年02月03日
    浏览(48)
  • 如何用MATLAB进行电路仿真

    本文演示如何用MATLAB进行电路仿真,测量RLC电路的电压。我用的是R2016b,不同版本软件界面稍有差别。 打开MATLAB软件,新建Simulink Model,如下图所示。 弹出untitled窗口之后,在命令行窗口输入如下命令并回车: powerlib 双击Electrical Souces,打开电源模块。 把AC Voltage Source拖入

    2024年02月05日
    浏览(44)
  • 利用MATLAB控制HFSS进行仿真

    利用MATLAB控制HFSS联合进行仿真 HFSS是一款三维仿真软件,经常用在天线设计领域,在设计天线时我们经常为了使天线达到需要的性能指标使用各种优化算法来对天线进行优化,但是HFSS自带的optimetrics模块难以满足我们的要求,而MATLAB在优化算法领域强大的计算能力就能够弥补

    2024年02月05日
    浏览(44)
  • 用Verilog设计一个8位二进制加法计数器,带异步复位端口,进行综合和仿真。

    点此处编译 这里还需将rst置1才有效 可以在clk=0;后加rst=1; 或者在clk=0;后加rst=0; 并且在#DELY clk=~clk;后加#(DELY*20) rst=~rst; 仿真即可

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包