如何利用FPGA生成SPWM调制信号

2023-11-16

实验目标

想生成20kHz的正弦波的SPWM信号

稍微说一下原理

SPWM即正弦波宽度脉冲调制

脉冲宽度随着sin函数发生变化。

冲量等效原理

冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同;冲量即窄脉冲的积分面积,所说的效果基本相同是指环节的输出波形基本相同。如果把各输入波形用傅里叶变换分析,则其低频段非常接近,仅在高频略有差异。
如下图,上下电压的分为14小段,每段的面积积分应是一致的,这样通过惯性环节时就会得到相同的输出:
在这里插入图片描述

双极性的的SPWM信号

本次是通过三角波和正弦波幅值大小进行对比,在下图中:三角波大于正弦波时,SPWM信号为0,反之,为1,产生了不规则占空比的下面的SPWM波形。
注意:
①三角波频率f1和正弦波频率f2的比值N为载波比,N需要大一点
②要保证三角波的峰峰值大于等于正弦波的峰峰值
在这里插入图片描述
原理性的具体可以参考:
[1]https://wenku.baidu.com/view/99d488ea7275a417866fb84ae45c3b3566ecddf8.html?fr=search-4
[2]https://wenku.baidu.com/view/94564f1d24c52cc58bd63186bceb19e8b8f6ecf1.html

具体步骤

1.用matlab生成三角波和正弦波的coe文件

1.创建matlab文件写代码:

clc;
close all;
clear;
%%triangle wave
k=1/50;
t0=0:1:24;
t1=25:1:49;
a0=k*t0;
a1=k*t1;
t2=50:1:99;
a2=1-k*(t2-50);
a=[a1,a2,a0];
t=[t0,t1,t2];
y0=round(a*1024);
 plot (y0)
 hold on
%%sine wave
 t3=0:1:999;
 A=0.25*sin(2*pi*t3/1000)+0.5;
y1=round(A*1024);
plot(y1)
%%
l1=length(t);%三角波的长度
l2=length(t3);%正弦波的序列长度


%%生成文件三角波coe文件
fid1=fopen('triwave.coe','w+');
fprintf(fid1,'memory_initialization_radix = 16;\n');
fprintf(fid1,'memory_initialization_vector =\n');
for i=1:l1-1
fprintf(fid1,'%x',y0(i));
fprintf(fid1,',\n');
end
fprintf(fid1,'%x',y0(l1));
fprintf(fid1,';');
fclose(fid1);

%%生成正弦波coe文件
fid1=fopen('sinwave.coe','w+');
fprintf(fid1,'memory_initialization_radix = 16;\n');
fprintf(fid1,'memory_initialization_vector =\n');
for i=1:l2-1
fprintf(fid1,'%x',y1(i));
fprintf(fid1,',\n');
end
fprintf(fid1,'%x',y1(l2));
fprintf(fid1,';');
fclose(fid1);

生成的数据分别是一个周期的三角波采样和一个周期的正弦波采样,这里我们设置的正弦波的周期是三角波的十倍。
在这里插入图片描述

2.找不到生成的文件,一般是路径的问题。检查你的路径没问题的话,会出现以下文件。
在这里插入图片描述
这些文件作为fpga导入rom ip核的coe文件。
tips:生成的coe文件可以直接拖进matlab的执行框或者vivado里面看一看是否正常。

2.调用ROM的ip读取coe文件

1.vivado新建好工程,一系列不再多说。
2.点击IP Catalog在这里插入图片描述

3.搜索ROM,点击Block Memory Generator
4.根据三角波的coe可以看到,进制是16,共102行,所以去掉前两行声明,共100行数。所以数据宽度width为3个16进制数,1个16进制数4位,共12位;深度depth位100。
在这里插入图片描述

5.根据上面的结论,创建三角波的rom_ip1,修改加亮处
在这里插入图片描述
选择三角波的文件
在这里插入图片描述
6. 点击 ok,点击 Generate 生成 ip 核。
在这里插入图片描述
7.同理,正弦波的也可以这么调用,步骤大致相同,不同的地方:
①正弦波的数据深度为1000
在这里插入图片描述

②调用的文件为正弦波的coe
在这里插入图片描述

3.调用pll的ip核来提供三角波和正弦波的控制时序

