搜索
bottom↓
回复: 13

VHDL求助,高手帮我看下这段代码中警告。

[复制链接]

出0入0汤圆

发表于 2010-4-21 23:53:02 | 显示全部楼层 |阅读模式
这段代码功能没问题,但有30多警告,大概是寄存器之类的警告,有没有隐患?

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity PUL is
        port(
             rest            : in STD_LOGIC:='0';      
             cen           : in STD_LOGIC:='0';
             jEN        : in STD_LOGIC:='0';   
             clk                     : in std_logic;
             yd    : in integer range 0 to 8000;       
             sout     : out integer range 0 to 8000;
             sd             : in integer range 0 to 8000);      
          
end PUL;

architecture ep2c8 of PUL is
signal scounter :integer range 0 to 8000;
begin

process (clk,cen,rest,yd)
begin
if (rest='1')then
scounter <=yd;
sout <=1000;
elsif (clk'event and clk='1')AND (rest='0')then
   if (cen='1')then
                if(sd /= scounter)AND(jEN='0')AND(sd >100) then
                scounter <=scounter -1;
                elsif (jEN='1')AND(scounter<8000)then       
                scounter <=scounter+1;
                else
                scounter <=scounter;
                end if;       
                sout<=scounter;                                                                                                                                                                                                   
        end if;
else
null;
end if;       
end process;

end ep2c8;

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

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

出0入0汤圆

发表于 2010-4-22 00:06:50 | 显示全部楼层
1.端口不要用整型,用std_logic_vector
2.不要给端口赋初值,没有任何意义
3.elsif (clk'event and clk='1')AND (rest='0')then ,这一句的AND (rest='0')明显多余,可以去掉

出0入0汤圆

 楼主| 发表于 2010-4-22 08:11:37 | 显示全部楼层
多谢楼上兄弟  1.端口不要用整型,用std_logic_vector 为什么啊?用整的话我比较方便,因为最大值的问题。

另外主要是想消除警告。
说明 器件选MAXII没警告 用EP2C时就有了

出0入0汤圆

发表于 2010-4-22 10:44:14 | 显示全部楼层
回复【楼主位】40130064
-----------------------------------------------------------------------

这个VHDL程序好乱!作者是新手!要多练习啊!写HDL程序每句或每部分最好自已知道最终综合成什么样子!如果你自已都模糊不清
别指望综合器给你综合成最好最优化正确的电路!每次写完后你最好看看综合后的RTL,对逻辑电路是不是多了不该有的latch,对时序电路是不是多出了register......
多实践多比较!

出0入0汤圆

 楼主| 发表于 2010-4-22 11:26:58 | 显示全部楼层
回复【3楼】jangyouhua
-----------------------------------------------------------------------

你帮我搞个啊,这个其实是一个受CLK周期变化梯形数据输出 说简单点就是一个梯形加减速控制电机的程序

关键是这部分不能少rest实际上是一个单脉冲,出现时scounter <=yd;  
if (rest='1')then
scounter <=yd;
就是要在rest到来时给scounter一个初始值

出0入0汤圆

 楼主| 发表于 2010-4-22 11:37:31 | 显示全部楼层

(原文件名:未命名.JPG)

出0入0汤圆

 楼主| 发表于 2010-4-22 15:31:36 | 显示全部楼层
新手问题你们老手帮解决下啊!~~~~~~~~~~~~~~~~~~~~

其实这是一个多驱动源 就是CLK和REST 同时控制scounte,你们就给我装高手吧

出0入0汤圆

发表于 2010-4-22 15:56:28 | 显示全部楼层
回复【2楼】40130064
多谢楼上兄弟  1.端口不要用整型,用std_logic_vector 为什么啊?用整的话我比较方便,因为最大值的问题。
另外主要是想消除警告。
说明 器件选MAXII没警告 用EP2C时就有了

-----------------------------------------------------------------------

如果端口定义为整形,请问管脚时从怎么约束?
你可以定义一个整型信号,最后输出给端口时转换一下,用conv_std_logic_vector(int,n),其中int为整型信号,n为位数

出0入0汤圆

 楼主| 发表于 2010-4-22 16:31:03 | 显示全部楼层
回复【7楼】zkf0100007
-----------------------------------------------------------------------

明白了点 谢谢 不过这个模块不设计管脚约束,因为它是中间的

这个转换函数我一直没用过 conv_std_logic_vector(int,n) 学习下!

出0入0汤圆

发表于 2010-4-22 17:03:37 | 显示全部楼层
回复【8楼】40130064
回复【7楼】zkf0100007  
-----------------------------------------------------------------------
明白了点 谢谢 不过这个模块不设计管脚约束,因为它是中间的
这个转换函数我一直没用过 conv_std_logic_vector(int,n) 学习下!
-----------------------------------------------------------------------
不管是否顶层模块,都不推荐实用整型作为端口

出0入0汤圆

 楼主| 发表于 2010-4-23 14:34:50 | 显示全部楼层
自己顶上去  找高手帮忙

rest是一个脉冲,就是要(rest='1') 将yd值给scounter,寄存。同时 clk上升沿时控制scounter加减


当然rest上升沿时将yd值给scounter寄存是最好的,当时我这么想,可是水平有限,因为两个信号同时控制一个,明显涉及多驱动源的方法。

出0入0汤圆

发表于 2010-4-23 21:37:50 | 显示全部楼层
麻烦楼主找一本VHDL的书浏览一下。

出0入0汤圆

发表于 2010-4-24 09:42:30 | 显示全部楼层
我再来说一下为什么不能把端口定义成整数。
有一些书中的一些小程序把端口定义成integer类型,我也按照这个做过,但是仿真出来的结果是0to100的数竟然占用101个端口,竟然是one-hot编码。其实我觉得这和编译器有关的,估计人们都不用integer定义,编译器也不干了。

出0入0汤圆

 楼主| 发表于 2010-4-24 14:01:55 | 显示全部楼层
回复【12楼】dongzhiqing
-----------------------------------------------------------------------
我晕了 你们别误会 我的主要问题不是端口问题 端口integer类型不是我发明的!!我从书上学的!!只是没人告诉我用这个的利弊.


主要问题是这个

rest是一个脉冲,就是要(rest='1') 将yd的值给scounter寄存。同时 clk上升沿时控制scounter加减
当然rest上升沿时将yd值给scounter寄存是最好的,当时我这么想,可是水平有限,因为两个信号同时控制一个我实在写不出。

这几行代码最终的功能没问题 正常!在硬件上跑没出问题。我是想改进下,因为整个工程就这地方有警告,至于前面有人说RTL级,我没这水平,也没这时间。

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

本版积分规则

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

GMT+8, 2024-7-24 17:25

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

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