EDA实验:可变模计数器

2025-08-08

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;


EDA实验:可变模计数器.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:关于社区管理与服务的调研报告 2

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219