实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计

实验三 基于FPGA的数码管动态扫描电路设计

源文件的链接放在最后啦

  1. 实验目的:
    (1) 熟悉7段数码管显示译码电路的设计。
    (2) 掌握数码管显示原理及静态、动态扫描电路的设计。
  2. 实验任务:
    (1) 基本任务1:利用FPGA硬件平台上的4位数码管做静态显示,用SW0-3输入BCD码,用SW4-7控制数码管位选;
    (2) 基本任务2:利用FPGA硬件平台上的4位数码管显示模10计数结果(以1S为节拍);
    (3) 基本任务3:利用FPGA硬件平台上的6位数码管显示模100计数结果(以1S为节拍);
    (4) 拓展任务1:对7448译码结果中的“6”和“9”进行补段;
    (5) 拓展任务2:用按键控制计数器从0-9计数,4位数码管显示计数结果;(注意按键消抖)
    (6) 拓展任务:3:dig_select、decoder和code_select三个模块做波形仿真。(注意输入设置)

基本任务一:利用FPGA硬件平台上的4位数码管做静态显示,用SW0-3输入BCD码,用SW4-7控制数码管位选;

1、实验原理
使用decoder模块控制数码管的显示功能,输入二进制码,输出对应的数码管显示数字。
dig_select模块负责选择哪一个数码管显示数字,add端输入二进制码,如果输入的频率特别高的话,人眼就分辨不出来一个个显示的过程了,看起来就是六个数码管都在亮。

2、电路模块设计
(1)decoder模块
decoder

(2)dig_select模块
dig_select

拓展任务一:对7448译码结果中的“6”和“9”进行补段;

1、电路模块设计
(1)补段后的decoder模块,原本6和9显示的时候会少一段没有显示,加上外部与非门后就可以完整显示了。

基本任务二:利用FPGA硬件平台上的4位数码管显示模10计数结果(以1S为节拍);

1、电路模块设计
(1)fre_div模块(如果不知道原理可以看我的上一篇文章实验二)
fre_div

(2)基本任务一的decoder和dig_select模块(在上面,用那个补过段的)
(3)模六计数器cnt6(实验一里有)
cnt6
(4)整体设计
整体设计

拓展任务二:用按键控制计数器从0-9计数,4位数码管显示计数结果;(注意按键消抖)

1、电路模块设计
(1)按键消抖key_debounce模块
(2)原理
利用D触发器的延时特性,将每一个D触发器(延时不同)的输出端相与,仅当所有D触发器都输出为1的时候,消抖模块才输出为1,这样就可以将按键抖动的部分(有1也有0的部分)跳过,达成消抖的目的。
后面还可以接更多的D触发器,如果效果不好的话。
clk端要接一个500Hz的时钟
消抖
(3)整体设计
接下来就和上面的差不多了。
我这里接了两个消抖模块是因为一个好像效果不太好。

基本任务3:利用FPGA硬件平台上的6位数码管显示模100计数结果(以1S为节拍);

1、电路设计
(1)实验三就有一些复杂了。要实现模100计数结果,我们首先要有一个模100计数器。
cnt100
cnt100

(2)第二个新模块是sec_select模块,之所以这么命名和设计是为了下面的数字电子钟做准备。
这个模块的主要作用是将每一个电子管显示不同的内容,根据基本任务二可知一次只能一个数码管显示一位数字,我们是通过加快频率使得人眼看起来是6个数码管一起显示。但是每一位都是显示的都是同一个内容,还没有分开,所以要用sec_select模块进行数据选择。我们可以看到现在有6组输入,以总线的形式输入到数选模块里来,这6组分别代表了六个数码管上显示的数字,
add端输入二进制BCD码与dig_select端保持同步,表示现在在显示的是哪一个电子管,那么code输出端就会选择相应的输入端输出。(比如add端是000,表示0号数码管显示,code端就会将D0对应的sec_ge秒的个位数字输出)

sec_select
(3)整体电路连接
其他用到的还有fre_div模块、模六计数器cnt6、code_select/decoder、dig_select模块
这些在上面都已经实现了复制过来就好。
整体电路连接

拓展任务:3:dig_select、decoder和code_select三个模块做波形仿真。(注意输入设置)

这一步就比较简单了,直接将前面已经封装好的模块生成相应的波形就行。

dig_select

dig_select

decoder

decoder

sec_select

(最后的6个输入端的数字是自己输入的)
sec_select
以上三个任务的源文件的链接在这里。以后也会更新更多的实验的,这么好的up主还不赶紧关注之后白嫖。☺

源文件链接

