рд╡реЗрд░рд┐рд▓реЛрдЧ рдкрд░ рдбреАрдбреАрдПрд╕ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░


рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рд╡реЗрд░рд┐рд▓реЙрдЧ рдкрд░ рдПрдХ рдбреАрдбреАрдПрд╕ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рд▓рд┐рдЦрдирд╛ рд╕рдордЭрд╛ред рдпрд╣ рдПрдХ sinusoidal рджреЛрд▓рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЖрд╡реГрддреНрддрд┐ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдЬрд┐рдирдореЗрдВ рд╕реЗ 8-рдмрд┐рдЯ рдПрдХрдзреНрд░реБрд╡реАрдп DAC рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдФрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдЬрд░реНрдирд▓ рдЕрд╡рдпрд╡ рдФрд░ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рдЗрди рдЯреЗрдмрд▓ рдХреА рдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдорд░реВрдкрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ Iverilog рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ GTKWave рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЗрдХрдлрд╛рдЗрд▓ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреЗ рдХрд╛рдо рдЖрдПрдЧрд╛ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, iverilog рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдореЗрдВ tb.out рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ vvp рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ iverilog рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, vvp рдмрд╛рд╣рд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред LCD, рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЪрд░ (рд╕рд┐рдЧреНрдирд▓) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреНрд░рджрд░реНрд╢рди рд▓рдХреНрд╖реНрдп, рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЪрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде GTKWave рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдк рд╕рдВрдХреЗрддреЛрдВ рдХреА рддрд░рдВрдЧреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


SRC = nco.v TB = nco_tb.v all: iverilog -o tb.out $(TB) vvp -lxt tb.out check: iverilog -v $(TB) display: iverilog -o tb.out $(TB) vvp -lxt tb.out gtkwave out.vcd & clean: rm -rf *.out *.vcd *.vvp 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рднрд╡рд┐рд╖реНрдп рдХреА рд╕рд╛рдЗрди рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рдереА рдЬреЛ рд╕рд╛рдЗрди рдЕрд╡рдзрд┐ рдХреЗ рдПрдХ рдЪреМрдерд╛рдИ рдХреЛ 64 рдЕрдВрдХреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджреЗрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ рддрдм рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдореИрдВрдиреЗ 8 рдмрд┐рдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдмрд┐рдЯ рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд╣рд░реА рдПрдХрдзреНрд░реБрд╡реАрдп рдбреАрдПрд╕реА рдХреЗ рд▓рд┐рдП DDS рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХрд▓реНрдкрдирд╛ рдХреА рдереА, рд╕рд╛рдЗрди рдХрд╛ рдЖрдпрд╛рдо 0 рд╕реЗ 256 рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдирдХрд╛рд░рд╛рддреНрдордХ рдЕрд░реНрдз-рдЕрд╡рдзрд┐ 0 рд╕реЗ 127 рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реИ, рдФрд░ 128 рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЖрдзрд╛ ... 255 ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдкреНрд░рд╛рдкреНрдд рд╕рд╛рдЗрди рдорд╛рди (0 рд╕реЗ рдкреАрдЖрдИ / 4 рддрдХ) рдХреЛ 127 рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ 127 рдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЕрд╡рдзрд┐ рдХреЗ рдкрд╣рд▓реЗ рддреНрд░реИрдорд╛рд╕рд┐рдХ рдХреЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЖрдпрд╛рдо 128 рдпрд╛ 256 рд╣реИред


рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдЧрдарди рдХреЗ рд╕рд╛рде, рдбреАрдПрд╕реА рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╕рд╛рдЗрди рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рдШрдЯрдХ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдзрд╛рд░рд┐рддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред


 import numpy as np x=np.linspace(0,np.pi/2,64) print(np.sin(x)) y=127*np.sin(x) print(len(y)) print(y) z=[] i = 0 for elem in y: if int(elem)<=16: print("lut[%d] = 7'h0%X;" % (i, int(elem))) else: print("lut[%d] = 7'h%X;" % (i, int(elem))) z.append(hex(int(elem))) i = i + 1 

