2.07 - ADSR

График "правильного" ADSR генератора изображен на рисунке.

Я же сделаю пока линейный ADSR.

Подключать к другим модулям так же просто, как и в случае с DCA. Но не стоит опрометчиво подключать вход кнопки на отладочной плате ко входу GATE! Значение на входе может оказаться не 1 или 0, от чего модуль ADSR может перейти в ошибочное состояние!

//VCO 220Hzwire [31:0] fout220; dds32 dds1(clk50M, 9449, fout220);//нопка в качестве гейта, ОБЯЗАТЕЛЬНО С БУФЕРОМ, иначе на гейт придет не 1 или 0 и модуль cглючитreg [2:0] gate_buff;wire GATE_D;always @ (posedge clk50M) gate_buff <= {gate_buff[1:0],~key0}; assign GATE_D = (gate_buff == 3'b111);//ADSRwire [31:0] fout4; adsr32 adsr1(clk50M, GATE_D, 256, 64, 32'h95ffffff, 32, fout4, SEG);//VCAwire [7:0] vcaout1; vca8 vca_1(clk50M, fout220[31:24], fout4[31:24], vcaout1);//DACwire pwm220; pwm8dac1 dac1(clk50M, vcaout1, pwm220);//выводalways @(posedge clk50M) begin snd_R <= pwm220; snd_L <= pwm220; end

Получившийся сигнал

Код модуля пока еще не до конца отлажен.

Подключать к другим модулям так же просто, как и в случае с DCA. Но не стоит опрометчиво подключать вход кнопки на отладочной плате ко входу GATE! Значение на входе может оказаться не 1 или 0, от чего модуль ADSR может перейти в ошибочное состояние!

Модулю лучше передавать проэкспоненцированные значения от контролов. Изыскания тут 4.03 - EXP для ADSR

//масштабирование wire [31:0] add_value; lin2exp_t exp(MSB, add_value); //A1 wire [13:0] A1; wire A1_lsb = ((CH_MESSAGE==4'b1011)&&(LSB==7'd048)); // control change & 48 control - LSB reg14w A1reg(clk50PLL, A1_lsb, add_value[13:0], A1); //D1 wire [13:0] D1; wire D1_lsb = ((CH_MESSAGE==4'b1011)&&(LSB==7'd049)); // control change & 49 control - LSB reg14w D1reg(clk50PLL, D1_lsb, add_value[13:0], D1); //S1 wire [6:0] S1; wire S1_lsb = ((CH_MESSAGE==4'b1011)&&(LSB==7'd050)); // control change & 50 control - LSB reg7 S1reg(clk50PLL, S1_lsb, MSB, S1); //R1 wire [13:0] R1; wire R1_lsb = ((CH_MESSAGE==4'b1011)&&(LSB==7'd051)); // control change & 51 control - LSB reg14w R1reg(clk50PLL, R1_lsb, add_value[13:0], R1); wire [31:0] adsr1out; adsr32 adsr1(clk50PLL, GATE, A1, D1, {S1,25'b0}, R1, adsr1out);