Forum: FPGA, VHDL & Co. FPGA Counter/Sinus/Auswertung


von Sven H. (germanone)


Lesenswert?

Hallo, ich als Neuling melde mich mal wieder mit einer Frage:

Ich habe eine Schaltung, die mir Sinus und Cosinus durch eine 
Widerstandskette ausgibt. Gezählt wird auf einen XILINX Virtex-II-Pro 
mit intern 40/240 MHz. Die Zählersignale kommen von einem HF-Modul. Im 
Moment liegt mein Problem darin, eine vernünftige Auswertung 
hinzubekommen. Diw Wegstrecke die mit diesem System gemessen wird 
stimmt. Allerdings sehe ich in der Auswertung Probleme mit den 
32Bit-Signalen.

Die 32 Spuren werden ausgelesen, dahinter steckt ein 26Bit Counter. 
Vorher wird eine Richtungsbestimmung gemacht, und das ganze über eine 
Auswertung über Decoder wieder an die Echtszeitschnittstelle ausgegeben. 
Und hier muss irgendwo der Fehler sitzen. Wir bekommen Differenzen von 
ca. 18 nm obwohl unsere Auflösung in dem Fall 2,5 nm sind. Ich hab schon 
versucht eine Mittelung zu machen aber damit noch weniger Erfolg gehabt 
als ich mir erhofft habe. Ich poste mal den Code... wäre echt nett wenn 
jemand eine Idee hat und mir weiterhelfen könnte.

Gruß Sven
1
library ieee;
2
3
use ieee.std_logic_1164.all;
4
use ieee.std_logic_unsigned.all;
5
use ieee.std_logic_arith.all;
6
7
use work.zlm2k4_pkg.all;
8
9
entity xj2bin32 is
10
  generic(
11
    delay:  time:=  1.0 ns);    -- Generic delay
12
  port (
13
    HCLK :  in std_logic;      -- High Clock,  240 MHz
14
    RESET :  in std_logic;      -- System Reset, high active, asynchron
15
    --
16
    Z :    in slv32;        -- Measurement interface
17
--    MASK :  in slv6;        -- Mask
18
    --
19
    X :    out slv32);
20
end xj2bin32;
21
22
23
architecture rtl of xj2bin32 is
24
  --
25
  -- component declaration
26
  --
27
  component udc26
28
    port (
29
    Q: OUT std_logic_VECTOR(25 downto 0);
30
    CLK: IN std_logic;
31
    UP: IN std_logic;
32
    CE: IN std_logic;
33
    ACLR: IN std_logic);
34
  end component;
35
36
  --
37
  -- Signal declaration
38
  --
