mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			124 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
// File: design.v
 | 
						|
// Generated by MyHDL 0.8
 | 
						|
// Date: Tue Dec  3 04:33:14 2013
 | 
						|
 | 
						|
 | 
						|
module d (
 | 
						|
    cos_z0,
 | 
						|
    sin_z0,
 | 
						|
    done,
 | 
						|
    z0,
 | 
						|
    start,
 | 
						|
    clock,
 | 
						|
    reset
 | 
						|
);
 | 
						|
// Sine and cosine computer.
 | 
						|
//
 | 
						|
// This module computes the sine and cosine of an input angle. The
 | 
						|
// floating point numbers are represented as integers by scaling them
 | 
						|
// up with a factor corresponding to the number of bits after the point.
 | 
						|
//
 | 
						|
// Ports:
 | 
						|
// -----
 | 
						|
// cos_z0: cosine of the input angle
 | 
						|
// sin_z0: sine of the input angle
 | 
						|
// done: output flag indicated completion of the computation
 | 
						|
// z0: input angle
 | 
						|
// start: input that starts the computation on a posedge
 | 
						|
// clock: clock input
 | 
						|
// reset: reset input
 | 
						|
 | 
						|
output signed [19:0] cos_z0;
 | 
						|
reg signed [19:0] cos_z0;
 | 
						|
output signed [19:0] sin_z0;
 | 
						|
reg signed [19:0] sin_z0;
 | 
						|
output done;
 | 
						|
reg done;
 | 
						|
input signed [19:0] z0;
 | 
						|
input start;
 | 
						|
input clock;
 | 
						|
input reset;
 | 
						|
 | 
						|
(* gentb_constant = 1'b0 *)
 | 
						|
wire reset;
 | 
						|
 | 
						|
always @(posedge clock, posedge reset) begin: DESIGN_PROCESSOR
 | 
						|
    reg [5-1:0] i;
 | 
						|
    reg [1-1:0] state;
 | 
						|
    reg signed [20-1:0] dz;
 | 
						|
    reg signed [20-1:0] dx;
 | 
						|
    reg signed [20-1:0] dy;
 | 
						|
    reg signed [20-1:0] y;
 | 
						|
    reg signed [20-1:0] x;
 | 
						|
    reg signed [20-1:0] z;
 | 
						|
    if (reset) begin
 | 
						|
        state = 1'b0;
 | 
						|
        cos_z0 <= 1;
 | 
						|
        sin_z0 <= 0;
 | 
						|
        done <= 1'b0;
 | 
						|
        x = 0;
 | 
						|
        y = 0;
 | 
						|
        z = 0;
 | 
						|
        i = 0;
 | 
						|
    end
 | 
						|
    else begin
 | 
						|
        case (state)
 | 
						|
            1'b0: begin
 | 
						|
                if (start) begin
 | 
						|
                    x = 159188;
 | 
						|
                    y = 0;
 | 
						|
                    z = z0;
 | 
						|
                    i = 0;
 | 
						|
                    done <= 1'b0;
 | 
						|
                    state = 1'b1;
 | 
						|
                end
 | 
						|
            end
 | 
						|
            1'b1: begin
 | 
						|
                dx = $signed(y >>> $signed({1'b0, i}));
 | 
						|
                dy = $signed(x >>> $signed({1'b0, i}));
 | 
						|
                case (i)
 | 
						|
                    0: dz = 205887;
 | 
						|
                    1: dz = 121542;
 | 
						|
                    2: dz = 64220;
 | 
						|
                    3: dz = 32599;
 | 
						|
                    4: dz = 16363;
 | 
						|
                    5: dz = 8189;
 | 
						|
                    6: dz = 4096;
 | 
						|
                    7: dz = 2048;
 | 
						|
                    8: dz = 1024;
 | 
						|
                    9: dz = 512;
 | 
						|
                    10: dz = 256;
 | 
						|
                    11: dz = 128;
 | 
						|
                    12: dz = 64;
 | 
						|
                    13: dz = 32;
 | 
						|
                    14: dz = 16;
 | 
						|
                    15: dz = 8;
 | 
						|
                    16: dz = 4;
 | 
						|
                    17: dz = 2;
 | 
						|
                    default: dz = 1;
 | 
						|
                endcase
 | 
						|
                if ((z >= 0)) begin
 | 
						|
                    x = x - dx;
 | 
						|
                    y = y + dy;
 | 
						|
                    z = z - dz;
 | 
						|
                end
 | 
						|
                else begin
 | 
						|
                    x = x + dx;
 | 
						|
                    y = y - dy;
 | 
						|
                    z = z + dz;
 | 
						|
                end
 | 
						|
                if ((i == (19 - 1))) begin
 | 
						|
                    cos_z0 <= x;
 | 
						|
                    sin_z0 <= y;
 | 
						|
                    state = 1'b0;
 | 
						|
                    done <= 1'b1;
 | 
						|
                end
 | 
						|
                else begin
 | 
						|
                    i = i + 1;
 | 
						|
                end
 | 
						|
            end
 | 
						|
        endcase
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
endmodule
 |