EDA实验:可变模计数器
文档包括错误程序分析和正确程序及其注释。通过拨码开关SW1,SW0实现计数器模值的选择,可选的模值有12进制、24进制、30进制、60进制。
First.vhdl 原版本程序以及错误分析
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY houmingzhen051 IS PORT(
CLK:IN STD_LOGIC; M1,M0:IN STD_LOGIC;
A:OUT INTEGER RANGE 0 TO 60; --在这里混淆了数据对象和变量的定义
B,C:OUT INTEGER RANGE 0 TO 9; --A原意指计数数据,B,C分别表示计数数值的十位和个位,本应是过程变量
DATA_OUT1,DATA_OUT2:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) --定义两个标准逻辑矢量,分别作为两位数码管的输入 );
END houmingzhen051;
ARCHITECTURE beh OF houmingzhen051 IS BEGIN
PROCESS(CLK) --这里应该有分频,使得计数时长为1S
IF CLK'EVENT AND CLK=1 THEN ELSIF(M0=0 AND M1=0) THEN IF(A>11) THEN A:=0;
ELSIF(A=11) THEN A:=0;
ELSE A:=A+1; END IF
ELSIF(M0=0 AND M1=1) THEN IF(A>23) THEN A:=0;
ELSE(A=23) THEN A:=0;
ELSE A:=A+1;
END IF;
ELSIF(M0=1 AND M1=0) THEN IF(A>29) THEN A:=0;
ELSIF(A=29) THEN A:=0
ELSE A:=A+1; END IF;
ELSIF(M0=1 AND M1=1) THEN IF(A>59) THEN A:=0;
ELSIF(A=59) THEN A:=0;
ELSE A:A+1; END IF; END IF;
B:A REM 10; C:=A/10; case B is
when 0 DATA_OUT<=\这里改出了问题
when 1 DATA_OUT<=\ when 2 DATA_OUT<=\ when 3 DATA_OUT<=\ when 4 DATA_OUT<=\ when 5 DATA_OUT<=\ when 6 DATA_OUT<=\ when 7 DATA_OUT<=\ when 8 DATA_OUT<=\ when 9 DATA_OUT<=\ end case; case C is
when 0 DATA_OUT<=\ when 1 DATA_OUT<=\ when 2 DATA_OUT<=\ when 3 DATA_OUT<=\ when 4 DATA_OUT<=\ when 5 DATA_OUT<=\ when 6 DATA_OUT<=\ when 7 DATA_OUT<=\ when 8 DATA_OUT<=\ when 9 DATA_OUT<=\ end case;
END PROCESS(CLK);
--由于编译一直出问题,反复修改最后也把 END beh; --总的来说,问题主要是变量定义错误、缺少时钟分频函数
Newversion.vhdl 修改版本及程序详细注释
LIBRARY IEEE; --库资源同时声明以下3个,可以省去很多麻烦
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY houmingzhen051 IS --以下部分是可变模计数器的实体说明,描述外部接口情况 PORT ( CLK: IN STD_LOGIC; --50MHZ时钟输入 CLOCK_50 引脚:PIN_N2 M0: IN STD_LOGIC; --M0,M1分别指拨码开关SW0和SW1的输入 引脚:PIN_N25 PIN_N26 M1: IN STD_LOGIC;
DATA_OUT1,DAT_OUT2: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --作为数码管显示输入
END ENTITY houmingzhen051;
ARCHITECTURE BEHAV OF houmingzhen051 IS --以下部分是结构体说明
SIGNAL CLK_1HZ: STD_LOGIC; --这里CLK_1Hz是分频时钟信号 BEGIN TEMP1:
PROCESS(CLK) VARIABLE CNT1:INTEGER:=0;
VARIABLE CNT2:INTEGER:=24999999;
BEGIN --以下语句CNT1从0加到25MHz,在50MHz的时钟下需要0.5s
IF CLK'EVENT AND CLK='1' THEN --然后CLK_1HZ取反,上升沿加下降沿正好等于一个时钟周期=1s
IF (CNT1 = CNT2) THEN --从而得到分频时钟信号 CNT1:=0;
CLK_1HZ<=NOT CLK_1HZ; ELSE
CNT1:=CNT1+1; END IF; END IF;
END PROCESS TEMP1; TEMP2:
PROCESS(CLK_1HZ)
VARIABLE C:INTEGER:=0; --这里定义过程变量 C表示计数值,F,E分别表示计数值的十位和个位 VARIABLE E:INTEGER:=0; VARIABLE F:INTEGER:=0; BEGIN
IF(CLK_1HZ'EVENT AND CLK_1HZ='1') THEN
IF ( M0='0' AND M1='0') THEN --SW0和SW1都是低电平时为12进制计数器 IF (C=11) THEN --计数值到11时,计数值C重新置0 C:=0; ELSE C:=C+1; END IF;
ELSIF ( M0='0' AND M1='1') THEN IF (C=23) THEN C:=0; ELSE C:=C+1; END IF; ELSIF ( M0='1' AND M1='0') THEN IF (C=29) THEN C:=0; ELSE C:=C+1; END IF;
ELSIF ( M0='1' AND M1='1') THEN IF (C=59) THEN C:=0; ELSE C:=C+1; END IF;
E:= C REM 10; F:= C / 10; CASE E IS WHEN 0=>DATA_OUT1<=\ WHEN 1=>DATA_OUT1<=\ WHEN 2=>DATA_OUT1<=\ WHEN 3=>DATA_OUT1<=\ WHEN 4=>DATA_OUT1<=\ WHEN 5=>DATA_OUT1<=\ WHEN 6=>DATA_OUT1<=\ WHEN 7=>DATA_OUT1<=\ WHEN 8=>DATA_OUT1<=\ WHEN 9=>DATA_OUT1<=\
--从0计到11,得到12进制计数器 --SW0=0,SW1=1的时候为24进制计数器 --SW0=1,SW1=0的时候为30进制计数器 --SW0=1,SW1=1,的时候为60进制计数器 --求计数值的个位 --求计数值的十位 --显示个位译码操作 WHEN OTHERS=>DATA_OUT1<=\ END CASE;
CASE F IS --显示十位译码操作 WHEN 0=>DATA_OUT2<=\ WHEN 1=>DATA_OUT2<=\ WHEN 2=>DATA_OUT2<=\ WHEN 3=>DATA_OUT2<=\ WHEN 4=>DATA_OUT2<=\ WHEN 5=>DATA_OUT2<=\ WHEN 6=>DATA_OUT2<=\ WHEN 7=>DATA_OUT2<=\ WHEN 8=>DATA_OUT2<=\ WHEN 9=>DATA_OUT2<=\
WHEN OTHERS=>DATA_OUT2<=\ END CASE; END IF; END IF;
END PROCESS; END BEHAV;
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典教育范文EDA实验:可变模计数器在线全文阅读。
相关推荐: