如何关闭fpga开发板上的led和fpga数码管动态显示常亮

频道本月排行
随机推荐文章
Copyright (C) 2006 - 2016 www.eorder.net.cn
All Rights Reserved您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于DE2-115开发板的FPGA入门设计实验剖析.doc 26页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
基于DE2-115开发板的FPGA入门设计实验
Lab1: 4位加法器、减法器的设计
在文件add_sub里面的工程文件operation_4.v为顶层文件,该顶层文件包含了三个子模块,分别为数码管显示模块,4位带进位的二进制加法器模块和4位带借位的二进制减法器模块,最后通过DE2-115开发板显示实验结果。
add_4bits.v 加法器
module adder_4bits
input clk,
input rst_n,
input [3:0] x,
input [3:0] y,
reg [3:0] sum,
always@(posedge clk or negedge rst_n)
if(!rst_n)
{carry_out, sum} &= 0;
{carry_out, sum} = x +
substractor_4bits.v减法器
module subtractor_4bits
input clk,
input rst_n,
input [3:0] x,
input [3:0] y,
output reg [3:0] sub,
output reg
borrow_out
always@(posedge clk or negedge rst_n)
if(!rst_n)
{borrow_out, sub} &= 0;
if(x &= y)
{borrow_out, sub} = {1'b0, x - y};
{borrow_out, sub} = {1'b1, x - y};
3)seg7_lut.v 数码管显示译码模块
module Seg7_lut
[3:0] iDIG,
output reg [6:0] oSEG
always @(iDIG)
case(iDIG)
4'h1: oSEG = 7'b1111001; // ---t----
4'h2: oSEG = 7'b0100100;
4'h3: oSEG = 7'b0110000;
4'h4: oSEG = 7'b0011001;
4'h5: oSEG = 7'b0010010;
// ---m----
4'h6: oSEG = 7'b0000010;
4'h7: oSEG = 7'b1111000;
4'h8: oSEG = 7'b0000000;
4'h9: oSEG = 7'b0011000;
// ---b----
4'ha: oSEG = 7'b0001000;
4'hb: oSEG = 7'b0000011;
4'hc: oSEG = 7'b1000110;
4'hd: oSEG = 7'b0100001;
4'he: oSEG = 7'b0000110;
4'hf: oSEG = 7'b0001110;
4'h0: oSEG = 7'b1000000;
本设计通过Verilog HDL硬件描述语言。描述加法、减法算法,包括了进位以及借位,最终可以在实验板上观察结果,验证了算法的正确性。拨码开关SW[7:0]输入两位计算值,SW[17]为复位按键,如下图所示:
该实验结果显示的是7+b=02,进位位在LEDG[0]显示,7-b=12,借位位在LEDR[0]显示。计算过程如下:
Lab2: 三位二进制乘法器的设计
在文件mult_3bits里面的工程文件operation_4.v为顶层文件,该顶层文件包含了两个子模块,分别为数码管显示模块和三位二进制乘法器模块,最后通过DE2-115开发板显示实验结果。
mult_3bits.v 乘法器
module mult_3bits
input [2:0] x,
input [2:0] y,
[5:0] mult_out
wire [2:0] temp0 = y[0] ? x : 3'
正在加载中,请稍后...fpga开发板上的4组数码管在没有被select的时候如何保持自身的数值?
[问题点数:20分,结帖人delacroix_xu]
fpga开发板上的4组数码管在没有被select的时候如何保持自身的数值?
[问题点数:20分,结帖人delacroix_xu]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|欢迎访问博客,Kevin希望通过博客记录下自己在学习FPGA过程中的点点滴滴,使其成为自己一段美好的回忆。^_^
数码管在我们的整个设计中,我们输入的数据与计算的结果都需要用数码管来显示,所以说数码管还是扮演着很重要的角色的。
1.1简析数码管的工作原理
关于数码管的工作原理,为了照顾零基础的朋友,Kevin还是再进行下简单的介绍,如果是已经了解了数码管工作原理的朋友可以直接跳过这一节。
下面我们先来一张数码管的图片:
数码管是由多个发光二极管封装在一起组成的“8”字型器件,各发光二极管已经在器件内部完成连线。
对于数码管,有共阴极和共阳极之分,共阳极及共阴极数码管内部间的连线可以简化成下图:
图中的“COM”相当于是一个片选信号,例如,共阳极的位选“COM”为高时,即选中了该数码管,此时数码管才能工作起来。当“COM”选通之后,我们就可以选通相应的段选信号使数码管显示我们想要的字符了。比如说,我们想让数码管显示一个“0”(假设数码管是共阳极的),那我们相应的h~a的十六进制代码应为0xc0。
以下是共阴极与共阳极数码管的0~f编码(顺序是为h~a):
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
1.2让数码管走起来
在这一节中,我们来做这样的一个小练习,Kevin也是想通过这样的一个小练习来让大家基本掌握数码管的工作原理,同时也了解如何使用FPGA来驱动数码管。
先说一下实验要求:数码管从0~9循环计数,变化时间的间隔为1S。
首先,咱们先画一个该设计的简单的逻辑框图:
图中“Div_cnt”模块在1s计时到了之后,就让div_flag这个信号拉高一个时钟周期。“Seg_ctrl”为数码管控制模块,产生位选sel信号及数码管的显示字符信号seg,显然我们的seg信号的变化需要根据div_flag这个信号来控制。
下面可以根据我们的这个逻辑图框图来写代码了。
首先来写div_cnt这个模块:
/********************************************************************
Name: div_cnt
* Engineer
* Function : 1s计数模块
* Blog Website : http://dengkanwen.com
********************************************************************/
module div_cnt(
input wire
//系统时钟为50MHz,即周期为20ns
input wire
output reg
CNT_END = 26'd; //1s计时结束
reg [25:0]
always @(posedge sclk or negedge s_rst_n)
if(s_rst_n == 1'b0)
cnt &= 26'd0;
else if(cnt == CNT_END)
cnt &= 26'd0;
cnt &= cnt + 1'b1;
always @(posedge sclk or negedge s_rst_n)
if(s_rst_n == 1'b0)
div_flag &= 1'b0;
else if(cnt == CNT_END)
div_flag &= 1'b1;
div_flag &= 1'b0;
接下来,我们来写数码管的控制模块,在写控制模块之前,我们需要来看一下我们的电路原理图:
咱们先来简单的说一下这个数码管电路。电路图中总共有6位数码管,所以呢就有6个位选控制端,而这6个位选控制端是和三极管连在一块的,看着三极管的连法,应该知道,数码管是属于共阳极的。然而这6个数码管的位选是由3-8译码器来控制的,下面咱们再看一下3-8译码器与数码管位选端的连线图:
连线图已经出来了,可能有些朋友还不太清楚3-8译码器的原理,那咱们再来一张3-8译码器的真值表:
结合电路图及真值表,咱们可以看出,我们可以控制译码器的A、B、C这三个引脚来控制输出端Y电平的高低,从而就可以来控制我们数码管的位选端。例如,我们想让位选信号为S1的那个数码管工作起来,那我们就必须要先使之位选端有效,则需要使Y0的输出为低,所以我们ABC的信号应该为000.
在Kevin讲完之后,相信大家对咱们这个数码管电路的工作原理应该了解的差不多了。
我们只是让一个数码管亮起来,那我们索性也就只让位选信号为s1的那个数码管工作,其余数码管不工作。下面咱们就动手来写数码管控制模块的代码:
/********************************************************************
* Module Name : seg_ctrl
* Engineer : Kevin
* Function
: 数码管显示控制模块
* Blog Website : http://dengkanwen.com
*********************************************************************/
module seg_ctrl(
input wire
input wire
input wire
output wire [2:0] sel,
//位选控制,连3-8译码器
output reg [7:0] seg
//段选信号
//========================共阳极数码管编码=========================================
//0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
//=================================================================================
parameter ZERO = 8'hc0,
ONE = 8'hf9,
TWO = 8'ha4,
THREE = 8'hb0,
FOUR = 8'h99,
FIVE = 8'h92,
SIX = 8'h82,
SEVEN = 8'hf8,
EIGHT = 8'h80,
NINE = 8'h90;
reg [3:0] num_
//用于寄存当前数码管应显示的值
always @(posedge sclk or negedge s_rst_n)
if(s_rst_n == 1'b0)
num_cnt &= 4'd0;
else if(num_cnt == 4'd9 && div_flag == 1'b1)
num_cnt &= 4'd0;
else if(div_flag == 1'b1)
num_cnt &= num_cnt + 1'b1;
case(num_cnt)
seg &= ZERO;
seg &= ONE;
seg &= TWO;
seg &= THREE;
seg &= FOUR;
seg &= FIVE;
seg &= SIX;
seg &= SEVEN;
seg &= EIGHT;
seg &= NINE;
assign sel = 3'b000;
这两个模块写好了之后,下面咱们再写一个顶层模块,用于连接两个模块之间的连线。
/********************************************************************
* Module Name : seg_top
* Eneigneer : Kevin
* Function : 数码管0~9变换顶层模块
* Blog Website : http://dengkanwen.com
*********************************************************************/
module seg_top(
input wire
input wire
output wire [2:0] sel,
output wire [7:0] seg
div_cnt_inst(
//系统时钟为50MHz,即周期为20ns
(s_rst_n),
(div_flag)
seg_ctrl seg_ctrl_inst(
(s_rst_n),
(div_flag),
//位选控制,连3-8译码器
//段选信号
虽然Kevin对于这种简单的设计还是比较有自信的,但是为了教给大家一个良好的设计习惯,咱们还是进行仿真,所以接下来咱们来写一个仿真文件。 当然在仿真的时候,我们可以将div_cnt中的cnt计满的值写小一点。
`timescale 1ns/1ns
module tb_seg_
wire [2:0]
wire [7:0]
initial begin
s_rst_n &= 0;
s_rst_n &= 1;
always #5 sclk = ~
seg_top_inst(
.s_rst_n (s_rst_n),
下面是咱们的仿真波形:
根据咱们的波形,可以说暂时是没有发现错误的,当然,Kevin下板子后也是板子也能正常工作。
1.3数码管进阶
数码管能实现0~9之间的跳转之后,下面我们来实现数码管从0~99变化,间隔的时间依然是1S。
在我们进行这个实验的时候,我们必须要清楚,这次的实验,我们需要用到2位数码管。在我们做0~9这个实验的时候,大家应该清楚,对于数码管,我们一次只能选通一个数码管,那我们又怎么能实现是两位数码管同时显示呢?
这里的道理很简单,虽然我们一次只能选通一个数码管的位选,但是由于有视觉停留效果,所以只要我们两位数码管之间的位选信号切换的速度达到了一定程度,超过了我们肉眼能分辨出来的频率,那我们眼睛看到的效果就是两个数码管在同时亮着。既然说到这了,那我们就定义位选信号之间变化的频率为1KHz。
对于这个实验,我们可以依然利用上面已经写好了的代码,只需要修改seg_crtl这个模块,在其中增加些许代码就OK了。那到底需要增加哪部分的代码呢?我们先来分析一下:首先肯定是需要有一个1KHz的“分频”部分,再有就是需要控制好seg,在选通第一位数码管时,我们需要将第一位数码管需要显示的字符赋给seg,选通第二数码管时需将第二位数码管应显示的字符赋给seg。
那接下来就来写代码:
/********************************************************************
* Module Name : seg_ctrl
* Engineer : Kevin
* Function : 数码管显示控制
* Blog Website : http://dengkanwen.com
v1.0 - initial release
v1.1 - 数码管从0~99显示
*********************************************************************/
module seg_ctrl(
input wire
input wire
input wire
output wire [2:0] sel,
//位选控制,连3-8译码器
output wire [7:0] seg
//段选信号
//========================共阳极数码管编码=========================================
//0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
//=================================================================================
parameter ZERO = 8'hc0,
ONE = 8'hf9,
TWO = 8'ha4,
THREE = 8'hb0,
FOUR = 8'h99,
FIVE = 8'h92,
SIX = 8'h82,
SEVEN = 8'hf8,
EIGHT = 8'h80,
NINE = 8'h90,
CNT_END = 4_9999;
//1KHz计满
//CNT_END = 4;
//1KHz计满 (用于仿真)
reg [15:0] cnt_1k;
reg [3:0] num_cnt_g;
//用于寄存当前数码管应显示的值
reg [3:0] num_cnt_s;
reg [7:0] seg_g;
//个位数码管显示
reg [7:0] seg_s;
//十位数码管显示
//1KHz频率标志
always @(posedge sclk or negedge s_rst_n)
if(s_rst_n == 1'b0)
cnt_1k &= 16'd0;
else if(cnt_1k == CNT_END)
cnt_1k &= 16'd0;
cnt_1k &= cnt_1k + 1'b1;
always @(posedge sclk or negedge s_rst_n)
if(s_rst_n == 1'b0)
flag_1k &= 1'b0;
else if(cnt_1k == CNT_END)
flag_1k &= ~flag_1k;
//num_cnt_g
always @(posedge sclk or negedge s_rst_n)
if(s_rst_n == 1'b0)
num_cnt_g &= 4'd0;
else if(num_cnt_g == 4'd9 && div_flag == 1'b1)
num_cnt_g &= 4'd0;
else if(div_flag == 1'b1)
num_cnt_g &= num_cnt_g + 1'b1;
//num_cnt_s
always @(posedge sclk or negedge s_rst_n)
if(s_rst_n == 1'b0)
num_cnt_s &= 4'd0;
else if(div_flag == 1'b1 && num_cnt_g == 4'd9 && num_cnt_s == 4'd9)
num_cnt_s &= 4'd0;
else if(div_flag == 1'b1 && num_cnt_g == 4'd9)
num_cnt_s &= num_cnt_s + 1'b1;
case(num_cnt_g)
seg_g &= ZERO;
seg_g &= ONE;
seg_g &= TWO;
seg_g &= THREE;
seg_g &= FOUR;
seg_g &= FIVE;
seg_g &= SIX;
seg_g &= SEVEN;
seg_g &= EIGHT;
seg_g &= NINE;
case(num_cnt_s)
seg_s &= ZERO;
seg_s &= ONE;
seg_s &= TWO;
seg_s &= THREE;
seg_s &= FOUR;
seg_s &= FIVE;
seg_s &= SIX;
seg_s &= SEVEN;
seg_s &= EIGHT;
seg_s &= NINE;
assign sel = (flag_1k == 1'b1) ? 3'b101 : 3'b100;
assign seg = (flag_1k == 1'b1) ? seg_g : seg_s;
模块代码写好了之后,我们还是需要先进行仿真,这里的话,Kevin就不把仿真的的结果截图了,仿真就留给大家自己完成了。
我们现在来个板子上的效果截图:
至此,咱们的这个实验就完成了。
1.让数码管依次显示“I
FPGA”,从左至右循环显示,滚动速度为1s滚动一次。
(备注:如果有发现内容错误,请大家及时指出,Kevin的QQ:)
转载请注明: &
or分享 (0)下次自动登录
现在的位置:
& 综合 & 正文
【连载】【FPGA黑金开发板】Verilog HDL那些事儿–数码管封装(十六)
声明:本文为原创作品,版权归akuei2及黑金动力社区()共同所有,如需转载,请注明出处
5.2 实验十五:数码管封装
5.1”“两位数码管”,去完成驱动的设计,但是在建模的过程中,我也付出许多昂贵的逻辑资源,因为在设计中涉及了“求余和除法”的数学符号。
”而已,如果换做是“六位数码管”的封装动作,实验七的设计思路当然是行不通的。所以在这一章的实验,我们要充分的使用Verilog HDL”来简化数码管的封装工作。
smg_interface.v Number_Sig 24Number_Sig
|4ideads1302
24'h123456, 11 10
smg_encode_module.v 0~F smg_control_module.v
smg_scan_module.v smg_interface.v
Number_Sig
24'h123456
T1smg_control_module.v
Number_Sig[23:20]
smg_encode_module.vsmg_scan_module.v
T2smg_control_module.v
Number_Sig[19:16]
smg_encode_module.vsmg_scan_module.v
T3smg_control_module.v
Number_Sig[15:12]
smg_encode_module.vsmg_scan_module.v
T4smg_control_module.v
Number_Sig[11:8]
smg_encode_module.vsmg_scan_module.v
T5smg_control_module.v
Number_Sig[7:4]
smg_encode_module.vsmg_scan_module.v
T6smg_control_module.v
Number_Sig[3:0]
smg_encode_module.vsmg_scan_module.v
smg_interface.v
smg_control_module.v
111ms15~23 1ms 27~63rNumber28 Number_Data6739~611ms
Number_Data
smg_encode_module.v
smg_encode_module.v
smg_scan_module.v
”的概念,而是简化至仅有“列扫描”。第101ms14~221mssmg_control_module.v 1mssmg_scan_module.v 1ms38~600
smg_interface.v
实验十五说明:
Number_Sig
实验十五结论:
key_interface.v
smg_interface.v
实验十五演示:
”。演示中会建立一个名为 demo_control_module.v
24'h000000 ~ 24'h999999
smg_interface.v
demo_control_module.v
8~24100ms10100ms14~22
26~74rNum 24'h000000 27rNumber Number_Sig78100ms
rNum 4143~694”。
rNum24'h000009100msrNum +1 44if rNum[3:0]rNum[7:4] +1 rNum 24'h000010
67~69rNum 24'h999999 24'h000000
Number_Sig
rNumber Number_Sig rNum
Number_Sig i 1~7”的关系,会使得 Number_Sig rNum”以后,再赋值与rNumberrNumber Number_Sig ( 72)
smg_interface_demo.v
smg_interface _demo.v ”是一样的。自己看着办吧。
实验十五演示说明:
smg_interface.v ,
实验十五演示结论:
【上篇】【下篇】

我要回帖

更多关于 fpga 七段数码管 的文章

 

随机推荐