一、实验内容
- 熟悉quartus开发环境
- BCD计数器的实现
- 移位寄存器的实现
- 实验目的
1)熟悉quartus开发环境
2)BCD计数器的实现
3)移位寄存器的实现
三、软件流程(硬件连接)
①新建工程
②创建半加器原理图
③将设计项目设置成可调用的元件
④尝试运行代码
⑤新建文件输出代码的波形
四、代码
1)BCD计数器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; --库程序包使用说明
ENTITY bcd IS
PORT(CLK,RST,EN:IN STD_LOGIC;
LED7SA,LED7SB,LED7SC:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END bcd; --实体说明
ARCHITECTURE behav OF bcd IS --基本结构体
SIGNAL CLK2,FULL,FOUT:STD_LOGIC
SIGNAL A,B,C:INTEGER RANGE 9 DOWNTO 0;
BEGIN
CLK0:PROCESS(CLK)
VARIABLE CNT23:STD_LOGIC_VECTOR(23 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK='1' THEN
CNT23:=CNT23+1;
END IF;
IF CNT23(15)='1' THEN
CLK2<='1';
ELSE CLK2<='0';
END IF;
END PROCESS CLK0;
PROCESS(CLK2,RST,EN) --基本结构体
variable CQ1,CQ2:INTEGER;
BEGIN
IF RST='1' THEN A<=0;B<=0;C<=0; --复位
ELSIF CLK2'EVENT AND CLK2='1' THEN
IF EN='1' THEN
IF A<9 THEN A<=A+1;
ELSE
A<=0;B<=B+1;
IF B=9 THEN
B<=0;C<=C+1;
END IF;
IF C=9 THEN
C<=0;B<=0;A<=0;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(A) --结构体A
BEGIN
CASE A IS --实现CASE语句
WHEN 0 => LED7SA<="1000000";
WHEN 1 => LED7SA<="1111001";
WHEN 2 => LED7SA<="0100100";
WHEN 3 => LED7SA<="0110000";
WHEN 4 => LED7SA<="0011001";
WHEN 5 => LED7SA<="0010010";
WHEN 6 => LED7SA<="0000011";
WHEN 7 => LED7SA<="1111000";
WHEN 8 => LED7SA<="0000000";
WHEN 9 => LED7SA<="0011000";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
PROCESS(B) --结构体B
BEGIN
CASE B IS --实现CASE语句
WHEN 0 => LED7SB<="1000000";
WHEN 1 => LED7SB<="1111001";
WHEN 2 => LED7SB<="0100100";
WHEN 3 => LED7SB<="0110000";
WHEN 4 => LED7SB<="0011001";
WHEN 5 => LED7SB<="0010010";
WHEN 6 => LED7SB<="0000011";
WHEN 7 => LED7SB<="1111000";
WHEN 8 => LED7SB<="0000000";
WHEN 9 => LED7SB<="0011000";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
PROCESS(C) --结构体C
BEGIN
CASE C IS --实现CASE语句
WHEN 0 => LED7SC<="1000000";
WHEN 1 => LED7SC<="1111001";
WHEN 2 => LED7SC<="0100100";
WHEN 3 => LED7SC<="0110000";
WHEN 4 => LED7SC<="0011001";
WHEN 5 => LED7SC<="0010010";
WHEN 6 => LED7SC<="0000011"
WHEN 7 => LED7SC<="1111000";
WHEN 8 => LED7SC<="0000000";
WHEN 9 => LED7SC<="0011000";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END behav;
2)移位寄存器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY shuyiwei IS --调用库、程序包
PORT (
din,clk:IN STD_LOGIC;
dout:OUT STD_LOGIC);
END ENTITY shuyiwei; --实体引用
ARCHITECTURE art OF shuyiwei IS
COMPONENT dff --元件结构体说明
PORT(
d,clk:IN STD_LOGIC;
q:OUT STD_LOGIC);
END COMPONENT;
SIGNAL Z:STD_LOGIC_VECTOR(4 DOWNTO 0); --信号结构体说明
BEGIN
z(0)<=din;dout<=z(4);
g1:FOR i IN 0 TO 3 GENERATE
dffx:dff PORT MAP(z(i),clk,z(i+1));
END GENERATE g1;
END ARCHITECTURE art;
五、实验结果及分析
1)BCD计数器
异步递增二进制计数器递增计数器就是每输入一个脉冲就进行一次加1运算,而二进制计数是输入脉冲个数与自然二进制数有对应关系。异步计数器是在做加1计数时是采取从低位到高位逐位进位的方式工作的。因此其中的各个触发器不是同步翻转的。按照二进制加法计数规则,每一位如果已经是1,则再计入1时应变为0, 同时向高位发出进位信号,使高位翻转。若使用下降沿动作的触发器组成计数器,只要将低位触发 器的Q端接到高位触发器的时钟输入端即可。当低位由 时,Q端的下降沿正好可以作为高位的时钟信号CP。
2)移位寄存器
移位寄存器不仅能寄存数据,而且能在时钟信号的作用下使其中的数据依次左移或右移。四位移位寄存器的原理图如图所示。因为从时钟信号CP的上升沿加到触发器上开始到输出端新状态稳定地建立起来有一段延迟时间,所以当时钟信号同时加到四个触发器上时,每个触发器接收的都是左边一个触发器中原来的数据。寄存器中的数据依次右移一位。