2976|6

208

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

FPGA的分频问题的求助 [复制链接]

本帖最后由 tangjianyuan 于 2015-3-5 15:14 编辑

大家好,请问各位FPGA大神们,想问一下大家这个多频率怎么编写啊,这是一款EEPROM存储芯片,要求输入如下面频率信号。
图中电源电压VCC=3.3V,R1 = 1×(1±10%)KΩ,R2 = 1×(1±10%)KΩ,C1 = 30×(1±10%)pF。输入信号F0 = 1MHz,F1 = F0/2,F2 = F1/2,F3 = F2/2,F4 = F3/2,F5 = F4/2,F6 = F5/2,F7 = F6/2,F8 = F7/2,F9 = F8/2,F10 = F9/2,F11 = F10/2,F12 = F11/2,F13 = F12/2,F14 = F13/2,F15 = F14/2,F16 = F15/2,FC0 = 500KHZ。请问F0,F1,F2,F3,F4,F5,,,的频率怎么分。

时钟频率由外部clk0产生50MHZ的晶振,从CLK0输入到CPLD芯片内部,但现在我有点不知道怎么把50HMZ的频率,每次都二分频,给到不同的地址上去,百度过,想到用二分频的方法,由于小弟对FPGA不很会用,只是在学校学习过VHDL语言,有些语法还不太会用。请大神们指点一下。下面是我预先写的一个程序,在处理地址上的不同频率,还不太对。望指点一下感激不尽。
module VDEE5M40VS(clk_in,cs,led,rest,address);

input clk_in,rest;
output [2:0] led;
output [16:0] address;
output cs;

reg cs;
reg clk_out;
reg clk_500k;
reg [2:0] led;
reg [49:0] j;    // 1MHZ counter data
reg [99:0] k;    // 500khz counter data
reg [31:0] count1;
reg [31:0] num;
reg [16:0] address;
reg [35:0] count2;
parameter N=36;

initial
begin
  count1 <=32'h0000_0000;
       count2<=32'h0000_0000;
       num<= 32'h0000_0000;
       led<= 3'hf0;
       cs<=1'b0;
       address<= 17'h0000_0000;
end


always @(posedge clk_in)
begin
     if(count2==N/2-1)  // 50MHZfrequency  counter number 50  generate 1MHZ
              begin
               clk_out <=!clk_out;
               count2 <=0;
              end
              else
              count2<= count2+1'b1;

end
/*******************************************************************
                LED Control 1s 闪烁
********************************************************************/

