Forum: FPGA, VHDL & Co. Pseudozufallszahlengenerator und Signaturanalysator Probleme


von Spyro (Gast)


Lesenswert?

Hi Leute,

ich weiß nicht warum, aber folgendes Design funktioniert bei mir einfach 
nicht. Es ein ein Design nach Galois und beinhaltet 
Zufallszahlengenerator und Signaturanalysator in einem per func_select 
auswählbar.

Mein Problem: Ist der Zufallgenerator eingestellt, dann wird einfach 
keine Zufallszahl in den Ausgängen x[0:NN] ausgegeben.

Kann mal jemand drüberschauen, ob ich irgendetwas falsch mache?

Wäre sehr dankbar!
1
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    00:03:13 04/14/2014 
6
-- Design Name: 
7
-- Module Name:    nBit_PZG_SGA - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.STD_LOGIC_UNSIGNED.ALL;
23
24
-- Uncomment the following library declaration if using
25
-- arithmetic functions with Signed or Unsigned values
26
--use IEEE.NUMERIC_STD.ALL;
27
28
-- Uncomment the following library declaration if instantiating
29
-- any Xilinx primitives in this code.
30
--library UNISIM;
31
--use UNISIM.VComponents.all;
32
33
entity nBit_PZG_SGA is
34
35
  GENERIC  (  NN                : integer := 8
36
  );
37
  Port  (    func_select          : in  STD_LOGIC;
38
          coefficient_vector    : in  STD_LOGIC_VECTOR(0 to NN-1);
39
          data_in_for_signature  : in  STD_LOGIC;
40
          clk              : in  STD_LOGIC;
41
          rst              : in   std_logic;
42
          x                : out STD_LOGIC_VECTOR(0 to NN-1)
43
  );
44
  
45
end nBit_PZG_SGA;
46
47
architecture Behavioral of nBit_PZG_SGA is
48
49
  COMPONENT d_ff PORT (
50
        D    : in  STD_LOGIC;
51
        clk  : in  STD_LOGIC;
52
        rst  : in  STD_LOGIC;
53
        Q    : out  STD_LOGIC
54
  );
55
  END COMPONENT;
56
  
57
  SIGNAL coeff_AND    : std_logic_vector (0 to NN-1);
58
  SIGNAL Q          : std_logic_vector (0 to NN) := (others => '0');
59
  SIGNAL ausgang_xor  : std_logic_vector (0 to NN-1);
60
  SIGNAL BACK       : std_logic := '1';  
61
  
62
begin
63
  
64
  -- FIRST FF
65
  D_FF_FIRST: d_ff PORT MAP(
66
        D    => ausgang_xor(0),
67
        clk  => clk,
68
        rst  => rst,
69
        Q    => Q(1)
70
  );
71
  
72
  
73
  Q(0)         <=  func_select AND data_in_for_signature;
74
  coeff_AND(0)  <= BACK;
75
  ausgang_xor(0)  <= Q(0) XOR coeff_AND(0);
76
  
77
  -- Ausgangssignal auf Ausgangsvektor geben.
78
  x(0)  <= Q(1);
79
  
80
  -- MIDDLE FF
81
  G: FOR i in 1 to (NN-2) GENERATE
82
  
83
    D_FF_MITTE: d_ff PORT MAP(
84
        D    => ausgang_xor(i),
85
        clk  => clk,
86
        rst  => rst,
87
        Q    => Q(i+1)
88
    );
89
    
90
    coeff_AND(i) <= coefficient_vector(i) AND BACK;
91
    ausgang_xor(i) <= Q(i) XOR coeff_AND(i);
92
    
93
    -- Ausgangssignal auf Ausgangsvektor geben.
94
    x(i)  <= Q(i+1);
95
96
  END GENERATE G;
97
  
98
  -- LAST FF
99
  D_FF_LAST: d_ff PORT MAP(
100
        D    => ausgang_xor(NN-1),
101
        clk  => clk,
102
        rst  => rst,
103
        Q    => Q(NN)
104
  );
105
  
106
  ausgang_xor(NN-1)  <= Q(NN-1) XOR coeff_AND(NN-1);
107
  coeff_AND(NN-1)  <= coefficient_vector(NN-1) AND BACK;
108
  BACK          <=  (Q(NN) AND coefficient_vector(NN-1)) WHEN (func_select = '0')
109
                ELSE Q(NN);
110
  
111
  -- Ausgangssignal auf Ausgangsvektor geben.
112
  x(NN-1)        <= Q(NN);
113
114
end Behavioral;

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


Lesenswert?

Spyro schrieb:
> x  : out STD_LOGIC_VECTOR(0 to NN-1)
Wer kommt auf die Idee, einen std_logic_vector aufsteigend zu 
deklarieren?

> Mein Problem: Ist der Zufallgenerator eingestellt, dann wird einfach
> keine Zufallszahl in den Ausgängen x[0:NN] ausgegeben.
Wie stellst du den Generator ein? Und wie stellst du fest, dass er nicht 
funktioniert? Wie sieht deine Testbench aus? Was ist deine Taktfrequenz?

: Bearbeitet durch Moderator
von Spyro (Gast)


Lesenswert?

Generator wird mit func_select <= '0' eingestellt.
Feststellen tue ich das, indem ich in der Testbench den func_select 
entsprechend einstelle, mein coefficient_vector setzte und die Testbench 
einfach mit einer clock laufen lasse. Die clock ist die voreingestellte 
Clock, die beim erstellen einer Testbench automatisch erstell wird.

