搜索
bottom↓
回复: 7

产生50mv的梯形波,结果这样

[复制链接]

出0入0汤圆

发表于 2014-4-13 13:40:28 | 显示全部楼层 |阅读模式
产生50mv的梯形波,为什么会出现如图的波形,该要怎么滤波?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-4-13 15:02:08 | 显示全部楼层
电路图?

出0入0汤圆

发表于 2014-4-13 16:27:50 | 显示全部楼层
上代码看看。。。。

出0入0汤圆

 楼主| 发表于 2014-4-13 18:11:25 | 显示全部楼层
lans0625 发表于 2014-4-13 16:27
上代码看看。。。。

是用verilog写的,产生2.5V的不错。50MV的不行,,估计50mv的干扰大过我要输出的,上代码了。。

//2.5V/7.5ms
//50mv/0.2ms
module Tra(CLK,RST_N,DA_SCLK1,DA_DIN1,DA_DIN2,DA_SYNC1,DA_SYNC2,DA_SCLK2,DA_data2);
input   CLK;
input   RST_N;
output  DA_SCLK1;
output  DA_SCLK2;
output  DA_DIN1;
output  DA_SYNC1;
output  DA_DIN2;
output  DA_SYNC2;
wire    DA_WCLK;
//...........
//output[11:0]   DA_data1;
output[5:0]   DA_data2;

pll     pll_inst(
               .inclk0(CLK),
               .c0(DA_SCLK1),
               .c1(DA_SCLK2),
               .c2(DA_WCLK)
               );

reg [4:0] sync_cnt1;
reg       DA_SYNC1_r;
always @(posedge DA_WCLK or negedge RST_N)
begin
if(!RST_N)
   sync_cnt1 <= 5'd0;
