sexta-feira, março 10, 2006

Postagem nº 100 - em grande!

Mãezinha... salva-me!


Isto é a segunda questão do meu trabalho de Gestão Económica... O trabalho é composto por três questões. A primeira até é fácil... tem números...

A terceira ainda é mais diabólica que esta! São só 8 páginas de fórmulas e com dois gráficos no meio. Não tou com paciência para pôr aqui, até porque já são horas de ir para a cama...

23 comentários:

Anónimo disse...

Já dá para ver que ontem deitaste-te tardíssimo! :( Ainda por cima a pores coisas aqui que não devem interessar a ninguém!...
Beijinhos.

Vitor Hugo disse...

O k aki está ñ m parece mt dificil... são umas derivadazitas e pouco mais... são é derivadas d comboios!!!

Vitor Hugo disse...

VIVA a postagem 100

Anónimo disse...

QUE POSTAGEM MAIS ESQUISITA. AINDA SE FOSSE O MEU NETO, AGORA DERIVADAS. BEIJINHOS

Dogus disse...

Nada difícil...

Vitor Hugo disse...

Isso é como limpar o cu a meninos...

Vitor Hugo disse...

Tava a gozar...

até pode ser dificil, eu ñ percebo nd dakilo, por isso ñ vou comentar!!! Um dia destes ponho aki tb mais qq coisa sobre o meu trabalho

Dogus disse...

Foi entregue. E foi uma sensação espectacular! Foi uma semana inteirinha a trabalhar na resolução, mas no fim soube mesmo bem! Agora resta saber a nota...

Vitor Hugo disse...

Tás melhor k eu então... Andei o fim-d-semana passado a tentar fazer uma coisa k os orientadores m tinham dito e xeguei à conclusão k ñ dava pra fazer... Disse-lhes logo na 2ª feira e trataram logo d arranjar (mandar pro ar) outra solução pra eu implementar. Andei a trabalhar nisso a semana toda e ontem xego à conclusão k tb ñ dá...

Na proxima 2ª devem mandar mais uns bitaites pro ar pra ver s funciona....

Vitor Hugo disse...

Eu sei k andavam com saudades d eu falar d trabalho... por isso cá vai

Estão aki 3 semanas d trabalo:

module ac97_control(clock_100M,AC97_SDATA_IN,AC97_BIT_CLOCK,
AC97_SYNCH,AC97_SDATA_OUT,AUDIO_RESET_Z,
LED_0,LED_3,LED_2,LED_1);

input AC97_SDATA_IN;
input AC97_BIT_CLOCK;
input clock_100M;

output AC97_SDATA_OUT;
output AC97_SYNCH;
output AUDIO_RESET_Z;

output LED_0,LED_3,LED_2,LED_1;

//reg AC97_SDATA_OUT;
reg AC97_SYNCH;
reg AUDIO_RESET_Z;




//////////////////////

reg [7:0] reset_count;
reg [7:0] bit_count;

reg [9:0] contador_1024;
reg [19:0] som_L, som_R;
reg [26:0] cont1;
reg clk_1hz;

/////// registos de leitura //////

wire [15:0] tag_in;
wire [19:0] slt1_in, slt2_in, PCM_LEFT_IN, PCM_RIGHT_IN, slt5_in, slt6_in;
wire [19:0] slt7_in, slt8_in, slt9_in, slt10_in, slt11_in, slt12_in;

////// registos de escrita //////

reg [15:0] tag_out;
reg [19:0] CMD_ADR, CMD_DATA, PCM_LEFT_OUT, PCM_RIGHT_OUT, slt5_out, slt6_out;
reg [19:0] slt7_out, slt8_out, slt9_out, slt10_out, slt11_out, slt12_out;

//// modulos ////

ac97_codec_sin SIN (.clk(AC97_BIT_CLOCK), .rst(AUDIO_RESET_Z),.sync(AC97_SYNCH),
.slt0(tag_in), .slt1(slt1_in), .slt2(slt2_in),
.slt3(PCM_LEFT_IN), .slt4(PCM_RIGHT_IN), .slt5(slt5_in),
.slt6(slt6_in), .slt7(slt7_in), .slt8(slt8_in),
.slt9(slt9_in), .slt10(slt10_in), .slt11(slt11_in),
.slt12(slt12_in),.sdata_in(AC97_SDATA_IN));

ac97_codec_sout SOUT (.clk(AC97_BIT_CLOCK), .rst(AUDIO_RESET_Z),.sync(AC97_SYNCH),
.slt0(tag_out), .slt1(CMD_ADR), .slt2(CMD_DATA),
.slt3(PCM_LEFT_OUT), .slt4(PCM_RIGHT_OUT), .slt5(slt5_out),
.slt6(slt6_out), .slt7(slt7_out), .slt8(slt8_out),
.slt9(slt9_out), .slt10(slt10_out), .slt11(slt11_out),
.slt12(slt12_out),.sdata_out(AC97_SDATA_OUT));

//// RESET ////
initial begin
reset_count <= 0;
AUDIO_RESET_Z <= 1'b0;
end

always @(posedge clock_100M) begin

if ((reset_count >= 8'd 0) && (reset_count <= 8'd 250)) begin
AUDIO_RESET_Z <= 0;
reset_count <= reset_count + 1;
end
else
AUDIO_RESET_Z <= 1;

end

//// SYNC ////

always @(posedge AC97_BIT_CLOCK) begin
if (bit_count >= 255)
bit_count <= 8'b 0;
else
bit_count <= bit_count + 1;

if ((bit_count >= 8'd 0) && (bit_count <= 8'd 15))
AC97_SYNCH <= 1;
else
AC97_SYNCH <= 0;
end

always @(posedge AC97_SYNCH) begin
if (contador_1024 <= 10'd 1000)
contador_1024 <= contador_1024 + 1;

end

always @(contador_1024 or PCM_LEFT_IN or PCM_RIGHT_IN) begin
case (contador_1024)
10'd 0 : begin
tag_out = 16'h E000;
CMD_ADR = 20'h 00000;
CMD_DATA = 20'h 00000;
PCM_LEFT_OUT = 20'h 00000;
PCM_RIGHT_OUT = 20'h 00000;
end
10'd 1 : begin
tag_out = 16'h E000;
CMD_ADR = 20'h 02000;
CMD_DATA = 20'h 00000;
PCM_LEFT_OUT = 20'h 00000;
PCM_RIGHT_OUT = 20'h 00000;
end
10'd 2 : begin
tag_out = 16'h E000;
CMD_ADR = 20'h 04000;
CMD_DATA = 20'h 00000;
PCM_LEFT_OUT = 20'h 00000;
PCM_RIGHT_OUT = 20'h 00000;
end
10'd 4 : begin
tag_out = 16'h E000 ;
CMD_ADR = 20'h 1A000;
CMD_DATA = 20'h 04040;
PCM_LEFT_OUT = 20'h 00000;
PCM_RIGHT_OUT = 20'h 00000;
end
10'd 5 : begin
tag_out = 16'h E000 ;
CMD_ADR = 20'h 1C000;
CMD_DATA = 20'h 00000;
PCM_LEFT_OUT = 20'h 00000;
PCM_RIGHT_OUT = 20'h 00000;
end
10'd 6 : begin
tag_out = 16'h E000;
CMD_ADR = 20'h 18000;
CMD_DATA = 20'h 08080;
PCM_LEFT_OUT = 20'h 00000;
PCM_RIGHT_OUT = 20'h 00000;
end

10'd 7 : begin
tag_out = 16'h E000;
CMD_ADR = 20'h 0A000;
CMD_DATA = 20'h 80000;
PCM_LEFT_OUT = 20'h 00000;
PCM_RIGHT_OUT = 20'h 00000;
end
default :begin
tag_out = 16'h 9800;
CMD_ADR = 20'h 00000;
CMD_DATA = 20'h 00000;
PCM_LEFT_OUT = PCM_LEFT_IN;
PCM_RIGHT_OUT = PCM_RIGHT_IN;
end
endcase

slt5_out = 20'h 00000;
slt6_out = 20'h 00000;
slt7_out = 20'h 00000;
slt8_out = 20'h 00000;
slt9_out = 20'h 00000;
slt10_out = 20'h 00000;
slt11_out = 20'h 00000;
slt12_out = 20'h 00000;

end


always @(posedge clk_1hz) begin
som_L <= ~som_L;
som_R <= ~som_R;
end


always @(posedge AC97_BIT_CLOCK) begin
if (cont1 >= 27'd 6144000) begin
cont1 <= 27'b 0;
clk_1hz <= ~clk_1hz;
end
else
cont1 <= cont1 + 1;
end

assign LED_3 = PCM_RIGHT_IN[15];
assign LED_2 = AC97_SYNCH;
assign LED_1 = AC97_SDATA_IN;
assign LED_0 = AC97_SDATA_OUT;

endmodule

Vitor Hugo disse...

Pra kem s kiser saber, o codigo do post anterior é apenas pra controlar o codec d audio AC97 do kit com k estou a trabalhar, nada mais k isso.

Pra xegar ali foi preciso partir muita pedra...

Dogus disse...

3 semanas de trabalho por 4 páginas de word? Em três semanas eu ladro mais que isso...

Anónimo disse...

Aquilo ali atrás é o q? Até fiquei abananada! Andam a encher o blog com coisas q ñ interessam muito... E depois as pessoas deixam de comentar! Por isso o jc nunca mais cá veio! :) Qq dia entra aqui em grande! :O Estamos à espera!

Beijocas para todos!

Anónimo disse...

Parabéns ao meu afilhado! :) O tempo passa... E já lá vão 3 mesinhos! O Baptizado é já para o mês q vem :)

