❀工信工实验参考——《VHDL实验2——数码管及分频器》

这篇具有很好参考价值的文章主要介绍了❀工信工实验参考——《VHDL实验2——数码管及分频器》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一般来说,我贴上来的代码都是能直接跑的,如果不行可以邮箱交流1902946954@qq.com

仅供参考,微机的老师讲的很好,所以请还是要先自己完成咯。
免责声明,本人菜只因一只,内容仅供参考,错了不负责哈

该实验和报告部分参考了ZhouzhouFighting的报告(链接华南理工大学VHDL实验数码管与分频器_vhdl数码管扫描频率-讲义代码类资源-CSDN下载),但是因为我们EDA实验室换成了正点原子新起点V2开发板,因此在数码管输出和前面的输入等部分做了一定的修改与调整。 

实验二  数据管及分频器

地          点:

      31    楼

   312房;

实验台号:

实验日期与时间:

评    分:

预习检查纪录:

批改教师:

报告内容:

一,实验要求:

(1)利用硬件描述语言设计分频器模块和七段显示码模块;

(2)学习数码管驱动芯片74HC595的时序,请同学根据时序写出VHDL代码;

(3)设计数据产生模块,每秒输出数字加1;

  1. 设计顶层文件,驱动数码管模块,使(3)产生数据显示在数码管上。

二、实验内容:

预期顶层逻辑图

vhdl数码管显示,VHDL实验,嵌入式硬件,单片机,fpga开发,经验分享,学习方法 

(因为更换了开发板,因此最后输出应该改为输出seg_duan 和seg_wei)

三、实验设计原理

本次实验一共分为三个模块,分别为divider,data_gen, seg。Divider负责把开版本的时钟频率变为我们计时需要用的1HZ频率;data_gen负责计数;seg负责与数码管显示连接的接口,输出位码与段码。

接下来一一分析实现的逻辑与代码:

  1. Divider模块
Library IEEE;
Use IEEE.std_logic_1164.ALL;
ENTITY class2_driver IS
PORT(clk,rst:IN std_logic;
     q:OUT std_logic);
END ENTITY;
ARCHITECTURE behav of class2_driver IS
SIGNAL time:integer :=1;
BEGIN
PROCESS(clk,rst)
BEGIN
IF rst='0' THEN time<=1;
ELSIF rising_edge(clk) THEN
     time<=time+1;
IF time=50000000 THEN
q<='1';
time<=1;
ELSE q<='0';
END IF;
END IF;
END PROCESS;
END behav;

开发板的时钟频率为50MHZ,查阅文献可知,人眼能够分辨的最高频率为24HZ。开发板的时钟频率远远超出人眼分辨范围,因此需要对时钟信号进行分频处理,以便后续计时模块产生的输出到数码管上可被人眼分辨。题目要求分频器模块时钟周期为1HZ,在代码实体中设置一个范围为1-50M的信号count,当count≥25M时分频器输出为‘1’,反之输出为’0’,当count=50M时,count=1。以此编程得到的输出时钟信号频率为1HZ,每1s产生一个上升沿。

        2.data_gen模块

Library IEEE;
Use IEEE.std_logic_1164.ALL;
use ieee.std_logic_signed.all;
ENTITY class2_counter IS
PORT(rst,en,clk,clk_1HZ: IN std_logic;
     data:OUT std_logic_vector(15 DOWNTO 0)
);
END entity;
ARCHITECTURE behav of class2_counter IS
SIGNAL temp:std_logic_vector(15 DOWNTO 0):=(others=>'0');
SIGNAL TEST:std_logic:='0';
BEGIN
PROCESS(clk,rst)
BEGIN
IF en='0' THEN TEST<='1';END IF;
IF TEST='0' THEN temp<=(others=>'0');
elsif rst='0' THEN  TEST<='0';temp<=(others=>'0');
ELSIF rising_edge(clk) THEN
IF clk_1HZ='1' THEN temp<=(temp+1);
END IF;
END IF;
data<=temp;
END PROCESS;
END behav;

题目要求数据产生模块,每秒输出数字加1,且数码管可显示16进制数,故data-gen模块的输出为一个16位二进制信号。该模块以divider模块输出的1HZ信号为时钟,模块内部有一信号q,当时钟上升沿到来时q=q+1。当q为’FFFF’时,q复位。最后将q值赋给data_gen模块的输出data。

3.seg模块(这是老师提供的verilog写的,我改的VHDL找不到了,凑合凑合吧能用)

module Verilog1(
			clk,rst_n,
			idis_data,
			seg_duan,seg_wei
		);

input clk;	
input rst_n;
input [15:0] idis_data ;

output     reg[7:0] seg_duan;
output 	reg[5:0] seg_wei;

