cfg_reg.v 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. module cfg_reg (
  2. // ===== 标准 APB 总线接口 =====
  3. input pclk, // APB 时钟
  4. input presetn, // APB 复位(低有效)
  5. input [11:0] paddr, // APB 偏移地址
  6. input pwrite, // 1=写,0=读
  7. input [31:0] pwdata, // 写数据
  8. output reg [31:0] prdata, // 读数据
  9. input psel, // 本模块片选
  10. input penable, // APB使能
  11. // ===== 输出信号 ADC部分 =====
  12. output reg adc_en, // ADC 使能
  13. output reg [7:0] adc_clk_div, // 时钟分频
  14. output reg [3:0] adc_chnl_sel, // 通道选择
  15. output reg [11:0] trig_threshold, // 触发阈值
  16. output reg [15:0] trig_pulse_width, // 触发脉宽
  17. output reg [1:0] trig_edge, // 触发边沿(00=上升 01=下降 10=双边 11=脉宽)
  18. output reg [1:0] trig_mode, // 触发模式(00=自动 01=普通 10=单次)
  19. output reg [4:0] trig_time_slot, // 时间档位
  20. output reg [15:0] trig_auto_timeout, // 自动模式触发超时值
  21. output reg adc_run, // 开始/停止
  22. output reg adc_restart, // 重置采样
  23. // ===== 输出信号 DAC部分 =====
  24. output reg dac_en, // DAC 使能
  25. output reg dac_run, // 运行/停止
  26. output reg [1:0] wave_type, // 波形类型 (00=方波 01=正弦波 10=三角波 11=锯齿波)
  27. output reg [9:0] max_vol, // 最大输出电压(DAC格式)
  28. output reg [9:0] min_vol, // 最小输出电压(DAC格式)
  29. output reg [31:0] frequency, // 频率
  30. output reg [7:0] duty_cycle // 占空比
  31. );
  32. // ==================== ADC 相关 ====================
  33. parameter ADDR_CTRL = 'h00;
  34. parameter ADDR_CLK_DIV = 'h04;
  35. parameter ADDR_TRIG_TH = 'h08;
  36. parameter ADDR_TRIG_PW = 'h0C;
  37. parameter ADDR_TRIG_CFG = 'h10;
  38. parameter ADDR_TRIG_TOUT = 'h14;
  39. parameter ADDR_RUN_CTRL = 'h18;
  40. // ==================== DAC 相关 ====================
  41. parameter ADDR_DAC_CTRL = 'h1C; // DAC 总控
  42. parameter ADDR_DAC_WAVE = 'h20; // 波形类型
  43. parameter ADDR_DAC_AMP = 'h24; // max + min
  44. parameter ADDR_DAC_FREQ = 'h28; // 频率
  45. parameter ADDR_DAC_DUTY = 'h2C; // 占空比
  46. wire apb_data_phase = psel && penable;
  47. //---------------------------
  48. // 1. APB 写逻辑
  49. //---------------------------
  50. always @(posedge pclk or negedge presetn) begin
  51. if (!presetn) begin
  52. adc_en <= 1'b0;
  53. adc_clk_div <= 8'd3;
  54. adc_chnl_sel <= 4'd13;
  55. trig_threshold <= 12'd2048;
  56. trig_pulse_width<= 16'd10;
  57. trig_edge <= 2'b00;
  58. trig_mode <= 2'b00;
  59. trig_time_slot <= 5'd1;
  60. trig_auto_timeout<=16'd1024;
  61. adc_run <= 1'b0;
  62. adc_restart <= 1'b0;
  63. // ==================== DAC 复位 ====================
  64. dac_en <= 1'b0;
  65. dac_run <= 1'b0;
  66. wave_type <= 2'b00;
  67. max_vol <= 10'd900; // 默认最大值
  68. min_vol <= 10'd100; // 默认最小值
  69. frequency <= 32'd1000; // 默认频率
  70. duty_cycle <= 8'd50; // 默认 50%
  71. end
  72. else if (apb_data_phase && pwrite) begin
  73. case (paddr)
  74. ADDR_CTRL: begin
  75. adc_en <= pwdata[0];
  76. adc_chnl_sel <= pwdata[4:1];
  77. end
  78. ADDR_CLK_DIV: adc_clk_div <= pwdata[7:0];
  79. ADDR_TRIG_TH: trig_threshold <= pwdata[11:0];
  80. ADDR_TRIG_PW: trig_pulse_width <= pwdata[15:0];
  81. ADDR_TRIG_CFG: begin
  82. trig_edge <= pwdata[1:0];
  83. trig_mode <= pwdata[3:2];
  84. trig_time_slot <= pwdata[8:4];
  85. end
  86. ADDR_TRIG_TOUT: trig_auto_timeout <= pwdata[15:0];
  87. ADDR_RUN_CTRL: begin
  88. adc_run <= pwdata[0];
  89. adc_restart <= pwdata[1];
  90. end
  91. // ==================== DAC 写配置 ====================
  92. ADDR_DAC_CTRL: begin
  93. dac_en <= pwdata[0];
  94. dac_run <= pwdata[1];
  95. end
  96. ADDR_DAC_WAVE: wave_type <= pwdata[1:0];
  97. ADDR_DAC_AMP: begin
  98. max_vol <= pwdata[9:0];
  99. min_vol <= pwdata[25:16];
  100. end
  101. ADDR_DAC_FREQ: frequency <= pwdata;
  102. ADDR_DAC_DUTY: duty_cycle <= pwdata[7:0];
  103. endcase
  104. end
  105. end
  106. //---------------------------
  107. // 2. APB 读逻辑
  108. //---------------------------
  109. always @(posedge pclk or negedge presetn) begin
  110. if (!presetn) begin
  111. prdata <= 32'd0;
  112. end
  113. else if (psel && !penable && !pwrite) begin
  114. case (paddr)
  115. ADDR_CTRL: prdata <= {27'd0, adc_chnl_sel, adc_en};
  116. ADDR_CLK_DIV: prdata <= {24'd0, adc_clk_div};
  117. ADDR_TRIG_TH: prdata <= {20'd0, trig_threshold};
  118. ADDR_TRIG_PW: prdata <= {16'd0, trig_pulse_width};
  119. ADDR_TRIG_CFG: prdata <= {23'd0, trig_time_slot, trig_mode, trig_edge};
  120. ADDR_TRIG_TOUT:prdata <= {16'd0, trig_auto_timeout};
  121. ADDR_RUN_CTRL: prdata <= {30'd0, adc_restart, adc_run};
  122. // ==================== DAC 读 ====================
  123. ADDR_DAC_CTRL: prdata <= {30'd0, dac_run, dac_en};
  124. ADDR_DAC_WAVE: prdata <= {30'd0, wave_type};
  125. ADDR_DAC_AMP: prdata = {6'd0, min_vol, 6'd0, max_vol};
  126. ADDR_DAC_FREQ: prdata <= frequency;
  127. ADDR_DAC_DUTY: prdata <= {24'd0, duty_cycle};
  128. default: prdata <= 32'd0;
  129. endcase
  130. end
  131. end
  132. endmodule