always @(posedge clk_in)
   begin
      if(num == 32'd50000000)
       begin
           led[0]<=~led[0];      
           num<=32'b0;   
        end
       else
       begin
           num <= num +1'b1;
      end
end
/********************************************************************
                  address  control 这里的多频率/2,加载到不同的地址线上,不知改如何处理
**********************************************************************/
always@(posedge clk_out)
begin
  if(count1 <= 32'd50)
       begin
           if(count1 %2 ==1'b1)
           begin
               //we <= 1'b1;
               //oe <= 1'b1;
          address <= address+1'b1;
            end
       elsebegin
               //we <= 1'b1;
              // oe <= 1'b1;
          address <= address;
                     end
            count1 <=count1+1'b1;
       end
       elsebegin
          led [2] <= ~led [2];
              count1<= 32'h0000000;
              address<=17'h000000;

       end        
end
/********************************************************************
                  generate 500kHZ frequency
**********************************************************************/
always @(posedge clk_in) //50MHZ clk 时钟信号产生 500KHZ信号
begin
   if(k==100)    //500KHZ=50MHZ/100
        begin
         k <=0;
         clk_500k <=~clk_500k;
        end

end
/********************************************************************
                  chip cs0  control
**********************************************************************/   
always @(posedge clk_500k)
begin
  if(led[2] <=1'b0)
       begin
       cs<= ~cs;
       end
       else
       cs<= 1'b1;

end
endmodule



IC测试QQ群(111938408




此帖出自FPGA/CPLD论坛

最新回复

这段代码只是为了得到一个2MHz的时钟信号。 clk_div最后直接例化到地址线就可以了。如果还是不明白可以Q我(717213469)   详情 回复 发表于 2015-3-6 19:36
点赞 关注
个人签名人要学会逆流而上,适者生存
 

回复
举报

755

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
本帖最后由 deweyled 于 2015-3-5 23:39 编辑

不知道你是不是需要这样的波形


0信号为1MHz
附参考代码

Test.v
  1. module Test(
  2. sys_clk,
  3. sys_rst,
  4. div_clk
  5. );

  6. input           sys_clk;
  7. input           sys_rst;
  8. output  [15:0]  div_clk;

  9. reg             clk_2mhz;
  10. reg     [15:0]  clk_2mhz_count;

  11. reg     [15:0]  s_div_clk;

  12. always @(posedge sys_clk or negedge sys_rst)begin
  13.     if(!sys_rst)begin
  14.         clk_2mhz <= 1'b0;
  15.         clk_2mhz_count <= 16'd0;
  16.     end
  17.     else begin
  18.         if(clk_2mhz_count == 16'd24)begin
  19.             clk_2mhz <= 1'b1;
  20.             clk_2mhz_count <= 16'd0;            
  21.         end
  22.         else begin
  23.             clk_2mhz <= 1'b0;
  24.             clk_2mhz_count <= clk_2mhz_count + 16'd1;            
  25.         end
  26.     end
  27. end

  28. always @(posedge clk_2mhz or negedge sys_rst)begin
  29.     if(!sys_rst)begin
  30.         s_div_clk[0] <= 1'b0;
  31.     end
  32.     else begin
  33.         s_div_clk[0] <= ~s_div_clk[0];
  34.     end
  35. end

  36. always @(posedge s_div_clk[0] or negedge sys_rst)begin
  37.     if(!sys_rst)begin
  38.         s_div_clk[1] <= 1'b0;
  39.     end
  40.     else begin
  41.         s_div_clk[1] <= ~s_div_clk[1];
  42.     end
  43. end

  44. always @(posedge s_div_clk[1] or negedge sys_rst)begin
  45.     if(!sys_rst)begin
  46.         s_div_clk[2] <= 1'b0;
  47.     end
  48.     else begin
  49.         s_div_clk[2] <= ~s_div_clk[2];
  50.     end
  51. end

  52. always @(posedge s_div_clk[2] or negedge sys_rst)begin
  53.     if(!sys_rst)begin
  54.         s_div_clk[3] <= 1'b0;
  55.     end
  56.     else begin
  57.         s_div_clk[3] <= ~s_div_clk[3];
  58.     end
  59. end

  60. endmodule
复制代码

Test_tb.sv
  1. module Test_tb();

  2. reg             sys_clk;
  3. reg             sys_rst;
  4. wire  [15:0]    div_clk;


  5. Test test_inst(
  6. .sys_clk(sys_clk),
  7. .sys_rst(sys_rst),
  8. .div_clk(div_clk)
  9. );

  10. initial begin
  11.     sys_clk <= 1'b0;
  12.     sys_rst <= 1'b0;
  13.     #100ns;
  14.     sys_rst <= 1'b1;
  15. end

  16. always #10ns sys_clk<=~sys_clk;

  17. endmodule
复制代码


此帖出自FPGA/CPLD论坛
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

板凳
 
先用50MHz分频做个2MHz,然后用2MHz去驱动一个17位的计数器累加,把这计数器的17位输出出去,分别就是F0~F16了。
不过EEPROM这样驱动对不对俺搅得有些疑问:
1、FC0是F0的2分频,F0不就没用了吗?是否FC0应常为低电平?
2、RDY/BUSY脚似不应接地,应悬空才对。
此帖出自FPGA/CPLD论坛

点评

[attachimg]190162[/attachimg] 我是把这个EEPROM芯片按照手册的真值表,置成了读的模式,其实我是要把这个芯片去做老化试验,我是这想的,我把芯片置成读的模式,然后就给芯片加入不同的激励信号,至于输出什么  详情 回复 发表于 2015-3-6 12:43
 
 
 

回复

208

帖子

3

TA的资源

纯净的硅(初级)

4
 
版主这么晚还没睡啊,谢谢您的回复,从仿真图看是这样的,越到后面的地址频率越低,我看了你的代码,你后面几s_div_clk[0],s_div_clk[1],s_div_clk[1],都是在前一个时钟二分频,把上取反一个时钟的作为下一个时钟的输入,我想问这样的话我十一七根地址线,那不是要写17次这样的取反操作,还有你取反后的信号怎么加到对应的地址上去,还是没搞明白。
always @(posedge sys_clk or negedge sys_rst)begin
    if(!sys_rst)begin
        clk_2mhz <= 1'b0;
        clk_2mhz_count <= 16'd0;
    end
    else begin
        if(clk_2mhz_count == 16'd24)begin
            clk_2mhz <= 1'b1;
            clk_2mhz_count <= 16'd0;            
        end
        else begin
            clk_2mhz <= 1'b0;
            clk_2mhz_count <= clk_2mhz_count + 16'd1;            
        end
    end
end
这里有的理解不过来,你放在是做一个地址计数吧,
你能在用文字讲一下思路吗?其实我这一张器件的寿命老炼图,我那张原理图上有很多VDEE5m40同样的模块,只是把地址线,控制线全接到CPLD上,再通过Cpld加入激励倒芯片管教上,而加的激励有要求就是上面这个频率要求,现在卡克在怎么精确把这个频率输送的对应的地址管脚,没有搞明白,望在能解释一下。
此帖出自FPGA/CPLD论坛

点评

这段代码只是为了得到一个2MHz的时钟信号。 clk_div最后直接例化到地址线就可以了。如果还是不明白可以Q我(717213469)  详情 回复 发表于 2015-3-6 19:36
个人签名人要学会逆流而上,适者生存
 
 
 

回复

208

帖子

3

TA的资源

纯净的硅(初级)

5
 
仙猫 发表于 2015-3-5 15:58
先用50MHz分频做个2MHz,然后用2MHz去驱动一个17位的计数器累加,把这计数器的17位输出出去,分别就是F0~F16了。
不过EEPROM这样驱动对不对俺搅得有些疑问:
1、FC0是F0的2分频,F0不就没用了吗?是否FC0应常为低电平?
2、RDY/BUSY脚似不应接地,应悬空才对。


我是把这个EEPROM芯片按照手册的真值表,置成了读的模式,其实我是要把这个芯片去做老化试验,我是这想的,我把芯片置成读的模式,然后就给芯片加入不同的激励信号,至于输出什么,IO把它拉死了,也就看不到输出是什么,RDY/BUSY脚真值表中是置成高阻,而接到电源,不对不对,
FC0 为给片选信号加入500KHZ的激励信号,你说的FCO是应该为低电平才有效。

现在遇到,我的FPGA不是很会写,不知道这么多的频率,我怎么放到地址线上去,代码有的不好理解。

我是外接了一个50Mhz的芯片,其实这款芯片内部有个振荡器,频率为3.3~5MHZ,是否用内部晶振更好一些?

























此帖出自FPGA/CPLD论坛

点评

看电路图已大致可以揣摩出,意图是在“读”模式下把存储器的内容循环输出出来。 功能描述时看似有很多种频率,其实只是逐个做2分频,很规律,只需把存储器的地址线接到一个2进制计数器上,让计数器周而复始转就行了  详情 回复 发表于 2015-3-6 13:30
个人签名人要学会逆流而上,适者生存
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

6
 
tangjianyuan 发表于 2015-3-6 12:43
我是把这个EEPROM芯片按照手册的真值表,置成了读的模式,其实我是要把这个芯片去做老化试验,我是这想的,我把芯片置成读的模式,然后就给芯片加入不同的激励信号,至于输出什么,IO把它拉死了,也就看不到输出是什么,RDY/BUSY脚真值表中是置成高阻,而接到电源,不对不对,
FC0 为给片选信号加入500KHZ的激励信号,你说的FCO是应该为低电平才有效。
现在遇到,我的FPGA不是很会写,不知道这么多的频率,我怎么放到地址线上去,代码有的不好理解。
我是外接了一个50Mhz的芯片,其实这款芯片内部有个振荡器,频率为3.3~5MHZ,是否用内部晶振更好一些?
看电路图已大致可以揣摩出,意图是在“读”模式下把存储器的内容循环输出出来。
功能描述时看似有很多种频率,其实只是逐个做2分频,很规律,只需把存储器的地址线接到一个2进制计数器上,让计数器周而复始转就行了。
如用FPGA做也就是写个不断+1的计数器而已,只需1个process,几行字。

●关于FC0
 图中FC0接的是存储器的片选,0有效。如果让FC0也在变,那么当FC0=1时存储器是不输出,是测试不到数据的。

●关于RDY/BUSY
 俺没查到该型号存储器的datasheet,但按常识RDY/BUSY一般是输出脚,接地可能会冲突损坏芯片。另:RDY/BUSY多为开漏输出,上拉电阻后才能看到芯片的状态,不用时可悬空。

此帖出自FPGA/CPLD论坛
 
 
 

回复

755

帖子

0

TA的资源

五彩晶圆(初级)

7
 
tangjianyuan 发表于 2015-3-6 00:23
版主这么晚还没睡啊,谢谢您的回复,从仿真图看是这样的,越到后面的地址频率越低,我看了你的代码,你后面几s_div_clk[0],s_div_clk[1],s_div_clk[1],都是在前一个时钟二分频,把上取反一个时钟的作为下一个时钟的输入,我想问这样的话我十一七根地址线,那不是要写17次这样的取反操作,还有你取反后的信号怎么加到对应的地址上去,还是没搞明白。
always @(posedge sys_clk or negedge sys_rst)begin
    if(!sys_rst)begin
        clk_2mhz



这段代码只是为了得到一个2MHz的时钟信号。
clk_div最后直接例化到地址线就可以了。如果还是不明白可以Q我(717213469)
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表