Você está na página 1de 10

LEFT: Sistemas de Aquisicao de Dados

Simulacao de um Comparador C.R.C.


Andre Bastos da Cunha
25 de Maio de 2007

Introduc
ao

O presente trabalho tem como objectivo a geracao de uma sequencia binaria para Cyclic
Redundancy Check, ou simplesmente C.R.C., de uma sequencia binaria arbitraria.
Tendo em conta as liberdades concedidas no enunciado do trabalho e uma questao de
contexto realista, construiu-se a simulacao no seguinte contexto:
Para conferir realismo `a simulacao, utilizou-se a simulacao realizada num trabalho
anterior, o modulador para gerar a sequencia binaria que vai servir de base para o
calculo do C.R.C.;
No mesmo esprito do ponto anterior, o programa gera uma copia da sequencia original
introduzindo-lhe um n
umero de erros definido pelo utilizador em posicoes aleatorias
da cadeia binaria;
Por fim, as duas sequencias sao comparadas e apresentadas bem como a conclusao
dessa comparacao.
O algoritmo para gerar a sequencia binaria para C.R.C. e bastante simples na practica
mas algo complexo de explicar. Basicamente existe um polinomio binario escrito sob a forma
de modulo 2 a que podemos chamar o polinomio gerador ou polinomio C.R.C.. Atraves da
sequencia binaria que se quer analisar e deste polinomio realiza-se iterativamente o seguinte
conjunto iterativo de operacoes:
Sempre que o bit mais significativo da cadeia e igual a 1, o programa executa sequencialmente a operacao de XOR entre os bits da sequencia original e os bits da sequencia
do polinomio binario C.R.C.;
Caso contrario, a cadeia permanece inalterada, o polinomio desloca-se ao longo da
cadeira binaria e o processo comparativo recomeca com o proximo bit mais significativo;
O processo iterativo continua ate que o u
ltimo bit da cadeia binaria coincida com o
seu homonimo do polinomio C.R.C..
1

Como um exemplo vale mais do que mil palavras, vou colocar aqui o exemplo dado na
aula teorica para visualizar melhor o processo iterativo propriamente dito.
Cadeia Bin
aria: 1 1 0 1 0 0 1 1 1 0 1 1 0 0
Polin
omio CRC: 1 0 1 1
Algoritmo:
1 1 0 1
1 0 1 1
0 1 1 0
1 0 1
0 1 1
1 0
0 1
1
0

0 0 1 1 1 0 1 1 0 0
0
1
1
1
0
0
0

0 1 1 1 0 1 1 0 0
0
1
1
1
0

1 1 1 0 1 1 0 0
1 1 1
1
0 1 1
1 0
0 1
1
0

0 1 1 0 0
0
1
1
0
1
1
0

1
1
0
1
1
0
1
1
0

1 0 0
1
1
0
1
1
0
1

0 0
0
1
1
1
0

0
0
1
1

Implementac
ao

Segue-se entao uma explicacao geral da arquitectura geral do programa. O programa e


constitudo por um script principal crc.m que alem de gerir toda a sequencia principal
do programa, trata directamente do processo de geracao aleatoria de um n
umero de erros
definido pelo utilizador e do processo comparativo final entre as cadeias C.R.C. geradas.
Neste script, sao introduzidos directamente pelo utilizador o polinomio binario sob a forma
de um vector coluna [x0 ,x1 ,x2 ,x3 ,x4 , ...,xn ] em que xi toma os valores 0 ou 1 e ainda o
n
umero de erros gerar na sequencia que vamos comparar.
Por uma questao de elegancia e funcionalidade na programacao, duas das dependencias
necessarias para o funcionamento deste script foram definidas como funcoes externas.
A primeira funcao presente no ficheiro crc deltasigma.m nao e mais que apenas um
clone da simulacao feita num dos trabalhos anteriores. Esta funcao nao transporta quaisquer
parametros do script principal, mas exige por parte do utilizador a introducao de um valor de
voltagem de referencia para o DAC, uma frequencia base, um valor do extremo do intervalo
ate 0 e o n
umero de pontos a amostrar. Transporta para o script principal a cadeia binaria
que se quer analisar.
2

O sinal amostrado e dado pela funcao:

Vin = 2[sin(2Fb 10x)+sin(2Fb 5x)+sin(2Fb 2x)+cos(2Fb 9x)+cos(2Fb 6x)+cos(2Fb 4x)]


(1)
A sequencia binaria e obtida `a sada do comparador desto circuito. Para mais detalhes
ver o trabalho anterior.
Por fim, a funcao presente no ficheiro crc gen.m executa o algoritmo iterativo que gera
as sequencias binarias C.R.C.. Os parametros desta funcao sao a cadeira binaria gerada por
modulacao bem como o polinomio C.R.C..
Para detalhes na implementacao, basta ler o codigo que se segue e os comentarios respectivos.

