Hi Sougata,

I did some experimenting with DDS a few years ago, i wrote this piece of code. If my memory serves me right, it worked up to 20kHz with reasonable good looking sine on the output. I also did some testing with PWMoutput but never got good results with that, there may be some leftovers in the program from that ...... just remove.
Code:
'****************************************************************
'*  Name    : DDS16F.BAS                                        *
'*  Author  : Ingvar Gillholm                                   *
'*  Date    : 2004-03-11                                        *
'*  Version : 1.0                                               *
'*  Notes   : This program produces a sinewave through PortB,   *
'*          : which should have a R-2R leadder connected to it. *
'****************************************************************


@ device  pic16F876, hs_osc, wdt_off

define OSC 20
'DEFINE LOADER_USED 1

TonePort    VAR PortB
CheckNew    VAR PortA.3

Phase       VAR BYTE[3] BANK0
Freq        VAR BYTE[3] BANK0
Zero        VAR BYTE    BANK0

TempVar     VAR BYTE

ADCON1 = 7      'Porta is digital
TrisA = $ff     'All inputs
PortB = 0       'Start with all outputs low
TrisB = 0       'All outputs            
Zero = 0

PR2 = $3f
OUTPUT PortC.2
T2CON = %00000100
CCP1CON = %00001100
GOTO New

Main:
asm
;
;======================== MAIN LOOP =========================
;

    bcf STATUS,RP0
    bcf STATUS,RP1

Loop
    BTFSC   _CheckNew     ; Check for a new	frequency
    GOTO    _New          ; and get new frequency
                          ;
	MOVF	_Freq,W       ; Get the current frequency
	ADDWF	_Phase,F	  ; and increment the phase
	btfss STATUS,C        ;
    goto NoCarry          ;burn time if no carry
	incf _Phase+1         ;
	btfsc STATUS,Z        ;
	incf _Phase+2         ;
AfterCarry	              ;
	MOVF	_Freq+1,W     ;
	ADDWF	_Phase+1,F    ; 
	btfsc STATUS,C        ;
	incf _Phase+2	      ;
	MOVF	_Freq+2,W	  ;
	ADDWF	_Phase+2,F    ;

	MOVF	_Phase+2,W	  ;

	ANDLW	07Fh		  ;Reduce to 7 bits for 180 degrees
	CALL	SineTbl		  ; and get amplitude
    
	BTFSS  _Phase+2,7	;Is amplitude supposed to be negative?
	SUBWF  _Zero,w		;Change polarity of sine amplitude
   	
    MOVWF	_TonePort     ;Output to DAC
	GOTO	Loop		  ;

NoCarry
    goto AfterCarry

;*********** SINE TABLE ****************

SineTbl
	ADDWF  PCL
    retlw 080h
    retlw 083h
    retlw 086h
    retlw 089h
    retlw 08Ch
    retlw 090h
    retlw 093h
    retlw 096h
    retlw 099h
    retlw 09Ch
    retlw 09Fh
    retlw 0A2h
    retlw 0A5h
    retlw 0A8h
    retlw 0ABh
    retlw 0AEh
    retlw 0B1h
    retlw 0B3h
    retlw 0B6h
    retlw 0B9h
    retlw 0BCh
    retlw 0BFh
    retlw 0C1h
    retlw 0C4h
    retlw 0C7h
    retlw 0C9h
    retlw 0CCh
    retlw 0CEh
    retlw 0D1h
    retlw 0D3h
    retlw 0D5h
    retlw 0D8h
    retlw 0DAh
    retlw 0DCh
    retlw 0DEh
    retlw 0E0h
    retlw 0E2h
    retlw 0E4h
    retlw 0E6h
    retlw 0E8h
    retlw 0EAh
    retlw 0EBh
    retlw 0EDh
    retlw 0EFh
    retlw 0F0h
    retlw 0F1h
    retlw 0F3h
    retlw 0F4h
    retlw 0F5h
    retlw 0F6h
    retlw 0F8h
    retlw 0F9h
    retlw 0FAh
    retlw 0FAh
    retlw 0FBh
    retlw 0FCh
    retlw 0FDh
    retlw 0FDh
    retlw 0FEh
    retlw 0FEh
    retlw 0FEh
    retlw 0FFh
    retlw 0FFh
    retlw 0FFh
    retlw 0FFh
    retlw 0FFh
    retlw 0FFh
    retlw 0FFh
    retlw 0FEh
    retlw 0FEh
    retlw 0FEh
    retlw 0FDh
    retlw 0FDh
    retlw 0FCh
    retlw 0FBh
    retlw 0FAh
    retlw 0FAh
    retlw 0F9h
    retlw 0F8h
    retlw 0F6h
    retlw 0F5h
    retlw 0F4h
    retlw 0F3h
    retlw 0F1h
    retlw 0F0h
    retlw 0EFh
    retlw 0EDh
    retlw 0EBh
    retlw 0EAh
    retlw 0E8h
    retlw 0E6h
    retlw 0E4h
    retlw 0E2h
    retlw 0E0h
    retlw 0DEh
    retlw 0DCh
    retlw 0DAh
    retlw 0D8h
    retlw 0D5h
    retlw 0D3h
    retlw 0D1h
    retlw 0CEh
    retlw 0CCh
    retlw 0C9h
    retlw 0C7h
    retlw 0C4h
    retlw 0C1h
    retlw 0BFh
    retlw 0BCh
    retlw 0B9h
    retlw 0B6h
    retlw 0B3h
    retlw 0B1h
    retlw 0AEh
    retlw 0ABh
    retlw 0A8h
    retlw 0A5h
    retlw 0A2h
    retlw 09Fh
    retlw 09Ch
    retlw 099h
    retlw 096h
    retlw 093h
    retlw 090h
    retlw 08Ch
    retlw 089h
    retlw 086h
    retlw 083h

ENDASM
New:
' The frequency is calculated as FreqValue = DesiredFreq/((1/2^24)*(5*10^6/28))
' Same as FreqValue = DesiredFreq/((1/16777216)*(5000000/28))
' Same as FreqValue = DesiredFreq*16777216*28/5000000
' Same as FreqValue = DesiredFreq*93,9524096
' The resolution is 1/93,9524096 = 0,01064368656703404........Hz

' The eight frequencies selected for this test is........
'  67,0 = 001896
'  94,8 = 0022CA
' 118,8	= 002B99
' 146,2	= 0035A7
' 173,8	= 003FC8
' 199,5	= 004937
' 225,7	= 0052D5
' 254,1 = 005D41

    TempVar = PortA & %00000111     'Only lower 3 bits
'    LOOKUP TempVar,[$00,$00,$00,$00,$00,$00,$00,$00],Freq[2]    'Stuff Hibyte            
'    LOOKUP TempVar,[$1a,$25,$2e,$39,$44,$4e,$58,$63],Freq[1]    'Stuff Midbyte
'    LOOKUP TempVar,[$58,$47,$b7,$7d,$57,$72,$c0,$eb],Freq[0]    'Stuff Lowbyte
    LOOKUP TempVar,[$00,$00,$00,$00,$00,$00,$00,$00],Freq[2]    'Stuff Hibyte            
    LOOKUP TempVar,[$18,$22,$2b,$35,$3f,$49,$52,$5d],Freq[1]    'Stuff Midbyte
    LOOKUP TempVar,[$96,$ca,$99,$a7,$c8,$37,$d5,$41],Freq[0]    'Stuff Lowbyte    
    GOTO Main
END
Doing amplitde control is probably too much to ask from a 16F@20MHz but a 18F@40MHz might be able to pull it off.

/Ingvar