Advertisement
Guest User

Untitled

a guest
Dec 29th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 10.53 KB | None | 0 0
  1. `timescale 100 ps / 10 ps
  2. `define DELAY4 40000  // 1 / 4 note delay
  3. `define DELAY8 20000  // 1 / 8 note delay
  4.  
  5. module FuerElise(clk, reset, led, segment, digit, io);
  6.  
  7.     input clk;
  8.     input reset;
  9.  
  10.     // disable LEDs and 7 segment display
  11.     output [7:0] led;
  12.     output [7:0] segment;
  13.     output [8:0] digit;
  14.     assign led[7:0] = 0;
  15.     assign segment[7:0] = 0;
  16.     assign digit[3:0] = 'hff;
  17.  
  18.     // prescaler: 50 MHz / 763 = 65536 Hz
  19.     reg [9:0] devide = 0;
  20.  
  21.     // 1 bit DAC latch register
  22.     reg DACout = 0;
  23.     output [0:0] io;
  24.     assign io[0] = DACout;
  25.  
  26.     // current value for converting to analog
  27.     reg [7:0] DACin = 0;
  28.  
  29.     // sums the DACin every clock cycle; 8th bit is copied to DACout
  30.     reg [8:0] sum = 0;
  31.  
  32.     // bits 15:8: index in sine table; bits 7:0 fraction index
  33.     reg [15:0] tableIndex = 0;
  34.  
  35.     // current note frequency
  36.     reg [15:0] freq = 0;
  37.  
  38.     // current index in note frequency table
  39.     reg [5:0] noteIndex = 0;
  40.  
  41.     // current index in song table
  42.     reg [5:0] songIndex = 0;
  43.  
  44.     // current note delay
  45.     reg [17:0] delay = 0;
  46.  
  47.     always @(posedge clk) begin
  48.         if (devide == 0) begin
  49.             if (delay == 0) begin
  50.                 // song note frequency table
  51.                 case (songIndex)
  52.                     0: noteIndex = 19;
  53.                     1: noteIndex = 18;
  54.                     2: noteIndex = 19;
  55.                     3: noteIndex = 18;
  56.                     4: noteIndex = 19;
  57.                     5: noteIndex = 14;
  58.                     6: noteIndex = 17;
  59.                     7: noteIndex = 15;
  60.                     8: noteIndex = 12;
  61.                     9: noteIndex = 3;
  62.                     10: noteIndex = 7;
  63.                     11: noteIndex = 12;
  64.                     12: noteIndex = 14;
  65.                     13: noteIndex = 7;
  66.                     14: noteIndex = 11;
  67.                     15: noteIndex = 14;
  68.                     16: noteIndex = 15;
  69.                     17: noteIndex = 7;
  70.                     18: noteIndex = 19;
  71.                     19: noteIndex = 18;
  72.                     20: noteIndex = 19;
  73.                     21: noteIndex = 18;
  74.                     22: noteIndex = 19;
  75.                     23: noteIndex = 14;
  76.                     24: noteIndex = 17;
  77.                     25: noteIndex = 15;
  78.                     26: noteIndex = 12;
  79.                     27: noteIndex = 3;
  80.                     28: noteIndex = 7;
  81.                     29: noteIndex = 12;
  82.                     30: noteIndex = 14;
  83.                     31: noteIndex = 7;
  84.                     32: noteIndex = 15;
  85.                     33: noteIndex = 14;
  86.                     34: noteIndex = 12;
  87.                 endcase
  88.  
  89.                 // song note delay table
  90.                 case (songIndex)
  91.                     0: delay = `DELAY8;
  92.                     1: delay = `DELAY8;
  93.                     2: delay = `DELAY8;
  94.                     3: delay = `DELAY8;
  95.                     4: delay = `DELAY8;
  96.                     5: delay = `DELAY8;
  97.                     6: delay = `DELAY8;
  98.                     7: delay = `DELAY8;
  99.                     8: delay = `DELAY4;
  100.                     9: delay = `DELAY8;
  101.                     10: delay = `DELAY8;
  102.                     11: delay = `DELAY8;
  103.                     12: delay = `DELAY4;
  104.                     13: delay = `DELAY8;
  105.                     14: delay = `DELAY8;
  106.                     15: delay = `DELAY8;
  107.                     16: delay = `DELAY4;
  108.                     17: delay = `DELAY8;
  109.                     18: delay = `DELAY8;
  110.                     19: delay = `DELAY8;
  111.                     20: delay = `DELAY8;
  112.                     21: delay = `DELAY8;
  113.                     22: delay = `DELAY8;
  114.                     23: delay = `DELAY8;
  115.                     24: delay = `DELAY8;
  116.                     25: delay = `DELAY8;
  117.                     26: delay = `DELAY4;
  118.                     27: delay = `DELAY8;
  119.                     28: delay = `DELAY8;
  120.                     29: delay = `DELAY8;
  121.                     30: delay = `DELAY4;
  122.                     31: delay = `DELAY8;
  123.                     32: delay = `DELAY8;
  124.                     33: delay = `DELAY8;
  125.                     34: delay = `DELAY4;
  126.                 endcase
  127.  
  128.                 songIndex = songIndex + 1;
  129.                 if (songIndex == 35) songIndex = 0;
  130.  
  131.                 // frequency table
  132.                 case (noteIndex)
  133.                     0: freq = 220;
  134.                     1: freq = 233;
  135.                     2: freq = 247;
  136.                     3: freq = 262;
  137.                     4: freq = 277;
  138.                     5: freq = 294;
  139.                     6: freq = 311;
  140.                     7: freq = 330;
  141.                     8: freq = 349;
  142.                     9: freq = 370;
  143.                     10: freq = 392;
  144.                     11: freq = 415;
  145.                     12: freq = 440;
  146.                     13: freq = 466;
  147.                     14: freq = 494;
  148.                     15: freq = 523;
  149.                     16: freq = 554;
  150.                     17: freq = 587;
  151.                     18: freq = 622;
  152.                     19: freq = 659;
  153.                     20: freq = 698;
  154.                     21: freq = 740;
  155.                     22: freq = 784;
  156.                     23: freq = 831;
  157.                     24: freq = 880;
  158.                     25: freq = 932;
  159.                     26: freq = 988;
  160.                 endcase
  161.             end else begin
  162.                 delay = delay - 1;
  163.             end
  164.  
  165.             // sine table
  166.             case (tableIndex[15:8])
  167.                 'h00: DACin <= 'h80;
  168.                 'h01: DACin <= 'h83;
  169.                 'h02: DACin <= 'h86;
  170.                 'h03: DACin <= 'h89;
  171.                 'h04: DACin <= 'h8C;
  172.                 'h05: DACin <= 'h8F;
  173.                 'h06: DACin <= 'h92;
  174.                 'h07: DACin <= 'h95;
  175.                 'h08: DACin <= 'h98;
  176.                 'h09: DACin <= 'h9C;
  177.                 'h0A: DACin <= 'h9F;
  178.                 'h0B: DACin <= 'hA2;
  179.                 'h0C: DACin <= 'hA5;
  180.                 'h0D: DACin <= 'hA8;
  181.                 'h0E: DACin <= 'hAB;
  182.                 'h0F: DACin <= 'hAE;
  183.                 'h10: DACin <= 'hB0;
  184.                 'h11: DACin <= 'hB3;
  185.                 'h12: DACin <= 'hB6;
  186.                 'h13: DACin <= 'hB9;
  187.                 'h14: DACin <= 'hBC;
  188.                 'h15: DACin <= 'hBF;
  189.                 'h16: DACin <= 'hC1;
  190.                 'h17: DACin <= 'hC4;
  191.                 'h18: DACin <= 'hC7;
  192.                 'h19: DACin <= 'hC9;
  193.                 'h1A: DACin <= 'hCC;
  194.                 'h1B: DACin <= 'hCE;
  195.                 'h1C: DACin <= 'hD1;
  196.                 'h1D: DACin <= 'hD3;
  197.                 'h1E: DACin <= 'hD5;
  198.                 'h1F: DACin <= 'hD8;
  199.                 'h20: DACin <= 'hDA;
  200.                 'h21: DACin <= 'hDC;
  201.                 'h22: DACin <= 'hDE;
  202.                 'h23: DACin <= 'hE0;
  203.                 'h24: DACin <= 'hE2;
  204.                 'h25: DACin <= 'hE4;
  205.                 'h26: DACin <= 'hE6;
  206.                 'h27: DACin <= 'hE8;
  207.                 'h28: DACin <= 'hEA;
  208.                 'h29: DACin <= 'hEC;
  209.                 'h2A: DACin <= 'hED;
  210.                 'h2B: DACin <= 'hEF;
  211.                 'h2C: DACin <= 'hF0;
  212.                 'h2D: DACin <= 'hF2;
  213.                 'h2E: DACin <= 'hF3;
  214.                 'h2F: DACin <= 'hF5;
  215.                 'h30: DACin <= 'hF6;
  216.                 'h31: DACin <= 'hF7;
  217.                 'h32: DACin <= 'hF8;
  218.                 'h33: DACin <= 'hF9;
  219.                 'h34: DACin <= 'hFA;
  220.                 'h35: DACin <= 'hFB;
  221.                 'h36: DACin <= 'hFC;
  222.                 'h37: DACin <= 'hFC;
  223.                 'h38: DACin <= 'hFD;
  224.                 'h39: DACin <= 'hFE;
  225.                 'h3A: DACin <= 'hFE;
  226.                 'h3B: DACin <= 'hFF;
  227.                 'h3C: DACin <= 'hFF;
  228.                 'h3D: DACin <= 'hFF;
  229.                 'h3E: DACin <= 'hFF;
  230.                 'h3F: DACin <= 'hFF;
  231.                 'h40: DACin <= 'hFF;
  232.                 'h41: DACin <= 'hFF;
  233.                 'h42: DACin <= 'hFF;
  234.                 'h43: DACin <= 'hFF;
  235.                 'h44: DACin <= 'hFF;
  236.                 'h45: DACin <= 'hFF;
  237.                 'h46: DACin <= 'hFE;
  238.                 'h47: DACin <= 'hFE;
  239.                 'h48: DACin <= 'hFD;
  240.                 'h49: DACin <= 'hFC;
  241.                 'h4A: DACin <= 'hFC;
  242.                 'h4B: DACin <= 'hFB;
  243.                 'h4C: DACin <= 'hFA;
  244.                 'h4D: DACin <= 'hF9;
  245.                 'h4E: DACin <= 'hF8;
  246.                 'h4F: DACin <= 'hF7;
  247.                 'h50: DACin <= 'hF6;
  248.                 'h51: DACin <= 'hF5;
  249.                 'h52: DACin <= 'hF3;
  250.                 'h53: DACin <= 'hF2;
  251.                 'h54: DACin <= 'hF0;
  252.                 'h55: DACin <= 'hEF;
  253.                 'h56: DACin <= 'hED;
  254.                 'h57: DACin <= 'hEC;
  255.                 'h58: DACin <= 'hEA;
  256.                 'h59: DACin <= 'hE8;
  257.                 'h5A: DACin <= 'hE6;
  258.                 'h5B: DACin <= 'hE4;
  259.                 'h5C: DACin <= 'hE2;
  260.                 'h5D: DACin <= 'hE0;
  261.                 'h5E: DACin <= 'hDE;
  262.                 'h5F: DACin <= 'hDC;
  263.                 'h60: DACin <= 'hDA;
  264.                 'h61: DACin <= 'hD8;
  265.                 'h62: DACin <= 'hD5;
  266.                 'h63: DACin <= 'hD3;
  267.                 'h64: DACin <= 'hD1;
  268.                 'h65: DACin <= 'hCE;
  269.                 'h66: DACin <= 'hCC;
  270.                 'h67: DACin <= 'hC9;
  271.                 'h68: DACin <= 'hC7;
  272.                 'h69: DACin <= 'hC4;
  273.                 'h6A: DACin <= 'hC1;
  274.                 'h6B: DACin <= 'hBF;
  275.                 'h6C: DACin <= 'hBC;
  276.                 'h6D: DACin <= 'hB9;
  277.                 'h6E: DACin <= 'hB6;
  278.                 'h6F: DACin <= 'hB3;
  279.                 'h70: DACin <= 'hB0;
  280.                 'h71: DACin <= 'hAE;
  281.                 'h72: DACin <= 'hAB;
  282.                 'h73: DACin <= 'hA8;
  283.                 'h74: DACin <= 'hA5;
  284.                 'h75: DACin <= 'hA2;
  285.                 'h76: DACin <= 'h9F;
  286.                 'h77: DACin <= 'h9C;
  287.                 'h78: DACin <= 'h98;
  288.                 'h79: DACin <= 'h95;
  289.                 'h7A: DACin <= 'h92;
  290.                 'h7B: DACin <= 'h8F;
  291.                 'h7C: DACin <= 'h8C;
  292.                 'h7D: DACin <= 'h89;
  293.                 'h7E: DACin <= 'h86;
  294.                 'h7F: DACin <= 'h83;
  295.                 'h80: DACin <= 'h7F;
  296.                 'h81: DACin <= 'h7C;
  297.                 'h82: DACin <= 'h79;
  298.                 'h83: DACin <= 'h76;
  299.                 'h84: DACin <= 'h73;
  300.                 'h85: DACin <= 'h70;
  301.                 'h86: DACin <= 'h6D;
  302.                 'h87: DACin <= 'h6A;
  303.                 'h88: DACin <= 'h67;
  304.                 'h89: DACin <= 'h63;
  305.                 'h8A: DACin <= 'h60;
  306.                 'h8B: DACin <= 'h5D;
  307.                 'h8C: DACin <= 'h5A;
  308.                 'h8D: DACin <= 'h57;
  309.                 'h8E: DACin <= 'h54;
  310.                 'h8F: DACin <= 'h51;
  311.                 'h90: DACin <= 'h4F;
  312.                 'h91: DACin <= 'h4C;
  313.                 'h92: DACin <= 'h49;
  314.                 'h93: DACin <= 'h46;
  315.                 'h94: DACin <= 'h43;
  316.                 'h95: DACin <= 'h40;
  317.                 'h96: DACin <= 'h3E;
  318.                 'h97: DACin <= 'h3B;
  319.                 'h98: DACin <= 'h38;
  320.                 'h99: DACin <= 'h36;
  321.                 'h9A: DACin <= 'h33;
  322.                 'h9B: DACin <= 'h31;
  323.                 'h9C: DACin <= 'h2E;
  324.                 'h9D: DACin <= 'h2C;
  325.                 'h9E: DACin <= 'h2A;
  326.                 'h9F: DACin <= 'h27;
  327.                 'hA0: DACin <= 'h25;
  328.                 'hA1: DACin <= 'h23;
  329.                 'hA2: DACin <= 'h21;
  330.                 'hA3: DACin <= 'h1F;
  331.                 'hA4: DACin <= 'h1D;
  332.                 'hA5: DACin <= 'h1B;
  333.                 'hA6: DACin <= 'h19;
  334.                 'hA7: DACin <= 'h17;
  335.                 'hA8: DACin <= 'h15;
  336.                 'hA9: DACin <= 'h13;
  337.                 'hAA: DACin <= 'h12;
  338.                 'hAB: DACin <= 'h10;
  339.                 'hAC: DACin <= 'h0F;
  340.                 'hAD: DACin <= 'h0D;
  341.                 'hAE: DACin <= 'h0C;
  342.                 'hAF: DACin <= 'h0A;
  343.                 'hB0: DACin <= 'h09;
  344.                 'hB1: DACin <= 'h08;
  345.                 'hB2: DACin <= 'h07;
  346.                 'hB3: DACin <= 'h06;
  347.                 'hB4: DACin <= 'h05;
  348.                 'hB5: DACin <= 'h04;
  349.                 'hB6: DACin <= 'h03;
  350.                 'hB7: DACin <= 'h03;
  351.                 'hB8: DACin <= 'h02;
  352.                 'hB9: DACin <= 'h01;
  353.                 'hBA: DACin <= 'h01;
  354.                 'hBB: DACin <= 'h00;
  355.                 'hBC: DACin <= 'h00;
  356.                 'hBD: DACin <= 'h00;
  357.                 'hBE: DACin <= 'h00;
  358.                 'hBF: DACin <= 'h00;
  359.                 'hC0: DACin <= 'h00;
  360.                 'hC1: DACin <= 'h00;
  361.                 'hC2: DACin <= 'h00;
  362.                 'hC3: DACin <= 'h00;
  363.                 'hC4: DACin <= 'h00;
  364.                 'hC5: DACin <= 'h00;
  365.                 'hC6: DACin <= 'h01;
  366.                 'hC7: DACin <= 'h01;
  367.                 'hC8: DACin <= 'h02;
  368.                 'hC9: DACin <= 'h03;
  369.                 'hCA: DACin <= 'h03;
  370.                 'hCB: DACin <= 'h04;
  371.                 'hCC: DACin <= 'h05;
  372.                 'hCD: DACin <= 'h06;
  373.                 'hCE: DACin <= 'h07;
  374.                 'hCF: DACin <= 'h08;
  375.                 'hD0: DACin <= 'h09;
  376.                 'hD1: DACin <= 'h0A;
  377.                 'hD2: DACin <= 'h0C;
  378.                 'hD3: DACin <= 'h0D;
  379.                 'hD4: DACin <= 'h0F;
  380.                 'hD5: DACin <= 'h10;
  381.                 'hD6: DACin <= 'h12;
  382.                 'hD7: DACin <= 'h13;
  383.                 'hD8: DACin <= 'h15;
  384.                 'hD9: DACin <= 'h17;
  385.                 'hDA: DACin <= 'h19;
  386.                 'hDB: DACin <= 'h1B;
  387.                 'hDC: DACin <= 'h1D;
  388.                 'hDD: DACin <= 'h1F;
  389.                 'hDE: DACin <= 'h21;
  390.                 'hDF: DACin <= 'h23;
  391.                 'hE0: DACin <= 'h25;
  392.                 'hE1: DACin <= 'h27;
  393.                 'hE2: DACin <= 'h2A;
  394.                 'hE3: DACin <= 'h2C;
  395.                 'hE4: DACin <= 'h2E;
  396.                 'hE5: DACin <= 'h31;
  397.                 'hE6: DACin <= 'h33;
  398.                 'hE7: DACin <= 'h36;
  399.                 'hE8: DACin <= 'h38;
  400.                 'hE9: DACin <= 'h3B;
  401.                 'hEA: DACin <= 'h3E;
  402.                 'hEB: DACin <= 'h40;
  403.                 'hEC: DACin <= 'h43;
  404.                 'hED: DACin <= 'h46;
  405.                 'hEE: DACin <= 'h49;
  406.                 'hEF: DACin <= 'h4C;
  407.                 'hF0: DACin <= 'h4F;
  408.                 'hF1: DACin <= 'h51;
  409.                 'hF2: DACin <= 'h54;
  410.                 'hF3: DACin <= 'h57;
  411.                 'hF4: DACin <= 'h5A;
  412.                 'hF5: DACin <= 'h5D;
  413.                 'hF6: DACin <= 'h60;
  414.                 'hF7: DACin <= 'h63;
  415.                 'hF8: DACin <= 'h67;
  416.                 'hF9: DACin <= 'h6A;
  417.                 'hFA: DACin <= 'h6D;
  418.                 'hFB: DACin <= 'h70;
  419.                 'hFC: DACin <= 'h73;
  420.                 'hFD: DACin <= 'h76;
  421.                 'hFE: DACin <= 'h79;
  422.                 'hFF: DACin <= 'h7C;
  423.             endcase
  424.             tableIndex <= tableIndex + freq;
  425.             devide <= 763;
  426.         end else devide <= devide - 1;
  427.     end
  428.  
  429.     always @(posedge clk) begin
  430.         sum[8] = 0;
  431.         sum = sum + DACin;
  432.         DACout = sum[8];
  433.     end
  434.  
  435. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement