VHDL求助,高手帮我看下这段代码中警告。
这段代码功能没问题,但有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; 1.端口不要用整型,用std_logic_vector
2.不要给端口赋初值,没有任何意义
3.elsif (clk'event and clk='1')AND (rest='0')then ,这一句的AND (rest='0')明显多余,可以去掉 多谢楼上兄弟1.端口不要用整型,用std_logic_vector 为什么啊?用整的话我比较方便,因为最大值的问题。
另外主要是想消除警告。
说明 器件选MAXII没警告 用EP2C时就有了 回复【楼主位】40130064
-----------------------------------------------------------------------
这个VHDL程序好乱!作者是新手!要多练习啊!写HDL程序每句或每部分最好自已知道最终综合成什么样子!如果你自已都模糊不清
别指望综合器给你综合成最好最优化正确的电路!每次写完后你最好看看综合后的RTL,对逻辑电路是不是多了不该有的latch,对时序电路是不是多出了register......
多实践多比较! 回复【3楼】jangyouhua
-----------------------------------------------------------------------
你帮我搞个啊,这个其实是一个受CLK周期变化梯形数据输出 说简单点就是一个梯形加减速控制电机的程序
关键是这部分不能少rest实际上是一个单脉冲,出现时scounter <=yd;
if (rest='1')then
scounter <=yd;
就是要在rest到来时给scounter一个初始值 http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_548347.JPG
(原文件名:未命名.JPG) 新手问题你们老手帮解决下啊!~~~~~~~~~~~~~~~~~~~~
其实这是一个多驱动源 就是CLK和REST 同时控制scounte,你们就给我装高手吧 回复【2楼】40130064
多谢楼上兄弟1.端口不要用整型,用std_logic_vector 为什么啊?用整的话我比较方便,因为最大值的问题。
另外主要是想消除警告。
说明 器件选MAXII没警告 用EP2C时就有了
-----------------------------------------------------------------------
如果端口定义为整形,请问管脚时从怎么约束?
你可以定义一个整型信号,最后输出给端口时转换一下,用conv_std_logic_vector(int,n),其中int为整型信号,n为位数 回复【7楼】zkf0100007
-----------------------------------------------------------------------
明白了点 谢谢 不过这个模块不设计管脚约束,因为它是中间的
这个转换函数我一直没用过 conv_std_logic_vector(int,n) 学习下! 回复【8楼】40130064
回复【7楼】zkf0100007
-----------------------------------------------------------------------
明白了点 谢谢 不过这个模块不设计管脚约束,因为它是中间的
这个转换函数我一直没用过 conv_std_logic_vector(int,n) 学习下!
-----------------------------------------------------------------------
不管是否顶层模块,都不推荐实用整型作为端口 自己顶上去找高手帮忙
rest是一个脉冲,就是要(rest='1') 将yd值给scounter,寄存。同时 clk上升沿时控制scounter加减
当然rest上升沿时将yd值给scounter寄存是最好的,当时我这么想,可是水平有限,因为两个信号同时控制一个,明显涉及多驱动源的方法。 麻烦楼主找一本VHDL的书浏览一下。 我再来说一下为什么不能把端口定义成整数。
有一些书中的一些小程序把端口定义成integer类型,我也按照这个做过,但是仿真出来的结果是0to100的数竟然占用101个端口,竟然是one-hot编码。其实我觉得这和编译器有关的,估计人们都不用integer定义,编译器也不干了。 回复【12楼】dongzhiqing
-----------------------------------------------------------------------
我晕了 你们别误会 我的主要问题不是端口问题 端口integer类型不是我发明的!!我从书上学的!!只是没人告诉我用这个的利弊.
主要问题是这个
rest是一个脉冲,就是要(rest='1') 将yd的值给scounter寄存。同时 clk上升沿时控制scounter加减
当然rest上升沿时将yd值给scounter寄存是最好的,当时我这么想,可是水平有限,因为两个信号同时控制一个我实在写不出。
这几行代码最终的功能没问题 正常!在硬件上跑没出问题。我是想改进下,因为整个工程就这地方有警告,至于前面有人说RTL级,我没这水平,也没这时间。
最后只能用计数器清零的写法.
页:
[1]