rocklet
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2244回复:15

如何实现FPGA的动态重构?

楼主#
更多 发布于:2003-02-22 15:08
举个简单的例子:在FPGA中嵌入任意分频器,并通过I/O端口随时可以更改其分频系数,而不影响其他功能模块的运行,如何实现呢?
请各位高手指教,不胜感激!!

最新喜欢:

dafyelfydafyel...
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-22 20:08
rocklet兄:
    1,首先,通常动态重构是指整个FPGA或所有可改变功能的器件的重构,不知道您所指的是整个FPGA的重构?
  2,如果不是整体重构,实际上就是一个编码器的实现,当有不同的输入参数时,可以改变分频器的分频系数,一个参考实现如下:
    分频器用计数器实现,采用Verilog HDL:
module freq_div(clk, pra, en, divfclk, res);
input res,clk,en; //复位,被分频时钟,分频系数改变使能
input[2:0] pra; //分频系数,最多有8种变化,当然可以有更多
output divclk;

reg[2:0] reg_pra;
reg[2:0] count;  //位数同pra;
always @(posedge clk) begin
  reg_pra = ~res?0:en? pra: reg_pra;
  count = ~res?0:(count==reg_pra)?(count+1):0;
end

//分频,50%占空比
assign divclk = (count>0= && cout<reg_pra[2:1])?1:0;

endmodule
计数器的计数可以有另外一种枚举写法,分频系数可以任意与pra对应。还可以有其它实现方法。此处的示例是我即兴所作,没有验证,谨供参考。
 3,如果是整个FPGA的重构,通过CPU或其它主控器对FPGA进行配置,是另外一个问题,如果是这样,可以继续交流。

    
  
  

    

 
    
rocklet
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-23 12:17
谢谢mengzi兄;
我做了一块ISA接口的FPGA开发板,用作数据采集,想嵌入一些动态重构功能,例如任意分频器,是部分的动态重构;有时间一定向mengzi兄请教整体的动态重构。
汗颜,我只会VHDL开发语言,能否请mengzi兄举一个VHDL的例子?
另外我一直不明白动态重构的硬件结构原理,烦请mengzi兄指教。
再次感谢mengzi兄的回贴 :)
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-26 00:26
rocklet兄:
    很抱歉,对于VHDL,俺只懂个皮毛,从未真正用过。任意分频器通常都是通过计数器来实现的:一种实现的电路是,同步计数器从某个数加载开始计数,计数到指定长度(时间),重新加载开始计数,也就是获取一个时间间隔(长度),每隔一个时间长度(即计数器输出在一个范围)控制一个一个DFFE复位、置位即可。动态的实现,可以是根据加载的启始数变化而改变计数长度(此时计数器计满溢出后加载启始数据),或是加载的启始数为0(即不管加载)而计数到某个时间长度后(计数器不溢出)而控制它从0在开始计数,通常用后一种方法。由于计数的计数长度可以改变,从而任意分频系数和占空比。直接用原理图来实现,应该是不特别复杂的,启始数或终结数就放在由总线IO控制(译码成en信号)的寄存器里,计数器一直在工作,根据计数范围的不同控制DFFE一时为高电平一时为低电平,只有当总线控制时,改变寄存器的值,也就是计数器的启始数或终结数,从而达到计数器计数长度改变的目的。  
henryblue
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2003-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-26 12:49
我的理解:
 动态重构就象一个RAM块,你建立不同的地址就会有不同的数据产生,你在上电后可以改写RAM的值,就会产生不同的对应关系,也就实现了动态重构。
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-26 20:41
rocklet兄:
     你所说的是整个FPGA的动态重构,只有整体配置时才可以,没办法在FPGA的工作过程中改变RAM的局部内容,无论串行、并行与主动、被动配置都必须重新整体配置,对于一些FPGA而言,无论功能发生了什么变化,也无论功能多么简单或复杂,配置文件的大小是不变的,配置过程也必须保证完整性,不能只配置一部分或没有配置完,一旦重新启动配置,RAM中原先的内容都会挥发了,直到返回CONFIGDONE信号。对于局部功能的改变,只有在FPGA中做一个先进编码器。
rocklet
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-03-02 12:40
mengzi兄:
你纠正了我一直以来对动态重构许多误区,在这里小弟要多谢了,小弟还有许多疑问,发email给你在详谈,何如?
rocklet
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-03-02 12:53
感谢henryblue兄的回帖,让小弟我对动态重构有了更清楚的认识
hwzhou
驱动小牛
驱动小牛
  • 注册日期2003-01-28
  • 最后登录2004-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-05 18:07
    对于动态重构,我的理解是:在同一片FPGA中,通过下载不同的配置数据实现不同的功能,至于是局部功能改变,还是全部功能改变,都是可以的。实现这种需要,比如可以由外部CPU在不同的时间段下载不同的配置数据,也可以在外部信号控制下在不同时间下载不同的配置数据加以实现。
    至于您问题中所说的“在FPGA中嵌入任意分频器,并通过I/O端口随时可以更改其分频系数,而不影响其他功能模块的运行,如何实现呢?”,我想实现起来应该更容易,还不能认为是动态重构。
rocklet
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-03-08 13:24
hwzhou兄:
谢谢回帖,您的说法和mengzi兄有共同之处,所谓高手所见略同,对于这个问题我尝试了一些办法如用ram核来存储分频系数等,都不是很理想,不知有什么办法可以实现?敬请赐教
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-03-10 12:15
rocklet兄:
   欢迎来信探讨,俺现在出差在外,没有自己的机器答复您,系数放在ROM表中还是可以的,这是一种方法,根据从IO输入的参数作为ROM的地址让ROM输出您希望的系数。但系数之后仍需接计数器进行分频。
  
hwzhou
驱动小牛
驱动小牛
  • 注册日期2003-01-28
  • 最后登录2004-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-03-12 10:19
我这几天也一直在外面跑,不知道您的分频控制源是什么,如果使用外部CPU等,实际实际上可以很方便通过I/O接口写入您所需的分频比,该分频比需要锁存在FPGA内部的寄存器,并把寄存器的输出作为分频器的输入。您可以随时改变寄存器的数据,从而随时改变分频比。
rocklet
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-19 21:37
今天终于上来了 :D
mengzi兄、hwzhou兄:
辛苦辛苦,二位可要多注意身体了
我是利用ISA总线来实现分频控制的;
如mengzi兄所说,利用ROM的确实现了在线改写分频系数,但有一个缺点:只能利用固化的那些有限的系数;目前正在尝试利用双口RAM来实现真正意义上的“任意分频器”;
还有更简洁优化的实现办法么?
--我现在最怕的是头让我出差,呵呵,多保重了!
hwzhou
驱动小牛
驱动小牛
  • 注册日期2003-01-28
  • 最后登录2004-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-03-21 16:56
您如果是通过ISA总线控制,那应该是比较简单的。通过ISA总线把分频系数锁存在FPGA内部的一个寄存器中,寄存器的输出作为分频器的输入,这样只要每次改变寄存器的值(从总线重新写入数据),就可以改变分频比了。对了,您的“任意分频”不会需要频繁改变分频系数吧?
rocklet
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-03-23 15:18
hwzhou兄:
不会频繁改变分频系数,但是分频系数不是固定的,与测试程序的解算有关。
hwzhou
驱动小牛
驱动小牛
  • 注册日期2003-01-28
  • 最后登录2004-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-03-29 10:29
对于这种方式,实际上可以在FPGA内部设计一组寄存器(大小取决于您的分频位数),每次通过地址信号写入一组数据就可以实现了。
游客

返回顶部