IP Catalog搜clock 选择Clocking Wizard
在这里插入图片描述
修改加亮区域
在这里插入图片描述
在这里插入图片描述
输出时钟
在这里插入图片描述
我想输出的是20kHz的正弦波,matlab生成的一个周期的正弦波是1000个点,20乘1000乘1000,所以这里输出的时钟1应该为20MHz,我因为刚入门练手所以生成80MHz,后面多写了一个四分频,其实是一样的。

新建wave_clk.v代码如下,调用了Clocking Wizard的ip
要注意,IP中的reset和设置的iRST_n高低有效是相反的,所以括号里加了~。

module wave_clk(
input iSys_clk,
input iRst_n,
output  oTri_clk,
output  oSin_clk
);
    wire locked;
    wire clk_temp1;
    reg [1:0] cnt1;
   // reg [5:0] cnt2;
    clk_wiz1 clk_generator 
     (
      // Clock out ports
      .clk_out1(clk_temp1),     // output clk_out1
      // Status and control signals
      .reset(~iRst_n), // input reset
      .locked(locked),       // output locked
     // Clock in ports
      .clk_in1(iSys_clk));     
      
      always@(posedge clk_temp1 or negedge iRst_n)
      begin
      if(!iRst_n)
      //begin
      cnt1<=2'b00;
      //cnt2<=6'b00;
      //end
      else if (cnt1==2'b11)
      cnt1<=2'b00;
      //else if (cnt2==6'd39)
      //cnt2<=6'b00;
      else //begin
      cnt1<=cnt1+1;
      //cnt2<=cnt2+1;
      //end
      end
     assign oTri_clk=(cnt1==2'b00) ?1:0;
     assign oSin_clk=(cnt1==2'b00) ?1:0;
//assign oSin_clk=(cnt2==2'b00) ?1:0;
endmodule

4.调用ROM的ip来获取数据,进行比较

新建一个wave_comparator.v,这个文件是用来读取ROM的数据,然后比较得出SPWM的信号为1还是为0;
调用上面两个已经生成ROM IP
代码如下:

module wave_comparator(
input iCLK_tri,
input iCLK_sin,
input iRST_n,//
output oComparator
);
    wire [11:0] Read_tri_data,Read_sin_data;
    reg [7:0]   Read_tri_addr;
    reg [9:0]   Read_sin_addr;
    
    always@(posedge iCLK_tri or negedge iRST_n )
    begin
    if(!iRST_n)
    Read_tri_addr<=0;//addr=0 data=?
    else if(Read_tri_addr==7'd99)//99 or 100?
    Read_tri_addr<=0;
    else
    Read_tri_addr<=Read_tri_addr+1;
    end
    
    always@(posedge iCLK_sin or negedge iRST_n )
    begin
    if(!iRST_n)
    Read_sin_addr<=0;
    else if(Read_sin_addr==10'd999)
    Read_sin_addr<=0;
    else
    Read_sin_addr<=Read_sin_addr+1;
    end
       
    rom_ip1 rom_tri
    (
    .clka(iCLK_tri),
    .addra(Read_tri_addr),
    .douta(Read_tri_data)
    );

    rom_ip2 rom_sin
    (
    .clka(iCLK_sin),
    .addra(Read_sin_addr),
    .douta(Read_sin_data)
    );    
    assign oComparator=(Read_tri_data<Read_sin_data)?1:0;
    
endmodule

5.建立wave.v调用wave_clk和wave_comparator

在这里插入图片描述
在这里插入图片描述
ALI和BLI就是输出的SPWM信号,ALI和BLI反相。

module wave(
input iSys_clk,
input iRst_n,
output ALI,BLI
    );
    wire oTri_clk;
    wire oSin_clk;
    
    wave_clk wave_clk
    (
    . iSys_clk(iSys_clk),
    . iRst_n(iRst_n),
    .  oTri_clk(oTri_clk),
    .  oSin_clk(oSin_clk)
    );
    wave_comparator wave_comparator
    (
    . iCLK_tri(oTri_clk),
    . iCLK_sin(oSin_clk),
    . iRST_n(iRst_n),//
    . oComparator(ALI)
    
    );
   assign BLI=~ALI;
   
   
 /*  ila ILA
   (
   .clk(iSys_clk),
   
   
   .probe0(iSys_clk),
   .probe1(oTri_clk),
   .probe2(oSin_clk),
   .probe3(iRst_n),
   .probe4(ALI)
   

   );
   */
endmodule

7.进行管脚约束

在这里插入图片描述
输入的选择系统时钟管脚,iRst_n用的是摁键开关,输出选择绑定io管脚输出,具体请参考开发板的原理图进行绑定约束
在这里插入图片描述

8.generate bitstream and program device

在这里插入图片描述

9.示波器观察

大概是对的吧,uhhhhh~
在这里插入图片描述

回顾

其实生成方法有很多种,可以一开始在matlab里面就比较完生成0和1的信号在直接导入,也可以用vivado完成大部分工作,每一个步骤其实都有很多替代方案,实现的方法多种多样是很灵活的,我刚刚入门开始学习,我写的方法比较笨和麻烦,本篇作为自己以后忘了复习用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何利用FPGA生成SPWM调制信号 的相关文章

  • ZYNQ无SD卡配置Linux系统到QSPI Flash和eMMC

    硬件 黑金AX7450开发板 zynq7100 QSPI Flash eMMC Flash 软件 Vivado 2017 4 Petalinux 2017 我用了一台Windows主机 用于设计Vivado和烧写QSPI Flash 一台U
  • 【Xilinx】如何自动格式化Verilog代码

    开发环境Vivado VSCode Xilinx 自动格式化Verilog代码 前言 一 安装VSCode并修改Vivado的默认编辑器 二 安装Verilog插件 1 语法插件 2 格式化插件 三 演示 如何代码格式化 1 插件演示 2
  • 【FPGA IP系列】FIFO的通俗理解

    FPGA厂商提供了丰富的IP核 基础性IP核都是可以直接免费调用的 比如FIFO RAM等等 本文主要介绍FIFO的一些基础知识 帮助大家能够理解FIFO的基础概念 一 FIFO介绍 FIFO全称是First In First Out 即先
  • 【Xilinx AX7103 MicroBalze学习笔记2】MicroBlaze 串口发送 Hello World 实验

    目录 实验介绍 硬件设计 Vivado部分 创建工程 搭建Block Design MicroBlaze部分 外围模块部分 时钟模块 Uart部分 管脚绑定 时钟约束 生成Bit流文件 软件设计 SDK部分 板级验证 总结 往期系列博客 实
  • FPGA功耗估计

    1 背景 quad 资源 速度 功耗是FPGA设计中的三大关键因素 温度与功耗成正相关性 功耗大必然会导致温度高 高温最常见的问题是系统重启 温度高对FPGA内部的时序不利 导致可靠性下降 2 功耗分类 1 芯片静态功耗 quad FPGA
  • Verilog基础语法(一)

    一 数据类型 在Verilog语言中主要有三大数据类型 寄存器数据类型 线网数据类型 参数数据类型 1 寄存器数据类型 关键字 reg reg类型数据默认初始值为不定值X 需要注意的是reg类型的数据只能在always语句和initial语
  • 征战开发板从无到有(三)

    接上一篇 翘首已盼的PCB板子做好了 管脚约束信息都在PCB板上体现出来了 很满意 会不会成为爆款呢 嘿嘿 来 先看看PCB裸板美图 由于征战开发板电路功能兼容小梅哥ACX720 大家可以直接用小梅哥的视频来学习 不会影响学习体验 现在学习
  • AXI4-Stream协议的信号以及Xilinx提供的从AXI到AXI-Stream转换的IP核区别

    AXI4 Stream协议是一种用来连接需要交换数据的两个部件的标准接口 它可以用于连接一个产生数据的主机和一个接受数据的从机 当然它也可以用于连接多个主机和从机 该协议支持多种数据流使用相同共享总线集合 允许构建类似于路由 宽窄总线 窄宽
  • VIVADO软件错误及解决办法汇总

    在VIVADO软件编写程序时会遇到很多类型的错误 写个博客记录下来防止再犯 短期可能只有几个问题 会长期保持更新 遇到问题就记录 2022 4 09 问题1 The debug port u ila 0 probe4 has 1 uncon
  • 【Xilinx AX7103 MicroBalze学习笔记4】MicroBlaze 按键中断实验

    目录 实验任务 实验框图 硬件设计 Vivado部分 Block Design 搭建 软件设计 SDK部分 代码部分 上板验证 往期系列博客 实验任务 通过 AXI GPIO 检测按键状态产生中断信号 中断控制器检测到中断后 给处理器发送中
  • ZYNQ PL开发流程

    2 ZYNQ PL开发 开发流程 开发使用vivado 流程如下 1 新建工程 工程项目含义 这里简单介绍下各个工程类型的含义 RTL Project 是指按照正常设计流程所选择的类型 这也是常用的一种类型 RTL Project 下的 D
  • AXI总线之DDR控制器的实现

    由于FPGA的内部RAM资源实在有限 同时又不得不面临大数据量缓存的问题 因此 将DDR进行共享成了最为直接有效的解决方案 设计目标 PL端有多个需要大量数据缓存的通道 让每个通道都将DDR作为外部缓存 FIFO 注意 总的突发在1Gbps
  • 【XINLIX 原语】XILINX 原语的使用之 IBUFDS 差分转单端、OBUFDS 单端转差分

    目录 IBUFGDS IBUFDS 介绍 IBUFDS 示意图 例化方式 OBUFDS OBUFDS 介绍 OBUFDS 示意图 例化方式 在 XILINX 中有许多原语 常见的差分转单端 IBUFDS 单端转差分 OBUFDS IBUFG
  • FPGA学习日记(五)ZYNQ——在线逻辑分析仪(ILA)硬件调试及simulator仿真软件的创建使用

    一 在线逻辑分析仪 ILA vivado的在线逻辑分析仪 ILA 其借用了传统逻辑分析仪的理念以及大部分的功能 并利用 FPGA 中的逻辑资源 将这些功能植入到 FPGA 的设计当中 如下图所示 ILA占用一部分FPGA内部逻辑资源 可看做
  • 【Xilinx AX7103 MicroBalze学习笔记7】MicroBlaze AXI4 接口之 DDR 读写实验

    目录 AXI4 协议介绍 实验任务 硬件设计 Vivado 部分 自定义 IP MicroBlaze 配置 配置 PLL IP 配置 MIG IP 添加源文件 IP 软件设计 SDK 部分 lt
  • HLS图像处理系列——肤色检测

    本博文采用Xilinx HLS 2014 4工具 实现一个肤色检测的模块 其中 本文重点是构建HLS图像处理函数 新建HLS工程的步骤 本博文不再详述 本工程新建之后 只添加了五个文件 如下图所示 其中 top cpp中的主函数最终会综合生
  • SPWM逆变的原理分析与仿真

    1 单相半桥SPWM逆变电路 1 1 拓扑 下图是单相半桥SPWM逆变电路 含有两个开关管 桥臂中点和直流侧电容中点之间连接负载 输出电压 端口电压 是幅值为0 5Vdc的脉冲波形 1 2 输出电压分析 单相半桥电路的输出电压的主要频率成分
  • 【FPGA】Xilinx vivado IP核许可申请——以MIPI CSI-2为例

    1 先进入xilinx官网 复制这个链接直接进入ip申请的地址 http www xilinx com getlicense 打开链接后需要登录 没账户的那就需要注册 点击红色方框内的蓝色字体即可注册 2 注册完成后 可以选择相应的IP核进
  • VHDL:按钮去抖动(或不去抖动,视情况而定)

    我已阅读其他帖子 但似乎无法修复我的 我是 VHDL 新手 所以我确信这是一个简单的修复 简而言之 按钮没有防抖 代码编译和比特流程序 在测试台中 按下按钮可以工作 但输出 LED 不会改变 在板上 按下按钮会使随机 LED 亮起 我猜是因
  • UIO 设备上的 mmap EINVAL 错误

    在尝试使用 UIO 而不是直接映射后 我在 Xilinx Zynq 上映射物理内存时遇到问题 dev mem 虽然计划是以普通用户身份运行应用程序 而不是root这仍在运行root 显然 第一个映射成功 其余映射到同一个文件描述符12 de

随机推荐

  • JAVA变量与数据类型

    人生不如意之事十有八九 在最好的年纪要努力充实自己 莫等空悲切白了少年头 而是要及时当勉励 岁月不待人 一 java变量 变量概述 1 内存中存储的一个存储区域 2 该存储区域内的数据在同一类型范围内不断变化 3 变量是程序中最基本的存储单
  • 老虎证券美股策略——将动量策略日频调仓改成月频

    最近策略频繁回撤 跑不赢标普500指数 所以对策略简单修改 以待后效 新加入的代码 def get if trade day infile open countday dat r incontent infile read infile c
  • Linux系统中负载较高问题排查思路与解决方法

    Load 就是对计算机干活多少的度量 Load Average 就是一段时间 1分钟 5分钟 15分钟 内平均Load linux服务器出现高负载的情况下 一般都有一些具体的症状 比如cpu 内存等被耗尽 磁盘IO或者网络等出现问题 下面通
  • CentOS7下安装LNMP以及phpMyAdmin

    两种安装 第一种 下载 可以到官网找 版本 https www phpmyadmin net downloads cd 到你要下载的位置 wget https files phpmyadmin net phpMyAdmin 4 4 12 p
  • Maven中pom文件内scope标签中import、parent 、dependencies、dependencyManagement详解

    首先介绍parent 如果父项目中有这些依赖
  • linux-sed命令

    目录 1 linux shell sed获取某一段字符串 2 linux shell shell脚本中 sed n取出某一行赋给一个变量 3 linux shell sed查询某一行 1 linux shell sed获取某一段字符串 如果
  • 网络层(四)

    网络层 我们说过 网络层主要讲的就是ip编址和路由选择算法 更准确的说 应该是网际IP协议 网际IP协议主要说明了各个主机和服务器的ip编址规则 了解IP编址前 我们需要知道IP数据报 IP数据报在网络层中传输 我们看一下IP数据报的结构
  • STM32F103ZET6【标准库函数开发】------PB3,PB4当做普通IO口,重定义

    一 如题 我在设计原理图的时候将PB3和PB4当做了普通IO口 结果按照一般配置的方法操作后 PB3 PB4并没有输出自己想要的信号 配置如下 void MOTOR GPIO Init void 初始化 GPIO InitTypeDef G
  • 人社练兵比武怎样挣积分 python 源码在线答题源码

    可以自动答题积分 不明白如何用的可以联系我 下面2个函数是学练习的 需要用的库为selenium time re pickle 题库需要收集 def dan 单选或多选 j browser find element by xpath id
  • java绘制(可视化)树结构图

    以JPanel组件为画板 继承JPanel类并重写paint Graphics g 函数 在函数中使用画笔g绘制树结构图 实例代码 3个java源文件 Main java DrawNode java DrawTree java 1 Main
  • 周订单量趋势

    周订单量趋势 PreAuthorize hasAuthority admin statistics home chart order week ApiOperation value 周订单量趋势 RequestMapping value c
  • 《Perl语言入门》读书笔记(六)哈希

    1 哈希特点 哈希是一种数据结构 与数组相同点 能容纳任意多的值 而哈希的检索方式与数组不同 数组是以数字下标检索 而哈希中的值 value 以唯一的名字 key 检索 key value一一对应 乱序排列 类似一桶数据 由于检索方式不同
  • 程序记录(一)VGG16猫狗分类

    import torch from torchvision import datasets models transforms import os from torch utils data import DataLoader from t
  • RANSAC鲁棒参数估计

    转自 http blog csdn net zhanglei8893 archive 2010 01 23 5249470 aspx RANSAC 是 RANdom SAmple Consensus 的缩写 该算法是用于从一组观测数据中估计
  • U-Boot Passing Kernel Arguments

    本文转载至 http www denx de wiki view DULG LinuxKernelArgs In nearly all cases you will want to pass additional information t
  • ply格式文件导出

    ply格式导出代码片段 注意vertex 和tri都是 N 3 格式 三角形编号从1开始 def dump to ply vertex tri wfp index in tri should begin from 1 vertex in s
  • 【Vue】Vue基础自用笔记&Day04_①Vue组件②Vue插槽

    Vue基础 Day04 1 Vue组件 component 定义全局组件 定义私有组件 组件中数据和方法的调用 组件动画 父组件传值子组件 子组件传值父组件 2 Vue插槽 slot 如果出现具名插槽没有效果 但是也没有报错 极有可能是Vu
  • C语言——IIC协议概述+PCF8591

    IIC协议 SCL必须由主机发送 在SCL 1 高电平 时 SDA下跳则 判罚 为 起始信号 SDA上跳则 判罚 为 停止信号P 每个字节后应该由对方回送一个应答信号ACK做为对方在线的标志 非应答信号一般在所有字节的最后一个字节后 一般要
  • 【RabbitMQ教程】springboot整合rabbitmq(topic模式)

    下面还是模拟注册服务当用户注册成功后 向短信和邮件服务推送消息的场景 搭建SpringBoot环境 创建两个工程 mq rabbitmq producer和mq rabbitmq consumer 分别配置1 2 3 第三步本例消费者用注解
  • 如何利用FPGA生成SPWM调制信号

    如何利用FPGA生成SPWM调制信号 实验目标 稍微说一下原理 SPWM即正弦波宽度脉冲调制 冲量等效原理 双极性的的SPWM信号 具体步骤 1 用matlab生成三角波和正弦波的coe文件 2 调用ROM的ip读取coe文件 3 调用pl