parameter 	SEG_NUM0 	= 8'hc0,
			SEG_NUM1 	= 8'hf9,
			SEG_NUM2 	= 8'ha4,
			SEG_NUM3 	= 8'hb0,
			SEG_NUM4 	= 8'h99,
			SEG_NUM5 	= 8'h92,
			SEG_NUM6 	= 8'h82,
			SEG_NUM7 	= 8'hF8,
			SEG_NUM8 	= 8'h80,
			SEG_NUM9 	= 8'h90,
			SEG_NUMA 	= 8'h88,
			SEG_NUMB 	= 8'h83,
			SEG_NUMC 	= 8'hc6,
			SEG_NUMD 	= 8'ha1,
			SEG_NUME 	= 8'h86,
			SEG_NUMF 	= 8'h8e;

parameter	SEG_WE0		= 6'b11_1110,
			SEG_WE1		= 6'b11_1101,
			SEG_WE2		= 6'b11_1011,
			SEG_WE3		= 6'b11_0111,
SEG_WE4		= 6'b10_1111,
	SEG_WE5		= 6'b01_1111;

reg[3:0] seg_num;
reg[7:0] cnt_4;	
always @(posedge clk or negedge rst_n)
	if(!rst_n) cnt_4 <= 8'd0;
	else cnt_4 <= cnt_4+1'b1;
always @(posedge clk or negedge rst_n)
	if(!rst_n) seg_num <= 8'h00;
	else 
		case(cnt_4[7:6])
				2'b00: seg_num <= idis_data[3:0];
				2'b01: seg_num <= idis_data[7:4];
				2'b10: seg_num <= idis_data[11:8];
				2'b11: seg_num <= idis_data[15:12];
			default:  ;
			endcase

always @(posedge clk or negedge rst_n)
	if(!rst_n)seg_duan <= 8'hff;

	else
		case(seg_num) 
			4'h0: seg_duan <= SEG_NUM0;
			4'h1: seg_duan <= SEG_NUM1;
			4'h2: seg_duan <= SEG_NUM2;
			4'h3: seg_duan <= SEG_NUM3;
			4'h4: seg_duan <= SEG_NUM4;
			4'h5: seg_duan <= SEG_NUM5;
			4'h6: seg_duan <= SEG_NUM6;
			4'h7: seg_duan <= SEG_NUM7;
			4'h8: seg_duan <= SEG_NUM8;
			4'h9: seg_duan <= SEG_NUM9;
			4'ha: seg_duan <= SEG_NUMA;
			4'hb: seg_duan <= SEG_NUMB;
			4'hc: seg_duan <= SEG_NUMC;
			4'hd: seg_duan <= SEG_NUMD;
			4'he: seg_duan <= SEG_NUME;
			4'hf: seg_duan <= SEG_NUMF;
		default:	 ;
		endcase
		
always @(cnt_4[7:6])
	case(cnt_4[7:6])
			2'b00: seg_wei <= SEG_WE0;
			2'b01: seg_wei <= SEG_WE1;
			2'b10: seg_wei <= SEG_WE2;
			2'b11: seg_wei <= SEG_WE3;
		default:  seg_wei <= 6'b0000_00;
		endcase
endmodule

首先对于数码管显示,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的。

因此我们应该用不断扫描的方法来点亮数码管。

输出的段码和位码分别控制数码管在第几位显示和显示什么数字。在每次时钟上升沿时会重新读入扫描来重新显示。具体实现方法为:

Data_gen会将数字的二进制传入seg,seg会将其按每四位拆分开,将最低4位的位码设为0,即在最低位的数码管显示,具体显示的数字遍历七段码列表匹配后,按七段码输出段码。其他位以此类推。

此外,设置复位信号rst_n。当复位信号为低电平时,设计的模块中的输出和计时信号全部复位。设置复位信号是为了异步复位,达到重新计数的目的。

  1. 实例化

将上述代码设为顶层实体,并且create symbol files for current file来创立元件,在新建的bpf文件中可直接使用。下图为三个实例化元件:

vhdl数码管显示,VHDL实验,嵌入式硬件,单片机,fpga开发,经验分享,学习方法

图1 分频器

vhdl数码管显示,VHDL实验,嵌入式硬件,单片机,fpga开发,经验分享,学习方法

图2 计数器data_gen

vhdl数码管显示,VHDL实验,嵌入式硬件,单片机,fpga开发,经验分享,学习方法

图3 seg数码管接口模块

并且最后按照对应线路将其连接完整,如图4所示:

vhdl数码管显示,VHDL实验,嵌入式硬件,单片机,fpga开发,经验分享,学习方法

图4 完整接线图

  1. 烧录至开发板

我们将bpf文件设为顶层文件并且编译,编译成功后,按照图5分配引脚后再次编译,并将文件烧录至正点原子新起点V2开发板。

