文章总览:YuanDaiMa2048博客文章总览
【数字电路与逻辑设计】实验二 计数器
一、实验内容
用 VHDL 语言实现计数状态连续的模值为 2N的计数器。这是一个同步清零的 4 为二进制加计数器,其计数的状态是从“0000~1111”进行变化。整个的计数周期是 16 个时钟周期,即 24个时钟周期。凡是这种技术周期为 2N且对计数状态无特殊要求的计数器,可以通过直接定义 N 位的计数信号和端口,对信号进行加或减操作,而不必进行计数状态的判断和控制。使用波形图进行仿真。
二、设计过程
本次代码的编写,是从4位二进制计数出发,利用清零端rst来进行循环计数。过程中使用if语句,当计数信号为“1111”时,计数信号r_counter再重零开始计数。这样可以达到计数效果。
三、源代码
(一)代码说明:
① clk:cp时钟脉冲信号,上升沿触发。
② rst:输入,清零端。
③ Z:输出,输出计数结果,即经过了几个cp时钟脉冲。
④ 本次设置的每次计数循环为16个为一个周期,每次计数信号r_counter加1,在每次cp上升沿到来时将计数值赋给输出Z;在计数信号为“1111”后,计数信号r_counter再重零开始计数。
(二)代码内容:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter is
port(clk:in std_logic;
rst:in std_logic;
Z:out std_logic_vector(3 downto 0));
end entity;
architecture behave of counter is
signal r_counter:std_logic_vector(3 downto 0);
begin
process(clk,rst)
begin
if(rst='1')then
r_counter<="0000";
elsif(clk'event and clk='1')then
if(r_counter="1111")then
r_counter<="0000";
else
r_counter<=r_counter+1;
end if;
end if;
end process;
Z<=r_counter;
end architecture behave;
四、仿真验证与实验结果
(一)波形图
(二)波形图说明
图中,利用clk表示cp时钟脉冲,周期设置为10.0ns(起始值为0);rst表示清零端(此处保持为低电平,不启用);Z表示为计数输出。
(三)实验结果
如图所示,当cp的周期过一次,计数则加一,在经历了16个周期后,又从0开始计数。证明可以实现计数效果。