I have to generate a two different sine wave(1st sine wave normal sine wave which is generate from 0 degree and 2nd one phase shifted sine wave ) using Verilog, and on google, I found something related to it but somehow I didn't understand. So, could anyone explain to me the logic behind this code?
Code:
module sine_cos(clk, reset, en, sine, cos);
input clk, reset, en;
output [7:0] sine,cos;
reg [7:0] sine_r, cos_r;
assign sine = sine_r + {cos_r[7], cos_r[7], cos_r[7], cos_r[7:3]};
assign cos = cos_r - {sine[7], sine[7], sine[7], sine[7:3]};
always@(posedge clk or negedge reset)
begin
if (!reset) begin
sine_r <= 0;
cos_r <= 120;
end else begin
if (en) begin
sine_r <= sine;
cos_r <= cos;
end
end
end
endmodule
but here what is the logic for ?
assign sine = sine_r + {cos_r[7], cos_r[7], cos_r[7], cos_r[7:3]};
assign cos = cos_r - {sine[7], sine[7], sine[7], sine[7:3]};
Consider that the derivative (slope) of sin is cos and the derivative of cos is sin. Thus you can increment one by a value proportional to the other and you get a self-oscillating output that's a very good (not perfect) sin wave.
The specific code you're questioning is just a power of 2 divide. FvM posted a better way to do this. The more you divide the longer the period is.
The biggest problem is rounding errors. You need to get lucky and find a set of parameters that returns exactly to where it started or you need to reset every cycle introducing a small amount of distortion. If you don't the amplitude will 'walk away' towards zero or infinity.
Bottom line this is a very 'cheap' way to generate a sin wave in an FPGA. For high precision work you're best off using the IP blocks that all FPGA manufacturers provide.
Hi, FvM
Heartily thanks for the replay ,
so by using this shift operators we rotate back Or right shift signal by 3 ?
by using sine and cos equations ?
How to generate Square wave from Sine wave in verilog ?
Here by using a just normal procedure for generating sine wave , through verilog code. " i have to generate a two different sine wave , 1st normal sine wave (which is start from 0 degree ) and 2nd wave which is start from phase shift(+- 90 degree) sine wave.and that i already done in vivado simulation but Now i want to again generate a square wave from this sine wave, (sine wave --> counter ) so please suggest me the logic for verilog !
same frequency?
sketch the sin wave, then sketch the square wave on top of it. where along the sin wave if the square wave high? when low?
now write the appropriate logic statements
different frequency?
how do you get from the sinwave frequency to the square wave frequency?
you specified sine and cos as signed values, so the square waves will be specified by sign + or -
use a statement that checks the sign bit, as FvM suggested