Um beijinho grande da madrinha emprestada!

Dogus disse...

Lembrei-me logo à meia-noite e cinco. Mas só acordei a estas horas belíssimas... É o que dá desligar o despertador! Um beijinho grande ao Miguel!

Anónimo disse...

Vitor
Eu só vejo montes de 20 h no teu trabalho, será que são as horas do jantar?
Beijinhos

Vitor Hugo disse...

Ñ é referencia nenhuma ás minhas horas d jantar, pk s fosse seria mais 2h ou 3h ou então nem hora tinha dado k mts dias nem janto...

Mas pra k ñ haja duvidas vou explicar o k significa o 20'h...
Tome-mos com exemplo a instruçã

CMD_ADR = 20'h 1C000;

Nesta instrução estamos a atribuir ao vector CMD_ADR, de tamanho 20, o valor em hexadecimal (por isso o h) 1C000.

Cada digito hexadecimal tem 4 bits, por isso é k precisamos d um vector d tamanho 20 pra representar um numero hexadecimal com 5 digitos.

Sempre disponivel pra esclarecer qq duvida,

Quase Eng. Vitor Hugo Ferreira

Dogus disse...

20h foi quase o tempo que demorou a passar aquelas páginas! E ainda ficaram a faltar 2 exercícios!

Anónimo disse...

