Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

NCO VHDL code. Can anyone suggest any improvements? is it synthesizable?

Status
Not open for further replies.

rgamma

Member level 1
Joined
Jul 15, 2011
Messages
33
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,286
Activity points
1,504
Hi, please tell me if this can be synthesised. It worked on modelsim student edition.

also, the lookup table is quite big. i generated it using matlab.

(don't give negative values of n as input. keep the first digit 0. it is signed.)

Code:
library ieee;
  use ieee.std_logic_1164.all;
  use ieee.std_logic_signed.all;
  use ieee.std_logic_arith.all;
  
  
entity nco_3 is 
  port( n : in std_logic_vector(3 downto 0);
        clk : in std_logic;
        sine_wav,cos_wav: out std_logic_vector(8 downto 0));
end nco_3;

architecture behav of nco_3 is


signal i : integer range 0 to 2047;
type memory_type is array (0 to 2047) of integer range -255 to 255; 
--ROM for storing the sine values generated by MATLAB. can generate any wave.
signal cos : memory_type :=(
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,253,253,253,253,253,253,253,252,252,252,252,252,252,252,252,252,251,251,251,251,251,251,251,250,250,250,250,250,250,249,249,249,249,249,249,248,248,248,248,248,248,247,247,247,247,247,246,246,246,246,246,245,245,245,245,244,244,244,244,244,243,243,243,243,242,242,242,242,241,241,241,241,240,240,240,240,239,239,239,238,238,238,238,237,237,237,236,236,236,236,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,230,230,230,229,229,229,228,228,228,227,227,227,226,226,226,225,225,224,224,224,223,223,223,222,222,221,221,221,220,220,219,219,219,218,218,217,217,217,216,216,215,215,215,214,214,213,213,212,212,212,211,211,210,210,209,209,208,208,208,207,207,206,206,205,205,204,204,203,203,202,202,201,201,200,200,200,199,199,198,198,197,197,196,196,195,195,194,194,193,193,192,191,191,190,190,189,189,188,188,187,187,186,186,185,185,184,184,183,182,182,181,181,180,180,179,179,178,177,177,176,176,175,175,174,173,173,172,172,171,171,170,169,169,168,168,167,166,166,165,165,164,163,163,162,162,161,160,160,159,159,158,157,157,156,156,155,154,154,153,152,152,151,151,150,149,149,148,147,147,146,145,145,144,144,143,142,142,141,140,140,139,138,138,137,136,136,135,134,134,133,132,132,131,130,130,129,128,128,127,126,126,125,124,124,123,122,121,121,120,119,119,118,117,117,116,115,115,114,113,112,112,111,110,110,109,108,107,107,106,105,105,104,103,102,102,101,100,100,99,98,97,97,96,95,95,94,93,92,92,91,90,89,89,88,87,86,86,85,84,84,83,82,81,81,80,79,78,78,77,76,75,75,74,73,72,72,71,70,69,69,68,67,66,66,65,64,63,63,62,61,60,60,59,58,57,56,56,55,54,53,53,52,51,50,50,49,48,47,47,46,45,44,43,43,42,41,40,40,39,38,37,36,36,35,34,33,33,32,31,30,29,29,28,27,26,26,25,24,23,22,22,21,20,19,19,18,17,16,15,15,14,13,12,12,11,10,9,8,8,7,6,5,5,4,3,2,1,1,-0,-1,-2,-3,-3,-4,-5,-6,-6,-7,-8,-9,-10,-10,-11,-12,-13,-13,-14,-15,-16,-17,-17,-18,-19,-20,-21,-21,-22,-23,-24,-24,-25,-26,-27,-28,-28,-29,-30,-31,-31,-32,-33,-34,-35,-35,-36,-37,-38,-38,-39,-40,-41,-41,-42,-43,-44,-45,-45,-46,-47,-48,-48,-49,-50,-51,-51,-52,-53,-54,-55,-55,-56,-57,-58,-58,-59,-60,-61,-61,-62,-63,-64,-64,-65,-66,-67,-67,-68,-69,-70,-70,-71,-72,-73,-73,-74,-75,-76,-76,-77,-78,-79,-79,-80,-81,-82,-82,-83,-84,-85,-85,-86,-87,-88,-88,-89,-90,-91,-91,-92,-93,-93,-94,-95,-96,-96,-97,-98,-99,-99,-100,-101,-101,-102,-103,-104,-104,-105,-106,-106,-107,-108,-109,-109,-110,-111,-111,-112,-113,-113,-114,-115,-116,-116,-117,-118,-118,-119,-120,-120,-121,-122,-122,-123,-124,-125,-125,-126,-127,-127,-128,-129,-129,-130,-131,-131,-132,-133,-133,-134,-135,-135,-136,-137,-137,-138,-139,-139,-140,-141,-141,-142,-143,-143,-144,-144,-145,-146,-146,-147,-148,-148,-149,-150,-150,-151,-151,-152,-153,-153,-154,-155,-155,-156,-156,-157,-158,-158,-159,-160,-160,-161,-161,-162,-163,-163,-164,-164,-165,-166,-166,-167,-167,-168,-169,-169,-170,-170,-171,-171,-172,-173,-173,-174,-174,-175,-175,-176,-177,-177,-178,-178,-179,-179,-180,-181,-181,-182,-182,-183,-183,-184,-184,-185,-185,-186,-186,-187,-188,-188,-189,-189,-190,-190,-191,-191,-192,-192,-193,-193,-194,-194,-195,-195,-196,-196,-197,-197,-198,-198,-199,-199,-200,-200,-201,-201,-202,-202,-203,-203,-204,-204,-205,-205,-205,-206,-206,-207,-207,-208,-208,-209,-209,-210,-210,-210,-211,-211,-212,-212,-213,-213,-213,-214,-214,-215,-215,-216,-216,-216,-217,-217,-218,-218,-218,-219,-219,-220,-220,-220,-221,-221,-222,-222,-222,-223,-223,-224,-224,-224,-225,-225,-225,-226,-226,-227,-227,-227,-228,-228,-228,-229,-229,-229,-230,-230,-230,-231,-231,-231,-232,-232,-232,-233,-233,-233,-234,-234,-234,-235,-235,-235,-235,-236,-236,-236,-237,-237,-237,-237,-238,-238,-238,-239,-239,-239,-239,-240,-240,-240,-240,-241,-241,-241,-241,-242,-242,-242,-242,-243,-243,-243,-243,-244,-244,-244,-244,-245,-245,-245,-245,-245,-246,-246,-246,-246,-246,-247,-247,-247,-247,-247,-248,-248,-248,-248,-248,-249,-249,-249,-249,-249,-249,-250,-250,-250,-250,-250,-250,-250,-251,-251,-251,-251,-251,-251,-251,-252,-252,-252,-252,-252,-252,-252,-252,-253,-253,-253,-253,-253,-253,-253,-253,-253,-253,-253,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-253,-253,-253,-253,-253,-253,-253,-253,-253,-253,-253,-252,-252,-252,-252,-252,-252,-252,-252,-251,-251,-251,-251,-251,-251,-251,-250,-250,-250,-250,-250,-250,-250,-249,-249,-249,-249,-249,-249,-248,-248,-248,-248,-248,-247,-247,-247,-247,-247,-246,-246,-246,-246,-246,-245,-245,-245,-245,-245,-244,-244,-244,-244,-243,-243,-243,-243,-242,-242,-242,-242,-241,-241,-241,-241,-240,-240,-240,-240,-239,-239,-239,-239,-238,-238,-238,-237,-237,-237,-237,-236,-236,-236,-235,-235,-235,-235,-234,-234,-234,-233,-233,-233,-232,-232,-232,-231,-231,-231,-230,-230,-230,-229,-229,-229,-228,-228,-228,-227,-227,-227,-226,-226,-225,-225,-225,-224,-224,-224,-223,-223,-222,-222,-222,-221,-221,-220,-220,-220,-219,-219,-218,-218,-218,-217,-217,-216,-216,-216,-215,-215,-214,-214,-213,-213,-213,-212,-212,-211,-211,-210,-210,-210,-209,-209,-208,-208,-207,-207,-206,-206,-205,-205,-205,-204,-204,-203,-203,-202,-202,-201,-201,-200,-200,-199,-199,-198,-198,-197,-197,-196,-196,-195,-195,-194,-194,-193,-193,-192,-192,-191,-191,-190,-190,-189,-189,-188,-188,-187,-186,-186,-185,-185,-184,-184,-183,-183,-182,-182,-181,-181,-180,-179,-179,-178,-178,-177,-177,-176,-175,-175,-174,-174,-173,-173,-172,-171,-171,-170,-170,-169,-169,-168,-167,-167,-166,-166,-165,-164,-164,-163,-163,-162,-161,-161,-160,-160,-159,-158,-158,-157,-156,-156,-155,-155,-154,-153,-153,-152,-151,-151,-150,-150,-149,-148,-148,-147,-146,-146,-145,-144,-144,-143,-143,-142,-141,-141,-140,-139,-139,-138,-137,-137,-136,-135,-135,-134,-133,-133,-132,-131,-131,-130,-129,-129,-128,-127,-127,-126,-125,-125,-124,-123,-122,-122,-121,-120,-120,-119,-118,-118,-117,-116,-116,-115,-114,-113,-113,-112,-111,-111,-110,-109,-109,-108,-107,-106,-106,-105,-104,-104,-103,-102,-101,-101,-100,-99,-99,-98,-97,-96,-96,-95,-94,-93,-93,-92,-91,-91,-90,-89,-88,-88,-87,-86,-85,-85,-84,-83,-82,-82,-81,-80,-79,-79,-78,-77,-76,-76,-75,-74,-73,-73,-72,-71,-70,-70,-69,-68,-67,-67,-66,-65,-64,-64,-63,-62,-61,-61,-60,-59,-58,-58,-57,-56,-55,-55,-54,-53,-52,-51,-51,-50,-49,-48,-48,-47,-46,-45,-45,-44,-43,-42,-41,-41,-40,-39,-38,-38,-37,-36,-35,-35,-34,-33,-32,-31,-31,-30,-29,-28,-28,-27,-26,-25,-24,-24,-23,-22,-21,-21,-20,-19,-18,-17,-17,-16,-15,-14,-13,-13,-12,-11,-10,-10,-9,-8,-7,-6,-6,-5,-4,-3,-3,-2,-1,-0,1,1,2,3,4,5,5,6,7,8,8,9,10,11,12,12,13,14,15,15,16,17,18,19,19,20,21,22,22,23,24,25,26,26,27,28,29,29,30,31,32,33,33,34,35,36,36,37,38,39,40,40,41,42,43,43,44,45,46,47,47,48,49,50,50,51,52,53,53,54,55,56,56,57,58,59,60,60,61,62,63,63,64,65,66,66,67,68,69,69,70,71,72,72,73,74,75,75,76,77,78,78,79,80,81,81,82,83,84,84,85,86,86,87,88,89,89,90,91,92,92,93,94,95,95,96,97,97,98,99,100,100,101,102,102,103,104,105,105,106,107,107,108,109,110,110,111,112,112,113,114,115,115,116,117,117,118,119,119,120,121,121,122,123,124,124,125,126,126,127,128,128,129,130,130,131,132,132,133,134,134,135,136,136,137,138,138,139,140,140,141,142,142,143,144,144,145,145,146,147,147,148,149,149,150,151,151,152,152,153,154,154,155,156,156,157,157,158,159,159,160,160,161,162,162,163,163,164,165,165,166,166,167,168,168,169,169,170,171,171,172,172,173,173,174,175,175,176,176,177,177,178,179,179,180,180,181,181,182,182,183,184,184,185,185,186,186,187,187,188,188,189,189,190,190,191,191,192,193,193,194,194,195,195,196,196,197,197,198,198,199,199,200,200,200,201,201,202,202,203,203,204,204,205,205,206,206,207,207,208,208,208,209,209,210,210,211,211,212,212,212,213,213,214,214,215,215,215,216,216,217,217,217,218,218,219,219,219,220,220,221,221,221,222,222,223,223,223,224,224,224,225,225,226,226,226,227,227,227,228,228,228,229,229,229,230,230,230,231,231,231,232,232,232,233,233,233,234,234,234,235,235,235,236,236,236,236,237,237,237,238,238,238,238,239,239,239,240,240,240,240,241,241,241,241,242,242,242,242,243,243,243,243,244,244,244,244,244,245,245,245,245,246,246,246,246,246,247,247,247,247,247,248,248,248,248,248,248,249,249,249,249,249,249,250,250,250,250,250,250,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,253,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255

);

signal sine : memory_type :=(
0,1,2,2,3,4,5,5,6,7,8,9,9,10,11,12,13,13,14,15,16,16,17,18,19,20,20,21,22,23,23,24,25,26,27,27,28,29,30,30,31,32,33,34,34,35,36,37,37,38,39,40,41,41,42,43,44,44,45,46,47,47,48,49,50,51,51,52,53,54,54,55,56,57,57,58,59,60,60,61,62,63,64,64,65,66,67,67,68,69,70,70,71,72,73,73,74,75,76,76,77,78,79,79,80,81,82,82,83,84,84,85,86,87,87,88,89,90,90,91,92,93,93,94,95,95,96,97,98,98,99,100,101,101,102,103,103,104,105,106,106,107,108,108,109,110,110,111,112,113,113,114,115,115,116,117,117,118,119,120,120,121,122,122,123,124,124,125,126,126,127,128,128,129,130,130,131,132,132,133,134,134,135,136,136,137,138,138,139,140,140,141,142,142,143,144,144,145,146,146,147,148,148,149,149,150,151,151,152,153,153,154,154,155,156,156,157,158,158,159,159,160,161,161,162,162,163,164,164,165,165,166,167,167,168,168,169,170,170,171,171,172,172,173,174,174,175,175,176,176,177,178,178,179,179,180,180,181,181,182,183,183,184,184,185,185,186,186,187,187,188,188,189,190,190,191,191,192,192,193,193,194,194,195,195,196,196,197,197,198,198,199,199,200,200,201,201,202,202,203,203,203,204,204,205,205,206,206,207,207,208,208,209,209,209,210,210,211,211,212,212,213,213,213,214,214,215,215,216,216,216,217,217,218,218,218,219,219,220,220,220,221,221,222,222,222,223,223,223,224,224,225,225,225,226,226,226,227,227,227,228,228,229,229,229,230,230,230,231,231,231,232,232,232,233,233,233,233,234,234,234,235,235,235,236,236,236,237,237,237,237,238,238,238,239,239,239,239,240,240,240,240,241,241,241,241,242,242,242,242,243,243,243,243,244,244,244,244,245,245,245,245,245,246,246,246,246,246,247,247,247,247,247,248,248,248,248,248,248,249,249,249,249,249,250,250,250,250,250,250,250,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253,253,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,253,253,253,253,253,253,253,252,252,252,252,252,252,252,252,251,251,251,251,251,251,251,251,250,250,250,250,250,250,249,249,249,249,249,249,248,248,248,248,248,247,247,247,247,247,247,246,246,246,246,245,245,245,245,245,244,244,244,244,243,243,243,243,243,242,242,242,242,241,241,241,241,240,240,240,239,239,239,239,238,238,238,238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,230,230,230,229,229,229,228,228,228,227,227,227,226,226,226,225,225,224,224,224,223,223,223,222,222,221,221,221,220,220,219,219,219,218,218,217,217,217,216,216,215,215,214,214,214,213,213,212,212,211,211,211,210,210,209,209,208,208,207,207,207,206,206,205,205,204,204,203,203,202,202,201,201,200,200,199,199,198,198,197,197,196,196,195,195,194,194,193,193,192,192,191,191,190,190,189,189,188,188,187,187,186,186,185,184,184,183,183,182,182,181,181,180,180,179,178,178,177,177,176,176,175,174,174,173,173,172,172,171,170,170,169,169,168,168,167,166,166,165,165,164,163,163,162,162,161,160,160,159,158,158,157,157,156,155,155,154,154,153,152,152,151,150,150,149,148,148,147,147,146,145,145,144,143,143,142,141,141,140,139,139,138,137,137,136,135,135,134,133,133,132,131,131,130,129,129,128,127,127,126,125,125,124,123,123,122,121,121,120,119,119,118,117,116,116,115,114,114,113,112,112,111,110,109,109,108,107,107,106,105,104,104,103,102,102,101,100,99,99,98,97,97,96,95,94,94,93,92,91,91,90,89,89,88,87,86,86,85,84,83,83,82,81,80,80,79,78,77,77,76,75,74,74,73,72,71,71,70,69,68,68,67,66,65,65,64,63,62,62,61,60,59,59,58,57,56,56,55,54,53,52,52,51,50,49,49,48,47,46,46,45,44,43,42,42,41,40,39,39,38,37,36,35,35,34,33,32,32,31,30,29,29,28,27,26,25,25,24,23,22,21,21,20,19,18,18,17,16,15,14,14,13,12,11,11,10,9,8,7,7,6,5,4,4,3,2,1,0,-0,-1,-2,-3,-4,-4,-5,-6,-7,-7,-8,-9,-10,-11,-11,-12,-13,-14,-14,-15,-16,-17,-18,-18,-19,-20,-21,-21,-22,-23,-24,-25,-25,-26,-27,-28,-29,-29,-30,-31,-32,-32,-33,-34,-35,-35,-36,-37,-38,-39,-39,-40,-41,-42,-42,-43,-44,-45,-46,-46,-47,-48,-49,-49,-50,-51,-52,-52,-53,-54,-55,-56,-56,-57,-58,-59,-59,-60,-61,-62,-62,-63,-64,-65,-65,-66,-67,-68,-68,-69,-70,-71,-71,-72,-73,-74,-74,-75,-76,-77,-77,-78,-79,-80,-80,-81,-82,-83,-83,-84,-85,-86,-86,-87,-88,-89,-89,-90,-91,-91,-92,-93,-94,-94,-95,-96,-97,-97,-98,-99,-99,-100,-101,-102,-102,-103,-104,-104,-105,-106,-107,-107,-108,-109,-109,-110,-111,-112,-112,-113,-114,-114,-115,-116,-116,-117,-118,-119,-119,-120,-121,-121,-122,-123,-123,-124,-125,-125,-126,-127,-127,-128,-129,-129,-130,-131,-131,-132,-133,-133,-134,-135,-135,-136,-137,-137,-138,-139,-139,-140,-141,-141,-142,-143,-143,-144,-145,-145,-146,-147,-147,-148,-148,-149,-150,-150,-151,-152,-152,-153,-154,-154,-155,-155,-156,-157,-157,-158,-158,-159,-160,-160,-161,-162,-162,-163,-163,-164,-165,-165,-166,-166,-167,-168,-168,-169,-169,-170,-170,-171,-172,-172,-173,-173,-174,-174,-175,-176,-176,-177,-177,-178,-178,-179,-180,-180,-181,-181,-182,-182,-183,-183,-184,-184,-185,-186,-186,-187,-187,-188,-188,-189,-189,-190,-190,-191,-191,-192,-192,-193,-193,-194,-194,-195,-195,-196,-196,-197,-197,-198,-198,-199,-199,-200,-200,-201,-201,-202,-202,-203,-203,-204,-204,-205,-205,-206,-206,-207,-207,-207,-208,-208,-209,-209,-210,-210,-211,-211,-211,-212,-212,-213,-213,-214,-214,-214,-215,-215,-216,-216,-217,-217,-217,-218,-218,-219,-219,-219,-220,-220,-221,-221,-221,-222,-222,-223,-223,-223,-224,-224,-224,-225,-225,-226,-226,-226,-227,-227,-227,-228,-228,-228,-229,-229,-229,-230,-230,-230,-231,-231,-231,-232,-232,-232,-233,-233,-233,-234,-234,-234,-235,-235,-235,-235,-236,-236,-236,-237,-237,-237,-238,-238,-238,-238,-239,-239,-239,-239,-240,-240,-240,-241,-241,-241,-241,-242,-242,-242,-242,-243,-243,-243,-243,-243,-244,-244,-244,-244,-245,-245,-245,-245,-245,-246,-246,-246,-246,-247,-247,-247,-247,-247,-247,-248,-248,-248,-248,-248,-249,-249,-249,-249,-249,-249,-250,-250,-250,-250,-250,-250,-251,-251,-251,-251,-251,-251,-251,-251,-252,-252,-252,-252,-252,-252,-252,-252,-253,-253,-253,-253,-253,-253,-253,-253,-253,-253,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-254,-253,-253,-253,-253,-253,-253,-253,-253,-253,-253,-252,-252,-252,-252,-252,-252,-252,-252,-252,-251,-251,-251,-251,-251,-251,-251,-250,-250,-250,-250,-250,-250,-250,-249,-249,-249,-249,-249,-248,-248,-248,-248,-248,-248,-247,-247,-247,-247,-247,-246,-246,-246,-246,-246,-245,-245,-245,-245,-245,-244,-244,-244,-244,-243,-243,-243,-243,-242,-242,-242,-242,-241,-241,-241,-241,-240,-240,-240,-240,-239,-239,-239,-239,-238,-238,-238,-237,-237,-237,-237,-236,-236,-236,-235,-235,-235,-234,-234,-234,-233,-233,-233,-233,-232,-232,-232,-231,-231,-231,-230,-230,-230,-229,-229,-229,-228,-228,-227,-227,-227,-226,-226,-226,-225,-225,-225,-224,-224,-223,-223,-223,-222,-222,-222,-221,-221,-220,-220,-220,-219,-219,-218,-218,-218,-217,-217,-216,-216,-216,-215,-215,-214,-214,-213,-213,-213,-212,-212,-211,-211,-210,-210,-209,-209,-209,-208,-208,-207,-207,-206,-206,-205,-205,-204,-204,-203,-203,-203,-202,-202,-201,-201,-200,-200,-199,-199,-198,-198,-197,-197,-196,-196,-195,-195,-194,-194,-193,-193,-192,-192,-191,-191,-190,-190,-189,-188,-188,-187,-187,-186,-186,-185,-185,-184,-184,-183,-183,-182,-181,-181,-180,-180,-179,-179,-178,-178,-177,-176,-176,-175,-175,-174,-174,-173,-172,-172,-171,-171,-170,-170,-169,-168,-168,-167,-167,-166,-165,-165,-164,-164,-163,-162,-162,-161,-161,-160,-159,-159,-158,-158,-157,-156,-156,-155,-154,-154,-153,-153,-152,-151,-151,-150,-149,-149,-148,-148,-147,-146,-146,-145,-144,-144,-143,-142,-142,-141,-140,-140,-139,-138,-138,-137,-136,-136,-135,-134,-134,-133,-132,-132,-131,-130,-130,-129,-128,-128,-127,-126,-126,-125,-124,-124,-123,-122,-122,-121,-120,-120,-119,-118,-117,-117,-116,-115,-115,-114,-113,-113,-112,-111,-110,-110,-109,-108,-108,-107,-106,-106,-105,-104,-103,-103,-102,-101,-101,-100,-99,-98,-98,-97,-96,-95,-95,-94,-93,-93,-92,-91,-90,-90,-89,-88,-87,-87,-86,-85,-84,-84,-83,-82,-82,-81,-80,-79,-79,-78,-77,-76,-76,-75,-74,-73,-73,-72,-71,-70,-70,-69,-68,-67,-67,-66,-65,-64,-64,-63,-62,-61,-60,-60,-59,-58,-57,-57,-56,-55,-54,-54,-53,-52,-51,-51,-50,-49,-48,-47,-47,-46,-45,-44,-44,-43,-42,-41,-41,-40,-39,-38,-37,-37,-36,-35,-34,-34,-33,-32,-31,-30,-30,-29,-28,-27,-27,-26,-25,-24,-23,-23,-22,-21,-20,-20,-19,-18,-17,-16,-16,-15,-14,-13,-13,-12,-11,-10,-9,-9,-8,-7,-6,-5,-5,-4,-3,-2,-2,-1,-0


);

begin
  process(clk)
    begin
      if(rising_edge(clk)) then     
        
        sine_wav <= conv_std_logic_vector(sine(i),9);
        cos_wav <= conv_std_logic_vector(cos(i),9);
        
      if (i <= (2047-conv_integer(n))) then
        i <= i+ conv_integer(n);
        else i<=2047;
      end if;
        if(i = 2047) then
        i <= 0;
      end if;
    end if;
  end process;
end behav;
 

It's basically synthesizable. The accumulator should be changed to simple add with overflow for correct operation.
Code:
  i <= i+ conv_integer(n);

Usually a NCO would use a larger bit width for the accumulator and the frequency input and only use the uppermost bits as address to sine/cosine table.

I assume, that the frequency input will be understood as signed (-8 .. +7 range) input in your design, is this what you intend? Otherwise you would want to declare it as unsigned explicitely or use a conversion before casting it to integer.
 
Thanks FvM, what should the accumulator do if there is an overflow? I've told it to reset i to 2047 if it comes anywhere near that value. How do NCOs behave in case of overflows?

Yeah, i ultimately plan to use a 32 bit accumulator. I did this for practice.

Is the look up table size enough of is it too small or is it too big?How are the upper few bits alone used for this?

Also, i want the input number to be unsigned. How do i convert it to unsigned integer?



Thanks.
 

Integer range of 0 to 2047 is synthesized as 11 bit quantity (unsigned 10 downto 0), the accumulator will work modulo 2048 without any additional action required. In other work, the NCO output frequency is fclk * n/2048. Your overflow code would cause an unwanted discontinuity at the overflow, because the previous value is lost when resetting the counter. You'll find out why by playing around with some numeric examples.

Although an integer data type is needed for the ROM index, I would define the accumulator as unsigned data type. This way, it's easier, to access bit selections. When implementing a larger accumulator respectively fractional accumulator bits, the code looks like this:
Code:
signal freq_input: std_logic_vector(12 downto 0);

signal accu:        unsigned(19 downto 0);

if(rising_edge(clk)) then     
  sine_wav <= conv_std_logic_vector(sine(conv_integer(accu(19 downto 9))),9);
  accu <= accu + unsigned(freq_input);

Is the look up table size enough of is it too small or is it too big?How are the upper few bits alone used for this?
You have amplitude and angle resolution of the table, both matter for the nco's signal quality, so you basically have to ask for the application requirements in this regard. Low amplitude resolution shows up as harmonic distortions, unsufficient angular also in non-harmonic (spurious) output.
 
for unsigned using the same libraries, you need to replace the signed library with the unsigned one:

use ieee.std_logic_unsigned.all;

you cannot use signed and unsigned in the same file.

---------- Post added at 19:39 ---------- Previous post was at 19:38 ----------

or do what FvM suggested :)
 
  • Like
Reactions: rgamma

    rgamma

    Points: 2
    Helpful Answer Positive Rating
If i remove the code accounting for overflow, it compiles , showing no errors or warnings, but, when 'i' exceeds 2047, the simulator abruptly stops and says fatal error.

How can i make this mod 2048?
 

If you declared i as unsigned instead of integer, it would rollover automatically.
 
  • Like
Reactions: rgamma

    rgamma

    Points: 2
    Helpful Answer Positive Rating
If you declared i as unsigned instead of integer, it would rollover automatically.
You don't need in synthesis. As I previously said, integer will be synthesized as signed or unsigned with the number of bits needed to represent the range. So integer range 0 to 2047 rolls over without additional means. Unfortunately you get an overflow error in simulation, which is in fact a reason to use unsigned type.

A simulation-proof integer code with exact overflow would either use a mod operator
Code:
accu <= (accu + inc) mod 2048;
or look like this
Code:
if accu + incr > 2047 then
  accu <= accu + inc - 2048;
else
  accu <= accu + inc:
end if;
 
  • Like
Reactions: rgamma

    rgamma

    Points: 2
    Helpful Answer Positive Rating
Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top