vhdl数码管显示,VHDL实验,嵌入式硬件,单片机,fpga开发,经验分享,学习方法

图5 实验2 引脚分配图(这个老师会给的)

四、实验结果和分析

vhdl数码管显示,VHDL实验,嵌入式硬件,单片机,fpga开发,经验分享,学习方法

图6 计数初始化

vhdl数码管显示,VHDL实验,嵌入式硬件,单片机,fpga开发,经验分享,学习方法

图7 计数实物图

由图6我们可以看到按下reset键数码管开始从0计时,由图7可以看到数码管能够正常计数,残留未能完全消影但是不影响使用。文章来源地址https://www.toymoban.com/news/detail-718569.html

到了这里,关于❀工信工实验参考——《VHDL实验2——数码管及分频器》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实验八 键盘扫描及数码管显示实验

    1)学习了解键盘扫描的基本原理。 2)掌握通过并行接口芯片对键盘进行扫描并在多位数码管显示数字的方法。 编写程序,实现如下功能: 初始时数码管无显示; 第一次按下键盘时,在 最右侧数码管显示对应的十六进制数字 ; 以后每次按下键盘,则将 当前显示的数字全部

    2024年02月09日
    浏览(31)
  • 单片机实验六 动态数码管实验

    1.熟悉实验软件和硬件,进行正确的接线; 2.编程使得数码管排依次显示01234567 1.Keil uVision4 2.PZISP自动下载软件 3.HC6800S开发板 动态数码管实验整体图 通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电

    2024年02月09日
    浏览(32)
  • 实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计

    源文件的链接放在最后啦 实验目的: (1) 熟悉7段数码管显示译码电路的设计。 (2) 掌握数码管显示原理及静态、动态扫描电路的设计。 实验任务: (1) 基本任务1:利用FPGA硬件平台上的4位数码管做静态显示,用SW0-3输入BCD码,用SW4-7控制数码管位选; (2) 基本任务

    2024年02月07日
    浏览(42)
  • <微机原理>[汇编语言]-[实验七]数码管动态显示实验

    实验一 软件开发环境和简单程序设计 实验二 I_O输入输出实验 实验三 键盘扫描显示实验 实验四 中断实验 实验五 定时器实验 实验六 串行口实验 实验七 数码管动态显示实验 实验八 矩阵键盘应用实验 实验九 电子时钟 微机原理实验课程,会陆续根据目录更新文章 掌握LED八段

    2024年02月07日
    浏览(31)
  • 二、19【FPGA】数码管动态显示实验

    学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。 学习视频:是根据野火FPGA视频教程——第二十二讲 https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3 “天下武功唯快不破”    “看到的不一定为真” 眼睛的视觉暂留:光信号传入大脑需要短暂时间,

    2023年04月08日
    浏览(29)
  • 【数电实验】实验 5 数码管动态扫描显示电路设计

    【2023-11-16:修改Y为4位宽,支持显示学号8和9】 实验要求 一、实验目的 1. 学习动态扫描显示数码管的使用。 2. 学习数据选择器及其信号分配方法。 3. 巩固 Verilog HDL 层次化设计电路的方法。 利用modelsim仿真 模块代码 1.modelsim仿真代码 2.程序源代码 RTL电路图 验收波形图 引脚

    2024年02月03日
    浏览(37)
  • 可编程逻辑器件之数码管显示实验

    一、实验目标 能够熟练的进行可编程逻辑器件开发,能够通过具体工程需求进行需求分析、模块划分、代码编写、功能仿真、综合分析、板级验证,能够独立正确的进行实验操作,培养学生的工程实践研究能力和动手实践能力,具备借助可编程逻辑器件开发平台和仿真工具科

    2024年02月02日
    浏览(94)
  • verilog学习笔记- 15)动态数码管显示实验

    目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证: 由于一般的静态驱动操作虽然方便,但占用的 I/0 口较多,例如要驱动6 位 8 段数码管,以静态驱动方式让数码管各个位显示不同的数值,如“123456”,需要占用6 × 8 = 48个I/O 口,虽然对于 FPGA 这种 I/O 口较多的芯片

    2024年02月07日
    浏览(34)
  • FPGA基本实验之数码管的动态显示

            关于数码管的基本知识大家可以参考我上一篇文章数码管的静态显示,         使用 1ms 的刷新时间让六个数码管轮 流显示:第 1ms 点亮第一个数码管,第 2ms 点亮第二个数码管,以此类推依次点亮六个数 码管,6ms 一个轮回,也就是说每个数码管每 6ms 点亮

    2024年02月08日
    浏览(28)
  • FPGA基本实验之数码管的静态显示

    此实验基于FPGA征途pro开发板实现, 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数一般分为七 段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显 示)。当然也还有一些其他类型的数码管如“N”形管、“米”字管

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包