设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 1241|回复: 5
收起左侧

Quartus Verilog HDL/FPGA 实现驱动无源蜂鸣器无限循环播放音乐演奏程序源码

[复制链接]
发表于 2022-1-18 20:12:39 | 显示全部楼层 |阅读模式
main.png
  1. module music_hz(                //蜂鸣器频率查表
  2.         input [7:0] pc,
  3.         output [15:0] hz
  4. );
  5. reg [15:0] i;
  6. assign hz = i;
  7. always @(*) begin
  8.                 case(pc)
  9.                         0:i=0;
  10.                         1:i=600;
  11.                         2:i=600;
  12.                         3:i=900;
  13.                         4:i=1200;
  14.                         5:i=900;
  15.                         6:i=1200;
  16.                         7:i=1500;
  17.                         8:i=1600;
  18.                         9:i=1500;
  19.                         10:i=1180;
  20.                         11:i=1350;
  21.                         12:i=0;
  22.                         13:i=600;
  23.                         14:i=600;
  24.                         15:i=900;
  25.                         16:i=1200;
  26.                         17:i=900;
  27.                         18:i=1200;
  28.                         19:i=1500;
  29.                         20:i=1600;
  30.                         21:i=1500;
  31.                         22:i=1200;
  32.                         23:i=1330;
  33.                         24:i=0;
  34.                         25:i=1500;
  35.                         26:i=1330;
  36.                         27:i=1200;
  37.                         28:i=1200;
  38.                         29:i=1330;
  39.                         30:i=1500;
  40.                         31:i=2000;
  41.                         32:i=2000;
  42.                         33:i=1800;
  43.                         34:i=1600;
  44.                         35:i=1500;
  45.                         36:i=1330;
  46.                         37:i=1600;
  47.                         38:i=1500;
  48.                         39:i=1200;
  49.                         40:i=900;
  50.                         41:i=1000;
  51.                         42:i=1000;
  52.                         43:i=1100;
  53.                         44:i=1200;
  54.                         45:i=1500;
  55.                         46:i=1200;
  56.                         47:i=1340;
  57.                         48:i=1500;
  58.                         49:i=1600;
  59.                         50:i=1670;
  60.                         51:i=1800;
  61.                         52:i=1340;
  62.                         53:i=900;
  63.                         54:i=750;
  64.                         55:i=600;
  65.                         56:i=600;
  66.                         57:i=900;
  67.                         58:i=1200;
  68.                         59:i=900;
  69.                         60:i=1200;
  70.                         61:i=1500;
  71.                         62:i=1600;
  72.                         63:i=1500;
  73.                         64:i=1180;
  74.                         65:i=1350;
  75.                         66:i=0;
  76.                         67:i=600;
  77.                         68:i=600;
  78.                         69:i=900;
  79.                         70:i=1200;
  80.                         71:i=900;
  81.                         72:i=1200;
  82.                         73:i=1500;
  83.                         74:i=1600;
  84.                         75:i=1500;
  85.                         76:i=1200;
  86.                         77:i=1330;
  87.                         78:i=0;
  88.                         79:i=1500;
  89.                         80:i=1330;
  90.                         81:i=1200;
  91.                         82:i=1200;
  92.                         83:i=1330;
  93.                         84:i=1500;
  94.                         85:i=2000;
  95.                         86:i=1800;
  96.                         87:i=1600;
  97.                         88:i=1500;
  98.                         89:i=1330;
  99.                         90:i=1600;
  100.                         91:i=1500;
  101.                         92:i=1200;
  102.                         93:i=900;
  103.                         94:i=1000;
  104.                         95:i=1000;
  105.                         96:i=1100;
  106.                         97:i=1200;
  107.                         98:i=1500;
  108.                         99:i=1200;
  109.                         100:i=1330;
  110.                         101:i=1200;
  111.                         102:i=1120;
  112.                         103:i=1330;
  113.                         104:i=1200;
  114.                         105:i=0;
  115.                         default:i = 0;
  116.                 endcase
  117. end
  118. endmodule

  119. module music_ms(                //蜂鸣器延时查表
  120.         input [7:0] pc,
  121.         output [15:0] ms
  122. );
  123. reg [15:0] i;
  124. assign ms = i;
  125. always @(*) begin
  126.                 case(pc)
  127.                         0:i=580;
  128.                         1:i=300;
  129.                         2:i=100;
  130.                         3:i=200;
  131.                         4:i=350;
  132.                         5:i=170;
  133.                         6:i=200;
  134.                         7:i=170;
  135.                         8:i=260;
  136.                         9:i=260;
  137.                         10:i=180;
  138.                         11:i=350;
  139.                         12:i=360;
  140.                         13:i=250;
  141.                         14:i=100;
  142.                         15:i=170;
  143.                         16:i=360;
  144.                         17:i=170;
  145.                         18:i=180;
  146.                         19:i=170;
  147.                         20:i=260;
  148.                         21:i=260;
  149.                         22:i=170;
  150.                         23:i=200;
  151.                         24:i=150;
  152.                         25:i=240;
  153.                         26:i=100;
  154.                         27:i=350;
  155.                         28:i=270;
  156.                         29:i=80;
  157.                         30:i=170;
  158.                         31:i=180;
  159.                         32:i=175;
  160.                         33:i=170;
  161.                         34:i=170;
  162.                         35:i=180;
  163.                         36:i=170;
  164.                         37:i=180;
  165.                         38:i=180;
  166.                         39:i=170;
  167.                         40:i=350;
  168.                         41:i=350;
  169.                         42:i=250;
  170.                         43:i=100;
  171.                         44:i=180;
  172.                         45:i=350;
  173.                         46:i=180;
  174.                         47:i=170;
  175.                         48:i=180;
  176.                         49:i=170;
  177.                         50:i=170;
  178.                         51:i=190;
  179.                         52:i=150;
  180.                         53:i=150;
  181.                         54:i=200;
  182.                         55:i=300;
  183.                         56:i=100;
  184.                         57:i=200;
  185.                         58:i=350;
  186.                         59:i=170;
  187.                         60:i=200;
  188.                         61:i=170;
  189.                         62:i=260;
  190.                         63:i=260;
  191.                         64:i=180;
  192.                         65:i=350;
  193.                         66:i=360;
  194.                         67:i=250;
  195.                         68:i=100;
  196.                         69:i=170;
  197.                         70:i=360;
  198.                         71:i=170;
  199.                         72:i=180;
  200.                         73:i=170;
  201.                         74:i=260;
  202.                         75:i=260;
  203.                         76:i=170;
  204.                         77:i=200;
  205.                         78:i=150;
  206.                         79:i=260;
  207.                         80:i=90;
  208.                         81:i=350;
  209.                         82:i=260;
  210.                         83:i=90;
  211.                         84:i=170;
  212.                         85:i=350;
  213.                         86:i=170;
  214.                         87:i=170;
  215.                         88:i=180;
  216.                         89:i=170;
  217.                         90:i=170;
  218.                         91:i=180;
  219.                         92:i=170;
  220.                         93:i=350;
  221.                         94:i=350;
  222.                         95:i=260;
  223.                         96:i=90;
  224.                         97:i=170;
  225.                         98:i=340;
  226.                         99:i=180;
  227.                         100:i=170;
  228.                         101:i=170;
  229.                         102:i=180;
  230.                         103:i=170;
  231.                         104:i=350;
  232.                         105:i=250;
  233.                         default:i = 0;
  234.                 endcase
  235. end
  236. endmodule

  237. module main(
  238.         input clk,                //50Mhz 时钟输入 Pin17
  239.         output reg beep        //无源蜂鸣器 Pin8 低电平触发
  240. );

  241. parameter fosc = 50000000; //晶振频率
  242. reg [15:0] hz;                //蜂鸣器当前鸣叫的频率
  243. reg [15:0] ms;                //蜂鸣器当前频率还剩多长时间 减到0切换到下一个频率
  244. reg [31:0] i;
  245. always @(posedge clk) begin                //蜂鸣器频率发生器
  246.         if(hz != 0) begin
  247.                 i = i + 1;
  248.                 if(i >= fosc/2/hz) begin
  249.                         i = 0;
  250.                         beep <= !beep;
  251.                 end
  252.         end else begin                //0Hz关闭蜂鸣器
  253.                 i = 0;
  254.                 beep <= 1;
  255.         end
  256. end

  257. reg [15:0] j = 0;
  258. reg khz1 = 0;
  259. always @(posedge clk) begin                //50Mhz分频1Khz
  260.         j = j + 1;
  261.         if(j >= fosc/1000/2) begin
  262.                 j = 0;
  263.                 khz1 <= !khz1;
  264.         end
  265. end

  266. reg [7:0] pc = 0;                        //蜂鸣器音乐 频率时间指针
  267. wire [15:0] w_hz;
  268. wire [15:0] w_ms;
  269. music_hz music_hz(
  270.         .pc(pc),
  271.         .hz(w_hz)
  272. );

  273. music_ms music_ms(
  274.         .pc(pc),
  275.         .ms(w_ms)
  276. );

  277. always @(posedge khz1) begin                        //1Khz 上升沿触发
  278.         if(ms <= 1) begin
  279.                 hz = w_hz;
  280.                 ms = w_ms;
  281.                 pc = pc + 1;
  282.                 if(pc > 105) begin
  283.                         pc = 0;
  284.                 end
  285.         end else begin
  286.                 ms = ms - 1;
  287.         end
  288. end
  289. endmodule
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-29 07:54 , Processed in 1.022058 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表