0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析基于verilog如何实现PWM DAC

FPGA开源工作室 来源:FPGA开源工作室 作者:leee 2021-07-02 10:32 次阅读

PWM 采用任意宽度的输入值,并创建只有一位宽度的输出。使用自由运行计数器的 PWM,这是能做的最简单的 PWM。

module PWM( input clk, input rst_n, input [3:0] PWM_in, output PWM_out);

reg [3:0] cnt;always @(posedge clk or negedge rst_n) if(!rst_n) cnt《=0; else cnt 《= cnt + 1‘b1; // free-running counter

assign PWM_out = (PWM_in 》 cnt)?1’b1:1‘b0; // comparatorendmodule

6893c2be-dadd-11eb-9e57-12bb97331649.png

选择了一个4位的 PWM 这里,所以 PWM 周期是16。输入可以从0到15,因此 PWM 输出比从0% 到15/16 = 93% 。如果需要能够达到100% ,输入需要有一个额外的bit位。

这段代码工作得很好,尽管当前形式的代码有点幼稚,因为输入必须是固定的(或者只有当计数器溢出 = 返回到0时才会更改)。否则输出将出现故障。因此,很可能需要一些额外的逻辑(通常是在正确的时间捕获输入的闩锁)

使用可加载的上下计数器的 PWM,这是一个稍微复杂一点的设计。

module PWM2( input clk, input rst_n, input [3:0] PWM_in, output PWM_out);

reg [3:0] cnt;reg cnt_dir; // 0 to count up, 1 to count downwire [3:0] cnt_next = cnt_dir ? cnt-1’b1 : cnt+1‘b1;wire cnt_end = cnt_dir ? cnt==4’b0000 : cnt==4‘b1111;

always @(posedge clk or negedge rst_n ) if(!rst_n) cnt 《= 0; else cnt 《= cnt_end ? PWM_in : cnt_next;always @(posedge clk or negedge rst_n) if(!rst_n) cnt_dir《=1’b0; else cnt_dir 《= cnt_dir ^ cnt_end;assign PWM_out = cnt_dir;endmodule

它使用一个可加载的上下计数器,不需要输出比较器。有趣的是,它并不完全等同于第一个设计,因为输出周期有17个状态而不是16个(输出从1/17 = 6% 到16/17 = 94%)。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4887

    浏览量

    209837
  • 比较器
    +关注

    关注

    14

    文章

    1523

    浏览量

    106471
  • 计数器
    +关注

    关注

    32

    文章

    2121

    浏览量

    92903

原文标题:verilog 实现PWM DAC

文章出处:【微信号:leezym0317,微信公众号:FPGA开源工作室】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    verilog语音实现浮点运算

    Verilog可以通过使用IEEE标准的浮点数表示来实现浮点运算。下面是一个基本的Verilog模块示例,展示了如何进行加法、乘法和除法等常见的浮点运算操作: module
    发表于 03-25 21:49

    在NuEdu,pwm_dac示例程序中,让pwm来供电,为什么pwm产生的是输出假象的电压?

    在NuEdu,pwm_dac示例程序中,是让pwm来供电,用adc来量取电压值。能够得到很均衡的数字。 这里我有个小问题,pwm产生的电压不是实实在在电压,是通过快速开关,来输出假象的电压,这个
    发表于 01-17 07:44

    WTN6系列语音芯片:PWMDAC音频输出在PCB设计中的优势

    随着科技的飞速发展,语音芯片在电子产品中的应用越来越广泛。其中,唯创知音的WTN6系列语音芯片凭借其卓越的性能和多样的功能,受到了市场的热烈欢迎。特别是其支持PWMDAC两种音频输出方式的特点
    的头像 发表于 12-18 08:46 222次阅读
    WTN6系列语音芯片:<b class='flag-5'>PWM</b>与<b class='flag-5'>DAC</b>音频输出在PCB设计中的优势

    如何提高PWM-DAC的输出精度

      昨天发了一篇TI的技术文章,里面提到了一个比较有意思的电路,就是用多路PWM并联来提高PWM-DAC的输出精度。比如组合两路8bit的PWM来组合为16bit的PWM-DAC
    的头像 发表于 11-18 16:30 921次阅读
    如何提高<b class='flag-5'>PWM-DAC</b>的输出精度

    arduino用pwmdac输出时,可以用adc校准精度吗?

    arduino用pwmdac输出时,可以用adc校准精度吗 怎么实现?最好用代码说明
    发表于 11-03 06:42

    pwm相比dac有哪些优势?

    pwm相比dac的优势有么?
    发表于 10-28 07:49

    语音芯片KT142C两种音频输出方式PWMDAC的区别

    一般的语音芯片,输出方式,无外乎两种,即dac输出,或者PWM输出
    的头像 发表于 10-21 11:43 401次阅读
    语音芯片KT142C两种音频输出方式<b class='flag-5'>PWM</b>和<b class='flag-5'>DAC</b>的区别

    JK触发器与T触发器的Verilog代码实现和RTL电路实现

    JK 触发器的 Verilog 代码实现和 RTL 电路实现
    的头像 发表于 10-09 17:29 2396次阅读
    JK触发器与T触发器的<b class='flag-5'>Verilog</b>代码<b class='flag-5'>实现</b>和RTL电路<b class='flag-5'>实现</b>

    如何获取ADC电压并由DACPWM发送

    应用程序: 获取 ADC 电压, 由 PWM DAC 发送 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-ETM-M487 此示例代码显示如何获取
    发表于 09-01 06:31

    如何获取ADC电压并由DACPWM发送

    应用程序: 获取 ADC 电压, 由 PWM DAC 发送 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-ETM-M487 此示例代码显示如何获取
    发表于 08-23 07:55

    MCU么实现快速DAC的呢?

    想试试新唐的MCU,但发现只有少量MCU带了DAC。 新唐是出于什么考虑不带DAC模块呢? 大家用新唐MCU的时候,又是怎么实现快速DAC的呢?
    发表于 06-27 06:50

    Verilog实现讲解

    verilog第一步肯定需要将输入输出端口,常量等信息补齐全;
    的头像 发表于 06-16 09:52 378次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>实现</b>讲解

    基2FFT的verilog代码实现及仿真

    上文基2FFT的算法推导及python仿真推导了基2FFT的公式,并通过python做了算法验证,本文使用verilog实现8点基2FFT的代码。
    的头像 发表于 06-02 12:38 677次阅读
    基2FFT的<b class='flag-5'>verilog</b>代码<b class='flag-5'>实现</b>及仿真

    Vivado:ROM和RAM的verilog代码实现

    本文主要介绍ROM和RAM实现verilog代码版本,可以借鉴参考下。
    的头像 发表于 05-16 16:57 884次阅读

    Verilog边沿检测的基本原理和代码实现

    本文将从Verilog和边沿检测的基本概念入手,介绍Verilog边沿检测的原理和应用代码示例。
    的头像 发表于 05-12 17:05 2307次阅读
    <b class='flag-5'>Verilog</b>边沿检测的基本原理和代码<b class='flag-5'>实现</b>