Forum: FPGA, VHDL & Co. Rechnung in VHDL


von A. Z. (Firma: Unkown) (b-net)


Lesenswert?

Hallo,

jetzt möchte ich fragen und zwar , wie man Bits aus ADC mit 
STD_LOGIC_VECTOR zu real bzw. integer umwandeln könnte.

ich hab einen code geschrieben aber kriegt immer fehlermeldung
<<Line 75. * can not have such operands in this context.
ERROR:HDLParsers:164 -
Line 77. parse error, unexpected INTEGER_LITERAL, expecting OPENPAR or 
IDENTIFIER>>
1
entity Calculation is
2
   Port ( --CLK       : in  STD_LOGIC;
3
--           RESET       : in  STD_LOGIC;
4
           GET_DATA      : in  STD_LOGIC;
5
           Buffer_VAL   : in  STD_LOGIC_VECTOR (71 downto 0);
6
--           CHANNEL   : in  STD_LOGIC_VECTOR (99 downto 0);
7
        READ_ENABLE  : out  STD_LOGIC := '0'; -- buffer
8
           DATA       : out  STD_LOGIC_VECTOR (7 downto 0));
9
end Calculation;
10
11
architecture Behavioral of Calculation is
12
13
signal ADC_2        : STD_LOGIC_VECTOR (0 downto 19) := (others => '0');
14
signal ADC_3        : STD_LOGIC_VECTOR (0 downto 13) := (others => '0');
15
16
signal ADC_2_OUT      : STD_LOGIC_VECTOR (7 downto 0) := (others => '0');
17
signal ADC_3_OUT      : STD_LOGIC_VECTOR (7 downto 0) := (others => '0');
18
19
signal ADC_2_UN      : unsigned (7 downto 0):= (others => '0');
20
signal ADC_3_UN      : unsigned (7 downto 0):= (others => '0');
21
22
signal calc_1        : INTEGER := 0;
23
signal result_1      : REAL := 0.000000;
24
25
signal calc_2        : INTEGER := 0;
26
signal result_2      : REAL := 0.00000;
27
28
constant ADC_2_sub      : INTEGER := 1048576;
29
constant ADC_3_sub      : INTEGER := 16384;
30
31
constant ADC_2_div      : INTEGER := 524288;
32
constant ADC_3_div      : INTEGER := 8192;
33
34
begin
35
36
37
Process (GET_DATA, Buffer_VAL) 
38
begin
39
40
if (GET_DATA = '1') then
41
    READ_ENABLE <= '1';
42
    
43
    ADC_2 <= not Buffer_VAL (51 downto 32);
44
    
45
    calc_1 <= (to_integer(unsigned(ADC_2))) - ADC_2_sub;
46
    result_1 <= REAL(0.5 * calc_1)/ADC_2_div;
47
    
48
    ADC_2_UN <= to_unsigned(integer(result_1),ADC_2_UN'8);
49
    
50
    ADC_2_OUT <= STD_LOGIC_VECTOR(ADC_2_UN);
51
52
end if;
53
end Process;

danach müssen die Messwerte in 8 databits über rs232 übertragen werden. 
was ist die beste Möglichkeit ? bit zu Ascii zu konvertieren
ich hab mir überlegt, erst HEXdez  und dann Ascii bin aber nicht sicher

von PittyJ (Gast)


Lesenswert?

Coole Sache.
Erste mal 0.5, danach durch 524288.
Hätte man nicht gleich durch 10485476 teilen können.
Oder besser noch die letzen 20 Bits weglassen. Wäre wohl zu trivial 
gewesen.

Aber so sieht das schon gut aus. Man lernt nie aus.

von Lattice User (Gast)


Lesenswert?

real kann man nur in der Simulation innerhalb einer Testbench 
verwenden.

von peter (Gast)


Lesenswert?

----------------------------------------
was ist die beste Möglichkeit ? bit zu Ascii zu konvertieren
---------------------------------------

Wenn die Daten zum PC gehen sende ich mit meinem DE-1-Board immer die 
Daten als reine Byte mit 38400 Baud zb und löse die dann am PC auf, 
entweder als Text oder auch nur als Binärdaten.

GRuss

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A. ZANAM schrieb:
> was ist die beste Möglichkeit ? bit zu Ascii zu konvertieren
> ich hab mir überlegt, erst HEXdez  und dann Ascii bin aber nicht sicher
Überleg nochmal...
Du musst den Wert erst mal nach BCD wandeln, und dann aus einer Tabelle 
einfach den passenden ASCII Wert lesen und den dann über die serielle 
Schnitte ausgeben. Dazu noch ein CR/LF und der Tag ist gerettet...
http://www.lothar-miller.de/s9y/categories/44-BCD-Umwandlung

> * can not have such operands in this context.
JEDE VHDL Beschreibung beginnt VOR dem Schlüsselwort entity. Was steht 
da bei dir?

> result_1 <= REAL(0.5 * calc_1)/ADC_2_div;
Mal vom bereits erwähnten real abgesehen: eine Division in Hardware ist 
einiges aufwendiger als das, was da steht...
http://www.lothar-miller.de/s9y/archives/29-Division-in-VHDL.html

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:
> A. ZANAM schrieb:
>> was ist die beste Möglichkeit ? bit zu Ascii zu konvertieren
>> ich hab mir überlegt, erst HEXdez  und dann Ascii bin aber nicht sicher
> Überleg nochmal...
> Du musst den Wert erst mal nach BCD wandeln, und dann aus einer Tabelle
> einfach den passenden ASCII Wert lesen und den dann über die serielle

Wozu Tabelle? Einfach bit 7-4 auf "0011" setzen.

von A. Z. (Firma: Unkown) (b-net)


Lesenswert?

Lothar Miller schrieb:
>
>> result_1 <= REAL(0.5 * calc_1)/ADC_2_div;
> Mal vom bereits erwähnten real abgesehen: eine Division in Hardware ist
> einiges aufwendiger als das, was da steht...
> http://www.lothar-miller.de/s9y/archives/29-Division-in-VHDL.html


>> * can not have such operands in this context.
> JEDE VHDL Beschreibung beginnt VOR dem Schlüsselwort entity. Was steht
> da bei dir?

du meinst wahrscheinlich die libs

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.all;
--use ieee.math_real.all;


> Überleg nochmal...
> Du musst den Wert erst mal nach BCD wandeln, und dann aus einer Tabelle
> einfach den passenden ASCII Wert lesen und den dann über die serielle
> Schnitte ausgeben. Dazu noch ein CR/LF und der Tag ist gerettet...
> http://www.lothar-miller.de/s9y/categories/44-BCD-Umwandlung

ich habs mir auch so gedacht aber wenn ich BCD verwerde dann kommen 
andere werte -___-

von tsag (Gast)


Lesenswert?

Boah leute, wenn ihr noch nie etwas in vhdl gemacht habt und nur c 
kennt, denn nimmt euch erstmal ein buch!!

von peter (Gast)


Lesenswert?

Man... wie umständlich...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A. ZANAM schrieb:
> ich habs mir auch so gedacht aber wenn ich BCD verwerde dann kommen
> andere werte -___-
Ok. Welche?

Lattice User schrieb:
> Wozu Tabelle? Einfach bit 7-4 auf "0011" setzen.
Ähm, richtig. Es ist ja schon BCD. Ich hatte das mit der Umwandlung von 
Binärzahlen nach Hex-ASCII verwechselt...

von A. Z. (Firma: Unkown) (b-net)


Angehängte Dateien:

Lesenswert?

Lothar Miller schrieb:
> Ok. Welche?
>

siehe Anhang. der oben dargestellte Wert muss dem oben dargestellten 
wert entsprechen Also ich wünsch mir dass ich den oben Wert krieg und 
dann eine Rechnung durchführen


> Lattice User schrieb:
>> Wozu Tabelle? Einfach bit 7-4 auf "0011" setzen.
 was ist bit 7-4. du meinst 4 bits zu 8 bits wegen UART.

ich dank euch ^^

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A. ZANAM schrieb:
> was ist bit 7-4.
Ein jedes Byte hat 8 Bits. Die sind entsprechend ihrer binären 
Wertigkeit durchnummeriert: 7,6,5,4,3,2,1,0
Das kommt von "zwei hoch Bitwertigkeit":
1
 7    6    5    4    3    2    1    0
2
2    2    2    2    2    2    2    2
3
=
4
128  64   32   16   8    4    2    1
Welches sind jetzt also die Bits 7..4?

A. ZANAM schrieb:
> siehe Anhang.
Du kannst einen 20 Bit Binärwert nicht in einem 20 Bit BCD Vektor 
unterbringen. Ausserdem musst du dir den BCD-Vektor hinterher natürlich 
als Hex-Wert anzeigen lassen. Das ist Anfängermathematik mit 
Zahlensystemen...

: Bearbeitet durch Moderator
von Gustl B. (-gb-)


Lesenswert?

Was zur?! Wieso denn überhaupt ASCII in VHDL? Wenn du statt der rohen 
binären Daten das nach Hex und ASCII wandelst weil es hybscher aussieht, 
dann sinkt bei gleicher Datenrate auf der Schnittstelle die 
Informationsrate. Ja ist als Mensch besser zu lesen, können aber viele 
Terminal Programme automatisch anzeigen wenn die binär empfangen, also 
wie ein Hexeditor. Und man kann dieses ASCII nicht so leicht 
weiterverarbeiten. Also wozu die Mühe?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Gustl Buheitel schrieb:
> Wieso denn überhaupt ASCII in VHDL?
Das hat mit VHDL nichts zu tun. Bleibt also die Frage:
> Wieso denn überhaupt ASCII...?
Antwort: weil es mit JEDEM verfügbaren Terminal (mit)lesbar und 
protokollierbar ist. Weil man die damit empfangenen Daten ganz einfach 
in weiterverarbeitende Programme übernehmen kann. Weil es darin 
Steuerzeichn für den Datenfluss gibt. Weil man dann eine '0' von einer 0 
(Stringende in C) unterscheiden kann. Weil man dann ganz leicht 
zusätzliche Prüfsummen anhängen kann. Weil, weil, weil...

Es gibt zig Gründe, die dafür sprechen, ein ASCII basiertes Protokoll zu 
verwenden, aber nur 1 einzigen, der dagegen spricht: es müssen mehr 
Zeichen übertragen werden. Und da gibt es idR. oft die Möglichkeit, mit 
der Baudrate nach oben zu gehen.

Warum gibt es textbasierte Dateiformate wie Intel-Hex oder 
Motorola-S-Records, wenn man das auch alles platzsparend in eine 
Binärdatei packen könnte?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.