OpenCores
URL https://opencores.org/ocsvn/ccsds_rxtxsoc/ccsds_rxtxsoc/trunk

Subversion Repositories ccsds_rxtxsoc

[/] [ccsds_rxtxsoc/] [trunk/] [ccsds_rxtx_lfsr.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 zguig52
-------------------------------
2
---- Project: EurySPACE CCSDS RX/TX with wishbone interface
3
---- Design Name: ccsds_rxtx_lfsr
4
---- Version: 1.0.0
5
---- Description:
6
---- Linear Feedback Shift Register
7
---- Input: none
8
---- Timing requirements: CCSDS_RXTX_LFSR_DATA_BUS_SIZE+1 clock cycles for valid output data
9
---- Output: dat_val_o <= "1" / dat_o <= "LFSRSEQUENCE"
10
---- Ressources requirements: TODO
11
-------------------------------
12
---- Author(s):
13
---- Guillaume REMBERT
14
-------------------------------
15
---- Licence:
16
---- MIT
17
-------------------------------
18
---- Changes list:
19
---- 2016/11/05: initial release
20
-------------------------------
21
-- Test ressources:
22
-- GNURADIO GLFSR block
23
 
24
-- CCSDS parameters
25
-- Width = 8
26
-- Mode = Fibonacci ('0')
27
-- Polynomial = x"A9"
28
-- Seed = x"FF"
29
-- Result = "1111111101001000000011101100000010011010"
30
 
31
-- Width = 8
32
-- Mode = Galois ('1')
33
-- Polynomial = x"A9"
34
-- Seed = x"FF"
35
-- Result = "101001011011000001011000110110"
36
 
37
-- libraries used
38
library ieee;
39
use ieee.std_logic_1164.all;
40
use ieee.numeric_std.all;
41
 
42
--=============================================================================
43
-- Entity declaration for ccsds_tx / unitary tx randomizer inputs and outputs
44
--=============================================================================
45
entity ccsds_rxtx_lfsr is
46
  generic(
47
    constant CCSDS_RXTX_LFSR_DATA_BUS_SIZE: integer; -- in bits
48
                constant CCSDS_RXTX_LFSR_MEMORY_SIZE: integer range 2 to 256 := 8; -- in bits
49
                constant CCSDS_RXTX_LFSR_MODE: std_logic := '0'; -- 0: Fibonacci / 1: Galois
50
                constant CCSDS_RXTX_LFSR_POLYNOMIAL: std_logic_vector   := x"A9"; -- Polynomial / MSB <=> lower polynome (needs to be '1')
51
                constant CCSDS_RXTX_LFSR_SEED: std_logic_vector := x"FF"                -- Initial Value
52
  );
53
  port(
54
    -- inputs
55
    clk_i: in std_logic;
56
    rst_i: in std_logic;
57
    -- outputs
58
    dat_o: out std_logic_vector(CCSDS_RXTX_LFSR_DATA_BUS_SIZE-1 downto 0);
59
    dat_val_o: out std_logic
60
  );
61
end ccsds_rxtx_lfsr;
62
 
63
--=============================================================================
64
-- architecture declaration / internal components and connections
65
--=============================================================================
66
architecture structure of ccsds_rxtx_lfsr is
67
 
68
-- internal constants
69
-- internal variable signals
70
        signal lfsr_memory: std_logic_vector(CCSDS_RXTX_LFSR_MEMORY_SIZE-1 downto 0) := CCSDS_RXTX_LFSR_SEED;
71
-- components instanciation and mapping
72
  begin
73
 
74
-- presynthesis checks
75
          CHKLFSRP0 : if CCSDS_RXTX_LFSR_POLYNOMIAL'length /= CCSDS_RXTX_LFSR_MEMORY_SIZE generate
76
                  process
77
                  begin
78
                          report "ERROR: LFSR_POLYNOMIAL LENGTH MUST BE EQUAL TO MEMORY SIZE (SHORTENED VERSION / DON'T PUT MANDATORY HIGHER POLYNOME '1')" severity failure;
79
                          wait;
80
                  end process;
81
          end generate CHKLFSRP0;
82
          CHKLFSRP1 : if CCSDS_RXTX_LFSR_MEMORY_SIZE <= 1 generate
83
                  process
84
                  begin
85
                          report "ERROR: LFSR_MEMORY_SIZE MUST BE BIGGER THAN 1" severity failure;
86
                          wait;
87
                  end process;
88
          end generate CHKLFSRP1;
89
          CHKLFSRP2 : if CCSDS_RXTX_LFSR_SEED'length /= CCSDS_RXTX_LFSR_MEMORY_SIZE generate
90
                  process
91
                  begin
92
                          report "ERROR: LFSR_SEED LENGTH MUST BE EQUAL TO LFSR_MEMORY_SIZE" severity failure;
93
                          wait;
94
                  end process;
95
          end generate CHKLFSRP2;
96
    CHKLFSRP3 : if CCSDS_RXTX_LFSR_POLYNOMIAL(CCSDS_RXTX_LFSR_MEMORY_SIZE-1) = '0' generate
97
      process
98
      begin
99
        report "ERROR: LFSR POLYNOMIAL MSB MUST BE EQUAL TO 1" severity failure;
100
        wait;
101
      end process;
102
    end generate CHKLFSRP3;
103
 
104
-- internal processing
105
    --=============================================================================
106
    -- Begin of crcp
107
    -- Compute CRC based on input data
108
    --=============================================================================
109
    -- read: rst_i
110
    -- write: dat_o, dat_val_o
111
    -- r/w: lfsr_memory
112
    LFSRP: process (clk_i)
113
    variable output_pointer: integer range -1 to (CCSDS_RXTX_LFSR_DATA_BUS_SIZE-1) := CCSDS_RXTX_LFSR_DATA_BUS_SIZE-1;
114
    variable feedback_register: std_logic := '0';
115
    begin
116
      -- on each clock rising edge
117
      if rising_edge(clk_i) then
118
        -- reset signal received
119
        if (rst_i = '1') then
120
          lfsr_memory <= CCSDS_RXTX_LFSR_SEED;
121
          dat_o <= (others => '0');
122
          dat_val_o <= '0';
123
          output_pointer := CCSDS_RXTX_LFSR_DATA_BUS_SIZE-1;
124
          feedback_register := '0';
125
        else
126
          -- generation is finished
127
          if (output_pointer = -1) then
128
            dat_val_o <= '1';
129
          -- generating sequence
130
          else
131
            dat_val_o <= '0';
132
            -- Fibonacci
133
            if (CCSDS_RXTX_LFSR_MODE = '0') then
134
              dat_o(output_pointer) <= lfsr_memory(CCSDS_RXTX_LFSR_MEMORY_SIZE-1);
135
              output_pointer := output_pointer - 1;
136
              feedback_register := lfsr_memory(CCSDS_RXTX_LFSR_MEMORY_SIZE-1);
137
              for i in 0 to CCSDS_RXTX_LFSR_MEMORY_SIZE-2 loop
138
                if (CCSDS_RXTX_LFSR_POLYNOMIAL(i) = '1') then
139
                  feedback_register := feedback_register xor lfsr_memory(i);
140
                end if;
141
              end loop;
142
              lfsr_memory <= std_logic_vector(resize(unsigned(lfsr_memory),CCSDS_RXTX_LFSR_MEMORY_SIZE-1)) & feedback_register;
143
            -- Galois
144
            else
145
              dat_o(output_pointer) <= lfsr_memory(CCSDS_RXTX_LFSR_MEMORY_SIZE-1);
146
              output_pointer := output_pointer - 1;
147
              lfsr_memory(0) <= lfsr_memory(CCSDS_RXTX_LFSR_MEMORY_SIZE-1);
148
              for i in 1 to CCSDS_RXTX_LFSR_MEMORY_SIZE-1 loop
149
                if (CCSDS_RXTX_LFSR_POLYNOMIAL(i) = '1') then
150
                  lfsr_memory(i) <= lfsr_memory(i-1) xor lfsr_memory(CCSDS_RXTX_LFSR_MEMORY_SIZE-1);
151
                else
152
                  lfsr_memory(i) <= lfsr_memory(i-1);
153
                end if;
154
              end loop;
155
            end if;
156
          end if;
157
        end if;
158
      end if;
159
    end process;
160
end structure;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.