fiquei na mesma, ou pouco melhor muito obrigada, mas de engenharia não percebo nada. beijinhos e bom trabalho

Anónimo disse...

Só sei que tive 18,5 neste trabalho...

Vitor Hugo disse...

Lembram-s d da outra vez terem visto um eskema com 3 modulos... pois este é um deles. Ainda faltam umas coisinhas, mas o essencial tá aki:


module deinterleaver(data_deinter_in,RDY_in,reset,clk,RATE,
data_deinter_out,RDY_deinter_out,
FD_deinter_in,FD_deinter_out,
RFD_deinter,ACK_deinter);


//// entradas ////
input [0:4] data_deinter_in;
input [6:0] RATE;
input RDY_in;
input reset;
input clk;
input ACK_deinter;
input FD_deinter_in;

//// saidas ////
output [0:5] data_deinter_out; // vamos ter á saida do deinterleaver 6 bits d cada vez
// no caso de 64800 serão 360 pra entrarem no LDPC decoder
output RDY_deinter_out;
output RFD_deinter;
output FD_deinter_out;


//// registos das saidas ////
reg RDY_deinter_out;
reg RFD_deinter;
reg FD_deinter_out;


//// registos ////

reg[7:0] addr_lei, addr_esc, count_lei;
reg[2:0] ind;
reg data_a, data_b;
reg sel, wea, web, ctr_lei;

wire[6:0] addr_a, addr_b;
wire data_out_a, data_out_b;



//// Modulos utilizados /////

ramb ramA(.addr(addr_a),.clk(clk),.din(data_a),.dout(data_out_a),
.sinit(reset),.we(wea));

ramb ramB(.addr(addr_b),.clk(clk),.din(data_b),.dout(data_out_b),
.sinit(reset),.we(web));





//// logica combinacional ////

assign addr_a = wea ? addr_esc[6:0] : addr_lei[6:0];
assign addr_b = web ? addr_esc[6:0] : addr_lei[6:0];

assign data_deinter_out = sel ? data_out_a : data_out_b;


// processo combinacional para seleção da memoria a ler e a escrever //
always@(reset or sel or ind or data_deinter_in) begin

