FPGA正弦波转换为方波

用vivado的dds ip产生了正弦波,想用过零比较的方法把正弦转换成方波。一开始把零点设为0,发现并不是,所以加了采集最大值最小值的代码,用中值作为零点,但仿真还是有些问题,想知道这些问题的原因
代码如下
reg [15:0] max;
reg [15:0] min;
wire [15:0] zero;

initial begin
max = 10000;
min = 10000;
end

always@(posedge sys_clk)
begin
    if(sin_out_0 > max)
      max <= sin_out_0;
end

always@(posedge sys_clk)
begin
    if(sin_out_0 < min)
      min <= sin_out_0;
end

assign zero = (max+min)/2;

always@(posedge sys_clk)
begin
    if(sin_out_0 > zero)
      squ_0 <= 1'b1;
    else
      squ_0 <= 1'b0;
end
运行结果 波形为什么在一开始会有毛刺,300多ms后波形正常,且方波的0和1与预计的相反?

另外对仿真里正弦这类波形的值感到困惑,比如该仿真里可以通过调整数制和有符号看到正弦波的具体值且零点是0,但用在代码里却不对,波形每点的值是怎么确定的呢?

img

正弦波是有符号数,需要按有符号数去定义
比如:
这样就能通过数据是否大于 0 来做方波了。

wire signed [15:0] sin_out_0; 
always@(posedge sys_clk)
begin
    if(sin_out_0 > 0)
      squ_0 <= 1'b1;
    else
      squ_0 <= 1'b0;
end


当然也可以这么用,判断 sin_out_0 最高位是不是 1 ,是1 就是负数
比如:

wire [15:0] sin_out_0; 
always@(posedge sys_clk)
begin
    if(sin_out_0[15] == 0)
      squ_0 <= 1'b1;
    else
      squ_0 <= 1'b0;
end