| // 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 |