VHDL程序在4位递增计数器中最多可计数10。。。。?
为了数到7,我在0到10之间为我做了很多。它没有显示任何错误,但从0000到1111计数VHDL程序在4位递增计数器中最多可计数10。。。。?,vhdl,Vhdl,为了数到7,我在0到10之间为我做了很多。它没有显示任何错误,但从0000到1111计数 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_signed.all; entity counter is port(CLK, CLR : in std_logic; output : inout std_logic_vector(3 downto 0)); end counter; a
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
entity counter is
port(CLK, CLR : in std_logic;
output : inout std_logic_vector(3 downto 0));
end counter;
architecture archi of counter is
signal tmp: std_logic_vector(3 downto 0);
begin
process (CLK, CLR)
variable i: integer:=0;
begin
if (CLR='1') then
tmp <= "0000";
elsif (clk = '1') then
for i in 0 to 6 loop
tmp <= tmp + 1;
end loop;
end if;
您能建议一下怎么做吗?…对不起,英语语法错误需要在一个时钟边缘操作
因为您的计数器端口中有clk,我们可以假设您希望计数器计数与时钟同步
你在两个时钟边缘上操作
end process;
output <= tmp;
end architecture;
应该是
elsif (clk = '1') then
for i in 0 to 6 loop
tmp <= tmp + 1;
end loop;
或
这些示例使用clk的上升沿。在IEEE-1076.6 IEEE VHDL寄存器标准下,不能合成使用两个时钟边缘的东西
传输级RTL合成。这不是公认的计时方法
制作模10计数器
假设您希望计数器从0变为9,并将其翻转
elsif rising_edge(clk) then
应该是
elsif (clk = '1') then
for i in 0 to 6 loop
tmp <= tmp + 1;
end loop;
这模拟了一个同步负载,它优先于由外部“状态”识别器驱动的增量。通过异步清除,它将模拟74163 4位计数器,外部4输入门识别1001并产生同步并行负载信号加载0000
loop语句有什么问题
如图所示的循环过程将导致一个增量,并在1111处产生如您所描述的反向翻转。您可以删除用于。。。环和端环;语句,它的行为将相同。每个驱动程序的一个信号只有一个计划未来更新,并且一个进程为其分配的每个信号只有一个驱动程序。所有循环迭代都发生在同一clk事件中。tmp在循环完成后的下一个模拟周期内不会得到更新,并且它的赋值在所有循环迭代中都是相同的,表达式tmp+1。最后一个循环迭代赋值将是实际发生的赋值,它赋值的值将是相同的
当计数器为状态驱动状态时,不需要使用循环语句≃ tmp。不需要i表示的附加状态。For循环的工作方式与您认为的不同。重写代码并删除for循环。
if tmp = "1001" then # binary 9
tmp <= (others => '0'); # equivalent to "0000"
else
tmp <= tmp + 1;
end if;