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