Analog kill me 2022-03-26 16:35 采纳率: 100%
浏览 403
已结题

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

  • 写回答

1条回答 默认 最新

  • 老皮芽子 2022-03-26 16:56
    关注

    正弦波是有符号数,需要按有符号数去定义
    比如:
    这样就能通过数据是否大于 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
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 3月26日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度