Hallo :),
(sorry für meine schlechte sprache) :)
ich hab einen lockeren VHDL Code für einen Full-Adder. Ich möchte mit
Generate und Generic N blocks von diesem Full-Adder zusammen verbinden,
damit ich N Bits mit anderen N Bits adde, und N+1 Bits als Ergebnis
bekomme.
mein FA Code ist der Folgende:
---------------------------------
entity FA is
Port ( a : in std_logic;
b : in std_logic;
cin : in std_logic; --carry in
s : out std_logic;
cout : out std_logic); --carry out
end FA;
architecture Behavioral of FA is
begin
s <= a XOR b XOR cin;
cout <= (a AND b) OR (a AND cin) OR (b AND cin);
end Behavioral;
--------------------------------
Und mit dem Folgenden Code habe ich es versucht, die FA Blöcke zusammen
zu verbinden:
-----------------------------------------------
entity FASeries is
generic (N : NATURAL := 8);
port(
a : std_logic_vector(N downto 0);
b : std_logic_vector(N downto 0);
res : std_logic_vector(N+1 downto 0)
);
end FASeries;
architecture Behavioral of FASeries is
component FA
Port ( a : in std_logic;
b : in std_logic;
cin : in std_logic;
s : out std_logic;
cout : out std_logic);
end component;
signal cout : std_logic_vector(N downto 0);
signal resultBuffer : std_logic_vector(N+1 downto 0);
begin
comp: FA
PORT MAP(
a => a(0),
b => b(0),
cin => '0',
s => resultBuffer(0)
);
g1: FOR i IN 1 TO N GENERATE
comp: FA
PORT MAP(
a => a(i),
b => b(i),
cin => cout(i-1),
s => resultBuffer(i)
);
END GENERATE g1;
resultBuffer(N+1) <= cout(N);
res <= resultBuffer; -- Error passiert hier, Line 69
end Behavioral;
------------------------------------------------------------
ich bin mir nicht sicher, dass meine Idee richtig ist (wie ich den Code
geschrieben habe). Der Code gibt ein Problem mit dem Syntax, und sagt:
Line 69. Object res of mode IN can not be updated.
Warum bekomme ich dieses Error? könnt ihr mir helfen? bekommet man den
erwarteten Ergebnis mit diesem Code?
Vielen Dank :)
Samer Afach schrieb:> Line 69. Object res of mode IN can not be updated.> Warum bekomme ich dieses Error?
Das ist ja wohl SELBSTERKLÄREND. Das Signal res hat die Richtung in
und kann daher nicht beschrieben werden.
Und der Hintergrund?
1
port(
2
a:std_logic_vector(Ndownto0);
3
b:std_logic_vector(Ndownto0);
4
res:std_logic_vector(N+1downto0)
5
);
Bei diesen Ports fehlt noch die Richtung (in, out, inout, buffer...).
Defaulteinstellung ist in. Probiers mal (mindestens) so:
Samer Afach schrieb:> Aber ist mein Code für die Idee richtig?
Das habe ich nicht kontrolliert.
Das ist eine Hausaufgabe, und deren Ergebnis kannst du mit einer
Simulation ganz leicht testen...
Vielen Dank für deine Antwort :),
nur zur Information, ich bin Doktorand von Physik. Also vielleicht die
Idee von Hausaufgaben ist noch ein bißchen veraltet für mich :P
Ich habe empfunden, dass etwas mit dem Code nicht stimmt. Ich habe die
Simulation gemacht für N=2, die Ergebnisse waren aber total falsch. Habe
immer im Ausgabe "res" entweder UUU0 oder UUU1 bekommen... ich weiß
nicht was das bedeutet.
Das Problem mit dem Code, wie ich es sehe, ist dass ich nicht weiß, wie
ich cin(1) mit cout(0) verbinden kann, und res(N+1) mit cout(N)
verbinden kann. Manche von diesen Signalen braucht kein Generate, wie
ich es geschrieben habe. Die Verbindung zwischen die Signale im Befehl
Generate und außerhalb Generate kann ich nicht machen. Ich weiß nicht
einfach wie!
Wie kann ich diese Verbindung machen? Es würde mich sehr freuen mir zu
sagen :)
wie meinst du das?
Vielleicht habe ich es falsch gesagt :P
The idea of homework is a little bit obsolete for me, cuz I'm a PhD
student.
Sieht das besser aus? ^^
ich bin Physiker. Ich lerne VHDL ganz allein! also eure Hilfe schätze
ich sehr :)
Bitte, auf eine Antwort warte ich :)
Samer Afach schrieb:> nur zur Information, ich bin Doktorand von Physik. Also vielleicht die> Idee von Hausaufgaben ist noch ein bißchen veraltet für mich :P
Willst du diesen Addierer "nur so als Übung" machen, oder hat das einen
Sinn? Ich mache in VHDL Additionen einfach mit c <= a+b;
> Ich habe empfunden, dass etwas mit dem Code nicht stimmt. Ich habe die> Simulation gemacht für N=2, die Ergebnisse waren aber total falsch. Habe> immer im Ausgabe "res" entweder UUU0 oder UUU1 bekommen...
Zeig doch mal deine Testbench...
(Am besten als Dateianhang mit Endung *.vhd)
Samer Afach schrieb:
1
componentFA
2
Port(a:instd_logic;-- 5 Ports
3
b:instd_logic;
4
cin:instd_logic;
5
s:outstd_logic;
6
cout:outstd_logic);
7
endcomponent;
8
9
10
comp:FA
11
PORTMAP(-- 4 Ports... :-o
12
a=>a(0),
13
b=>b(0),
14
cin=>'0',
15
s=>resultBuffer(0)
16
);
17
18
g1:FORiIN1TONGENERATE-- auch 4 Ports...
19
comp:FA
20
PORTMAP(
21
a=>a(i),
22
b=>b(i),
23
cin=>cout(i-1),
24
s=>resultBuffer(i)
25
);
26
ENDGENERATEg1;
27
:
28
resultBuffer(N+1)<=cout(N);-- hier sind wir ausserhalb der Schleife!!!
29
:
30
endBehavioral;
> ich bin mir nicht sicher, dass meine Idee richtig ist (wie ich den Code> geschrieben habe)
Nein, das kann so nicht stimmen. Mich wundert, dass da überhaupt was
rauskommt...
Und überleg dir: wie soll denn ein Addierer funktionieren, wenn der
Übertrag nicht weitergegeben wird?
Ich muß D. I. (grotesque) da schon recht geben: das Nichterkennen dieses
Problems hat m.E. nichts mit Sprachproblemen oder VHDL an sich zu tun...
Thank you so much for your solution. It worked perfectly.
Why am I writing this in English? because I really feel insulted right
now. Mr. Miller, with all due respect. I appreciate your help a lot, and
I'm very happy to find people helping and being nice with nothing asked
in return. But eventually you don't have to agree with someone accusing
me of not deserving my Diploma. This is extremely insulting. I'm very
new to VHDL, and concurrent code confuses me a lot, because I'm a C++
programmer since 10 years. I admit, the questions are very easy to
answer for a pro like you, but for someone like me, it's just difficult
to "see" the errors the way you see them in the code. We all have a
starting point, and we all pose embarrassing question. This is how we
learn :)
When I said the homework thing, I posed it as a joke, and posed the
right smiley beside it so you won't think I'm refusing cooperating with
you. It's just that I knew the code didn't make sense somehow. And I
mentioned at the beginning of this post that my German is very weak. So
please appreciate this point a lot. I'm doing all I can!
Thanks again for the help. But please consider people's feelings next
time, and when someone says a rude comment, you don't have to agree with
them.
Best regards, and thanks again.
Samer Afach
Universitätsklinikum, Jena.
Samer Afach schrieb:> It worked perfectly.
Nice to hear. You see: you have not been very far from the correct
solution.
> But eventually you don't have to agree with someone accusing> me of not deserving my Diploma. This is extremely insulting.
It was not my intetion to offend you. It just seemed to me (as obviously
to Duke) as if you have a very high grade qualification and you ask very
simple low grade questions with (fairly) obvious answers. Of course you
are right with the comparision of a starter vs. a pro. I just loose the
focus on that fact from now to then.
> I appreciate your help a lot, and I'm very happy to find people> helping and being nice with nothing asked in return.
Get a copy of the book "VHDL-Synthese" from Reichardt&Schwarz. As a
little penalty for you its German, but your knowledge of the language
doesn't look all that bad... ;-)
BTW: what did you mean with
Samer Afach schrieb:>>>> ich hab einen lockeren VHDL Code> Best regards, and thanks again.
You're welcome. Good luck for your further work.
D. I. wasn't a guest. He's a user with an account. I didn't care when D.
I. said what he said, because he didn't even contribute to the answer.
So some guy being rude and talking inappropriate is something you'd find
in all communities, and they're there just to be ignored.
But then agreeing with that was by Lothar was offensive. I think Lothar
didn't mean it, he was just surprised from my low-grade questions, as he
mentioned. He already expressed that he's not that happy by agreeing to
D. I.'s statement.
Let's not blow the problem and give it greater than its dimensions. A
person like D. I., with all due respect, who enters a topic just to
write an offensive sentence is a type of people, for which I wouldn't
give the least care. He could stay away and get all conceited with his
brilliant answers and science that he knows.
We're all here to help each other, and we're all humans who err, pose
stupid and embarrassing question, but eventually we learn. Let's not
talk about this anymore :-)