else if(sync_cnt1==5'd23)
   sync_cnt1 <= 5'd0;
else
   sync_cnt1 <= sync_cnt1 + 1'b1;
end
always @(posedge DA_WCLK or negedge RST_N)
begin
  if(!RST_N)
    DA_SYNC1_r <= 1'b0;
  else if(sync_cnt1 < 5'd1)
    DA_SYNC1_r <= 1'b1;
  else
    DA_SYNC1_r <= 1'b0;
end
assign  DA_SYNC1 = DA_SYNC1_r;
reg  adr_en;
always @(posedge DA_WCLK or negedge RST_N)
begin
  if(!RST_N)
    adr_en <= 1'b0;
  else if(sync_cnt1==5'd20)
    adr_en <= 1'b1;
  else
    adr_en <= 1'b0;
end

wire [11:0] adr_rom;
reg  [11:0] adr_rom_r;
wire [11:0] DA_data1;
wire        rom_clk;
assign   rom_clk = ~DA_WCLK;
assign   adr_rom = adr_rom_r;
reg[1:0] out_st;
reg[15:0] high_cnt;
always @(posedge DA_WCLK or negedge RST_N)
begin
  if(!RST_N)
   begin
    adr_rom_r <= 12'd0;
    out_st <= 2'b00;
    high_cnt <= 16'd0;
   end
  else
    case(out_st)
      2'b00:begin
               if(adr_en && adr_rom_r<12'd3013 )
                   adr_rom_r <= adr_rom_r + 1'b1;
               else if(adr_rom_r==12'd3013)
                 begin
               
                   out_st <= 2'b01;
                 end
               else
                   adr_rom_r <= adr_rom_r;
             end
       2'b01:begin
                adr_rom_r <= 12'd3013;
                if(high_cnt==16'd59999)
                 begin
                   out_st <= 2'b10;
                   high_cnt <= 16'd0;
                 end
                else
                 begin
                   high_cnt <= high_cnt + 1'b1;
                   out_st <= 2'b01;
                 end
             end
        2'b10:begin
               if(adr_en && adr_rom_r>12'd0 )
                   adr_rom_r <= adr_rom_r - 1'b1;
               else if(adr_rom_r==12'd0)
                 begin
                   out_st <= 2'b11;
                 end
               else
                   adr_rom_r <= adr_rom_r;
             end
         2'b11:begin
                adr_rom_r <= 12'd0;
                if(high_cnt==16'd59999)
                 begin
                   out_st <= 2'b00;
                   high_cnt <= 16'd0;
                 end
                else
                 begin
                   high_cnt <= high_cnt + 1'b1;
                   out_st <= 2'b11;
                 end
             end
         default: out_st <= 2'b00;
         endcase
end
rom1   rom1_inst(
               .address(adr_rom),
               .clock(rom_clk),
               .q(DA_data1)
               );
reg  DA_DIN1_r;
reg [4:0] st;
always @(posedge DA_WCLK or negedge RST_N)
begin
  if(!RST_N)
    begin
      DA_DIN1_r <= 1'b0;
      st <= 5'd0;
    end
  else
    begin
       case(st)
          5'd0:begin
                 if(DA_SYNC1_r==1'b1)
                   begin
                     DA_DIN1_r <= 1'b0;//16
                     st  <= 5'd1;
                   end
                  else
                     st <= 5'd0;
                 end
           5'd1:begin DA_DIN1_r <= 1'b0; st <= 5'd2;end//15
           5'd2:begin DA_DIN1_r <= 1'b0; st <= 5'd3;end//14
           5'd3:begin DA_DIN1_r <= 1'b0; st <= 5'd4;end//13
           5'd4:begin DA_DIN1_r <= DA_data1[11]; st <= 5'd5;end//12
           5'd5:begin DA_DIN1_r <= DA_data1[10]; st <= 5'd6;end//11
           5'd6:begin DA_DIN1_r <= DA_data1[9]; st <= 5'd7;end//10
           5'd7:begin DA_DIN1_r <= DA_data1[8]; st <= 5'd8;end//9
           5'd8:begin DA_DIN1_r <= DA_data1[7]; st <= 5'd9;end//8
           5'd9:begin DA_DIN1_r <= DA_data1[6]; st <= 5'd10;end//7
           5'd10:begin DA_DIN1_r <= DA_data1[5]; st <= 5'd11;end//6
           5'd11:begin DA_DIN1_r <= DA_data1[4]; st <= 5'd12;end//5
           5'd12:begin DA_DIN1_r <= DA_data1[3]; st <= 5'd13;end//4
           5'd13:begin DA_DIN1_r <= DA_data1[2]; st <= 5'd14;end//3
           5'd14:begin DA_DIN1_r <= DA_data1[1]; st <= 5'd15;end//2
           5'd15:begin DA_DIN1_r <= DA_data1[0]; st <= 5'd0;end//1
           default st <= 5'd0;
           endcase
    end  
end
assign  DA_DIN1 = DA_DIN1_r;
//.............50mv.................
//..................................
reg [5:0] sync_cnt2;
reg       DA_SYNC2_r;
always @(posedge DA_WCLK or negedge RST_N)
begin
if(!RST_N)
   sync_cnt2 <= 6'd0;
else if(sync_cnt2==6'd33)
   sync_cnt2 <= 6'd0;
else
   sync_cnt2 <= sync_cnt2 + 1'b1;
end
always @(posedge DA_WCLK or negedge RST_N)
begin
  if(!RST_N)
    DA_SYNC2_r <= 1'b0;
  else if(sync_cnt2 < 6'd1)
    DA_SYNC2_r <= 1'b1;
  else
    DA_SYNC2_r <= 1'b0;
end
assign  DA_SYNC2 = DA_SYNC2_r;
reg  adr_en2;
always @(posedge DA_WCLK or negedge RST_N)
begin
  if(!RST_N)
    adr_en2 <= 1'b0;
  else if(sync_cnt2==6'd20)
    adr_en2 <= 1'b1;
  else
    adr_en2 <= 1'b0;
end
wire [5:0] adr_rom2;
reg  [5:0] adr_rom_r2;
//wire [11:0] DA_data2;


reg[1:0] out_st2;
reg[15:0] high_cnt2;
always @(posedge DA_WCLK or negedge RST_N)
begin
  if(!RST_N)
   begin
    adr_rom_r2 <= 6'd0;
    out_st2 <= 2'b00;
    high_cnt2 <= 16'd0;
   end
  else
    case(out_st2)
      2'b00:begin
               if(adr_en2 && adr_rom_r2<6'd59 )
                   adr_rom_r2 <= adr_rom_r2 + 1'b1;
               else if(adr_rom_r==6'd59)
                 begin
               
                   out_st2 <= 2'b01;
                 end
               else
                   adr_rom_r2 <= adr_rom_r2;
             end
       2'b01:begin
                adr_rom_r2 <= 6'd59;
                if(high_cnt2==16'd59999)
                 begin
                   out_st2 <= 2'b10;
                   high_cnt2 <= 16'd0;
                 end
                else
                 begin
                   high_cnt2 <= high_cnt2 + 1'b1;
                   out_st2 <= 2'b01;
                 end
             end
        2'b10:begin
               if(adr_en2 && adr_rom_r>6'd0 )
                   adr_rom_r2 <= adr_rom_r2 - 1'b1;
               else if(adr_rom_r==6'd0)
                 begin
                   out_st2 <= 2'b11;
                 end
               else
                   adr_rom_r2 <= adr_rom_r2;
             end
         2'b11:begin
                adr_rom_r2 <= 6'd0;
                if(high_cnt2==16'd59999)
                 begin
                   out_st2 <= 2'b00;
                   high_cnt2 <= 16'd0;
                 end
                else
                 begin
                   high_cnt2 <= high_cnt2 + 1'b1;
                   out_st2 <= 2'b11;
                 end
             end
         default: out_st2 <= 2'b00;
         endcase
end
assign   adr_rom2 = adr_rom_r2;
rom3   rom3_inst(
               .address(adr_rom2),
               .clock(rom_clk),
               .q(DA_data2)
               );
reg  DA_DIN2_r;
reg [4:0] st2;
always @(posedge DA_WCLK or negedge RST_N)
begin
  if(!RST_N)
    begin
      DA_DIN2_r <= 1'b0;
      st2 <= 5'd0;
    end
  else
    begin
       case(st2)
          5'd0:begin
                 if(DA_SYNC2_r==1'b1)
                   begin
                     DA_DIN2_r <= 1'b0;//16
                     st2  <= 5'd1;
                   end
                  else
                     st2 <= 5'd0;
                 end
           5'd1:begin DA_DIN2_r <= 1'b0; st2 <= 5'd2;end//15
           5'd2:begin DA_DIN2_r <= 1'b0; st2 <= 5'd3;end//14
           5'd3:begin DA_DIN2_r <= 1'b0; st2 <= 5'd4;end//13
           5'd4:begin DA_DIN2_r <= 1'b0; st2 <= 5'd5;end//12
           5'd5:begin DA_DIN2_r <= 1'b0; st2 <= 5'd6;end//11
           5'd6:begin DA_DIN2_r <= 1'b0; st2 <= 5'd7;end//10
           5'd7:begin DA_DIN2_r <= 1'b0; st2 <= 5'd8;end//9
           5'd8:begin DA_DIN2_r <= 1'b0; st2 <= 5'd9;end//8
           5'd9:begin DA_DIN2_r <= 1'b0; st2 <= 5'd10;end//7
           5'd10:begin DA_DIN2_r <= DA_data2[5]; st2 <= 5'd11;end//6
           5'd11:begin DA_DIN2_r <= DA_data2[4]; st2 <= 5'd12;end//5
           5'd12:begin DA_DIN2_r <= DA_data2[3]; st2 <= 5'd13;end//4
           5'd13:begin DA_DIN2_r <= DA_data2[2]; st2 <= 5'd14;end//3
           5'd14:begin DA_DIN2_r <= DA_data2[1]; st2 <= 5'd15;end//2
           5'd15:begin DA_DIN2_r <= DA_data2[0]; st2 <= 5'd0;end//1
           default st2 <= 5'd0;
           endcase
    end  
end
assign  DA_DIN2 = DA_DIN2_r;
endmodule

出0入0汤圆

 楼主| 发表于 2014-4-13 18:13:05 | 显示全部楼层

额 没啥电路图 其实 就一个DA,加了个RC滤波,悲催的是RC滤波 还不管用,难道是R和C参数选取问题,我的截止频率已经很低了。。

出0入0汤圆

 楼主| 发表于 2014-4-13 18:16:53 | 显示全部楼层
lans0625 发表于 2014-4-13 16:27
上代码看看。。。。

2.5V和50MV的代码几乎一样,没怎么改,应该不是程序问题。。附上2。5V的波形,,模拟电路好长时间没碰了,多数忘了。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-4-13 21:03:45 | 显示全部楼层
好一个梯形波

出0入0汤圆

发表于 2014-4-15 08:49:25 | 显示全部楼层
2.5V的波形很好。50mv 可能是干扰太大
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表