新手(我)编写模十计数器的过程
一、实体部分,确定输入输出变量
输入变量一定有一个时钟信号,i_sys_clk
系统复位输入:i_sys_rst
以及系统的输出变量output,模十应该是以四位向量的格式输出,故设置变量为逻辑位矢量类型std_logic_vector(3 downto 0)
二、编写结构体部分
重点是:首先需要设置一个信号变量,用于结构的全局部分,以此来计数,因为output只能用于输出,不能在程序中进行赋值或者计算。
判断i_sys_rst信号
记得最后将计数器的暂存值赋给output进行输出
三、计数器代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all; --定义宏指令
entity counter_10 is
generic(
i_mod_value:integer:=9
); --模值设定参数,模值-1
port(
i_sys_clk: in std_logic; --定义时钟输入信号
i_sys_rst: in std_logic; --系统复位信号
output:out std_logic_vector(3 downto 0)--计数器的输出
);
end entity;
architecture behavior of counter_10 is
signal r_counter:std_logic_vector(3 downto 0); --计数值暂存器
begin
process(i_sys_clk,i_sys_rst)
begin
if(i_sys_rst = '1') then --如果系统复位信号为1
r_counter <= "0000"; --计数值归零
elsif(i_sys_clk'event and i_sys_clk = '1') then --如果上升沿来了
if(r_counter = i_mod_value) then --继续判断,如果记满10,那么重新开始计数
r_counter <="0000";
else
r_counter <= r_counter +1; --如果没有记满10,也就是计数器的值=9,那么继续计数
end if;
end if;
end process;
output <= r_counter; --将计数值最后进行输出
end architecture behavior;
四,进行波形仿真,检验程序是否正确
可以看到仿真波形以及计数输出是没有错的。
如果想要改变模值,需要改变一下i_mod_value即可。
ps:小白刚开始学习eda实验,有什么错误还希望各位大佬不吝赐教,感谢!