Verilog - Float (16-bit) todellisiin muuntaminen

V

vjabagch

Guest
Minulla on Sine kosini ROM moduuli jota tuotetaan Matlab käyttäen puoli-tarkkuuslähestyminen toiminto saatavilla Matlab-sivustosta.Se koostuu 10-bittinen osoite tilaa ja 16-bittinen tiedot bussi.Saan erittäin suuri (ja väärä) numeroita simulaation.Olen liittänyt esimerkki simulointi lähtö.

# 0.00 radiaaneina -> sin = 131072.0000 cos = 1,0000
# 0.01 radiaaneina -> sin = 131072.0000 cos = 1,0000
# 0.01 radiaaneina -> sin = 16777216.0000 cos = 1,0000
# 0.01 radiaaneina -> sin = 16777216.0000 cos = 1,0000

...

# 6.27 radiaaneina -> sin = 4261412864.0000 cos = 1,0000
# 6.27 radiaaneina -> sin = 4278190080.0000 cos = 1,0000
# 6.28 radiaaneina -> sin = 4278190080.0000 cos = 1,0000
# 6.28 radiaaneina -> sin = 4294836224.0000 cos = 1,0000

The testbench sisältää suurin ongelma sisällä seurata julkilausuman.

$ seurata ( "% 1.2f radiaaneina -> sin =% 1.4f cos =% 1.4f", (osoite * 2 * pi / 1023),
((-1) ** (Sine [15])) * (1'b1 (sine [9:0]>> 10)) * (2 ** (sine [14:10] - 5'd15)) ,
((-1) ** (Kosini [15])) * (1'b1 (kosini [9:0]>> 10)) * (2 ** (kosini [14:10] - 5'd15)) );

Omat kysymykset ovat seuraavat:

Onko minun seurata julkilausuma perustaa oikein muuntaa 16-bittinen liukuluku todellisiin (x.xxxx-muodossa).

Mikä on max määrä desimaalia, että puoli tarkkuus (16-bittinen liukuluku) olisi sen desimaalierottimen oikealla puolella?Koska olen käsittelevät sin ja kosini 0: sta 2pi (jonka säde on 1) Olen vain 1 numeron vasemmalle.

Olen Latasin moduuli ja testi-penkki, seuraavaan osoitteeseen.

http://vahejabagchourian.comyr.com/Verilog/

Yksittäiset tiedostot tallennetaan osoitteessa:

http://vahejabagchourian.comyr.com/Verilog/sync_rom.v
http://vahejabagchourian.comyr.com/Verilog/sync_rom_tb.v

Kaikki apu on tervetullutta.

Kiitos,
Vahe
Anteeksi, mutta sinun on kirjautumistunnuksen nähdäksesi tämän liitäntävaatimuksia

 
?

Joiden seurauksena sinulla odottaa sine [9:0]>> 10?Se on sama kuin nolla kaikkien arvojen ehdoton, luulisin.don't give negative results due to default Verilog data types.

Myös välttämätön [14:10] - 5'd15
eivät anna negatiiviset tulokset johtuvat default Verilog tietotyyppejä.

 
Kiitos avusta.

Minulla oli mahdollisuus ratkaista ongelma.

Oma testbench liittänyt liitteenä alla.Monitorin julkilausuma ja lisätään kokonaisluku kannanotot ovat tärkeitä muutoksia tein.Kiitos vielä kerran.Toivon, että tämä auttaa noin muuten edessään samanlainen kysymys.

Vahe# 0.00 radiaaneina -> sin = 0,0000 cos = 1,0000
# 0.01 radiaaneina -> sin = 0,0000 cos = 1,0000
# 0.01 radiaaneina -> sin = 0,0061 cos = 1,0000
# 0.01 radiaaneina -> sin = 0,0061 cos = 1,0000
# 0.01 radiaaneina -> sin = 0,0123 cos = 1,0000
# 0.02 radiaaneina -> sin = 0,0123 cos = 1,0000
# 0.02 radiaaneina -> sin = 0,0184 cos = 1,0000
# 0.02 radiaaneina -> sin = 0,0184 cos = 1,0000
# 0.02 radiaaneina -> sin = 0,0246 cos = 0,9995
# 0.03 radiaaneina -> sin = 0,0246 cos = 0,9995
# 0.03 radiaaneina -> sin = 0,0307 cos = 0,9995
# 0.04 radiaaneina -> sin = 0,0307 cos = 0,9995
# 0.04 radiaaneina -> sin = 0,0368 cos = 0,9995
# 0.04 radiaaneina -> sin = 0,0368 cos = 0,9995
# 0.04 radiaaneina -> sin = 0,0430 cos = 0,9990
# 0.05 radiaaneina -> sin = 0,0430 cos = 0,9990
# 0.05 radiaaneina -> sin = 0,0491 cos = 0,9990

...# 6.24 radiaaneina -> sin = -0,0430 cos = 0,9990
# 6.24 radiaaneina -> sin = -0,0368 cos = 0,9995
# 6.25 radiaaneina -> sin = -0,0368 cos = 0,9995
# 6.25 radiaaneina -> sin = -0,0307 cos = 0,9995
# 6.26 radiaaneina -> sin = -0,0307 cos = 0,9995
# 6.26 radiaaneina -> sin = -0,0246 cos = 0,9995
# 6.26 radiaaneina -> sin = -0,0246 cos = 0,9995
# 6.26 radiaaneina -> sin = -0,0184 cos = 1,0000
# 6.27 radiaaneina -> sin = -0,0184 cos = 1,0000
# 6.27 radiaaneina -> sin = -0,0123 cos = 1,0000
# 6.27 radiaaneina -> sin = -0,0123 cos = 1,0000
# 6.27 radiaaneina -> sin = -0,0061 cos = 1,0000
# 6.28 radiaaneina -> sin = -0,0061 cos = 1,0000
# 6.28 radiaaneina -> sin = -0,0000 cos = 1,0000
"ajassa 1ns / 1ps

moduuli sync_rom_tb_v;

/ / Panokset
reg kello;
reg [9:0] osoite;

/ / Lähdöt
lanka [15:0] välttämätön;
lanka [15:0] kosini;

todellinen pi = 3,14;/ / Instantiate yksikkö Under Test (UUT)
sync_rom UUT (
. kellon (kello),
.-osoite (osoite),
. sine (ehdoton),
. kosini (kosini)
);integer cosine_significand;
integer sine_significand;

integer sine_sign;
integer cosine_sign;

integer sine_exponent;
integer cosine_exponent;

aina @ (sini, kosini)
aloittaa

sine_significand = sine [9:0];
cosine_significand = kosini [9:0];

sine_sign = välttämätön [15];
cosine_sign = kosini [15];

sine_exponent = sine [14:10];
cosine_exponent = kosini [14:10];

$ seurata ( "% 1.2f radiaaneina -> sin =% 1.4f cos =% 1.4f", (osoite * 2 * pi / 1023),
((-1) ** (Sine_sign)) * (1 ($ itor (sine_significand) / 1024)) * ((sine_exponent <15)? (1,0000 / 2 ** (-1 * (sine_exponent - 15))) : (2 ** (sine_exponent - 15))),
((-1) ** (Cosine_sign)) * (1 ($ itor (cosine_significand) / 1024)) * ((cosine_exponent <15)? (1,0000 / 2 ** (-1 * (cosine_exponent - 15))) : (2 ** (cosine_exponent - 15))));

loppualkuperäisen
aloittaa
/ / Alusta Panokset
kello = 0;
osoite = 0;
loppu

aina
aloittaa
# 50 kello = ~ kello;
loppu

integer i;

aina
aloittaa

for (i = 0; i <1024; i = i 1)
aloittaa
# 100 osoite = i;
loppu/ / Odota 100 ns maailmanlaajuisen reset loppuun
# 100 $ loppuun;

/ / Lisää ärsyke tästä

loppu

endmodule

 

Welcome to EDABoard.com

Sponsor

Back
Top