DE0で回転処理をやってみる

FPGAでの計算処理をやってみたかったので、画面の回転処理をやってみました。
最初、小数点以下6bitでやったんだけど、ちょっとカクカクするので、小数点以下を7bitとってみたらだいぶスムーズに。けど、やっぱ8bit欲しいなー


とりあえず回転処理やってる部分のソースだけ。

module rotation(
	input clk,
	output [9:0]led,
	input [9:0] sw,
	output [3:0] vga_r,
	output [3:0] vga_g,
	output [3:0] vga_b,
	output vga_hs,
	output vga_vs,
	output lcd_rw,
	output lcd_rs,
	output lcd_en,
	output [7:0] lcd_data,
	output lcd_blon

);

	assign led = 10'd0;
	//assign hled2 = 8'hff;
	//assign hled3 = 8'hff;

	wire [9:0] disp_x;
	wire [9:0] disp_y;
	
	reg[7:0] rad = 8'd32;
	reg[23:0] rad_cnt;
	always @(posedge clk or negedge reset) begin
		if(!reset) begin
			rad <= 8'd0;
			rad_cnt <= 24'd0;
		end else if(rad_cnt == 24'd1899999) begin
			rad_cnt <= 24'd0;
			rad <= rad + 8'd1;
		end else
			rad_cnt <= rad_cnt + 24'd1;
	end
	
	wire [8:0] cos;
	wire [8:0] sin;
	sin8 ss (rad, sin);
	sin8 sc (rad + 8'd64, cos);
	wire [16:0] cosf = {(cos[8] ? 8'hff : 8'h00), cos};
	wire [16:0] sinf = {(sin[8] ? 8'hff : 8'h00), sin};
	
	reg [16:0] cenx = 10'd320;
	reg [16:0] ceny = 10'd256;
	wire [16:0] xf = disp_x;
	wire [16:0] yf = disp_y;
	wire [16:0] xcos = (cosf * xf);
	wire [16:0] xsin = (sinf * xf);
	wire [16:0] ycos = (cosf * yf);
	wire [16:0] ysin = (sinf * yf);
	wire [16:0] cxcos = (cosf * cenx);
	wire [16:0] cxsin = (sinf * cenx);
	wire [16:0] cycos = (cosf * ceny);
	wire [16:0] cysin = (sinf * ceny);
	wire [16:0] dx = xcos + ysin - cxcos - cysin + cenx;
	wire [16:0] dy = ycos - xsin + cxsin - cycos + ceny;
	wire [9:0] imgx = dx[16:7];
	wire [9:0] imgy = dy[16:7];
	
	wire [11:0] rgb = 
		(imgy < 10'h100) ? {imgy[7:4], imgy[7:4], 4'hf} :
			(imgx[5] ^ imgy[4]) ? 12'hfff : 12'hfcc;
	vga v(clk, vga_r, vga_g, vga_b, vga_hs, vga_vs, disp_x, disp_y, rgb);
	
endmodule