实验内容

  1. 分频器设计(分频输出:1Hz或2Hz的信号) 要求:实验开发板上有一个50MHz的时钟脉冲(此频率过高,接到开发板的LED灯后,无法观察到LED灯一亮一灭的过程),设计一个分频器,使得分频后的时钟脉冲接到开发板上的LED灯后,肉眼可以观察到LED灯闪烁。
  2. 设计一个十进制加法计数器 使用设计的分频器的输出信号作为计数器的时钟输入,再利用第二次实验中设计的七段显示译码器显示计数值。
  3. 巴克码发生器设计和巴克码检测器设计。

1. 分频器设计

分频器功能:将开发板上自身提供的高频率(50MHz)时钟脉冲通过分频得到低频率的时钟脉冲。

运用VHDL编写实现分频器(1Hz和2Hz):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fenpinqi IS
PORT(clk_in:IN STD_LOGIC;
clkout_1:buffer STD_LOGIC;
clkout_2:buffer STD_LOGIC);
END fenpinqi;
ARCHITECTURE behave OF fenpinqi IS
SIGNAL cnt_1:integer range 0 to 25000000;
SIGNAL cnt_2:integer range 0 to 12500000;
BEGIN
PROCESS(clk_in)
BEGIN
IF(clk_in'EVENT AND clk_in='1')THEN
IF(cnt_1=25000000)THEN        
cnt_1<=0;
clkout_1<=NOT clkout_1;
ELSE
cnt_1<=cnt_1+1;
END IF;

IF(cnt_2=12500000)THEN        
cnt_2<=0;
clkout_2<=NOT clkout_2;
ELSE
cnt_2<=cnt_2+1;
END IF;
END IF;
END PROCESS;
END architecture ;

引脚配置:

img

实验设计与结果分析:

将输入与开发板自身提供的50MHz时钟脉冲输出端相连,2个输出端分别与2个led相连,观察时钟脉冲。

将程序及引脚配置烧录到硬件中验证,看到一个led以周期0.5s闪烁,另一个led以周期1s闪烁,即分别得到得到了2Hz时钟脉冲和1Hz时钟脉冲,分频成功。

2. 设计一个十进制加法计数器

十进制计数加法器功能:时钟脉冲作为输入加法计数器根据时钟脉冲的频率进行加法计数,且以一定的周期数不断循环计数。

运用VHDL编写实现十进制加法计数器(0~59为一个周期):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cnt10 IS
PORT(clk_in:IN STD_LOGIC;
clkout_2:buffer STD_LOGIC;
cnt_1: out std_logic_vector(6 downto 0);
cnt_2: out std_logic_vector(6 downto 0));
END cnt10;
ARCHITECTURE behave OF cnt10 IS
SIGNAL cnt_2HZ:integer range 0 to 12500000;
SIGNAL cnt2: integer range 0 to 9;
SIGNAL cnt1: integer range 0 to 6;
BEGIN
PROCESS(clk_in)
BEGIN
IF(clk_in'EVENT AND clk_in='1')THEN
IF(cnt_2HZ=12500000)THEN        
cnt_2HZ<=0;
clkout_2<=NOT clkout_2;
ELSE
cnt_2HZ<=cnt_2HZ+1;
END IF;
END IF;

IF(clkout_2'EVENT AND clkout_2='1')THEN
if(cnt2=9 and cnt1=5) THEN
cnt2<=0;
cnt1<=0;
elsif(cnt2=9) THEN
cnt2<=0;
cnt1<=cnt1+1;
else
cnt2<=cnt2+1;
end if;
end if;

case cnt2 is
when 0=>cnt_2<="1000000";
when 1=>cnt_2<="1111001";
when 2=>cnt_2<="0100100";
when 3=>cnt_2<="0110000";
when 4=>cnt_2<="0011001";
when 5=>cnt_2<="0010010";
when 6=>cnt_2<="0000010";
when 7=>cnt_2<="1111000";
when 8=>cnt_2<="0000000";
when 9=>cnt_2<="0010000";
END CASE;
case cnt1 is
when 0=>cnt_1<="1000000";
when 1=>cnt_1<="1111001";
when 2=>cnt_1<="0100100";
when 3=>cnt_1<="0110000";
when 4=>cnt_1<="0011001";
when 5=>cnt_1<="0010010";
when 6=>cnt_1<="0000010";
END CASE;
END PROCESS;
END architecture ;

引脚配置:

img

实验设计与结果分析:

以上个题目得到的2Hz频率作为时钟脉冲输入,输出连接两个七段数码管。

实现即每0.5s进行一次加法计数,循环周期数为0~59,不断循环计数的十进制加法计数器。

将程序和引脚配置烧录到开发板上,完整实现了上述功能。

3. 巴克码发生器设计和巴克码检测器设计

巴克码发生器功能:这次实验实现7位的巴克码发生,即使led以巴克码的形式闪烁。

img

运用VHDL编写实现巴克码发生器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
library ieee;
use ieee.std_logic_1164.all;
entity barkker is
port(clk_in:in std_logic;
\out\:out std_logic_vector(3 downto 0);
tap:out std_logic);
end entity;
architecture behave of barkker is
signal clk:std_logic;
signal count:integer range 0 to 6;
begin
 process(clk_in)
 variable n:integer range 0 to 50000000;
 begin
if(clk_in'event and clk_in='1')
then n:=n+1;
if(n=50000000)
then n:=0;
clk<=not clk;
end if;
end if;
 end process;
 
 process(clk)
 begin
 tap<=clk;
if(clk'event and clk='1')
then if (count<6)
then count<=count+1;
else count<=0;
end if;
end if;
 end process;
 
 process(count)
  begin
   case count is
   when 0=>\out\<="0001";
   when 1=>\out\<="0001";
   when 2=>\out\<="0001";
   when 3=>\out\<="0000";
   when 4=>\out\<="0000";
   when 5=>\out\<="0001";
   when 6=>\out\<="0000";
   end case;
 end process;
end behave;

引脚配置:

img

实验设计与结果分析:

设计中将输入与开发板上提供的50MHz时钟脉冲输出端相连,经过分频得到周期为2s的时钟脉冲。两个输出均分别与led相连,与tap相连的led作为时钟脉冲的周期闪烁,即每经过一次时钟脉冲闪烁一次,与\out\相连的led作为输出巴克码的显示。

整体功能即是:设计的巴克码发生器的每一位输出的周期为2s,其中一个led作为时钟脉冲的信号,根据此记录另一个led的状态,在输出7个脉冲后,得到7位巴克码。

将程序和引脚配置烧录至开发板,显示结果与预期一致。

巴克码检测器没实现出来……主要是做实验时对巴克码的概念不是很清晰,也不知道巴克码检测器到底要实现的功能是什么,勉强根据巴克码组表做出7位的巴克码发生器。