cfg_reg_test.v 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // 无用接口硬接 0
  2. assign dma_req = 1'b0;
  3. // APB 兼容(保留但不使用,防止报错)
  4. parameter ADDR_CTRL = 'h00;
  5. parameter ADDR_DATA = 'h04;
  6. wire apb_data_phase = apb_psel && apb_penable;
  7. reg [9:0] dummy_din;
  8. always @(posedge apb_clock or negedge apb_resetn) begin
  9. if (!apb_resetn)
  10. dummy_din <= 10'd0;
  11. else if (apb_data_phase && apb_pwrite && apb_paddr == ADDR_DATA)
  12. dummy_din <= apb_pwdata[9:0];
  13. end
  14. always @(*) begin
  15. apb_prdata = 32'd0;
  16. end
  17. // ------------------------------
  18. // DDS 相位累加器(仅加法,无除法)
  19. // ------------------------------
  20. reg [31:0] phase;
  21. always @(posedge apb_clock or negedge apb_resetn) begin
  22. if (!apb_resetn || !dac_run || !dac_en)
  23. phase <= 32'd0;
  24. else
  25. phase <= phase + frequency;
  26. end
  27. wire [9:0] phase_10bit = phase[31:22];
  28. // ------------------------------
  29. // 4 种波形生成(无 RAM、无除法)
  30. // ------------------------------
  31. wire [9:0] square_wave = (phase_10bit < (duty_cycle * 1024 / 100)) ? max_vol : min_vol;
  32. wire [9:0] tri_wave = phase_10bit[9] ?
  33. (max_vol - ((phase_10bit[8:0]) * (max_vol - min_vol) / 512)) :
  34. (min_vol + ((phase_10bit[8:0]) * (max_vol - min_vol) / 512));
  35. wire [9:0] saw_wave = min_vol + ((max_vol - min_vol) * phase_10bit) / 1024;
  36. wire [9:0] sine_wave = (phase_10bit < 512) ?
  37. min_vol + ((max_vol - min_vol) * phase_10bit) / 512 :
  38. max_vol - ((max_vol - min_vol) * (phase_10bit - 512)) / 512;
  39. reg [9:0] dac_data;
  40. always @(*) begin
  41. case (wave_type)
  42. 2'b00: dac_data = square_wave;
  43. 2'b01: dac_data = sine_wave;
  44. 2'b10: dac_data = tri_wave;
  45. 2'b11: dac_data = saw_wave;
  46. endcase
  47. end
  48. // ------------------------------
  49. // DAC 硬核例化
  50. // 严格按你要求:
  51. // dac_en → enb
  52. // dac_run → stop
  53. // bufen → 0
  54. // ------------------------------
  55. alta_dac dac_inst(
  56. .enb (~dac_en), // 你要的匹配
  57. .bufenb (1'b0), // 写死 0
  58. .din (dac_data),
  59. .stop (~dac_run), // 你要的匹配
  60. .dout ()
  61. );