if(!reset) begin
wea=0;
web=0;
data_a = 0;
data_b = 0;
end
else begin
if(sel == 0)begin
wea=1;
web=0;
data_a = data_deinter_in[ind];
data_b = 0;
end
else begin
wea=0;
web=1;
data_a = 0;
data_b = data_deinter_in[ind];
end
end
end


// processo sequencial para atribuição do endereço de leitura //
always@(posedge clk or negedge reset) begin

if(!reset)begin
addr_lei <= 7'd 119;
FD_deinter_out <= 0;
RDY_deinter_out <= 0;
sel <= 1;
end
else begin
if(RDY_in == 1 && ACK_deinter == 1)begin
if(addr_lei == 7'd 119 || FD_deinter_in == 1'b 1) begin // colokei aki o FD.... ñ sei s está bem
addr_lei <= 7'd 0;
sel <= ~sel;
end
else begin
addr_lei <= addr_lei + 7'd 1;

if(ctr_lei == 1)begin
if(addr_lei == 1)
FD_deinter_out <= 1;
else
FD_deinter_out <= 0;

RDY_deinter_out <= 1;
end
else begin
FD_deinter_out <= 0;
RDY_deinter_out <= 0;
end

if(RATE[4] == 1) // short frame
if(addr_lei == 7'd 59)
addr_lei <= 7'd 119;
end
end
else begin
if(ctr_lei == 1)begin
if(addr_lei == 1)
FD_deinter_out <= 1;
else
FD_deinter_out <= 0;

RDY_deinter_out <= 1;
end
else begin
FD_deinter_out <= 0;
RDY_deinter_out <= 0;
end
end
end
end



// processo sequencial de atribuição do endereço de escrita //
always@(posedge clk or negedge reset) begin

if(!reset) begin
addr_esc <= 7'd 119;
end
else begin
if (FD_deinter_out == 1'b 1)
addr_esc <= 7'd 119;

if(RDY_in == 1 && ACK_deinter == 1) begin
if(addr_esc == 7'd 119) begin // inicialização do endereço de escrita
if(RATE[4]==0)begin //normal frame
case(RATE[3:0]) // code rate

4'b 0100 : begin // rate = 3/5
case(RATE[6:5]) // tipo de modulação
2'b 00 : addr_esc <= 7'd 0; // QPSK
2'b 01 : addr_esc <= 7'd 80; // 8PSK
2'b 10 : addr_esc <= 7'd 90; // 16APSK
2'b 11 : addr_esc <= 7'd 96; // 32APSK
endcase // endcase (RATE[6:5]) // tipo de modulação
end // end 4'b 0100 : begin // rate = 3/5

default : addr_esc <= 7'd 0; // restantes tipos d code rate
endcase
end // end if(RATE[4]==0) //normal frame
else begin //short frame
case(RATE[3:0]) // code rate

4'b 0100 : begin // rate = 3/5
case(RATE[6:5]) // tipo de modulação
2'b 00 : addr_esc <= 7'd 0; // QPSK
2'b 01 : addr_esc <= 7'd 40; // 8PSK
2'b 10 : addr_esc <= 7'd 45; // 16APSK
2'b 11 : addr_esc <= 7'd 48; // 32APSK
endcase
end // endcase (RATE[6:5]) // tipo de modulação

default : addr_esc <= 7'd 0; // restantes tipos d code rate
endcase
end // end else do if(RATE[4]==0) //short frame

end // end do if(addr_esc == 7'd 119) begin // inicialização do endereço de escrita

else begin // soma do endereço d escrita
if (RATE[4]==0) begin //normal frame
case(RATE[6:5]) // tipo de modulação
2'b 00: begin // QPSK
addr_esc <= addr_esc + 7'd 1;
end
2'b 01: begin // 8PSK
case(RATE[3:0]) // code rate
4'b 0100 : begin // code rate = 3/5
if(addr_esc < 7'd 39)
addr_esc <= addr_esc + 7'd 80 + 7'd 1;
else
addr_esc <= addr_esc - 7'd 40;
end
default: begin
if(addr_esc > 7'd 79)
addr_esc <= addr_esc - 7'd 80 + 7'd 1;
else
addr_esc <= addr_esc + 7'd 40;
end
endcase // case(RATE[3:0]) // code rate
end
2'b 10: begin // 16APSK
case(RATE[3:0]) // code rate
4'b 0100 : begin // code rate = 3/5
if(addr_esc < 7'd 29)
addr_esc <= addr_esc + 7'd 90 + 7'd 1;
else
addr_esc <= addr_esc - 7'd 30;
end
default: begin
if(addr_esc > 7'd 89)
addr_esc <= addr_esc - 7'd 90 + 7'd 1;
else
addr_esc <= addr_esc + 7'd 30;
end
endcase // case(RATE[3:0]) // code rate
end
2'b 11: begin // 32APSK
case(RATE[3:0]) // code rate
4'b 0100 : begin // code rate = 3/5
if(addr_esc < 7'd 23)
addr_esc <= addr_esc + 7'd 96 + 7'd 1;
else
addr_esc <= addr_esc - 7'd 24;
end
default: begin // restantes rates
if(addr_esc > 7'd 95)
addr_esc <= addr_esc - 7'd 96 + 7'd 1;
else
addr_esc <= addr_esc + 7'd 24;
end
endcase // case(RATE[3:0]) // code rate
end
endcase //end case(RATE[6:5]) // tipo de modulação
end // end if (RATE[4]==0) begin //normal frame


else begin //short frame
if(addr_esc == 7'd 59) begin
addr_esc <= 7'd 119;
end
else begin
case(RATE[6:5]) // tipo de modulação
2'b 00: begin // QPSK
addr_esc <= addr_esc + 7'd 1;
end
2'b 01: begin // 8PSK
case(RATE[3:0]) // code rate
4'b 0100 : begin // code rate = 3/5
if(addr_esc < 7'd 19)
addr_esc <= addr_esc + 7'd 40 + 7'd 1;
else
addr_esc <= addr_esc - 7'd 20;
end
default: begin // restantes rates
if(addr_esc > 7'd 39)
addr_esc <= addr_esc - 7'd 40 + 7'd 1;
else
addr_esc <= addr_esc + 7'd 20;
end
endcase // end case(RATE[3:0]) // code rate
end
2'b 10: begin // 16APSK
case(RATE[3:0]) // code rate
4'b 0100 : begin // code rate = 3/5
if(addr_esc < 7'd 14)
addr_esc <= addr_esc + 7'd 45 + 7'd 1;
else
addr_esc <= addr_esc - 7'd 15;
end
default: begin // restantes rates
if(addr_esc > 7'd 44)
addr_esc <= addr_esc - 7'd 45 + 7'd 1;
else
addr_esc <= addr_esc + 7'd 15;
end
endcase // end case(RATE[3:0]) // code rate
end
2'b 11: begin // 32APSK
case(RATE[3:0]) // code rate
4'b 0100 : begin // code rate = 3/5
if(addr_esc < 7'd 11)
addr_esc <= addr_esc + 7'd 48 + 7'd 1;
else
addr_esc <= addr_esc - 7'd 12;
end
default: begin // restantes rates
if(addr_esc > 7'd 47)
addr_esc <= addr_esc - 7'd 48 + 7'd 1;
else
addr_esc <= addr_esc + 7'd 12;
end
endcase // end case(RATE[3:0]) // code rate
end
endcase // end case(RATE[6:5]) // tipo de modulação
end
end
end
end
end

end // end process


// processo sequencial de atribuição do indice de leitura da entrada //
always@(posedge clk or negedge reset) begin

if(!reset)begin
ind <= 3'd 4;
RFD_deinter <= 1;
end
else begin // else do if(!reset)
if(RDY_in == 1 && ACK_deinter == 1) begin
if(ind == 3'd 4)begin
ind <= 3'd 0;
RFD_deinter <= 0;
end
else begin
ind <= ind + 1;
if(ind == 3'd 3)
RFD_deinter <= 1;
end
end
else begin
RFD_deinter <= 1;
end

end // end else do if(!reset)

end // end process


always@(posedge clk or negedge reset) begin

if(!reset)begin
ctr_lei <= 0;
count_lei <= 7'd 0;
end
else begin
if(RDY_in == 1 && ACK_deinter == 1)begin
if(count_lei == 7'd 119)begin
count_lei <= 17'd 1;
ctr_lei <= 1;
end
else
count_lei <= count_lei + 7'd 1;

if(RATE[4]==1)
if(count_lei == 17'd 59)
count_lei <= 17'd 119;

end
end

end // end process

endmodule

Vitor Hugo disse...

D referir k este codigo ñ foi feito por mim, mas plo Sengo. Eu andei atarefado com a porcaria do AC97 e agora ando d volta do sistema de comunicação entre as duas placas...

Anónimo disse...

Aquilo ali atrás era o q? :) Mas só sabem assustar o pessoal com coisas destas?! Depois as pessoas deixam de comentar!...