рдЪреВрдБрдХрд┐ рд╕рд╛рдЗрди рдлрдВрдХреНрд╢рди рд╕рдордорд┐рдд (рд╡рд┐рд╖рдо) рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдкрд╣рд▓рд╛ рд╕рдорд░реВрдкрддрд╛ рдкрд╛рдк (x) = - рдкрд╛рдк (pi + x) рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реА рд╕рдорд░реВрдкрддрд╛ рдХреЛ рдЗрд╕ рддрдереНрдп рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдХрд┐ рдЕрд╡рдзрд┐ рдХреЗ рдПрдХ рдЪреМрдерд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛрдиреЗ рдкрд░, рджреВрд╕рд░реА рддрд┐рдорд╛рд╣реА рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ рдкрд╣рд▓реА рдЫрдорд╛рд╣реА рдкрд░ рд╕рд╛рдЗрди рдкрд╣рд▓реЗ рдмрдврд╝рддрд╛ рд╣реИ, рдлрд┐рд░ рдШрдЯрддрд╛ рд╣реИ)ред


рд╣рдо рдПрдХ рд╕рд╛рдЗрди рдмрдирд╛рддреЗ рд╣реИрдВ


рдбреАрдбреАрдПрд╕ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдереЛрдХ рдПрдХ рдЪрд░рдг рдмреИрдЯрд░реА рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд▓реБрдХ рдЕрдк рдЯреЗрдмрд▓ (LUT) рд╕реЗ рдПрдХ рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред рдШрдбрд╝реА рд╕рдВрдХреЗрдд рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдореВрд▓реНрдп рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдПрдХ рд╕рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рдХреА рдЖрд╡реГрддреНрддрд┐ рдЪрд░рдг рд╕рдВрдЪрд╛рдпрдХ рдХреЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧреА - рдпрд╣ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдЖрд╡реГрддреНрддрд┐ рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, Kotelnikov рдорд╛рдирджрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рд╕рд┐рдЧреНрдирд▓ рдЖрд╡реГрддреНрддрд┐ (рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХреЛ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП) рд╕реЗ рдХрдо рд╕реЗ рдХрдо 2 рдЧреБрдирд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдкрд░ рд╕реАрдорд╛ рдЖрдзрд╛ рдЪрд░рдг рд╕рдВрдЪрд╛рдпрдХ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдорд╛рдирджрдВрдб рд╕рд┐рдЧреНрдирд▓ рдЖрд╡реГрддреНрддрд┐ рдХрд╛ рдирдореВрдирд╛рдХрд░рдг рдЖрд╡реГрддреНрддрд┐ = 2.2 рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рдЪрд░рдо рд╕реАрдорд╛ рдкрд░ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдмрд┐рдЯ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ 6 рдмрд┐рдЯреНрд╕ рдХреЛ 8-рдмрд┐рдЯ рдЪрд░рдг рдХреА рдмреИрдЯрд░реА рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд╛рдЗрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреНрд░реЗрд▓рд╛рдЗрдЯ рд╣реИ)ред


рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╕рдорд░реВрдкрддрд╛ рдХреЗ рдХрд╛рд░рдг, 2 ^ 6 = 64 рдХреЗ рдирд┐рдЪрд▓реЗ 6 рдмрд┐рдЯреНрд╕ рдХреЛ рд╕реАрдзреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдЪреНрдЪ 2 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдЗрди рдкреАрдврд╝реА рдХреА рдПрдХ рдЪреМрдерд╛рдИ рдЕрд╡рдзрд┐ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рддрд╛рд▓рд┐рдХрд╛ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреА рджрд┐рд╢рд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:


 module nco(clk, rst, out ); input clk, rst; output reg [7:0] out; reg [5:0] phase_inc = 6'h1; reg [7:0] phase_acc = 0; parameter LUT_SIZE = 64; reg [6:0] lut [0:LUT_SIZE-1]; always @(posedge clk) begin if (rst) begin phase_inc = 6'h1; phase_acc = 0; out = 0; lut[0] = 7'h00; //     lut[63] = 7'h7F; end else begin //      1    if (phase_acc[7:6] == 2'b00) begin //        LUT out <= {1'b1,lut[phase_acc[5:0]]}; end if (phase_acc[7:6] == 2'b01) begin out <= {1'b1,lut[~phase_acc[5:0]]}; end if (phase_acc[7:6] == 2'b10) begin out <= {1'b0,~lut[phase_acc[5:0]]}; end if (phase_acc[7:6] == 2'b11) begin out <= {1'b0,~lut[~phase_acc[5:0]]}; end phase_acc <= phase_acc + {2'b0,phase_inc}; end end endmodule 

рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЪрд░рдг рд╡реГрджреНрдзрд┐ рдореВрд▓реНрдп рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╣рдо рдЗрд╕реЗ рдПрдХ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдб рдХреЗ рд╕рдВрд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд░реАрд╕реЗрдЯ рдХреЗ рджреМрд░рд╛рди рдореВрд▓реНрдпреЛрдВ рд╕реЗ рднреА рднрд░рд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП FPGA рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдмреНрд▓реЙрдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реА рдЖрдИрдкреА рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рд╕рдорд░реВрдкрддрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдореЗрдВ, рдпрд╣ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ (2 рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рдкрд░) рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд░рдг рд╕рдВрдЪрд╛рдпрдХ рд╕реНрдерд┐рдд рд╣реИред рдпрджрд┐ рдЙрдЪреНрдЪрддрдо = 00 рд╣реИ, рддреЛ рдЙрдЪреНрдЪрддрдо рдЕрдВрдХ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ 1 рд╣реИ (рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЕрд░реНрдз-рд▓рд╣рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░), рдирд┐рдЪрд▓реЗ рд╡рд╛рд▓реЗ рдореЗрдВ - рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ LUT рд╕реЗ рдореВрд▓реНрдпред рдЪрд░рдг рд╕рдВрдЪрдпрдХрд░реНрддрд╛ рдХрд╛ рдорд╛рди 63 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж (рдкрд╣рд▓реА рддрд┐рдорд╛рд╣реА рдмреАрдд рдЬрд╛рдПрдЧреА), 01 рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдФрд░ рдирд┐рдЪрд▓реЗ рд╡рд╛рд▓реЗ рдлрд┐рд░ рд╕реЗ рд╢реВрдиреНрдп рд╕реЗ рднрд░ рдЬрд╛рдПрдВрдЧреЗред


LUT рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЪрд░рдг рд╕рдВрдЪрд╛рдпрдХ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдШрдбрд╝реА рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рдмрдврд╝рддрд╛ рд░рд╣реЗрдЧрд╛, рдФрд░ рдЗрд╕рдХрд╛ рдЙрд▓рдЯрд╛ рдореВрд▓реНрдп рдШрдЯ рдЬрд╛рдПрдЧрд╛)ред


рдиреЗрдЧреЗрдЯрд┐рд╡ рд╣рд╛рдл-рд╡реЗрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо 0. рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдКрдкрд░реА рдмрд┐рдЯ рдореЗрдВ, рд╣рдореЗрдВ рдЕрдм рд╕рд╛рдЗрди рдЯреЗрдмрд▓ рд╕реЗ рд╡реИрд▓реНрдпреВ рдХреЛ рдЦреБрдж рд╣реА рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд╛рдЗрди рдХреА рддрд┐рдорд╛рд╣реА рдХреА рдПрдХ рдорд┐рд░рд░ рдХреЙрдкреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдХреНрд╡рд╛рд░реНрдЯрд░ рдХреА рддрд░рд╣ рд╣реА рддрд╕реНрд╡реАрд░ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди 127 рдиреАрдЪреЗ рдЖ рдЬрд╛рддреА рд╣реИред рдЖрдк рдХреЛрдб рдореЗрдВ рдЙрд▓рдЯрд╛ рд╣рдЯрд╛рдХрд░ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдо рдЖрд╡реГрддреНрддрд┐ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдмрджрд▓рддреЗ рд╣реИрдВ


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд░рдг рд╡реГрджреНрдзрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдирдП рдЗрдирдкреБрдЯ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:


 input [5:0] freq_res; input [7:0] phase; 

