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