Moderador: 51
module filter(CLK, RESET, ADDR, DATA_X, DATA_K, DATA_Y)
input CLK;
input RESET;
input [4:0] ADDR;
input [15:0] DATA_X; // dados X
input [15:0] DATA_K; // coeficiente K
output [15:0] DATA_Y; // saida Y
reg [31:0] A [0:31]; // 32x acumuladores de 32 bits
assign DATA_Y = A[ADDR][31:16];
always@(posedge CLK)
begin
if(RESET)
A[ADDR] <= 0;
else
A[ADDR] <= A[ADDR] + DATA_K * DATA_X;
end
endmodule
always@(posedge CLK)
begin
A[ADDR] <= RESET ? 0 : A[ADDR] + DATA_K * DATA_X;
end
mastk escreveu:Sim, os circuitos que descrevo atualmente estao no limite de 72 macro celulas, quando isso acontece faço exatamente o que disse, tento mudar a "forma que descrevi" e muito vezes isso basta, porem ja teve casos que tive que mudar o escopo do sintetizador.
Em alguns outros casos, o sintetizador, simplifica a minha logico a ponto que algo deixa de funcionar, deixando apenas um avisso, que sequer é reportado nos Logs finais, apenas nos parciais.
Nao cheguei a ver nenhuma ferramente no ISE de visualizar graficamente o resultado da sinteze.
É F*** ser burro, doi no cabeca e principalmente no bolso.
module vram(
input CLKA,
input WEA,
input [7:0] DINA,
input [14:0] ADDRA,
output reg [7:0] DOUTA,
input CLKB,
input WEB,
input [7:0] DINB,
input [14:0] ADDRB,
output reg [7:0] DOUTB
);
reg [7:0] VRAM [0:16383];
always@(posedge CLKA)
begin
DOUTA <= VRAM[ADDRA];
if(WEA)
VRAM[ADDRA] <= DINA;
end
always@(posedge CLKB)
begin
DOUTB <= VRAM[ADDRB];
if(WEB)
VRAM[ADDRB] <= DINB;
end
endmodule
module spriteram(
input CLKA,
input WEA,
input [7:0] DINA,
input [4:0] ADDRA,
output [7:0] DOUTA,
input PXCLK,
input PXRES,
input HEN,
input VEN,
output PXOUT
);
reg [7:0] SPRITE [0:31];
reg [7:0] PXADDR;
assign PXOUT = SPRIT[PXADDR[7:3]][PXADDR[2:0]];
always@(posedge PXCLK)
begin
PXADDR <= PXRES ? 0 : PXADDR + (VEN&&HEN);
end
assign DOUTA = SPRITE[ADDRA];
always@(posedge CLKA)
begin
if(WEA)
SPRITE[ADDRA] <= DINA;
end
endmodule
always@(posedge PXCLK)
begin
if(HCOUNT == HWIDTH)
begin
HCOUNT <= 0;
if(VCOUNT == VWIDTH)
begin
VCOUNT <= 0;
PXRES <= 1;
end
begin
PXRES <= 0;
VCOUNT <= VCOUNT+1;
if(VCOUNT >= VSPRITE && VCOUNT < (VSPRITE+16))
VEN <= 1;
else
VEN <= 0;
end
end
else
begin
HCOUNT <= HCOUNT+1;
if(HCOUNT >= HSPRITE && HSPRITE < (HSPRITE+16))
HEN <= 1;
else
HEN <= 0;
end
end
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante