码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数字IC手撕代码-XX公司笔试真题(脉冲密度调制)


     前言:

            本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。

    目录如下:

    1.数字IC手撕代码-分频器(任意偶数分频)

    2.数字IC手撕代码-分频器(任意奇数分频)

    3.数字IC手撕代码-分频器(任意小数分频)

    4.数字IC手撕代码-异步复位同步释放

    5.数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

    6.数字IC手撕代码-序列检测(状态机写法)

    7.数字IC手撕代码-序列检测(移位寄存器写法)

    8.数字IC手撕代码-半加器、全加器

    9.数字IC手撕代码-串转并、并转串

    10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)

    11.数字IC手撕代码-有限状态机FSM-饮料机

    12.数字IC手撕代码-握手信号(READY-VALID)

    13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

    14.数字IC手撕代码-泰凌微笔试真题

    15.数字IC手撕代码-平头哥技术终面手撕真题

    16.数字IC手撕代码-兆易创新笔试真题

    17.数字IC手撕代码-乐鑫科技笔试真题(4倍频)

    18.数字IC手撕代码-双端口RAM(dual-port-RAM)

            ...持续更新

     更多手撕代码题可以前往 数字IC手撕代码--题库


    目录

    题目描述

    解决思路

    代码

    testbench

    输出波形 


    题目描述

             使用HDL实现脉冲密度调制(PDM),即根据输入12bit pdm_in,按下列要求输出不同占空比的方波:

            ① 当pdm_in>10,pdm_out即输出的波形占空比为4/pdm_in;

            ② 当pdm_in<=10,pdm_out不翻转输出固定值。

    其输入输出接口为:

    1. input clk;
    2. input [11:0]pdm_in;
    3. input reset;
    4. output pdm_out;

    解决思路

            脉冲密度调制(PDM),通过调节波形的占空比来改变脉冲的密度。信号逻辑为高的时间T_hign除以周期T_cycle所得到的比值叫做占空比。

            实现第一个要求,当pdm_in>10时,可以让新信号在4个clk周期为高,在(pdm_in-4)个clk周期为低,这样就实现了一个pdm_in分频,占空比为4/pdm_in。

            第二个要求,当pdm_in<=10时,pdm_out就不让他翻转,并且让实现分频的计数器清零。 


    代码

    1. module pdm(
    2. input clk ,
    3. input [11:0] pdm_in ,
    4. input reset ,
    5. output pdm_out
    6. );
    7. reg pdm_processed;
    8. reg [11:0] count;
    9. always @(posedge clk)begin
    10. if(reset)begin
    11. pdm_processed <= 1'd0;
    12. end
    13. else if(pdm_in > 10)begin
    14. if(count <= 3)
    15. pdm_processed <= 1'b1;
    16. else if(count < pdm_in -1)
    17. pdm_processed <= 1'b0;
    18. else if(count == pdm_in-1)
    19. pdm_processed <= 1'b0;
    20. end
    21. else begin // pdm_in <= 10
    22. pdm_processed <= pdm_processed; //stay
    23. end
    24. end
    25. always @(posedge clk)begin
    26. if(reset)begin
    27. count <= 12'd0;
    28. end
    29. else begin
    30. if(pdm_in > 10 && count < pdm_in-1)begin
    31. count <= count + 1'b1;
    32. end
    33. else if(pdm_in > 10 && count == pdm_in-1)begin // one pdm_out cycle finish
    34. count <= 12'd0;
    35. end
    36. else begin // pdm_in <= 10
    37. count <= 12'd0;
    38. end
    39. end
    40. end
    41. assign pdm_out = pdm_processed;
    42. endmodule

    testbench

    1. module pdm_tb();
    2. reg clk,reset;
    3. wire pdm_out;
    4. always #5 clk = ~clk;
    5. reg [11:0] pdm_in;
    6. initial begin
    7. clk <= 1'b0;
    8. reset <= 1'b1;
    9. pdm_in <= 12'd0;
    10. #20
    11. reset <= 1'b0;
    12. #20
    13. pdm_in <= 12'd20;
    14. #400
    15. pdm_in <= 12'd12;
    16. #240
    17. pdm_in <= 12'd5;
    18. #50
    19. pdm_in <= 12'd12;
    20. #30
    21. pdm_in <= 12'd5;
    22. #200
    23. $finish();
    24. end
    25. //dump fsdb
    26. initial begin
    27. $fsdbDumpfile("pdm.fsdb");
    28. $fsdbDumpvars(0);
    29. end
    30. pdm u_pdm(
    31. .clk (clk) ,
    32. .pdm_in (pdm_in),
    33. .reset (reset) ,
    34. .pdm_out(pdm_out)
    35. );
    36. endmodule

    输出波形 

            从波形中可以看到我们设置了pdm_in = 20,pdm_out如我们所想,输出为占空比4/20的方波。当设置pdm_in = 12时,pdm_out输出为占空比4/12的方波。当设置pdm_in < 10时,dpm_out保持原来的状态不变。


     更多手撕代码题可以前往 数字IC手撕代码--题库

  • 相关阅读:
    【无标题】
    GAN网络系列博客(二):改善StyleGAN的图像质量
    day2学习笔记
    计算机毕业设计Python+Django的闲置物品交易系统+二手商城网站(源码+系统+mysql数据库+Lw文档)
    TCP/IP协议介绍——三次握手四次挥手
    使用 Spring Initializr 初始化 Spring Boot 项目
    matlab | 函数:常用函数
    vue2_路由04_编程式路由导航push与replace
    机械工程英语第二版叶邦彦-汉语翻译最多单元版
    全面解析缓存应用经典问题
  • 原文地址:https://blog.csdn.net/qq_57502075/article/details/127831568
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号