Professional Documents
Culture Documents
1 Introduction
In this exercise the task was to create a Ethernet frame checker using the generator polyno-
mial: G(x) = x3 2 + x2 6 + x2 3 + x2 2 + x1 6 + x1 2 + x1 1 + x1 0 + x8 + x7 + x5 + x4 + x2 + x + 1.
In the first part the received frame is loaded into the register bit-wise so to calculate if a
frame is correct it would take around 512 clock cycles.
The second part was to implement the same system just by reading 8 bits at the time
instead a single bit. This will limit the amount of clock cycles used to calculate the frame
to around 64 clock cycles.
To test if the correct output is given when a error occurs the first byte is set to 1 instead
of 0.
To synthesize the implementation a Stratix II model number EP2S15F484C3 has been
used. The achieved speed can be seen in the timing tables.
32 i f s t a r t o f f r a m e = ’ 1 ’ then
33 count <= 0 a f t e r 2 ns ;
34 e n d f r a m e <= ’ 0 ’ a f t e r 2 ns ;
35 s t a r t <= ’ 1 ’ ;
36 e l s i f e n d o f f r a m e = ’ 1 ’ then
37 count <= 0 a f t e r 2 ns ;
38 e n d f r a m e <= ’ 1 ’ a f t e r 2 ns ;
39 data <= not d a t a i n a f t e r 5 ns ;
40 else
41 count <= count + 1 a f t e r 2 ns ;
42 end i f ;
43 i f count < 31 then
44 data <= not d a t a i n a f t e r 5 ns ;
45 else
46 i f e n d o f f r a m e = ’0 ’ then
47 data <= d a t a i n a f t e r 5 ns ;
48 end i f ;
49 end i f ;
50 end i f ;
51 end process i n v e r t ;
52
53 s e t r e g : process ( c l k , r e s e t ) i s
54 begin
55 i f r e s e t = ’ 1 ’ then
56 r e g <= (OTHERS => ’ 0 ’ ) ;
57 f c s e r r o r <= ’ 1 ’ ;
58 e l s i f r i s i n g e d g e ( c l k ) then
59 i f e n d f r a m e = ’ 1 ’ then
60 i f r e g ( 3 1 downto 0 ) = x” 00000000 ” then
61 f c s e r r o r <= ’ 0 ’ a f t e r 5 ns ;
62 else
63 f c s e r r o r <= ’ 1 ’ a f t e r 5 ns ;
64 end i f ;
65 end i f ;
66 i f s t a r t = ’ 1 ’ then
67 r e g ( 0 ) <= r e g ( 3 1 ) xor data a f t e r 10 ns ;
68 r e g ( 1 ) <= r e g ( 3 1 ) xor r e g ( 0 ) a f t e r 10 ns ;
69 r e g ( 2 ) <= r e g ( 3 1 ) xor r e g ( 1 ) a f t e r 10 ns ;
70 r e g ( 3 ) <= r e g ( 2 ) a f t e r 10 ns ;
71 r e g ( 4 ) <= r e g ( 3 1 ) xor r e g ( 3 ) a f t e r 10 ns ;
72 r e g ( 5 ) <= r e g ( 3 1 ) xor r e g ( 4 ) a f t e r 10 ns ;
73 r e g ( 6 ) <= r e g ( 5 ) a f t e r 10 ns ;
74 r e g ( 7 ) <= r e g ( 3 1 ) xor r e g ( 6 ) a f t e r 10 ns ;
75 r e g ( 8 ) <= r e g ( 3 1 ) xor r e g ( 7 ) a f t e r 10 ns ;
76 r e g ( 9 ) <= r e g ( 8 ) a f t e r 10 ns ;
77 r e g ( 1 0 ) <= r e g ( 3 1 ) xor r e g ( 9 ) a f t e r 10 ns ;
78 r e g ( 1 1 ) <= r e g ( 3 1 ) xor r e g ( 1 0 ) a f t e r 10 ns ;
79 r e g ( 1 2 ) <= r e g ( 3 1 ) xor r e g ( 1 1 ) a f t e r 10 ns ;
80 r e g ( 1 3 ) <= r e g ( 1 2 ) a f t e r 10 ns ;
81 r e g ( 1 4 ) <= r e g ( 1 3 ) a f t e r 10 ns ;
82 r e g ( 1 5 ) <= r e g ( 1 4 ) a f t e r 10 ns ;
83 r e g ( 1 6 ) <= r e g ( 3 1 ) xor r e g ( 1 5 ) a f t e r 10 ns ;
84 r e g ( 1 7 ) <= r e g ( 1 6 ) a f t e r 10 ns ;
2.2 VHDL code for serial 5
85 r e g ( 1 8 ) <= r e g ( 1 7 ) a f t e r 10 ns ;
86 r e g ( 1 9 ) <= r e g ( 1 8 ) a f t e r 10 ns ;
87 r e g ( 2 0 ) <= r e g ( 1 9 ) a f t e r 10 ns ;
88 r e g ( 2 1 ) <= r e g ( 2 0 ) a f t e r 10 ns ;
89 r e g ( 2 2 ) <= r e g ( 3 1 ) xor r e g ( 2 1 ) a f t e r 10 ns ;
90 r e g ( 2 3 ) <= r e g ( 3 1 ) xor r e g ( 2 2 ) a f t e r 10 ns ;
91 r e g ( 2 4 ) <= r e g ( 2 3 ) a f t e r 10 ns ;
92 r e g ( 2 5 ) <= r e g ( 2 4 ) a f t e r 10 ns ;
93 r e g ( 2 6 ) <= r e g ( 3 1 ) xor r e g ( 2 5 ) a f t e r 10 ns ;
94 r e g ( 2 7 ) <= r e g ( 2 6 ) a f t e r 10 ns ;
95 r e g ( 2 8 ) <= r e g ( 2 7 ) a f t e r 10 ns ;
96 r e g ( 2 9 ) <= r e g ( 2 8 ) a f t e r 10 ns ;
97 r e g ( 3 0 ) <= r e g ( 2 9 ) a f t e r 10 ns ;
98 r e g ( 3 1 ) <= r e g ( 3 0 ) a f t e r 10 ns ;
99 end i f ;
100 end i f ;
101 end process s e t r e g ;
102 end architecture f c s c h e c k ;
2.3 Test bench for serial 6
50 count <= 0 ;
51 d a t a i n <= ’ 0 ’ ;
52 s t a r t o f f r a m e <= ’ 0 ’ ;
53 e n d o f f r a m e <= ’ 0 ’ ;
54 ELSIF r i s i n g e d g e ( c l k ) THEN
55 IF count = 0 THEN
56 s t a r t o f f r a m e <= ’ 1 ’ a f t e r 2 ns ;
57 d a t a i n <= data ( count ) a f t e r 2 ns ;
58 ELSIF count = 480 THEN
59 e n d o f f r a m e <= ’ 1 ’ a f t e r 2 ns ;
60 d a t a i n <= data ( count ) a f t e r 2 ns ;
61 ELSIF count > 511 THEN
62 d a t a i n <= ’ 0 ’ a f t e r 5 ns ;
63 ELSE
64 e n d o f f r a m e <= ’ 0 ’ a f t e r 2 ns ;
65 s t a r t o f f r a m e <= ’ 0 ’ a f t e r 2 ns ;
66 d a t a i n <= data ( count ) a f t e r 2 ns ;
67 END IF ;
68 count <= count + 1 a f t e r 5 ns ;
69 END IF ;
70 END PROCESS;
71
72
73 END ARCHITECTURE a r c h ;
We notice that M(X)*x^32 + R(X) is divisible by G(X). In other words, the packet is considered error free
if the remainder from dividing M(X)*x^32 + R(X) with G(X) is zero.
The remainder is stored in the 32 registers R(31)..R(0). The generating polynomial is generally defined as:
3.2 Matlab program for equations 10
G(X) = g32*X^32 + g31*X^31 ........ g2*X^2 + g1*X^1 + g0
The circuit for the computation of R(X) (and P(X)) is given below.
g0 g1 g2 g3 g30 g31
Figure The
7: packet
Enumeration of the +32
bit stream, M(X)*x^32 bitis fed
R(X), register. ImageThe
into the calculator. taken from
Registers exercise
must contain document.
“0” before
the calculation is initiated. The last 32 bits that enter the circuit is the FCS (Remember to complement to
convert to the CRC value). The data bits are error free if all the registers contain “0”.
1 c l e a r a l lExample
; Ethernet packet with valid checksum (B3 31 88 1B):
2 n = 3 1 ; 00 10 A4 7B EA 80 00 12 34 56 78 90 08 00 45 00 00 2E B3 FE 00 00 80 11
05 40 C0 A8 00 2C C0 A8 00 04 04 00 04 00 00 1A 2D E8 00 01 02 03 04 05
3 % B i t s i n06 s e 07
r t e08 d 09t o0At h0Be 0Cr e0Dg i0Es t e0Fr 10a t11t h
E6e C5time
3D B2
4 cycles = 8;
5 % Generator p o l y n o m i a l
6 G = [ 0 0 Tasks 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1];
7 A = [ zeros ( 1 , n ) ; eye ( n ) ] ;
Task 1
8 A = [A f lGenerate i p l r (G) ’];
VHDL code that checks an Ethernet packet for bit errors. Assume that the packet is received as a
9 B = mod(Aˆ c ybitc lstream.
serial e s , 2That
) ; is, the circuit above can be used directly. The module “fcs_check_serial” should con-
10 f i d = fopen tain the
( ’following
r e g i s IO
t esignals:
r . t x t ’ , ’w ’ ) ;
11 f o r i =1:32
12 r e g = find (B( i , : ) ==1) ;
13 text = [ ’ r e g ( ’ num2str ( i −1) ’ ) <= ’ ] ;
14 i f ( ˜ isempty ( r e g ) )
15 f o r j =1: length ( r e g )
16 text = [ text ’ r e g ( ’ num2str ( r e g ( j ) −1) ’ ) ’ ] ;
17 i f ( j ˜= length ( r e g ) )
18 text = [ text ’ xor ’ ] ;
19 end
20 end
21 end
22 text = [ text ’ a f t e r 10 ns ; \ r \n ’ ] ;
23 f p r i n t f ( f i d , text , c h a r ) ;
24 end
25 f c l o s e ( f i d ) ;
3.3 VHDL code for parallel 11
53 IF s t a r t f r a m e = ’ 1 ’ THEN
54 r e g ( 0 ) <= d a t a r e g ( 0 ) xor r e g ( 2 4 ) xor r e g ( 3 0 ) a f t e r 10 ns ;
55 r e g ( 1 ) <= d a t a r e g ( 1 ) xor r e g ( 2 4 ) xor r e g ( 2 5 ) xor r e g ( 3 0 ) xor r e g
( 3 1 ) a f t e r 10 ns ;
56 r e g ( 2 ) <= d a t a r e g ( 2 ) xor r e g ( 2 4 ) xor r e g ( 2 5 ) xor r e g ( 2 6 ) xor r e g
( 3 0 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
57 r e g ( 3 ) <= d a t a r e g ( 3 ) xor r e g ( 2 5 ) xor r e g ( 2 6 ) xor r e g ( 2 7 ) xor r e g
( 3 1 ) a f t e r 10 ns ;
58 r e g ( 4 ) <= d a t a r e g ( 4 ) xor r e g ( 2 4 ) xor r e g ( 2 6 ) xor r e g ( 2 7 ) xor r e g
( 2 8 ) xor r e g ( 3 0 ) a f t e r 10 ns ;
59 r e g ( 5 ) <= d a t a r e g ( 5 ) xor r e g ( 2 4 ) xor r e g ( 2 5 ) xor r e g ( 2 7 ) xor r e g
( 2 8 ) xor r e g ( 2 9 ) xor r e g ( 3 0 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
60 r e g ( 6 ) <= d a t a r e g ( 6 ) xor r e g ( 2 5 ) xor r e g ( 2 6 ) xor r e g ( 2 8 ) xor r e g
( 2 9 ) xor r e g ( 3 0 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
61 r e g ( 7 ) <= d a t a r e g ( 7 ) xor r e g ( 2 4 ) xor r e g ( 2 6 ) xor r e g ( 2 7 ) xor r e g
( 2 9 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
62 r e g ( 8 ) <= r e g ( 0 ) xor r e g ( 2 4 ) xor r e g ( 2 5 ) xor r e g ( 2 7 ) xor r e g ( 2 8 )
a f t e r 10 ns ;
63 r e g ( 9 ) <= r e g ( 1 ) xor r e g ( 2 5 ) xor r e g ( 2 6 ) xor r e g ( 2 8 ) xor r e g ( 2 9 )
a f t e r 10 ns ;
64 r e g ( 1 0 ) <= r e g ( 2 ) xor r e g ( 2 4 ) xor r e g ( 2 6 ) xor r e g ( 2 7 ) xor r e g ( 2 9 )
a f t e r 10 ns ;
65 r e g ( 1 1 ) <= r e g ( 3 ) xor r e g ( 2 4 ) xor r e g ( 2 5 ) xor r e g ( 2 7 ) xor r e g ( 2 8 )
a f t e r 10 ns ;
66 r e g ( 1 2 ) <= r e g ( 4 ) xor r e g ( 2 4 ) xor r e g ( 2 5 ) xor r e g ( 2 6 ) xor r e g ( 2 8 )
xor r e g ( 2 9 ) xor r e g ( 3 0 ) a f t e r 10 ns ;
67 r e g ( 1 3 ) <= r e g ( 5 ) xor r e g ( 2 5 ) xor r e g ( 2 6 ) xor r e g ( 2 7 ) xor r e g ( 2 9 )
xor r e g ( 3 0 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
68 r e g ( 1 4 ) <= r e g ( 6 ) xor r e g ( 2 6 ) xor r e g ( 2 7 ) xor r e g ( 2 8 ) xor r e g ( 3 0 )
xor r e g ( 3 1 ) a f t e r 10 ns ;
69 r e g ( 1 5 ) <= r e g ( 7 ) xor r e g ( 2 7 ) xor r e g ( 2 8 ) xor r e g ( 2 9 ) xor r e g ( 3 1 )
a f t e r 10 ns ;
70 r e g ( 1 6 ) <= r e g ( 8 ) xor r e g ( 2 4 ) xor r e g ( 2 8 ) xor r e g ( 2 9 ) a f t e r 10 ns ;
71 r e g ( 1 7 ) <= r e g ( 9 ) xor r e g ( 2 5 ) xor r e g ( 2 9 ) xor r e g ( 3 0 ) a f t e r 10 ns ;
72 r e g ( 1 8 ) <= r e g ( 1 0 ) xor r e g ( 2 6 ) xor r e g ( 3 0 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
73 r e g ( 1 9 ) <= r e g ( 1 1 ) xor r e g ( 2 7 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
74 r e g ( 2 0 ) <= r e g ( 1 2 ) xor r e g ( 2 8 ) a f t e r 10 ns ;
75 r e g ( 2 1 ) <= r e g ( 1 3 ) xor r e g ( 2 9 ) a f t e r 10 ns ;
76 r e g ( 2 2 ) <= r e g ( 1 4 ) xor r e g ( 2 4 ) a f t e r 10 ns ;
77 r e g ( 2 3 ) <= r e g ( 1 5 ) xor r e g ( 2 4 ) xor r e g ( 2 5 ) xor r e g ( 3 0 ) a f t e r 10 ns ;
78 r e g ( 2 4 ) <= r e g ( 1 6 ) xor r e g ( 2 5 ) xor r e g ( 2 6 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
79 r e g ( 2 5 ) <= r e g ( 1 7 ) xor r e g ( 2 6 ) xor r e g ( 2 7 ) a f t e r 10 ns ;
80 r e g ( 2 6 ) <= r e g ( 1 8 ) xor r e g ( 2 4 ) xor r e g ( 2 7 ) xor r e g ( 2 8 ) xor r e g ( 3 0 )
a f t e r 10 ns ;
81 r e g ( 2 7 ) <= r e g ( 1 9 ) xor r e g ( 2 5 ) xor r e g ( 2 8 ) xor r e g ( 2 9 ) xor r e g ( 3 1 )
a f t e r 10 ns ;
82 r e g ( 2 8 ) <= r e g ( 2 0 ) xor r e g ( 2 6 ) xor r e g ( 2 9 ) xor r e g ( 3 0 ) a f t e r 10 ns ;
83 r e g ( 2 9 ) <= r e g ( 2 1 ) xor r e g ( 2 7 ) xor r e g ( 3 0 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
84 r e g ( 3 0 ) <= r e g ( 2 2 ) xor r e g ( 2 8 ) xor r e g ( 3 1 ) a f t e r 10 ns ;
85 r e g ( 3 1 ) <= r e g ( 2 3 ) xor r e g ( 2 9 ) a f t e r 10 ns ;
86 END IF ;
87 IF e n d f r a m e = ’ 1 ’ THEN
88 IF count = 66 THEN
3.3 VHDL code for parallel 13
49 IF r e s e t = ’ 1 ’ THEN
50 count <= 0 AFTER 10 ns ;
51 d a t a i n <= ” 00000000 ” AFTER 10 ns ;
52 s t a r t o f f r a m e <= ’ 0 ’ AFTER 10 ns ;
53 e n d o f f r a m e <= ’ 0 ’ AFTER 10 ns ;
54 ELSIF r i s i n g e d g e ( c l k ) THEN
55 IF count = 0 THEN
56 s t a r t o f f r a m e <= ’ 1 ’ AFTER 10 ns ;
57 d a t a i n <= data ( count ∗8 to ( count ∗ 8 ) +7) AFTER 10 ns ;
58 ELSIF count = 60 THEN −− L a s t 32 b i t s i s b e i n g s e n t
59 e n d o f f r a m e <= ’ 1 ’ AFTER 10 ns ;
60 d a t a i n <= data ( count ∗8 to ( count ∗ 8 ) +7) AFTER 10 ns ;
61 ELSIF count > 63 THEN −− No more d a t a send z e r o e s
62 e n d o f f r a m e <= ’ 0 ’ AFTER 10 ns ;
63 d a t a i n <= ” 00000000 ” AFTER 10 ns ;
64 ELSE
65 e n d o f f r a m e <= ’ 0 ’ AFTER 10 ns ;
66 s t a r t o f f r a m e <= ’ 0 ’ AFTER 10 ns ;
67 d a t a i n <= data ( count ∗8 to ( count ∗ 8 ) +7) AFTER 10 ns ;
68 END IF ;
69 count <= count + 1 AFTER 10 ns ;
70 END IF ;
71 END PROCESS;
72 END ARCHITECTURE a r c h ;