OpenCores
URL https://opencores.org/ocsvn/warp/warp/trunk

Subversion Repositories warp

[/] [warp/] [rtl/] [tmu_edgediv.v] - Rev 7

Compare with Previous | Blame | View Log

/*
 * Milkymist VJ SoC
 * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
 *
 * This program is free and excepted software; you can use it, redistribute it
 * and/or modify it under the terms of the Exception General Public License as
 * published by the Exception License Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the Exception General Public License for more
 * details.
 *
 * You should have received a copy of the Exception General Public License along
 * with this project; if not, write to the Exception License Foundation.
 */
 
module tmu_edgediv(
	input sys_clk,
	input sys_rst,
 
	output busy,
 
	input pipe_stb_i,
	output reg pipe_ack_o,
	/* Points pass-through */
	input [10:0] A0_S_X,
	input [10:0] A0_S_Y,
	input [10:0] A0_D_X,
	input [10:0] A0_D_Y,
	input [10:0] B0_D_Y,
	input [10:0] C0_D_Y,
	input dx10_positive,
	input [10:0] dx10,
	input dx20_positive,
	input [10:0] dx20,
	input dx30_positive,
	input [10:0] dx30,
	input du10_positive,
	input [10:0] du10,
	input du20_positive,
	input [10:0] du20,
	input du30_positive,
	input [10:0] du30,
	input dv10_positive,
	input [10:0] dv10,
	input dv20_positive,
	input [10:0] dv20,
	input dv30_positive,
	input [10:0] dv30,
	input [10:0] divisor10,
	input [10:0] divisor20,
	input [10:0] divisor30,
 
	output reg pipe_stb_o,
	input pipe_ack_i,
	output reg [10:0] A_S_X,
	output reg [10:0] A_S_Y,
	output reg [10:0] A_D_X,
	output reg [10:0] A_D_Y,
	output reg [10:0] B_D_Y,
	output reg [10:0] C_D_Y,
 
	output reg dx1_positive,
	output [10:0] dx1_q,
	output [10:0] dx1_r,
	output reg dx2_positive,
	output [10:0] dx2_q,
	output [10:0] dx2_r,
	output reg dx3_positive,
	output [10:0] dx3_q,
	output [10:0] dx3_r,
 
	output reg du1_positive,
	output [10:0] du1_q,
	output [10:0] du1_r,
	output reg du2_positive,
	output [10:0] du2_q,
	output [10:0] du2_r,
	output reg du3_positive,
	output [10:0] du3_q,
	output [10:0] du3_r,
 
	output reg dv1_positive,
	output [10:0] dv1_q,
	output [10:0] dv1_r,
	output reg dv2_positive,
	output [10:0] dv2_q,
	output [10:0] dv2_r,
	output reg dv3_positive,
	output [10:0] dv3_q,
	output [10:0] dv3_r,
 
	/* Divisors pass-through (needed for Bresenham algorithm) */
	output reg [10:0] divisor1,
	output reg [10:0] divisor2,
	output reg [10:0] divisor3
);
 
/* Divider bank */
 
reg start;
wire ready;
 
/* X (destination X) */
tmu_divider11 d_dx1(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(dx10),
	.divisor(divisor10),
 
	.ready(ready),
	.quotient(dx1_q),
	.remainder(dx1_r)
);
tmu_divider11 d_dx2(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(dx20),
	.divisor(divisor20),
 
	.ready(),
	.quotient(dx2_q),
	.remainder(dx2_r)
);
tmu_divider11 d_dx3(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(dx30),
	.divisor(divisor30),
 
	.ready(),
	.quotient(dx3_q),
	.remainder(dx3_r)
);
 
/* U (source X) */
tmu_divider11 d_du1(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(du10),
	.divisor(divisor10),
 
	.ready(),
	.quotient(du1_q),
	.remainder(du1_r)
);
tmu_divider11 d_du2(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(du20),
	.divisor(divisor20),
 
	.ready(),
	.quotient(du2_q),
	.remainder(du2_r)
);
tmu_divider11 d_du3(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(du30),
	.divisor(divisor30),
 
	.ready(),
	.quotient(du3_q),
	.remainder(du3_r)
);
 
/* V (source Y) */
tmu_divider11 d_dv1(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(dv10),
	.divisor(divisor10),
 
	.ready(),
	.quotient(dv1_q),
	.remainder(dv1_r)
);
tmu_divider11 d_dv2(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(dv20),
	.divisor(divisor20),
 
	.ready(),
	.quotient(dv2_q),
	.remainder(dv2_r)
);
tmu_divider11 d_dv3(
	.sys_clk(sys_clk),
	.sys_rst(sys_rst),
 
	.start(start),
	.dividend(dv30),
	.divisor(divisor30),
 
	.ready(),
	.quotient(dv3_q),
	.remainder(dv3_r)
);
 
/* Pipeline pass-through */
 
always @(posedge sys_clk) begin
	if(start) begin
		A_S_X <= A0_S_X;
		A_S_Y <= A0_S_Y;
		A_D_X <= A0_D_X;
		A_D_Y <= A0_D_Y;
		B_D_Y <= B0_D_Y;
		C_D_Y <= C0_D_Y;
		dx1_positive <= dx10_positive;
		dx2_positive <= dx20_positive;
		dx3_positive <= dx30_positive;
		du1_positive <= du10_positive;
		du2_positive <= du20_positive;
		du3_positive <= du30_positive;
		dv1_positive <= dv10_positive;
		dv2_positive <= dv20_positive;
		dv3_positive <= dv30_positive;
		divisor1 <= divisor10;
		divisor2 <= divisor20;
		divisor3 <= divisor30;
	end
end
 
/* Glue logic */
 
reg state;
reg next_state;
 
parameter IDLE = 1'b0;
parameter WAIT = 1'b1;
 
always @(posedge sys_clk) begin
	if(sys_rst)
		state = IDLE;
	else
		state = next_state;
end
 
assign busy = state;
 
always @(*) begin
	next_state = state;
 
	start = 1'b0;
	pipe_stb_o = 1'b0;
	pipe_ack_o = 1'b0;
 
	case(state)
		IDLE: begin
			pipe_ack_o = 1'b1;
			if(pipe_stb_i) begin
				start = 1'b1;
				next_state = WAIT;
			end
		end
		WAIT: begin
			if(ready) begin
				pipe_stb_o = 1'b1;
				if(pipe_ack_i)
					next_state = IDLE;
			end
		end
	endcase
end
 
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.