2.1

Script principal
Listing 1: crc.m
% Sistemas de Aquisio de Dados, TPC n o 8
% Andr Cunha, n o 53757, LEFT

% Simulao de um comparador CRC para uma sequncia binria


% gerada a partir de um modulador delta-sigma aafectada de erros
% aleatrios.
% Clear workspace. Demora mais tempo mas assegura que no usamos
% variveis ou valores ao correr o programa mais do que uma vez.

10

clear;
% Inicializao das variveis
15

i = 0;
j = 0;
s i z e = 0;
errors = 0;

20

% Inicializao das matrizes e vectores.


binary_sequence = [];
processed_sequence = [];

25

% O programa chama a funo deltasigma (feita num trabalho


% anterior) para gerar a sequncia binria.
% Sero pedidos parmetros de input relacionados com esta funo.

30

binary_sequence = crc_deltasigma();
% Sequncia da aula terica para efeitos de teste. Comentar em
% cima e descomentar em baixo para usar.

35

% binary_sequence = [1,1,0,1,0,0,1,1,1,0,1,1,0,0];
% O programa pede ao utilizador o polinmio CRC sob a forma de um
% vector coluna.

40

crc_pol = ...
input(Qual o polinomio de CRC (vector coluna)? [1,0,1,0,0]);
% Polinmio CRC da aula terica para efeitos de teste. Comentar em
% cima e descomentar em baixo para usar.

45

% crc_pol = [1,0,1,1];
% O programa pede o nmero de erros aleatrios a introduzir
% na sequncia.
50

errors = input(Quantos erros deseja introduzir na sequencia?);


% Para saber o nmero de bits na sequncia, o programa conta o
% nmero de elementos no vector.
55

s i z e = numel(binary_sequence);

60

% Cria-se um vector aleatrio de dimenso igual ao tamanho da


% sequncia binria em anlise com valores no intervalo
% compreendido entre 1 e o tamanho do vector.
corruption = c e i l ( s i z e .*rand(size ,1));

65

% O vector criado vai reunir as posies possveis onde podemos


% gerar os erros.
% Conforme o nmero de erros definido pelo utilizador, um novo
% vector com essa dimenso vai armazenar as posies onde
% efectivamente vo ser gerados erros.

70

error_position = corruption(1:errors);
% Cria-se ento uma cpia da sequncia binria original.
75

processed_sequence = binary_sequence;
% Caso existam erros,
i f errors > 0,

80

% o programa vai correr um ciclo que vai inverter o valor dos


% bits nas posies aleatrias geradas anteriormente,

85

f o r j = 1 : errors,
i f processed_sequence(error_position(j)) == 0,
processed_sequence(error_position(j)) = 1;
e l s e processed_sequence(error_position(j)) = 0;
end
end

90

% caso contrrio, no realiza qualquer alterao na sequncia

% original limitando-se a copi-la.

95

e l s e processed_sequence = binary_sequence;
end
% O programa chama a funo que calcula o CRC para cada uma das
% sequncias binrias (a original e a com erros).

100

disp(CRC da sequencia original)


bs_crc = crc_gen(binary_sequence,crc_pol);
disp(CRC da sequencia processada)

105

ps_crc = crc_gen(processed_sequence,crc_pol);
% Ciclo de verificao que compara os dois CRC obtidos.
110

i f bs_crc == ps_crc,
disp(A sequencia foi processada sem erros)
e l s e disp(A sequencia foi processada com erros)
end

2.2

Fun
c
ao geradora da cadeia bin
aria
Listing 2: crc deltasigma.m
% Sistemas de Aquisio de Dados, TPC n o 8
% Andr Cunha, n o 53757, LEFT

% Simulao de um circuito delta-sigma que gera sequncias


% binrias a partir de um sinal sinusoidal de entrada.
function [sequence] = crc_deltasigma()
% Inicializao das variveis.

10

15

out_dac = 0;
out_intg = 0;
out_comp = 0;
i = 0;
intervalo = 0;
pontos = 0;
% Inicializao das matrizes e vectores.

20

25

v = [];
x = [];
sequence = [];
%
%
%
%
%

