Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `timescale 100 ps / 10 ps
- `define DELAY4 40000 // 1 / 4 note delay
- `define DELAY8 20000 // 1 / 8 note delay
- module FuerElise(clk, reset, led, segment, digit, io);
- input clk;
- input reset;
- // disable LEDs and 7 segment display
- output [7:0] led;
- output [7:0] segment;
- output [8:0] digit;
- assign led[7:0] = 0;
- assign segment[7:0] = 0;
- assign digit[3:0] = 'hff;
- // prescaler: 50 MHz / 763 = 65536 Hz
- reg [9:0] devide = 0;
- // 1 bit DAC latch register
- reg DACout = 0;
- output [0:0] io;
- assign io[0] = DACout;
- // current value for converting to analog
- reg [7:0] DACin = 0;
- // sums the DACin every clock cycle; 8th bit is copied to DACout
- reg [8:0] sum = 0;
- // bits 15:8: index in sine table; bits 7:0 fraction index
- reg [15:0] tableIndex = 0;
- // current note frequency
- reg [15:0] freq = 0;
- // current index in note frequency table
- reg [5:0] noteIndex = 0;
- // current index in song table
- reg [5:0] songIndex = 0;
- // current note delay
- reg [17:0] delay = 0;
- always @(posedge clk) begin
- if (devide == 0) begin
- if (delay == 0) begin
- // song note frequency table
- case (songIndex)
- 0: noteIndex = 19;
- 1: noteIndex = 18;
- 2: noteIndex = 19;
- 3: noteIndex = 18;
- 4: noteIndex = 19;
- 5: noteIndex = 14;
- 6: noteIndex = 17;
- 7: noteIndex = 15;
- 8: noteIndex = 12;
- 9: noteIndex = 3;
- 10: noteIndex = 7;
- 11: noteIndex = 12;
- 12: noteIndex = 14;
- 13: noteIndex = 7;
- 14: noteIndex = 11;
- 15: noteIndex = 14;
- 16: noteIndex = 15;
- 17: noteIndex = 7;
- 18: noteIndex = 19;
- 19: noteIndex = 18;
- 20: noteIndex = 19;
- 21: noteIndex = 18;
- 22: noteIndex = 19;
- 23: noteIndex = 14;
- 24: noteIndex = 17;
- 25: noteIndex = 15;
- 26: noteIndex = 12;
- 27: noteIndex = 3;
- 28: noteIndex = 7;
- 29: noteIndex = 12;
- 30: noteIndex = 14;
- 31: noteIndex = 7;
- 32: noteIndex = 15;
- 33: noteIndex = 14;
- 34: noteIndex = 12;
- endcase
- // song note delay table
- case (songIndex)
- 0: delay = `DELAY8;
- 1: delay = `DELAY8;
- 2: delay = `DELAY8;
- 3: delay = `DELAY8;
- 4: delay = `DELAY8;
- 5: delay = `DELAY8;
- 6: delay = `DELAY8;
- 7: delay = `DELAY8;
- 8: delay = `DELAY4;
- 9: delay = `DELAY8;
- 10: delay = `DELAY8;
- 11: delay = `DELAY8;
- 12: delay = `DELAY4;
- 13: delay = `DELAY8;
- 14: delay = `DELAY8;
- 15: delay = `DELAY8;
- 16: delay = `DELAY4;
- 17: delay = `DELAY8;
- 18: delay = `DELAY8;
- 19: delay = `DELAY8;
- 20: delay = `DELAY8;
- 21: delay = `DELAY8;
- 22: delay = `DELAY8;
- 23: delay = `DELAY8;
- 24: delay = `DELAY8;
- 25: delay = `DELAY8;
- 26: delay = `DELAY4;
- 27: delay = `DELAY8;
- 28: delay = `DELAY8;
- 29: delay = `DELAY8;
- 30: delay = `DELAY4;
- 31: delay = `DELAY8;
- 32: delay = `DELAY8;
- 33: delay = `DELAY8;
- 34: delay = `DELAY4;
- endcase
- songIndex = songIndex + 1;
- if (songIndex == 35) songIndex = 0;
- // frequency table
- case (noteIndex)
- 0: freq = 220;
- 1: freq = 233;
- 2: freq = 247;
- 3: freq = 262;
- 4: freq = 277;
- 5: freq = 294;
- 6: freq = 311;
- 7: freq = 330;
- 8: freq = 349;
- 9: freq = 370;
- 10: freq = 392;
- 11: freq = 415;
- 12: freq = 440;
- 13: freq = 466;
- 14: freq = 494;
- 15: freq = 523;
- 16: freq = 554;
- 17: freq = 587;
- 18: freq = 622;
- 19: freq = 659;
- 20: freq = 698;
- 21: freq = 740;
- 22: freq = 784;
- 23: freq = 831;
- 24: freq = 880;
- 25: freq = 932;
- 26: freq = 988;
- endcase
- end else begin
- delay = delay - 1;
- end
- // sine table
- case (tableIndex[15:8])
- 'h00: DACin <= 'h80;
- 'h01: DACin <= 'h83;
- 'h02: DACin <= 'h86;
- 'h03: DACin <= 'h89;
- 'h04: DACin <= 'h8C;
- 'h05: DACin <= 'h8F;
- 'h06: DACin <= 'h92;
- 'h07: DACin <= 'h95;
- 'h08: DACin <= 'h98;
- 'h09: DACin <= 'h9C;
- 'h0A: DACin <= 'h9F;
- 'h0B: DACin <= 'hA2;
- 'h0C: DACin <= 'hA5;
- 'h0D: DACin <= 'hA8;
- 'h0E: DACin <= 'hAB;
- 'h0F: DACin <= 'hAE;
- 'h10: DACin <= 'hB0;
- 'h11: DACin <= 'hB3;
- 'h12: DACin <= 'hB6;
- 'h13: DACin <= 'hB9;
- 'h14: DACin <= 'hBC;
- 'h15: DACin <= 'hBF;
- 'h16: DACin <= 'hC1;
- 'h17: DACin <= 'hC4;
- 'h18: DACin <= 'hC7;
- 'h19: DACin <= 'hC9;
- 'h1A: DACin <= 'hCC;
- 'h1B: DACin <= 'hCE;
- 'h1C: DACin <= 'hD1;
- 'h1D: DACin <= 'hD3;
- 'h1E: DACin <= 'hD5;
- 'h1F: DACin <= 'hD8;
- 'h20: DACin <= 'hDA;
- 'h21: DACin <= 'hDC;
- 'h22: DACin <= 'hDE;
- 'h23: DACin <= 'hE0;
- 'h24: DACin <= 'hE2;
- 'h25: DACin <= 'hE4;
- 'h26: DACin <= 'hE6;
- 'h27: DACin <= 'hE8;
- 'h28: DACin <= 'hEA;
- 'h29: DACin <= 'hEC;
- 'h2A: DACin <= 'hED;
- 'h2B: DACin <= 'hEF;
- 'h2C: DACin <= 'hF0;
- 'h2D: DACin <= 'hF2;
- 'h2E: DACin <= 'hF3;
- 'h2F: DACin <= 'hF5;
- 'h30: DACin <= 'hF6;
- 'h31: DACin <= 'hF7;
- 'h32: DACin <= 'hF8;
- 'h33: DACin <= 'hF9;
- 'h34: DACin <= 'hFA;
- 'h35: DACin <= 'hFB;
- 'h36: DACin <= 'hFC;
- 'h37: DACin <= 'hFC;
- 'h38: DACin <= 'hFD;
- 'h39: DACin <= 'hFE;
- 'h3A: DACin <= 'hFE;
- 'h3B: DACin <= 'hFF;
- 'h3C: DACin <= 'hFF;
- 'h3D: DACin <= 'hFF;
- 'h3E: DACin <= 'hFF;
- 'h3F: DACin <= 'hFF;
- 'h40: DACin <= 'hFF;
- 'h41: DACin <= 'hFF;
- 'h42: DACin <= 'hFF;
- 'h43: DACin <= 'hFF;
- 'h44: DACin <= 'hFF;
- 'h45: DACin <= 'hFF;
- 'h46: DACin <= 'hFE;
- 'h47: DACin <= 'hFE;
- 'h48: DACin <= 'hFD;
- 'h49: DACin <= 'hFC;
- 'h4A: DACin <= 'hFC;
- 'h4B: DACin <= 'hFB;
- 'h4C: DACin <= 'hFA;
- 'h4D: DACin <= 'hF9;
- 'h4E: DACin <= 'hF8;
- 'h4F: DACin <= 'hF7;
- 'h50: DACin <= 'hF6;
- 'h51: DACin <= 'hF5;
- 'h52: DACin <= 'hF3;
- 'h53: DACin <= 'hF2;
- 'h54: DACin <= 'hF0;
- 'h55: DACin <= 'hEF;
- 'h56: DACin <= 'hED;
- 'h57: DACin <= 'hEC;
- 'h58: DACin <= 'hEA;
- 'h59: DACin <= 'hE8;
- 'h5A: DACin <= 'hE6;
- 'h5B: DACin <= 'hE4;
- 'h5C: DACin <= 'hE2;
- 'h5D: DACin <= 'hE0;
- 'h5E: DACin <= 'hDE;
- 'h5F: DACin <= 'hDC;
- 'h60: DACin <= 'hDA;
- 'h61: DACin <= 'hD8;
- 'h62: DACin <= 'hD5;
- 'h63: DACin <= 'hD3;
- 'h64: DACin <= 'hD1;
- 'h65: DACin <= 'hCE;
- 'h66: DACin <= 'hCC;
- 'h67: DACin <= 'hC9;
- 'h68: DACin <= 'hC7;
- 'h69: DACin <= 'hC4;
- 'h6A: DACin <= 'hC1;
- 'h6B: DACin <= 'hBF;
- 'h6C: DACin <= 'hBC;
- 'h6D: DACin <= 'hB9;
- 'h6E: DACin <= 'hB6;
- 'h6F: DACin <= 'hB3;
- 'h70: DACin <= 'hB0;
- 'h71: DACin <= 'hAE;
- 'h72: DACin <= 'hAB;
- 'h73: DACin <= 'hA8;
- 'h74: DACin <= 'hA5;
- 'h75: DACin <= 'hA2;
- 'h76: DACin <= 'h9F;
- 'h77: DACin <= 'h9C;
- 'h78: DACin <= 'h98;
- 'h79: DACin <= 'h95;
- 'h7A: DACin <= 'h92;
- 'h7B: DACin <= 'h8F;
- 'h7C: DACin <= 'h8C;
- 'h7D: DACin <= 'h89;
- 'h7E: DACin <= 'h86;
- 'h7F: DACin <= 'h83;
- 'h80: DACin <= 'h7F;
- 'h81: DACin <= 'h7C;
- 'h82: DACin <= 'h79;
- 'h83: DACin <= 'h76;
- 'h84: DACin <= 'h73;
- 'h85: DACin <= 'h70;
- 'h86: DACin <= 'h6D;
- 'h87: DACin <= 'h6A;
- 'h88: DACin <= 'h67;
- 'h89: DACin <= 'h63;
- 'h8A: DACin <= 'h60;
- 'h8B: DACin <= 'h5D;
- 'h8C: DACin <= 'h5A;
- 'h8D: DACin <= 'h57;
- 'h8E: DACin <= 'h54;
- 'h8F: DACin <= 'h51;
- 'h90: DACin <= 'h4F;
- 'h91: DACin <= 'h4C;
- 'h92: DACin <= 'h49;
- 'h93: DACin <= 'h46;
- 'h94: DACin <= 'h43;
- 'h95: DACin <= 'h40;
- 'h96: DACin <= 'h3E;
- 'h97: DACin <= 'h3B;
- 'h98: DACin <= 'h38;
- 'h99: DACin <= 'h36;
- 'h9A: DACin <= 'h33;
- 'h9B: DACin <= 'h31;
- 'h9C: DACin <= 'h2E;
- 'h9D: DACin <= 'h2C;
- 'h9E: DACin <= 'h2A;
- 'h9F: DACin <= 'h27;
- 'hA0: DACin <= 'h25;
- 'hA1: DACin <= 'h23;
- 'hA2: DACin <= 'h21;
- 'hA3: DACin <= 'h1F;
- 'hA4: DACin <= 'h1D;
- 'hA5: DACin <= 'h1B;
- 'hA6: DACin <= 'h19;
- 'hA7: DACin <= 'h17;
- 'hA8: DACin <= 'h15;
- 'hA9: DACin <= 'h13;
- 'hAA: DACin <= 'h12;
- 'hAB: DACin <= 'h10;
- 'hAC: DACin <= 'h0F;
- 'hAD: DACin <= 'h0D;
- 'hAE: DACin <= 'h0C;
- 'hAF: DACin <= 'h0A;
- 'hB0: DACin <= 'h09;
- 'hB1: DACin <= 'h08;
- 'hB2: DACin <= 'h07;
- 'hB3: DACin <= 'h06;
- 'hB4: DACin <= 'h05;
- 'hB5: DACin <= 'h04;
- 'hB6: DACin <= 'h03;
- 'hB7: DACin <= 'h03;
- 'hB8: DACin <= 'h02;
- 'hB9: DACin <= 'h01;
- 'hBA: DACin <= 'h01;
- 'hBB: DACin <= 'h00;
- 'hBC: DACin <= 'h00;
- 'hBD: DACin <= 'h00;
- 'hBE: DACin <= 'h00;
- 'hBF: DACin <= 'h00;
- 'hC0: DACin <= 'h00;
- 'hC1: DACin <= 'h00;
- 'hC2: DACin <= 'h00;
- 'hC3: DACin <= 'h00;
- 'hC4: DACin <= 'h00;
- 'hC5: DACin <= 'h00;
- 'hC6: DACin <= 'h01;
- 'hC7: DACin <= 'h01;
- 'hC8: DACin <= 'h02;
- 'hC9: DACin <= 'h03;
- 'hCA: DACin <= 'h03;
- 'hCB: DACin <= 'h04;
- 'hCC: DACin <= 'h05;
- 'hCD: DACin <= 'h06;
- 'hCE: DACin <= 'h07;
- 'hCF: DACin <= 'h08;
- 'hD0: DACin <= 'h09;
- 'hD1: DACin <= 'h0A;
- 'hD2: DACin <= 'h0C;
- 'hD3: DACin <= 'h0D;
- 'hD4: DACin <= 'h0F;
- 'hD5: DACin <= 'h10;
- 'hD6: DACin <= 'h12;
- 'hD7: DACin <= 'h13;
- 'hD8: DACin <= 'h15;
- 'hD9: DACin <= 'h17;
- 'hDA: DACin <= 'h19;
- 'hDB: DACin <= 'h1B;
- 'hDC: DACin <= 'h1D;
- 'hDD: DACin <= 'h1F;
- 'hDE: DACin <= 'h21;
- 'hDF: DACin <= 'h23;
- 'hE0: DACin <= 'h25;
- 'hE1: DACin <= 'h27;
- 'hE2: DACin <= 'h2A;
- 'hE3: DACin <= 'h2C;
- 'hE4: DACin <= 'h2E;
- 'hE5: DACin <= 'h31;
- 'hE6: DACin <= 'h33;
- 'hE7: DACin <= 'h36;
- 'hE8: DACin <= 'h38;
- 'hE9: DACin <= 'h3B;
- 'hEA: DACin <= 'h3E;
- 'hEB: DACin <= 'h40;
- 'hEC: DACin <= 'h43;
- 'hED: DACin <= 'h46;
- 'hEE: DACin <= 'h49;
- 'hEF: DACin <= 'h4C;
- 'hF0: DACin <= 'h4F;
- 'hF1: DACin <= 'h51;
- 'hF2: DACin <= 'h54;
- 'hF3: DACin <= 'h57;
- 'hF4: DACin <= 'h5A;
- 'hF5: DACin <= 'h5D;
- 'hF6: DACin <= 'h60;
- 'hF7: DACin <= 'h63;
- 'hF8: DACin <= 'h67;
- 'hF9: DACin <= 'h6A;
- 'hFA: DACin <= 'h6D;
- 'hFB: DACin <= 'h70;
- 'hFC: DACin <= 'h73;
- 'hFD: DACin <= 'h76;
- 'hFE: DACin <= 'h79;
- 'hFF: DACin <= 'h7C;
- endcase
- tableIndex <= tableIndex + freq;
- devide <= 763;
- end else devide <= devide - 1;
- end
- always @(posedge clk) begin
- sum[8] = 0;
- sum = sum + DACin;
- DACout = sum[8];
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement