ich hab
*ein Sinnussignal(50 Hz,maximal Amplitude = 127) mit 8 bit
std_logic_vector
*ein konstant Signal auch 8 bit mit dem Wert 127
Weil Sinnussignal inklusiv die negativen Werte hat,muss ich die 0 Punkt
von Sinnus mit 128 in y Richtung addieren.
Dann vergleiche ich die Werte zwischen Sinnussignal und
Konstantsignal,um PWM Signal zu bekommen.
-->hab ich ein schöne PWM(halbe Periode =1,halbe Periode = 0).Das ist
okie.
Problem ist:
wenn Konstantksignal nicht 8 bit sondern 11 bit ist,muss die Bitzahl des
Sinnussignal auch vergrößern.Der Wert des Konstantsignal ist jetzt 1627
Benutze ich folgende Code
-----------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Add_Bit is
Port ( Bit_in : in STD_LOGIC_VECTOR (7 downto 0);
Bit_out : out STD_LOGIC_VECTOR (10 downto 0));
end Add_Bit;
architecture Behavioral of Add_Bit is
constant Bit_add : std_logic_vector(2 downto 0) :="000";
begin
process(Bit_in)
begin
Bit_out <= (Bit_add & Bit_in);
end process;
end Behavioral;
---------------------
und Bit_in => Sinnussignal
Weil der Wert des Konstant Signal 1627,deshalb muss 0 Punkt von Sinnus
noch 1500 addiere.
Ausgang 'Bit_out' =>'sig_in'
----------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity skala_verschiebung is
Port ( sig_in : in STD_LOGIC_VECTOR (10 downto 0);
sig_out : out STD_LOGIC_VECTOR (10 downto 0));
end skala_verschiebung;
architecture Behavioral of skala_verschiebung is
constant TG1 : std_logic_vector(8 downto 0):="1111111";--127
constant TG2 : std_logic_vector(10 downto 0):= "10111011100"--1500;
begin
process(sig_in)
begin
sig_out <= (sig_in + TG1+TG2);
end process;
end Behavioral;
-----------------------
Und mache ich das Vergleichen aber... PWM ist immer 1.Kann nicht
verstehen
Jemand kann mir helfen.
Danke im Voraus.
> Und mache ich das Vergleichen
Wo denn?
Kopiere bitte deine Dateien incl. Vergliicher in eine vhdl-Datei und
poste die. Du kannst auch mehrere Dateien an deinen Post anhängen...
Warum machst du für jede Zeile Code eine eigene Entity? Das ist doch
absolut unübersichtlich...
Warum machst du das nicht mit numeric_std? Da kannst du sinnvoll und
reproduzierbar rechnen, ganz ohne Abhängikeiten von
use IEEE.STD_LOGIC_UNSIGNED.ALL;
oder
use IEEE.STD_LOGIC_SIGNED.ALL;
@Lothar Miller
"Warum machst du für jede Zeile Code eine eigene Entity? Das ist doch
absolut unübersichtlich..."
-->weil ich Schematik benutze d.h jede Block muss ich defeniere.
Anhang schike ich Code dabei.
> Anhang schike ich Code dabei.
Ziemlich böse Herumjongliererei mit Variablen...
> PWM ist immer 1
Welche Werte kommen denn an den Signalen SINNUS1-3 herein?
BTW:
1)
Die Dreiecksfunktion, die hier verwendet wird, heisst SINUS :-/
2)
Der Code wäre so (ohne signifikante Funktionsänderung) wesentlich
aufgeräumter:
>Welche Werte kommen denn an den Signalen SINNUS1-3 herein?
Wert von Block sinnus
> Die Dreiecksfunktion, die hier verwendet wird, heisst SINUS :-/
Ja,benutze ich deinen Sinnuscode(3 sinnussignal mit 120 versetzt).
Problem ist:bekomme ich falsches Ergebnis,wenn ich die 0-von Sinnus
verschiebe.Ich verstehe nicht warum
>> 2)> ohne signifikante Funktionsänderung
was bedeutet das?
Gebe ich wieder deinen Sinnus Code
> Weil Sinnussignal inklusiv die negativen Werte hat
Wenn dich das stört, dann pass doch einfach die Sinus-Erzeugung an.
Und zwar genau so:
> muss ich die 0 Punkt von Sinnus mit 128 in y Richtung addieren.
Dazu solltest du dir die arithmetischen Funktionen der VHDL-Libs genauer
anschauen.
Alles weitere sind mathematische Grundlagen...
Nochmal:
Ersetze SINNUS durch SINUS :-/
Sinus hat nur 1 'n', auch Cosinus hat nur 1 'n'. Nur Tangens hat 2 'n'.