39
  signal Z_Q :    std_logic_vector(Z'range);
40
  signal Z_QQ :    std_logic_vector(Z'range);
41
  signal Z_QQQ :    std_logic_vector(Z'range);
42
  signal Q :      slv26;            -- Output 26-bit-up/down counter
43
  signal O :      slv32;            -- Counter + decoder
44
  signal XLOW :    slv6;            -- Decoder output
45
  signal XZOUT:    slv32;
46
47
  signal CE :     std_logic;          -- Count Enable
48
  signal UP :       std_logic;          -- 1:UP, 0:DOWN
49
  
50
  signal C1 :      slv3;
51
  signal C2 :      slv3;
52
53
begin
54
55
56
  PSYNCZ:process(RESET,HCLK)
57
  begin
58
    if RESET = '1' then
59
      Z_Q <=    (Z'range => '0') after delay;
60
      Z_QQ <=    (Z'range => '0') after delay;
61
      Z_QQQ <=  (Z'range => '0') after delay;
62
    elsif rising_edge(HCLK) then
63
      Z_Q <=    Z after delay;
64
      Z_QQ <=    Z_Q after delay;
65
      Z_QQQ <=  Z_QQ after delay;
66
    end if;
67
  end process PSYNCZ;
68
  
69
  
70
  C1 <= Z_Q(0)  & Z_QQ(0)  & Z_Q(16) after delay;
71
  C2 <= Z_Q(16) & Z_QQ(16) & Z_Q(0) after delay;
72
  
73
  P100:process(RESET,HCLK)
74
  begin
75
    if RESET = '1' then
76
      CE <=  '0' after delay;
77
      UP <=  '0' after delay;
78
    elsif rising_edge(HCLK) then
79
      if    C1 = "100" then  
80
        UP <=  '1' after delay;
81
        CE <=  '1' after delay;
82
      elsif C2 = "101" then
83
        UP <=  '1' after delay;
84
        CE <=  '0' after delay;
85
      elsif C1 = "011" then
86
        UP <=  '1' after delay;
87
        CE <=  '0' after delay;
88
      elsif C2 = "010" then
89
        UP <=  '1' after delay;
90
        CE <=  '0' after delay;
91
      elsif C1 = "010" then
92
        UP <=  '0' after delay;
93
        CE <=  '1' after delay;
94
      elsif C2 = "100" then
95
        UP <=  '0' after delay;
96
        CE <=  '0' after delay;
97
      elsif C1 = "101" then
98
        UP <=  '0' after delay;
99
        CE <=  '0' after delay;
100
      elsif C2 = "011" then
101
        UP <=  '0' after delay;
102
        CE <=  '0' after delay;
103
      else
104
        CE <=  '0' after delay;
105
      end if;
106
    end if;
107
  end process P100;
108
109
  --
110
  -- 26 up/down counter
111
  --
112
  U1: udc26
113
    port map (
114
      Q =>   Q,
115
      CLK =>  HCLK,
116
      UP =>  UP,
117
      CE =>  CE,
118
      ACLR => RESET);
119
120
XLOW <=  convert4(Z_QQQ);
121
--  XZOUT(0) <= Z_QQQ(0);
122
--  XZOUT(1) <= Z_QQQ(1);
123
--  XZOUT(2) <= Z_QQQ(2);
124
--  XZOUT(3) <= Z_QQQ(3);
125
--  XZOUT(4) <= Z_QQQ(4);
126
--  XZOUT(5) <= Z_QQQ(5);
127
--  XZOUT(6) <= Z_QQQ(6);
128
--  XZOUT(7) <= Z_QQQ(7);
129
--  XZOUT(8) <= Z_QQQ(8);
130
--  XZOUT(9) <= Z_QQQ(9);
131
--  XZOUT(10) <= Z_QQQ(10);
132
--  XZOUT(11) <= Z_QQQ(11);
133
--  XZOUT(12) <= Z_QQQ(12);
134
--  XZOUT(13) <= Z_QQQ(13);
135
--  XZOUT(14) <= Z_QQQ(14);
136
--  XZOUT(15) <= Z_QQQ(15);
137
--  XZOUT(16) <= Z_QQQ(16);
138
--  XZOUT(17) <= Z_QQQ(17);
139
--  XZOUT(18) <= Z_QQQ(18);
140
--  XZOUT(19) <= Z_QQQ(19);
141
--  XZOUT(20) <= Z_QQQ(20);
142
--  XZOUT(21) <= Z_QQQ(21);
143
--  XZOUT(22) <= Z_QQQ(22);
144
--  XZOUT(23) <= Z_QQQ(23);
145
--  XZOUT(24) <= Z_QQQ(24);
146
--  XZOUT(25) <= Z_QQQ(25);
147
--  XZOUT(26) <= Z_QQQ(26);
148
--  XZOUT(27) <= Z_QQQ(27);
149
--  XZOUT(28) <= Z_QQQ(28);
150
--  XZOUT(29) <= Z_QQQ(29);
151
--  XZOUT(30) <= Z_QQQ(30);
152
--  XZOUT(31) <= Z_QQQ(31);
153
154
--  XZOUT <= bitclear(Z_QQQ);
155
--  XLOW(0) := '0';
156
--  XLOW(1) := '0';
157
--  XLOW(2) := '0';
158
--  XLOW(3) := '0';
159
--  XLOW(4) := '0';
160
--  XLOW(5) := '0';
161
162
163
164
  POUT:process(RESET,HCLK)
165
    variable O  : slv32;            -- Counter + decoder
166
    variable T  : slv6;
167
  begin
168
    if RESET = '1' then
169
      X <=  (X'range =>  '0') after delay;
170
    elsif rising_edge(HCLK) then
171
--      O :=  Q & XLOW;
172
--      T :=  MASK and O(5 downto 0);
173
--      X <=  O(31 downto 6) & T after delay;
174
--      X <=  Q & XLOW after delay;
175
--      X <= XZOUT after delay;
176
177
      X <= Q & XLOW after delay;
178
179
180
181
    end if;
182
  end process POUT;
183
184
185
end rtl;

Zum testen hab ich mir mal die SIN/COS (XZOUT) direkt ohne Decoder 
ausgegeben.

Hier noch der Quellen zum Decoder:
1
function convert4(I : slv32) return std_logic_vector is 
2
    variable temp : std_logic_vector(5 downto 0);
3
  begin
4
     temp(5) :=  not I(0);
5
     temp(4) :=  not(I(8) xor I(24));
6
     temp(3) :=  not(I(0) xor I(8) xor I(16) xor I(24));
7
     temp(2) :=  not(I(0) xor I(4) xor I(8) xor I(12) xor I(16) xor I(20) xor I(24) xor I(28));
8
     temp(1) :=  not(I(0) xor I(2) xor I(4) xor I(6) xor I(8) xor I(10) xor I(12) xor I(14) xor
9
            I(16) xor I(18) xor I(20) xor I(22) xor I(24) xor I(26) xor I(28) xor I(30));
10
     temp(0) :=      xnor_reduce( I);
11
12
    return temp;
13
  end function convert4;

Ich hab schon "viele" Möglichkeiten ausprobiert aber noch keine Passable 
Lösung gefunden. Würde mich echt freuen wenn mir jemand wirklich 
weiterhelfen könnte.

von Lattice User (Gast)


Lesenswert?

Ich kenn mich zwar eher mit Lattice und Verilog aus, aber was willst du 
mit
"after delay" erreichen? Das ist nicht synthesierbar!

von Sven H. (germanone)


Lesenswert?

Bitte entschuldigt... der code ist nicht von mir. Die ganze Sache kann 
ich auch so wie sie jetzt ist nur unter XILINX ISE 7.1 Als PROM 
erstellen. Habe es mit ISE 10.3 versucht aber da hat nix mehr hin. Habt 
ihr eine Lösung, wie ich es schnellstens besser machen kann?

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


Lesenswert?

Sven Herrmann schrieb:
> Habe es mit ISE 10.3 versucht aber da hat nix mehr hin.
Wei merkst du das? Was geht da nicht?

Lattice User schrieb:
> was willst du mit
> "after delay" erreichen? Das ist nicht synthesierbar!
Die legendären symbolischen Laufzeiten...
Die hatten wir schon im 
Beitrag "Re: Frage zu Pseudozufallsgenerator!?"

von Andi (chefdesigner)


Lesenswert?

Die "afters" sollten eigentlich bei der Syn nicht stören. Aber bei der 
Simulation muss man genau aufpassen, was man tut. ModelSim vertut sich 
da scheinens manchmal ein wenig.

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.