|
- `define fosc 50000000
- module dial_tones_hz( //通过拨号数字查找两个合成频率
- input [3:0] number, //拨号数字 0~9:数字 A~D:字母 E:星号 F:井号
- output reg [10:0] hzA, //合成频率A (低群/Hz)
- output reg [10:0] hzB //合成频率B (高群/Hz)
- );
- always @(*) begin
- {hzA,hzB} = 22'd0;
- case(number)
- 4'h0:{hzA,hzB} = {11'd941,11'd1336}; //数字0 合成频率:941Hz与1336Hz叠加
- 4'h1:{hzA,hzB} = {11'd697,11'd1209}; //数字1
- 4'h2:{hzA,hzB} = {11'd697,11'd1336}; //数字2
- 4'h3:{hzA,hzB} = {11'd697,11'd1477}; //数字3
- 4'h4:{hzA,hzB} = {11'd770,11'd1209}; //数字4
- 4'h5:{hzA,hzB} = {11'd770,11'd1336}; //数字5
- 4'h6:{hzA,hzB} = {11'd770,11'd1477}; //数字6
- 4'h7:{hzA,hzB} = {11'd852,11'd1209}; //数字7
- 4'h8:{hzA,hzB} = {11'd852,11'd1336}; //数字8
- 4'h9:{hzA,hzB} = {11'd852,11'd1477}; //数字9
- 4'hA:{hzA,hzB} = {11'd697,11'd1633}; //字母A
- 4'hB:{hzA,hzB} = {11'd770,11'd1633}; //字母B
- 4'hC:{hzA,hzB} = {11'd852,11'd1633}; //字母C
- 4'hD:{hzA,hzB} = {11'd941,11'd1633}; //字母D
- 4'hE:{hzA,hzB} = {11'd941,11'd1209}; //星号
- 4'hF:{hzA,hzB} = {11'd941,11'd1477}; //井号
- endcase
- end
- endmodule
- module pwm_8bit( //8位PWM发生器模块
- input clk, //有源晶振时钟输入
- input [7:0] pwm, //占空比 0:低电平 255:高电平
- output out //PWM波输出 PWM频率:时钟频率/256
- );
- reg [7:0] spwm;
- reg [7:0] i;
- assign out = (i < spwm) ? 1'b1 : 1'b0;
- always @(posedge clk) begin
- if(!i) begin
- spwm <= pwm;
- end
- i = i + 8'd1;
- if(&i) begin
- i = 8'd0;
- end
- end
- endmodule
- module sin_data( //8位正弦波PWM查表模块
- input clk, //时钟输入
- output [7:0] pwm //PWM值输出 正弦波频率:时钟频率/256
- );
- reg [7:0] pc;
- initial pc = 8'd0;
- wire [7:0] s [255:0];
- assign s[8'h00]=8'h7F;
- assign s[8'h01]=8'h81;
- assign s[8'h02]=8'h83;
- assign s[8'h03]=8'h88;
- assign s[8'h04]=8'h8A;
- assign s[8'h05]=8'h8F;
- assign s[8'h06]=8'h91;
- assign s[8'h07]=8'h93;
- assign s[8'h08]=8'h97;
- assign s[8'h09]=8'h9A;
- assign s[8'h0A]=8'h9E;
- assign s[8'h0B]=8'hA0;
- assign s[8'h0C]=8'hA2;
- assign s[8'h0D]=8'hA6;
- assign s[8'h0E]=8'hA9;
- assign s[8'h0F]=8'hAD;
- assign s[8'h10]=8'hAF;
- assign s[8'h11]=8'hB3;
- assign s[8'h12]=8'hB5;
- assign s[8'h13]=8'hB7;
- assign s[8'h14]=8'hBB;
- assign s[8'h15]=8'hBD;
- assign s[8'h16]=8'hC1;
- assign s[8'h17]=8'hC3;
- assign s[8'h18]=8'hC4;
- assign s[8'h19]=8'hC8;
- assign s[8'h1A]=8'hCA;
- assign s[8'h1B]=8'hCD;
- assign s[8'h1C]=8'hCF;
- assign s[8'h1D]=8'hD1;
- assign s[8'h1E]=8'hD4;
- assign s[8'h1F]=8'hD6;
- assign s[8'h20]=8'hD9;
- assign s[8'h21]=8'hDB;
- assign s[8'h22]=8'hDE;
- assign s[8'h23]=8'hDF;
- assign s[8'h24]=8'hE1;
- assign s[8'h25]=8'hE3;
- assign s[8'h26]=8'hE5;
- assign s[8'h27]=8'hE7;
- assign s[8'h28]=8'hE9;
- assign s[8'h29]=8'hEA;
- assign s[8'h2A]=8'hEC;
- assign s[8'h2B]=8'hED;
- assign s[8'h2C]=8'hF0;
- assign s[8'h2D]=8'hF1;
- assign s[8'h2E]=8'hF2;
- assign s[8'h2F]=8'hF3;
- assign s[8'h30]=8'hF4;
- assign s[8'h31]=8'hF6;
- assign s[8'h32]=8'hF7;
- assign s[8'h33]=8'hF8;
- assign s[8'h34]=8'hF9;
- assign s[8'h35]=8'hFA;
- assign s[8'h36]=8'hFB;
- assign s[8'h37]=8'hFB;
- assign s[8'h38]=8'hFC;
- assign s[8'h39]=8'hFD;
- assign s[8'h3A]=8'hFD;
- assign s[8'h3B]=8'hFE;
- assign s[8'h3C]=8'hFE;
- assign s[8'h3D]=8'hFE;
- assign s[8'h3E]=8'hFE;
- assign s[8'h3F]=8'hFE;
- assign s[8'h40]=8'hFF;
- assign s[8'h41]=8'hFE;
- assign s[8'h42]=8'hFE;
- assign s[8'h43]=8'hFE;
- assign s[8'h44]=8'hFE;
- assign s[8'h45]=8'hFE;
- assign s[8'h46]=8'hFD;
- assign s[8'h47]=8'hFD;
- assign s[8'h48]=8'hFC;
- assign s[8'h49]=8'hFB;
- assign s[8'h4A]=8'hFB;
- assign s[8'h4B]=8'hFA;
- assign s[8'h4C]=8'hF9;
- assign s[8'h4D]=8'hF8;
- assign s[8'h4E]=8'hF7;
- assign s[8'h4F]=8'hF6;
- assign s[8'h50]=8'hF5;
- assign s[8'h51]=8'hF3;
- assign s[8'h52]=8'hF3;
- assign s[8'h53]=8'hF1;
- assign s[8'h54]=8'hF0;
- assign s[8'h55]=8'hED;
- assign s[8'h56]=8'hEC;
- assign s[8'h57]=8'hEB;
- assign s[8'h58]=8'hE9;
- assign s[8'h59]=8'hE7;
- assign s[8'h5A]=8'hE5;
- assign s[8'h5B]=8'hE3;
- assign s[8'h5C]=8'hE2;
- assign s[8'h5D]=8'hDF;
- assign s[8'h5E]=8'hDE;
- assign s[8'h5F]=8'hDB;
- assign s[8'h60]=8'hD9;
- assign s[8'h61]=8'hD8;
- assign s[8'h62]=8'hD4;
- assign s[8'h63]=8'hD3;
- assign s[8'h64]=8'hCF;
- assign s[8'h65]=8'hCD;
- assign s[8'h66]=8'hCA;
- assign s[8'h67]=8'hC8;
- assign s[8'h68]=8'hC6;
- assign s[8'h69]=8'hC3;
- assign s[8'h6A]=8'hC1;
- assign s[8'h6B]=8'hBD;
- assign s[8'h6C]=8'hBB;
- assign s[8'h6D]=8'hB9;
- assign s[8'h6E]=8'hB5;
- assign s[8'h6F]=8'hB3;
- assign s[8'h70]=8'hAF;
- assign s[8'h71]=8'hAD;
- assign s[8'h72]=8'hAB;
- assign s[8'h73]=8'hA6;
- assign s[8'h74]=8'hA4;
- assign s[8'h75]=8'hA0;
- assign s[8'h76]=8'h9E;
- assign s[8'h77]=8'h9A;
- assign s[8'h78]=8'h97;
- assign s[8'h79]=8'h95;
- assign s[8'h7A]=8'h91;
- assign s[8'h7B]=8'h8F;
- assign s[8'h7C]=8'h8A;
- assign s[8'h7D]=8'h88;
- assign s[8'h7E]=8'h86;
- assign s[8'h7F]=8'h81;
- assign s[8'h80]=8'h7F;
- assign s[8'h81]=8'h7B;
- assign s[8'h82]=8'h78;
- assign s[8'h83]=8'h76;
- assign s[8'h84]=8'h72;
- assign s[8'h85]=8'h6F;
- assign s[8'h86]=8'h6B;
- assign s[8'h87]=8'h69;
- assign s[8'h88]=8'h64;
- assign s[8'h89]=8'h62;
- assign s[8'h8A]=8'h60;
- assign s[8'h8B]=8'h5C;
- assign s[8'h8C]=8'h5A;
- assign s[8'h8D]=8'h55;
- assign s[8'h8E]=8'h53;
- assign s[8'h8F]=8'h51;
- assign s[8'h90]=8'h4D;
- assign s[8'h91]=8'h4B;
- assign s[8'h92]=8'h47;
- assign s[8'h93]=8'h45;
- assign s[8'h94]=8'h43;
- assign s[8'h95]=8'h3F;
- assign s[8'h96]=8'h3D;
- assign s[8'h97]=8'h3A;
- assign s[8'h98]=8'h38;
- assign s[8'h99]=8'h34;
- assign s[8'h9A]=8'h32;
- assign s[8'h9B]=8'h31;
- assign s[8'h9C]=8'h2D;
- assign s[8'h9D]=8'h2B;
- assign s[8'h9E]=8'h28;
- assign s[8'h9F]=8'h26;
- assign s[8'hA0]=8'h25;
- assign s[8'hA1]=8'h22;
- assign s[8'hA2]=8'h20;
- assign s[8'hA3]=8'h1D;
- assign s[8'hA4]=8'h1C;
- assign s[8'hA5]=8'h1B;
- assign s[8'hA6]=8'h18;
- assign s[8'hA7]=8'h17;
- assign s[8'hA8]=8'h14;
- assign s[8'hA9]=8'h13;
- assign s[8'hAA]=8'h11;
- assign s[8'hAB]=8'h0F;
- assign s[8'hAC]=8'h0E;
- assign s[8'hAD]=8'h0C;
- assign s[8'hAE]=8'h0B;
- assign s[8'hAF]=8'h0A;
- assign s[8'hB0]=8'h09;
- assign s[8'hB1]=8'h08;
- assign s[8'hB2]=8'h06;
- assign s[8'hB3]=8'h06;
- assign s[8'hB4]=8'h04;
- assign s[8'hB5]=8'h04;
- assign s[8'hB6]=8'h03;
- assign s[8'hB7]=8'h02;
- assign s[8'hB8]=8'h02;
- assign s[8'hB9]=8'h01;
- assign s[8'hBA]=8'h01;
- assign s[8'hBB]=8'h00;
- assign s[8'hBC]=8'h00;
- assign s[8'hBD]=8'h00;
- assign s[8'hBE]=8'h00;
- assign s[8'hBF]=8'h00;
- assign s[8'hC0]=8'h00;
- assign s[8'hC1]=8'h00;
- assign s[8'hC2]=8'h00;
- assign s[8'hC3]=8'h00;
- assign s[8'hC4]=8'h00;
- assign s[8'hC5]=8'h01;
- assign s[8'hC6]=8'h01;
- assign s[8'hC7]=8'h01;
- assign s[8'hC8]=8'h02;
- assign s[8'hC9]=8'h03;
- assign s[8'hCA]=8'h04;
- assign s[8'hCB]=8'h04;
- assign s[8'hCC]=8'h06;
- assign s[8'hCD]=8'h06;
- assign s[8'hCE]=8'h07;
- assign s[8'hCF]=8'h09;
- assign s[8'hD0]=8'h0A;
- assign s[8'hD1]=8'h0B;
- assign s[8'hD2]=8'h0C;
- assign s[8'hD3]=8'h0D;
- assign s[8'hD4]=8'h0F;
- assign s[8'hD5]=8'h11;
- assign s[8'hD6]=8'h13;
- assign s[8'hD7]=8'h14;
- assign s[8'hD8]=8'h15;
- assign s[8'hD9]=8'h18;
- assign s[8'hDA]=8'h19;
- assign s[8'hDB]=8'h1C;
- assign s[8'hDC]=8'h1D;
- assign s[8'hDD]=8'h20;
- assign s[8'hDE]=8'h22;
- assign s[8'hDF]=8'h23;
- assign s[8'hE0]=8'h26;
- assign s[8'hE1]=8'h28;
- assign s[8'hE2]=8'h2B;
- assign s[8'hE3]=8'h2D;
- assign s[8'hE4]=8'h2F;
- assign s[8'hE5]=8'h32;
- assign s[8'hE6]=8'h34;
- assign s[8'hE7]=8'h38;
- assign s[8'hE8]=8'h3A;
- assign s[8'hE9]=8'h3B;
- assign s[8'hEA]=8'h3F;
- assign s[8'hEB]=8'h41;
- assign s[8'hEC]=8'h45;
- assign s[8'hED]=8'h47;
- assign s[8'hEE]=8'h4B;
- assign s[8'hEF]=8'h4D;
- assign s[8'hF0]=8'h4F;
- assign s[8'hF1]=8'h53;
- assign s[8'hF2]=8'h55;
- assign s[8'hF3]=8'h5A;
- assign s[8'hF4]=8'h5C;
- assign s[8'hF5]=8'h5E;
- assign s[8'hF6]=8'h62;
- assign s[8'hF7]=8'h64;
- assign s[8'hF8]=8'h69;
- assign s[8'hF9]=8'h6B;
- assign s[8'hFA]=8'h6D;
- assign s[8'hFB]=8'h72;
- assign s[8'hFC]=8'h74;
- assign s[8'hFD]=8'h78;
- assign s[8'hFE]=8'h7B;
- assign s[8'hFF]=8'h7F;
- assign pwm = s[pc];
- always @(posedge clk) begin
- pc <= pc + 8'd1;
- end
- endmodule
- module sin_wave( //正弦波发生器
- input clk, //有源晶振时钟输入
- input [10:0] hz, //正弦波频率
- output [7:0] pwm //接PWM发生器
- );
- integer i;
- reg clkB;
- always @(posedge clk) begin
- i = i + 1;
- if(i >= `fosc/256/2/hz) begin
- i = 0;
- clkB <= !clkB;
- end
- end
- sin_data sin_data(
- .clk(clkB),
- .pwm(pwm)
- );
- endmodule
- module main(
- input clk,
- output out
- );
- wire [7:0] pwmA;
- wire [7:0] pwmB;
- wire [10:0] hzA;
- wire [10:0] hzB;
- integer i;
- reg [3:0] number;
- reg j;
- always @(posedge clk) begin
- i = i + 1;
- if(i >= `fosc/8) begin
- i = 0;
- j <= !j;
- end
- end
- always @(posedge j) begin
- number <= number + 4'd1;
- end
- dial_tones_hz dial_tones_hz(
- .number(number),
- .hzA(hzA),
- .hzB(hzB)
- );
- sin_wave sinA(
- .clk(clk),
- .hz(hzA),
- .pwm(pwmA)
- );
- sin_wave sinB(
- .clk(clk),
- .hz(hzB),
- .pwm(pwmB)
- );
- pwm_8bit pwm_8bit(
- .clk(clk),
- .pwm( j ? ((pwmA + pwmB) /2) : 8'd0),
- .out(out)
- );
- endmodule
复制代码 |
|