我是VHDL的新手,我想为编码器信号编程一个简单的计数器,每100个周期计数(duh)到1000。我使用莱迪思ispMACH 4000ZE Pico DevKit和软件ispLEVER Classic Project Navigator进行编程。
我的代码是:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use IEEE.std_logic_unsigned.all;
entity Counter_10B is
port (
reset : in std_ulogic := '0';
updown : in std_ulogic := '0';
clk : in std_ulogic := '0';
cnt_out : out std_ulogic_vector(9 downto 0) := (others => '0')
);
end Counter_10B;
architecture behavior of Counter_10B is
signal int_cnt : unsigned(9 downto 0) := (others => '0');
begin
Counter : process(clk, updown, reset)
variable temp1 : unsigned(4 downto 0) := (others => '0');
variable temp2 : unsigned(9 downto 0) := (others => '0');
begin
if (reset = '0') then
temp2 := (others => '0');
end if;
if ((clk'event AND clk='1')) then
temp1 := temp1 + 1;
if(temp1 >= 100) then
if(updown = '0') then
if(temp2 >= 1000) then
temp2 := (others => '0');
end if;
temp2 := temp2 + 1;
elsif(updown = '1') then
if(temp2 = 0) then
temp2 := (others => '1');
end if;
temp2 := temp2 - 1;
end if ;
temp1 := 0;
end if;
int_cnt <= temp2;
end if;
end process;
cnt_out <= std_ulogic_vector(int_cnt);
end behavior;
我的问题是,每次编译时,我都没有任何编译错误,但有很多警告,例如:
对Counter.temp2(0)的所有可达分配赋值为'0';通过优化删除寄存器
或
修剪int_cnt(9 downto 0)的寄存器位9到1
但我最大的问题是:
输入clk / reset / updown未使用
我真的需要最后警告的帮助,我不明白为什么我有这个错误。它没有任何意义,不是吗?
谢谢!
编辑30.09
Counter : process(clk, updown, reset)
variable temp1 : natural range 0 to 100 := 0;
begin
if (reset = '0') then
int_cnt <= (others => '0');
elsif ((clk'event AND clk='1')) then
temp1 := temp1 + 1;
if(temp1 >= 100) then
if(updown = '0') then
if(int_cnt >= 1000) then
int_cnt <= (others => '0');
end if;
int_cnt <= int_cnt + 1;
elsif(updown = '1') then
if(int_cnt = 0) then
int_cnt <= 1000;
end if;
int_cnt <= int_cnt - 1;
end if ;
temp1 := 0;
end if;
end if;
end process;
cnt_out <= std_ulogic_vector(int_cnt);
答案 0 :(得分:3)
更好地使用数据类型! VHDL有一个不错的类型系统:不要忽视它!
而不是
variable temp1 : unsigned(4 downto 0) := (others => '0');
写
variable temp1 : natural range 0 to 31 := 0;
更简单,更清洁,同样得到大多数综合工具的支持。
当你写下
if(temp1 >= 100) then
你可能会抓住你的头并在问题发生之前解决问题......
(应该清楚为什么不使用updown;很遗憾,工具不是非常具体的WHICH信号未被使用。)
只有当你的synth工具限制太强而无法支持这一点时才会妥协,并且只有足够的妥协才能满足有缺陷的工具,并且还会向供应商报告工具缺陷,以便他们能够修复它!
答案 1 :(得分:0)
您的流程不是以通常对合成有效的样式编写的。你需要一个&#34; else&#34;,而不是两个单独的if块:
if (reset = '0') then
temp2 := (others => '0');
elsif (clk'event AND clk='1') then
...
你所写的内容可能在模拟中起作用,但是模拟工具通常按字面意思执行一个过程,如编写的那样,综合工具推断出物理逻辑元素,并且更加挑剔风格。
如果综合工具优化temp2
,则整个过程变得无关紧要,因此输入将不会被使用(因为它们不再连接到任何东西)。