Forum: FPGA, VHDL & Co. Teiler in fpga 3a dsp 1800A


von nguoi moi (Gast)


Lesenswert?

hallo zusammen,


ich besitze stolzweise einen fpga spartan 3a dsp 1800A 
http://www.xilinx.com/products/devkits/HW-SD1800A-DSP-SB-UNI-G.htm. Ich 
hab paar frage.

1. in meinem process möchte ich eine division berechnen, geht das mit 
clk = 25Mhz?
1
process (clk)
2
begin
3
variable x,y : std_logic_vector (9 downto 0);
4
begin
5
6
 if clk'event and clk = '1' then
7
        x := x + 1;
8
  y := x/20;
9
 end if;
10
end process;

Damit möchte ich dem "y" nur den Ganzzahlanteil von (x/20) zuweisen, 
z.b. "x =  25" ---> y = 25/20 = 1

2. Gibts Tutorial für diesen Board? Der Name klingt dass man ihn als DSP 
benutzen kann, aber wie?

Vielen Dank im voraus!

von Christian R. (supachris)


Lesenswert?

Divisionen durch andere Zahlen als 2^n werden von der Synthese nicht 
direkt unterstützt. Das musst du zu Fuß oder mit Hilfe der DSP48 Blöcke 
realisieren. Schau dir mal den Core Generator an, da gibts einen 
Dividierer. Allerdings braucht der meines Wissens auch soviele 
taktzyklen, wie dein Vektor Bits hat.
Siehe auch: 
http://www.mikrocontroller.net/articles/Rechnen_in_VHDL#Umsetzbare_Operatoren

von Duke Scarring (Gast)


Lesenswert?

@ nguoi moi:

Was sagt denn die Synthese zu Deinem Code? Hast Du eine Testbench?
Mein XST sagt:
1
line 23: Operator <INVALID OPERATOR> must have constant operands or first operand must be power of 2

Vielleicht kannst Du 32 als Teiler verwenden. Ich würde das dann so 
schreiben:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity division is
6
  port(
7
    clk: in  std_logic;
8
    x_i: in  std_logic_vector (9 downto 0);
9
    x_o: out std_logic_vector (9 downto 0);
10
    y_o: out std_logic_vector (9 downto 0)
11
  );
12
end division;
13
14
architecture rtl of division is
15
16
begin
17
18
  main: process
19
  begin
20
    wait until rising_edge(clk);
21
    x_o <= std_logic_vector(  unsigned(x_i) + 1      );
22
    y_o <= std_logic_vector( (unsigned(x_i) + 1) /32 );
23
  end process;
24
25
end rtl;

> 2. Gibts Tutorial für diesen Board? Der Name klingt dass man ihn als DSP
> benutzen kann, aber wie?
Es gibt sicher kein spezielles Tutorial, aber in ISE sind m.E. einige 
Examples (File -> Open Example) dabei.
Das DSP im Namen bezieht sich auf die höhere Anzahl von DSP48-Blöcken im 
FPGA. Das sind schnelle Multiplizierer mit angehängten Addierern. Damit 
lassen sich gut diverse Filter für die Signalverarbeitung generieren.

Duke

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo nguoi moi,

du hast keine richtige Division, sondern nur eine Verstärkung mit einem 
Faktor < 1. In diesem Fall hilft es, deinen Verstärkungsfaktor mit einer 
2er-Potenz zu erweitern, damit multiplizierst du dein Signal und teilst 
dieses Ergebnis wieder mit der 2er-Potenz.

für dein Problem

1/20=0,5=0,5*1024/1024=51,2/1024

in VHDL

x1 <= x * 51;
y <= x1 / 1024;

Tom

von nguoi moi (Gast)


Lesenswert?

vielen dank für eure mühung und sehr hilfreiche Lösungen:-)

machs gut

ciao

Nguoi Moi

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.