链接:https://pan.baidu.com/s/1h-XcA9dNkaZXisXnOjWazg
提取码:2021

  • 170
    点赞
  • 442
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
基于FPGA的LED数码管控制系统设计quartus工程源码+文档说明文件 --/****************************************************************************** -- ** 功能描述:串口通信__FPGA和上位机通信(波特率:9600bps,10个bit是1位起始位,8个数据位,1个结束) -- 字符串(串口调试工具设成字符格式接受和发送方式),FPGA接受(0到9和A到F)后显示在7段数码管上。 --*******************************************************************************/ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity uart_seg is port( clk:in std_logic;--50M时钟输入 rst:in std_logic;--复位信号输入 rxd:in std_logic;--串行数据接收端 txd:out std_logic;--串行数据发送端 en:out std_logic_vector(7 downto 0);--数码管使能 seg_data:out std_logic_vector(7 downto 0)--数码管数据 ); end uart_seg; architecture behave of uart_seg is --/*****************************/ signal div_reg:integer range 0 to 326 ; --分频计数器,分频值由波特率决定。分频后得到频率8倍波特率的时钟 signal div8_rec_reg:std_logic_vector(2 downto 0); --该寄存器的计数值对应接收时当前位于的时隙数 signal state_rec:std_logic_vector(3 downto 0); --接受状态寄存器 signal clkbaud_rec:std_logic; --以波特率为频率的接受使能信号 signal clkbaud8x:std_logic; --以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙 signal recstart:std_logic; --开始接收标志 signal recstart_tmp:std_logic; --开始接收标志 signal rxd_reg1:std_logic; --接收寄存器1 signal rxd_reg2:std_logic; --接收寄存器2,因为接收数据为异步信号,故用两级缓存 signal rxd_buf:std_logic_vector(7 downto 0); --接受数据缓存 -- 分频参数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的8 -- 倍,此处值对应9600的波特率,即分频出的时钟频率是9600*8(CLK 50M) begin en <= "00000000";--7段数码管使能信号 process(clk,rst) begin if(clk'event and clk = '1')then--上升沿触发 if(rst = '0')then div_reg<=0; else if(div_reg = 324)then--时钟频率是9600*8 div_reg <= 0; else div_reg <= div_reg+1; end if; end if; end if; end process
下面是一个基于Quartus II软件的FPGA六位数码管动态显示电路的VHDL设计代码: ```vhdl library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity six_digit_display is port ( clk : in std_logic; data_in : in std_logic_vector(7 downto 0); segment_out : out std_logic_vector(6 downto 0); digit_out : out std_logic_vector(5 downto 0) ); end entity six_digit_display; architecture behavior of six_digit_display is signal count : integer range 0 to 999999 := 0; signal digit : integer range 0 to 5 := 0; signal data : std_logic_vector(5 downto 0); signal segments : std_logic_vector(6 downto 0); begin process(clk) begin if rising_edge(clk) then count <= count + 1; if count = 1000000 then count <= 0; digit <= digit + 1; if digit = 6 then digit <= 0; end if; case digit is when 0 => data <= data_in(3 downto 0); when 1 => data <= data_in(7 downto 4); when 2 => data <= data_in(11 downto 8); when 3 => data <= data_in(15 downto 12); when 4 => data <= data_in(19 downto 16); when 5 => data <= data_in(23 downto 20); end case; case data is when "000000" => segments <= "1111110"; -- 0 when "000001" => segments <= "0110000"; -- 1 when "000010" => segments <= "1101101"; -- 2 when "000011" => segments <= "1111001"; -- 3 when "000100" => segments <= "0110011"; -- 4 when "000101" => segments <= "1011011"; -- 5 when "000110" => segments <= "1011111"; -- 6 when "000111" => segments <= "1110000"; -- 7 when "001000" => segments <= "1111111"; -- 8 when "001001" => segments <= "1111011"; -- 9 when "001010" => segments <= "1110111"; -- A when "001011" => segments <= "0011111"; -- b when "001100" => segments <= "1001110"; -- C when "001101" => segments <= "0111101"; -- d when "001110" => segments <= "1001111"; -- E when "001111" => segments <= "1000111"; -- F when others => segments <= "XXXXXXX"; -- Invalid input end case; end if; end if; end process; segment_out <= segments; case digit is when 0 => digit_out <= "000001"; when 1 => digit_out <= "000010"; when 2 => digit_out <= "000100"; when 3 => digit_out <= "001000"; when 4 => digit_out <= "010000"; when 5 => digit_out <= "100000"; when others => digit_out <= "XXXXXX"; -- Invalid digit end case; end architecture behavior; ``` 代码中包含了一个时钟信号`clk`,一个八位输入信号`data_in`,一个七位输出信号`segment_out`和一个六位输出信号`digit_out`。时钟信号被用于触发时序控制,八位输入信号是要显示的数字,七位输出信号用于控制数码管的段选,六位输出信号用于控制数码管的位选。 在代码中,使用了一个计数器`count`和一个数字选择器`digit`,它们被用于生成数码管动态显示的效果。每当计数计数到1000000时,就会触发一次数码管显示更新。数字选择器会按照顺序选择要显示的数字,并根据数字的值选择相应的段选信号。最后,将段选信号和位选信号输出到相应的输出引脚上,从而实现数码管动态显示效果。 注意,代码中使用了一个`case`语句来对输入信号进行解码。这里使用了一个简单的标准七段数码管编码,可以根据需要进行修改。此外,还需要根据具体的硬件平台进行引脚分配和约束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值