Eigentlich müsste man in der Testbench ein Generic Map noch einstellen. 
Da mir Xilinx beim erstellen der Testbenh automatisch meinen 
Standardwert von NN = 8 genommen hat, hab ich das einfach mal 
übernommen.
1
--------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer:
4
--
5
-- Create Date:   22:06:36 04/15/2014
6
-- Design Name:   
7
-- Module Name:   C:/Users/Steffen Kern/Documents/Xilinx/Aufgabe_3/tb_002.vhd
8
-- Project Name:  Aufgabe_3
9
-- Target Device:  
10
-- Tool versions:  
11
-- Description:   
12
-- 
13
-- VHDL Test Bench Created by ISE for module: nBit_PZG_SGA
14
-- 
15
-- Dependencies:
16
-- 
17
-- Revision:
18
-- Revision 0.01 - File Created
19
-- Additional Comments:
20
--
21
-- Notes: 
22
-- This testbench has been automatically generated using types std_logic and
23
-- std_logic_vector for the ports of the unit under test.  Xilinx recommends
24
-- that these types always be used for the top-level I/O of a design in order
25
-- to guarantee that the testbench will bind correctly to the post-implementation 
26
-- simulation model.
27
--------------------------------------------------------------------------------
28
LIBRARY ieee;
29
USE ieee.std_logic_1164.ALL;
30
 
31
-- Uncomment the following library declaration if using
32
-- arithmetic functions with Signed or Unsigned values
33
--USE ieee.numeric_std.ALL;
34
 
35
ENTITY tb_002 IS
36
END tb_002;
37
 
38
ARCHITECTURE behavior OF tb_002 IS 
39
 
40
    -- Component Declaration for the Unit Under Test (UUT)
41
 
42
    COMPONENT nBit_PZG_SGA
43
    PORT(
44
         func_select : IN  std_logic;
45
         coefficient_vector : IN  std_logic_vector(0 to 7);
46
         data_in_for_signature : IN  std_logic;
47
         clk : IN  std_logic;
48
         rst : IN  std_logic;
49
         x : OUT  std_logic_vector(0 to 7)
50
        );
51
    END COMPONENT;
52
    
53
54
   --Inputs
55
   signal func_select : std_logic := '0';
56
   signal coefficient_vector : std_logic_vector(0 to 7) := (others => '0');
57
   signal data_in_for_signature : std_logic := '0';
58
   signal clk : std_logic := '0';
59
   signal rst : std_logic := '0';
60
61
   --Outputs
62
   signal x : std_logic_vector(0 to 7);
63
64
   -- Clock period definitions
65
   constant clk_period : time := 10 ns;
66
 
67
BEGIN
68
 
69
  -- Instantiate the Unit Under Test (UUT)
70
   uut: nBit_PZG_SGA PORT MAP (
71
          func_select => func_select,
72
          coefficient_vector => coefficient_vector,
73
          data_in_for_signature => data_in_for_signature,
74
          clk => clk,
75
          rst => rst,
76
          x => x
77
        );
78
79
   -- Clock process definitions
80
   clk_process :process
81
   begin
82
    clk <= '0';
83
    wait for clk_period/2;
84
    clk <= '1';
85
    wait for clk_period/2;
86
   end process;
87
 
88
89
   -- Stimulus
90
   func_select        <= '0';         -- PZG selected
91
  coefficient_vector  <= "11111111";
92
  
93
94
END;

von Spyro (Gast)


Lesenswert?

Achso und mein Ausgangsvektor x bleibt konstant auf 'U'. Genauso wie 
mein Q-Signal.

von Lattice User (Gast)


Lesenswert?

Spyro schrieb:
> Achso und mein Ausgangsvektor x bleibt konstant auf 'U'. Genauso wie
> mein Q-Signal.

Pulse mal "rst" am Anfang der Simulation.


Anmerkung:
FF von Hand zu instantieren ist sehr unüblich. Macht man eigentlich nur 
um etwas extrem zu optimieren.

Codegeneratoren machen das auch oft, da hat es aber den Zweck den Code 
an den FPGA Hersteller zu binden.

von Spyro (Gast)


Lesenswert?

Der rst-Pulse am Anfang setzt mir zumindest mal mein x-Ausgangsvektor 
und mein Q-Vektor von 'u' auf '0'. Danke für den Tipp.

Jetzt fehlt mir nur noch, warum der Zufallsgenerator nicht will :)

von Spyro (Gast)


Lesenswert?

Kann es sein, dass man einen Zufallsgenerator immer erst "Anstoßen" 
muss, damit der loszählt? Sprich: rst, dann einmal ne '1' reinschieben 
und dann laufen lassen.

von MasterOf (Gast)


Lesenswert?

Ja aber da steht in jedem Lehrbuch über LSFR, das im Alle-'0' Zustand 
Schluß mit Zustandsänderung ist, da das XOR netzwerk immer nur eine neue 
'0' in das bereits mit Nullen gefüllte Schieberegister schiebt.

Deshalb initialisiert man die FF auch nicht identisch mit '0'. Alle mit 
'1' nach dem reset, wäre schon mal ein guter Anfang.

Siehe auch 
http://en.wikipedia.org/wiki/Linear_feedback_shift_register#Uses_as_counters

MfG,

von Spyro (Gast)


Lesenswert?

AAhhhh!!! Vielen Dank für die Info!
Bin gerade am Erlernen der Materie und die Verbindung hat mir noch 
gefehlt :)

Damit hat sich mein Problem dann auch gelöst! :)

Einen schönen Abend noch allen :)

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.