dac.v 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 19:26:11 07/23/2010
  7. // Design Name:
  8. // Module Name: dac_test
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module dac(
  22. input clkin,
  23. input sysclk,
  24. input we,
  25. input[10:0] pgm_address,
  26. input[7:0] pgm_data,
  27. input[7:0] volume,
  28. input vol_latch,
  29. input play,
  30. input reset,
  31. output sdout,
  32. output lrck,
  33. output mclk,
  34. output sclk,
  35. output DAC_STATUS
  36. );
  37. reg[8:0] dac_address_r;
  38. wire[8:0] dac_address = dac_address_r;
  39. wire[31:0] dac_data;
  40. assign DAC_STATUS = dac_address_r[8];
  41. reg[7:0] vol_reg;
  42. reg[7:0] vol_target_reg;
  43. reg[1:0] vol_latch_reg;
  44. reg vol_valid;
  45. reg[2:0] sysclk_sreg;
  46. wire sysclk_rising = (sysclk_sreg[2:1] == 2'b01);
  47. reg [25:0] interpol_count;
  48. always @(posedge clkin) begin
  49. sysclk_sreg <= {sysclk_sreg[1:0], sysclk};
  50. end
  51. dac_buf snes_dac_buf (
  52. .clka(clkin),
  53. .wea(~we), // Bus [0 : 0]
  54. .addra(pgm_address), // Bus [10 : 0]
  55. .dina(pgm_data), // Bus [7 : 0]
  56. .clkb(clkin),
  57. .addrb(dac_address), // Bus [8 : 0]
  58. .doutb(dac_data)); // Bus [31 : 0]
  59. reg [8:0] cnt;
  60. reg [15:0] smpcnt;
  61. reg [1:0] samples;
  62. reg [15:0] smpshift;
  63. assign mclk = cnt[2]; // mclk = clk/8
  64. assign lrck = cnt[8]; // lrck = mclk/128
  65. assign sclk = cnt[3]; // sclk = lrck*32
  66. reg [2:0] lrck_sreg;
  67. reg [2:0] sclk_sreg;
  68. wire lrck_rising = (lrck_sreg[1:0] == 2'b01);
  69. wire lrck_falling = (lrck_sreg[1:0] == 2'b10);
  70. wire sclk_rising = (sclk_sreg[1:0] == 2'b01);
  71. wire sclk_falling = (sclk_sreg[1:0] == 2'b10);
  72. wire vol_latch_rising = (vol_latch_reg[1:0] == 2'b01);
  73. reg sdout_reg;
  74. assign sdout = sdout_reg;
  75. reg [1:0] reset_sreg;
  76. wire reset_rising = (reset_sreg[1:0] == 2'b01);
  77. reg play_r;
  78. initial begin
  79. cnt = 9'h100;
  80. smpcnt = 16'b0;
  81. lrck_sreg = 2'b11;
  82. sclk_sreg = 1'b0;
  83. dac_address_r = 10'b0;
  84. vol_valid = 1'b0;
  85. vol_latch_reg = 1'b0;
  86. vol_reg = 8'h0;
  87. vol_target_reg = 8'hff;
  88. samples <= 2'b00;
  89. end
  90. always @(posedge clkin) begin
  91. if(reset_rising) begin
  92. dac_address_r <= 0;
  93. interpol_count <= 0;
  94. end else if(sysclk_rising) begin
  95. if(interpol_count > 59378938) begin
  96. interpol_count <= interpol_count + 122500 - 59501439;
  97. dac_address_r <= dac_address_r + play_r;
  98. end else begin
  99. interpol_count <= interpol_count + 122500;
  100. end
  101. end
  102. end
  103. always @(posedge clkin) begin
  104. cnt <= cnt + 1;
  105. lrck_sreg <= {lrck_sreg[1:0], lrck};
  106. sclk_sreg <= {sclk_sreg[1:0], sclk};
  107. vol_latch_reg <= {vol_latch_reg[0], vol_latch};
  108. play_r <= play;
  109. reset_sreg <= {reset_sreg[0], reset};
  110. end
  111. always @(posedge clkin) begin
  112. if (vol_latch_rising) begin
  113. vol_valid <= 1'b1;
  114. end
  115. else if(vol_valid) begin
  116. vol_target_reg <= volume;
  117. vol_valid <= 1'b0;
  118. end
  119. end
  120. // ramp volume only every 4 samples
  121. always @(posedge clkin) begin
  122. if (lrck_rising && &samples[1:0]) begin
  123. if(vol_reg > vol_target_reg)
  124. vol_reg <= vol_reg - 1;
  125. else if(vol_reg < vol_target_reg)
  126. vol_reg <= vol_reg + 1;
  127. end
  128. end
  129. always @(posedge clkin) begin
  130. if (sclk_falling) begin
  131. smpcnt <= smpcnt + 1;
  132. sdout_reg <= smpshift[15];
  133. if (lrck_rising) begin // right channel
  134. smpshift <= (({16'h0, dac_data[31:16]^16'h8000} * vol_reg) >> 8) ^ 16'h8000;
  135. samples <= samples + 1;
  136. end else if (lrck_falling) begin // left channel
  137. smpshift <= (({16'h0, dac_data[15:0]^16'h8000} * vol_reg) >> 8) ^ 16'h8000;
  138. end else begin
  139. smpshift <= {smpshift[14:0], 1'b0};
  140. end
  141. end
  142. end
  143. endmodule