output ack,
output busy,
- output [31:0] wbm_dat_o,
+ output reg [31:0] wbm_dat_o,
output reg [31:0] wbm_adr_o,
output wbm_cyc_o,
output wbm_stb_o,
assign q_c = wbm_ack_i & write_y;
assign q_i = {dma_d1, dma_d2, y, x};
-always @(posedge sys_clk)
+always @(posedge sys_clk) begin
wbm_adr_o <= {dma_base, 3'd0} + {q_o[13:0], write_y, 2'd0};
+ wbm_dat_o <= write_y ? q_o[45:14] : q_o[q_width-1:46];
+end
+
+reg bus_not_valid_yet;
+always @(posedge sys_clk)
+ bus_not_valid_yet <= wbm_ack_i;
always @(posedge sys_clk) begin
if(sys_rst)
else if(wbm_ack_i) write_y <= ~write_y;
end
-assign wbm_dat_o = write_y ? q_o[45:14] : q_o[q_width-1:46];
-
-reg address_not_valid_yet;
-always @(posedge sys_clk)
- address_not_valid_yet <= q_c;
-
-assign wbm_cyc_o = ~empty & ~address_not_valid_yet;
-assign wbm_stb_o = ~empty & ~address_not_valid_yet;
+assign wbm_cyc_o = ~empty & ~bus_not_valid_yet;
+assign wbm_stb_o = ~empty & ~bus_not_valid_yet;
assign ack = ~full;
assign busy = ~empty;
if(wbm_stb_o & ~wbm_ack_i & (($random % 200) == 0)) begin
wbm_ack_i <= 1'b1;
$fromfloat(wbm_dat_o, r);
- $display("DMA write addr %x:%x (%d;%d - %f - %d %d)", wbm_adr_o, wbm_dat_o, wbm_adr_o[8:2], wbm_adr_o[15:9], r, wbm_dat_o[31:16], wbm_dat_o[15:0]);
+ $display("DMA write addr %x:%x (%b - %f)", wbm_adr_o, wbm_dat_o, wbm_adr_o[2], r);
end
end
end
csrwrite(32'h0814, 32'b0000000_0000011_0000100_0111_0000000); /* VECTOUT R3, R4 */
/* DMA base */
- csrwrite(32'h0004, 32'h12340000);
+ csrwrite(32'h0004, 32'h401de328);
/* Start */
csrwrite(32'h0000, 32'h00000001);
csrwrite(32'h0820, 32'b0000000_0000000_0000000_0000_0000000); /* NOP */
csrwrite(32'h0824, 32'b0000000_0000000_0000000_0000_0000101); /* NOP | EXIT R5 */
csrwrite(32'h0828, 32'b0000000_0000101_0000101_0111_0000000); /* VECTOUT R5, R5 */
+
+ /* DMA base */
+ csrwrite(32'h0004, 32'h401de328);
/* Start */
csrwrite(32'h0000, 32'h00000001);
static struct pfpu_td pfpu_td;
-//#define DUMP_MESH
+#define DUMP_MESH
static void pvv_callback(struct pfpu_td *td)
{
rpipe_frame = (struct rpipe_frame *)td->user;
#ifdef DUMP_MESH
- for(y=0;y<6;y++) {
- for(x=0;x<6;x++)
+ for(y=10;y<13;y++) {
+ for(x=10;x<13;x++)
printf("(%02d %02d) ", rpipe_frame->vertices[y][x].y, rpipe_frame->vertices[y][x].x);
printf("\n");
}
ADD_ISN(PFPU_OPCODE_FMUL, FR( 21), BR( 6), FR( 23)); /* FR23: Y screen float */
ADD_ISN(PFPU_OPCODE_F2I, FR( 22), BR( 0), FR( 24)); /* FR26: X screen integer */
ADD_ISN(PFPU_OPCODE_F2I, FR( 23), BR( 0), FR( 25)); /* FR27: Y screen integer */
- ADD_ISN(PFPU_OPCODE_VECTOUT, FR( 25), FR( 24), BR( 0)); /* put out vector */
+ ADD_ISN(PFPU_OPCODE_VECTOUT, FR( 24), FR( 25), BR( 0)); /* put out vector */
#undef BR
#undef FR
static unsigned short *tex_frontbuffer;
static unsigned short *tex_backbuffer;
-static struct tmu_vertex scale_tex_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
+static struct tmu_vertex scale_tex_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE] __attribute__((aligned(8)));
#define SPAM_W 75
#define SPAM_H 75
#define SPAM_Y 30
#define SPAM_CHROMAKEY 0x001f
-static struct tmu_vertex spam_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
+static struct tmu_vertex spam_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE] __attribute__((aligned(8)));
void rpipe_init()
{
{
tmu_task1.flags = 0;
tmu_task1.hmeshlast = renderer_hmeshlast;
- tmu_task1.vmeshlast = renderer_hmeshlast;
+ tmu_task1.vmeshlast = renderer_vmeshlast;
tmu_task1.brightness = frame->brightness;
tmu_task1.chromakey = 0;
tmu_task1.vertices = &frame->vertices[0][0];
break;
}
- wave_draw(tex_backbuffer, vga_hres, vga_vres, ¶ms, vertices, nvertices);
+ wave_draw(tex_backbuffer, renderer_texsize, renderer_texsize, ¶ms, vertices, nvertices);
}
static void rpipe_tmu_copydone(struct tmu_td *td)
* This test should only be run when the driver task queue
* is empty.
*/
+static struct tmu_vertex mesh[128][128] __attribute__((aligned(8)));
static void pfputest()
{
- unsigned int mesh[128][128];
unsigned int *pfpu_regs = (unsigned int *)CSR_PFPU_DREGBASE;
unsigned int *pfpu_code = (unsigned int *)CSR_PFPU_CODEBASE;
int x, y;
irq_setmask(oldmask & (~IRQ_PFPU));
for(y=0;y<128;y++)
- for(x=0;x<128;x++)
- mesh[y][x] = 0xdeadbeef;
+ for(x=0;x<128;x++) {
+ mesh[y][x].x = 0xdeadbeef;
+ mesh[y][x].y = 0xdeadbeef;
+ }
- CSR_PFPU_MESHBASE = (unsigned int)mesh;
+ CSR_PFPU_MESHBASE = (unsigned int)&mesh;
//CSR_PFPU_HMESHLAST = 6;
//CSR_PFPU_VMESHLAST = 9;
pfpu_code[ 6] = 0x00000000;
pfpu_code[ 7] = 0x00000000;
pfpu_code[ 8] = 0x00000000;
- pfpu_code[ 9] = 0x0000007f;
+ pfpu_code[ 9] = 0x00000005;
+ pfpu_code[10] = 0x00142b80;
/*printf("Program:\n");
for(x=0;x<10;x++)
printf("Result:\n");
for(y=0;y<10;y++) {
for(x=0;x<12;x++)
- printf("%08x ", mesh[y][x]);
+ printf("%08x ", mesh[y][x].x);
+ printf("\n");
+ }
+ printf("\n");
+ for(y=0;y<10;y++) {
+ for(x=0;x<12;x++)
+ printf("%08x ", mesh[y][x].y);
printf("\n");
}
printf("Program:\n");
- for(x=0;x<10;x++)
+ for(x=0;x<11;x++)
printf("%08x ", pfpu_code[x]);
printf("\n");