///////////////////////////////////////////////////////////////////////////// // // FM sound generator Type-M : YM3012 type serial-paralell converter // // Version : 0.90 // // Copyright(c) 2005 Tatsuyuki Satoh , All rights reserved // // License: // still develop version,DEMO use only // Do not distribute this version // // Issue: // // todo: // // Histry: // ///////////////////////////////////////////////////////////////////////////// module dac3012( CLK,CLKEN, SO,SH1,SH2, L,R ); input CLK; input CLKEN; input SO,SH1,SH2; output [15:0] L,R; ///////////////////////////////////////////////////////////////////////////// // capture ///////////////////////////////////////////////////////////////////////////// reg [12:0] sreg; reg last_sh1,last_sh2; reg [15:0] dr,dl; reg [ 2:0] sr,sl; reg [15:0] out_r,out_l; always @(posedge CLK) begin if(CLKEN) begin // shift register sreg <= {SO,sreg[12:1]}; last_sh1 <= SH1; if(last_sh1 & ~SH1) begin out_r <= dr; sr <= sreg[12:10]; dr <= {~sreg[9],sreg[8:0],6'b000000}; end else if(sr<7) begin // increment floating point sr <= sr + 1; dr[14:0] <= dr[15:1]; end last_sh2 <= SH2; if(last_sh2 & ~SH2) begin out_l <= dl; sl <= sreg[12:10]; dl <= {~sreg[9],sreg[8:0],6'b000000}; end else if(sl<7) begin // increment floating point sl <= sl + 1; dl[14:0] <= dl[15:1]; end end end ///////////////////////////////////////////////////////////////////////////// // output ///////////////////////////////////////////////////////////////////////////// assign L = out_l; assign R = out_r; endmodule