集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: fpgaw

至芯科技【夏宇闻教授专栏】与你一起搞定FPGA设计!

[复制链接]
北极土著 发表于 2011-12-6 11:11:37 | 显示全部楼层
本帖最后由 夏宇闻 于 2011-12-6 13:54 编辑

夏老师,您好,最近使用ise做设计时,状态机总是跑飞,我仔细检查过状态跳转,没有问题。也添加了default语句。

夏老师答:两种情况,1、FSM的外部输入信号与其时钟不同步,使状态跑飞。
2、FSM即使写了default项,但综合指令未规定是否产生强制复位逻辑,所以状态飞出后不能返回。
derksyq 发表于 2011-12-6 22:46:55 | 显示全部楼层
问一下reg wire parameter interger的详细的区别 主要是前两个 最好有用法说明
夏宇闻 该用户已被删除
夏宇闻 发表于 2011-12-7 11:15:23 | 显示全部楼层
问一下reg wire parameter interger的详细的区别 主要是前两个 最好有用法说明
derksyq 发表于 2011-12-6 22:46

夏老师答:
自己看书,书上写得十分清楚。看不明白再提问题。
lanpad 发表于 2011-12-8 09:08:08 | 显示全部楼层
本帖最后由 lanpad 于 2011-12-8 09:09 编辑

夏老师
请问除法是否有计算延迟较小的近似算法?
我要做两个个如下运算:
(1)
这个公式中的开平方根打算用JPL近似算法代替
只是除法该如何计算呢?
结果肯定是一个0到1之间的小数,这该如何表示?
(a、b、c、d均为实时输入的16位整型变量)

(2)
这个公式算平方和似乎更复杂
全用IP核实现的话需要8个乘法器和一个除法器的IP核
且延时特别大


请问夏老师以上两公式是否有延迟不太大的近似算法?
谢谢!

本帖子中包含更多资源

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

x
zombes 发表于 2011-12-8 20:52:20 | 显示全部楼层
本帖最后由 夏宇闻 于 2011-12-9 08:09 编辑

夏老师,写状态机尤其是时序很强的状态机的时候想到一个问题,一段与两段状态机在执行上有没有区别?比如一段式,可能一个case条件下会有多层if else嵌套(现在写了一个4层),这会不会有什么坏处?对于状态机的输出写在if条件下,可否?

夏老师答:状态机的多种型式无本质差别,生成的电路大同小异,只要功能正确,性能达到要求即可。但写状态机的水平高低相差十分巨大,水平高的表达十分清晰,大状态,小状态之间分工明确,产生的电路层次分明,反映了设计者的思路是有层次的,清晰的,反之则是混乱的,漏洞百出的。人的逻辑总结能力是不同的,有相当大的差距,有的人能把极复杂的事情层层分解,有条不纷,而有些人却会把不太复杂的事情搞得一团糟。文字表达的能力也是如此,除了天份之外,还需要学习和实践的锻炼。
夏宇闻 该用户已被删除
夏宇闻 发表于 2011-12-9 05:46:13 | 显示全部楼层
夏老师
请问除法是否有计算延迟较小的近似算法?
我要做两个个如下运算:
(1)
这个公式中的开平方根打 ...
lanpad 发表于 2011-12-8 09:08


用硬件实现高速算法时,通常采用近似算法,只要精度和处理速度满足工程需求即可。我不知道你项目需求的细节,所以很难帮助你敲定,究竟用几位来表示这些数,就能满足需求,平方和的开根号,与求模近似,是否可以改为求绝对值和来近似……,总之近似算法的研究应该在电路设计前进行。
zhshqh 发表于 2011-12-13 10:32:02 | 显示全部楼层
刚开始学verilog,在实践中发现一个现象如下代码所示:

module SWITCH_module(
                                       output reg [63:0] TDM_out,
                                       input CLK8M,
                                       input [2:0] TS_BIT_position,
                                       input [7:0] TDM_in
                                      );

    integer i;

always @(negedge CLK8M)
begin                                                                  
        case(TS_BIT_position)
3'b000  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8] <= TDM_in;
3'b001  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 1] <= TDM_in;
3'b010  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 2] <= TDM_in;
3'b011  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 3] <= TDM_in;
3'b100  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 4] <= TDM_in;
3'b101  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 5] <= TDM_in;
3'b110  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 6] <= TDM_in;        
default  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 7] <= TDM_in;               
                endcase         
end        
endmodule

上面的代码是我想实现的意图,也达到了我想实现的意图,但当我想把其中的CASE语句简写为如下形式时

           for(i = 0; i <= 7; i = i + 1)               
                TDM_out[i*8 + TS_BIT_position] <= TDM_in;

综合出来的结果只有TDM_out[15:0]是和上面相同的,后面的TDM_out[63:16]就不是我想要达到的目的了,请问各位高手,上面这个语句有什么不符合的语法,或者综合器理解不了的问题吗?

收藏 分享
zhshqh 发表于 2011-12-13 10:33:37 | 显示全部楼层
刚开始学verilog,在实践中发现一个现象如下代码所示:

module SWITCH_module(
                                       output reg [63:0] TDM_out,
                                       input CLK8M,
                                       input [2:0] TS_BIT_position,
                                       input [7:0] TDM_in
                                      );

    integer i;

always @(negedge CLK8M)
begin                                                                  
        case(TS_BIT_position)
3'b000  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8] <= TDM_in[i];
3'b001  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 1] <= TDM_in[i];
3'b010  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 2] <= TDM_in[i];
3'b011  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 3] <= TDM_in[i];
3'b100  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 4] <= TDM_in[i];
3'b101  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 5] <= TDM_in[i];
3'b110  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 6] <= TDM_in[i];        
default  :  for ( i = 0; i <= 7; i = i + 1) TDM_out[i*8 + 7] <= TDM_in[i];               
                endcase         
end        
endmodule

上面的代码是我想实现的意图,也达到了我想实现的意图,但当我想把其中的CASE语句简写为如下形式时

           for(i = 0; i <= 7; i = i + 1)               
                TDM_out[i*8 + TS_BIT_position] <= TDM_in[i];

综合出来的结果只有TDM_out[15:0]是和上面相同的,后面的TDM_out[63:16]就不是我想要达到的目的了,请问各位高手,上面这个语句有什么不符合的语法,或者综合器理解不了的问题吗?
qq376784106 发表于 2011-12-14 00:34:51 | 显示全部楼层
本帖最后由 夏宇闻 于 2011-12-14 06:20 编辑

夏老师  您好  我想问下怎么使用VerilogHDL语言做浮点的乘法器和加法器啊

夏老师答:先问是否一定要用浮点的运算器?如果一定要用就用参数化宏模块中相应的浮点运算模块,实例引用即可。如果靠自己一个人用Verilog从基本逻辑编起,恐怕要花几年时间,也未必搞妥,很不现实。
夏宇闻 该用户已被删除
夏宇闻 发表于 2011-12-14 06:11:07 | 显示全部楼层
刚开始学verilog,在实践中发现一个现象如下代码所示:

module SWITCH_module(
                       ...
zhshqh 发表于 2011-12-13 10:33

可能是数组索引问题引起的,你的索引加了一个输入信号,这是一个wire类型的输入,你改一下,用时钟沿把该输入寄存后再做索引的加数。试一试再说。
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-16 05:45 , Processed in 0.068844 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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