O programa pergunta ao utilizador para introduzir voltagem de


referencia do DAC, frequencia base do sinal a modular, o
intervalo de tempo e o numero de pontos a amostrar. Entre
parntesis colocaram-se valores sugeridos que funcionam bem
para o sinal em estudo.

30

vref = input(O valor da voltagem de referencia do DAC? (10));


frq = input(O valor da frequencia base do sinal? (100));
intervalo = input(O intervalo devera ser entre 0 e ? (0.01));
pontos = input(Quantos pontos deseja amostrar? (1500));
35

%
%
%
%

Definio da funo que descreve o sinal de entrada que se


pretende modular. Qualquer funo pode ser usada convinhando
que se utilize como variavel o x, e opcionalmente uma frequencia
base frq (introduzida anteriormente).

40

x = 0 : intervalo/pontos : intervalo;
v = 2*(sin(2* pi *x*frq*10) + sin(2* pi *x*frq*5) + sin(2* pi *x*frq*2)...
+ cos(2* pi *x*frq*9) + cos(2* pi *x*frq*6) + cos(2* pi *x*frq*4));

45

% Definio do vector que vai armazenar a sequencia gerada pelo


% modulador delta-sigma.
sequence = [1:pontos];

50

% Ciclo que descreve o modulador delta-sigma.


f o r i = 1 : pontos,
% Multiplica por -1 o sinal de sada do DAC.

55

out_dac = out_dac * -1;


% Soma o valor de Vin com a voltagem de sada do DAC.
out_soma = v(i) + out_dac;

60

% Soma o valor de sada do somador com o valor acumulado do


% integral.
% A parcela do integral em cada iterada (integral de out_soma)
% porque estamos a integrar uma constante num intervalo de
% dimenso 1.

65

out_intg = out_intg + out_soma;


70

% Se o valor do integral for positivo ou nulo, ento a sada


% do comparador vai a 1,
i f out_intg >= 0,
out_comp = 1;
out_dac = vref;

75

% caso contrario, a saida do comparador vai a 0.


else

80

out_comp = 0;
out_dac = -vref;
end
% Gera a sequncia binria iterativamente, guardando os valores
% de sada do comparador num vector.

85

sequence(i) = out_comp;
90

end

2.3

Fun
c
ao geradora da cadeia C.R.C.
Listing 3: crc gen.m
% Sistemas de Aquisio de Dados, TPC n o 8
% Andr Cunha, n o 53757, LEFT

% Programa que gera sequncias CRC para uma dada sequncia binria
% e um dado polinmio CRC.
function crc = crc_gen(binary_sequence,crc_pol)

10

% Comea-se por contar o nmero de linhas do vector coluna que


% descreve o polinmio CRC.
crc_dim = numel(crc_pol);

15

% Conta-se o nmero de linhas do vector coluna que descreve a


% sequncia binria em estudo.
s i z e = numel(binary_sequence);

20

% Cpia da sequncia binria para para um vector temporrio y onde


% se vo realizar as operaes tendo em vista a obteno do CRC.
y = binary_sequence;

25

30

35

%
%
%
%

Notar que as operaes a realizar so feitas iterativamente ao


longo da cadeia binria terminando quando o ltimo digito do
polinmio CRC encontra o ltimo digito da cadeia binria em
estudo.

%
%
%
%
%

Desta forma, o ciclo ir correr entre o primeiro valor da cadeia


binria at ao ponto dado pela diferena entre o tamanho total da
cadeia e a dimenso do polinmio CRC subtrada de 1 porque se
comea a contar os deslocamentos logo no primeiro bit quando
ainda no houve qualquer deslocamento.

f o r l = 1 : s i z e - (crc_dim - 1),
% Sempre que o bit mais significativo for igual a 1,
i f y(l) == 1,

40

% ento realizado um XOR entre os valores da cadeia


% binria e os valores do polinmio CRC,
f o r m = 1 : crc_dim,

i f y(l + m -1) == crc_pol(m),


y(l + m -1) = 0;
e l s e y(l + m -1) = 1;
end

45

end
50

% caso contrrio, os restantes valores da cadeia binria


% permanecem inalterados.
e l s e y(l) = y(l);
end

55

end
% Trunca-se a sequncia CRC obtida de acordo com o tamanho do
% polinmio CRC (eliminam-se os zeros esquerda).
60

crc = y( s i z e - (crc_dim - 1) : s i z e );
% Faz-se output do CRC obtido no ecr.
65

disp(O CRC obtido e:)


disp(crc);

10

Você também pode gostar