рдЪрд░рдг рд╡реГрджреНрдзрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдкрд░ рд╕реНрдиреИрдк рдХрд░рддреЗ рд╣реИрдВ:


 always @(posedge clk) begin if (rst) begin //... end else begin //... phase_inc <= freq_res; end end 

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЪрд░рдг рд╕рдВрдЪрдпрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдорд╛рди рд╕реЗ рднрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрджрд┐ рдЗрдирдкреБрдЯ рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдХрд╛ рдореВрд▓реНрдп рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдПрдХ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдЙрдард╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ phase_acc рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рдЖрдпрд╛ рдерд╛, рд╡рд╣ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдбрд┐рдЬрд╛рдЗрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 reg change_phase = 0; //     //     (  ) //     : prev_phase <= phase; if (phase != prev_phase) begin //       change_phase <= 1'b1; end if (change_phase) begin //        phase_acc <= prev_phase; change_phase <= 1'b0; end else begin //           phase_acc <= phase_acc + {2'b0,phase_inc}; end 

testbench


Iverilog рдФрд░ GTKWave рдХреЗ рдЯреЗрд╕реНрдЯрдмреЗрдВрдЪ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдбрд┐рдЬрд╝рд╛рдЗрди (рдПрдХ рдбреЙрд▓рд░ рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде) рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп ISE рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реВрдЯ рдпрд╛ рдХреНрд╡рд╛рд░реНрдЯрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдЕрд░реНрде рдореЙрдирд┐рдЯрд░ рдХрд┐рдП рдЧрдП рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдкрд░реАрдХреНрд╖рдг рдмреЗрдВрдЪ рдХрд╛ рдХрд╛рд░реНрдп рд╕реНрд╡рдпрдВ рддреБрдЪреНрдЫ рд╣реИ - рд╣рдо рдПрдХ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЖрд╡реГрддреНрддрд┐ / рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред


 `include "nco.v" `timescale 1ns / 1ps module nco_tb; reg clk = 0, rst = 0; reg [7:0] phase = 0; reg [5:0] freq_res; wire [7:0] out; nco nco_inst ( .clk(clk), .rst(rst), .phase(phase), .freq_res(freq_res), .out(out) ); always #2 clk <= ~clk; initial begin $dumpfile("out.vcd"); $dumpvars(0, nco_tb); //$monitor("time =%4d out=%h",$time,out); rst = 1'b1; freq_res = 1; #8 rst = 1'b0; #300 phase = 8'b00100011; #300 phase = 8'b00001111; #1200 freq_res = 6'b111101; #1200 freq_res = 6'b001111; #1200 freq_res = 6'b011111; #400 phase = 8'b00010011; #1200 $finish; end endmodule 

рдЪрд╛рд░реНрдЯрд┐рдВрдЧ рд╕рдордп


рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдо рдЯреЗрд╕реНрдЯрдмреИрдВрдХ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╕рдордп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдмрджрд▓рддреЗ рдЖрд╡реГрддреНрддрд┐ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдмрдврд╝рддреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде, рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди (рдкреНрд░рддрд┐ рдЕрд╡рдзрд┐ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) рдХреНрд░рдорд╢рдГ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рдШрдбрд╝реА рдХреА рдЖрд╡реГрддреНрддрд┐ рдФрд░ рдЗрд╕рдХреЗ LUT рдЖрдХрд╛рд░ рд╢реБрджреНрдз рд╕рд╛рдЗрди рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдирд┐рд░реНрдгрд╛рдпрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ (рдЕрдзрд┐рдХ рдЖрджрд░реНрд╢ рдЕрдкрдиреЗ рдЖрджрд░реНрд╢ рдХреЗ рдХрд░реАрдм рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдореЗрдВ рдХрдо рдкрдХреНрд╖ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВред рд╕рдВрдХреЗрдд рдФрд░ рд╢рд┐рдЦрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрддреНрдкрдиреНрди рдЖрд╡реГрддреНрддрд┐ рдкрд░ рд╣реЛрдЧрд╛)ред



рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреЗрдд рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣ рдПрдХ рдЪрд┐рдХрдиреА рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред



рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рд╕рд╛рдЗрди рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рдВрдХреЗрдд рдПрдВрдЯреА-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдлрд┐рд▓реНрдЯрд░ (рд▓реЛ-рдкрд╛рд╕ рдлрд┐рд▓реНрдЯрд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред


рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ


Source: https://habr.com/ru/post/hi457634/


All Articles