课程设计要求:
1、课程设计题目及要求
2、设计思路:流程图或论述的形式描述
3、功能模块图:整体结构框图以及包含模块,各模块功能以及代码
4、仿真结果及结果说明(要能论证你是否达到要求)。
题目一、“学号”检测器(必做)
检测输入的两位十进制数字(每位学生的学号最后两位),与自己的学号相同输出“1”,否则输出“0”。
题目二、带调时和闹铃功能的万年历(根据完成部分给分)
1、能显示年、月、日、时、分;
2、数字时钟以一天24小时做为计数周期
2、年、月、日、时和分数字显示,“秒”信号驱动led显示光点,将“时”、”分“隔开;
3、具有时间调整功能,即用户能修改数字时钟的年、月、日、时和分;
4、闹铃功能,闹铃起闹时间可设置且闹铃时长可调节。
注意:仿真时基础时钟可设置高点,以ms或者ns代替s来仿真。
最后答辩要求:
1、能熟练操作软件
2、对题目中的功能能较好的完成
3、能熟练回答程序中提出的问题
4、完整的设计报告(程序完全重复的一律不得高分)
第二篇:VHDL红外接收课程设计报告
VHDL课程设计报告
——版权归原作者所有
一、 题目要求
(1)、红外遥控系统的设计
红外遥控系统由发射编码和接收解码两个部分组成,本课程设计要求制作发射编码电路板(遥控器)以及编写程序在EDA实验板上实现接收解码,具体说明如下:
1、发射编码部分
发射编码部分要求使用指定的元器件在万用板上完成红外遥控器的制作,该部分电路原理图参照《PT2248数据手册》,制作前请详细阅读《红外遥控器制作说明》,制作时要求元器件在万用板上排列整齐,布局合理,焊接良好,各按键功能正常,均能发送编码。
2、接收解码部分
接收解码用VHDL语言编写程序,在EDA实验板上实现解码,要求具有以下功能:
(1)基本要求:
(a)将一体化红外接收解调器的输出信号解码(12个单击键、6个连续键,单击键编号为7-18,连续键编码为1-6),在EDA实验板上用七段数码管显示出来;
(b)当按下遥控器1—6号连续键时,在EDA实验板上用发光二极管点亮作为连续键按下的指示,要求遥控器上连续键接下时指示灯点亮,直到松开按键时才熄灭,用于区别单击键。
(c)EDA实验板上设置四个按键,其功能等同于遥控器上的1—4号按键,当按下此四个按键时七段数码管分别对应显示“1”、“2”、“3”、“4”。
(d)每当接收到有效按键时,蜂鸣器会发出提示音。
(2)扩展功能:(能完成的加分)
通过遥控器跳线改变用户码,EDA实验板上用三个发光二极管正确显示发送端的用户码。
二、设计分析
1)、流水灯程序:
测试各发光二极管的程序。程序中只要依次给要闪亮的灯输入低电平即可。
2)、
测试8位数码管的程序。CD4511可以将4位二进制编码转换成对应的7段显像管编码输出。真值表如下:
程序中只要将8位数码管显示控制端全部置1,即可保持数码管显示状态,依
次将“0000”-“1001”输送给CD4511就可以实现对8位数码管的动态扫描。时钟由晶振分频后得到。
3)、矩阵键盘扫描程序
测试键盘输入的程序。程序实现了显示0-4输入的输出显示。键盘输入行由“0111”到“1110”,列也是由“0111”到“1110”,直接翻译成对应的二进制编码输入CD4511译码显示。
4)、接收译码程序
本次实验的最主要程序。发射端编码方式已经在《红外遥控器制作说明及编码规则简要说明》中给出,要接收发射端发射的编码最关键的问题是发射段频率和接收段频率不一致的现象。发射端频率为38KHz,程序中设计的接收端频率为2.048MHz的8分频,即8KHz。
发射端每四个周期代表一个二进制编码,时间为1/38KHz*16*4=1.684ms,四个周期的时间换算成接收端周期数为1.684ms/(1/8KHz)=13.47。一个周期占13.47/4=3.37,三个周期占13.47/4*3=10.1,由于编码中一个周期的低电平代表“1”,三个周期的低电平代表“0”,再考虑到同步的问题,取(10.1+3.37)/2=6.77作为判断“0”、“1”的分界线,即当检测到超过7个接收端周期的低电平后即可认为接收到的是“0”,否则为“1”。
翻译出编码信号后根据编码的规则,分析用户和所显示的数字即可。
三、系统模块的划分以及各模块的功能描述
程序采用单进程,划分为接收编码信号及翻译模块和输出显示模块。
接收编码信号模块分为从键盘接收信号和从发射板接收信号,从键盘接收到的信号直接
翻译对应的二进制编码输出到显示模块;从发射板接收到的信号需要进行译码,每次接收13位周期的信号,如果前7个周期都为低电平,即可认为接收到“1”,否则为“0”。译码后根据编码的规则进行翻译,翻译成对应的二进制编码输出。当检测到收到的信号为1~6时,相应的彩灯发亮指示连续按键。
输出显示模块主要是对每一位显像管分别的输出进行控制,根据翻译出的二进制编码分别将各位的编码输入到CD4511,驱动显像管显示。
四、程序仿真
(1)键盘仿真
各信号描述:
Qrset:复位信号
Qinf:串行信号输入信号
Qck:时钟信号
Qjian:
键盘输入信号(7代表输入0111,即输入1,同理B代表2,D代表3,E代表4)
Qbit:片选信号,指示某个显像管显示
Qnum:二进制编码信号,输入CD4511编码
Qcon:彩灯显示信号
Qusr:用户信号(程序中全部将用户设为111)
Qbeep:蜂鸣信号
此图是测试键盘输入的仿真,键盘依次输入7、B、D、E(即1,2,3,4)在二进制编码端识别出1、2、3、4。相应的彩灯也被置为低电平
(2)发射板仿真
各信号含义与上面相同。
该仿真是测试接收发射端信号的仿真。图中仿真发射端编码为11110010000,从仿真结果可以看到。Qbit片选信号正确的在两个显像管间切换。Qnum也根据片选信号的不同相应的显示0和1(显示十位时是0,个位为1)。Qcon(6)是连续信号的显示灯,接收到1后该显示灯发光一段时间,之后会熄灭,因为连续信号会不停的发送编码信号,所以显示效果为连续灯常亮;而其他非连续信号输入时该灯不会亮。Qcon(5 downto 0)正确显示了接收到1信号时应该亮的指示灯。Quser显示用户为111。
五、设计体会及心得
本次实验锻炼了我们动手的能力,进一步熟练了焊接技巧。对布板的重要性有了更深刻
的认识,基本消除了以前常发生的飞线现象。
最重要的是本次实验让我们对信号远程传输的发射和接收有了具体的了解,对如何使用VHDL来实现硬件的功能有了初步了解。掌握了CD4511、74LS224、74HC4040、max7000等芯片的用法和各管脚的分布。
实验中得到各位老师的帮助,尤其是反复的取拿器件,浪费了老师很多时间,再此表示感谢~~
六、源程序
--XIANSHI.VHD 负责各显像管的显示
library ieee;
use ieee.std_logic_1164.all;
entity xianshi is
port (
acode : in std_logic_vector (4 downto 0); --翻译出的编码
aclk : in std_logic; --时钟信号
abit : out std_logic_vector(1 downto 0); --片选信号
anum : out std_logic_vector (3 downto 0) --编码输入CD4511
);
end xianshi;
architecture behav of xianshi is
begin
process (aclk)
variable a : std_logic ;
begin
if rising_edge (aclk) then
a:=not a;
if a='0' then
anum <= "000" & acode(4); --十位
abit <= "10";
else
anum <= acode(3 downto 0); --个位
abit <= "01";
end if;
end if;
end process;
end behav;
--OK.VHD 提供上层接口
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ok is
port (
qclk : in std_logic;
qreset : in std_logic;
qinf : in std_logic;
qjian : in std_logic_vector(3 downto 0);
qbit : out std_logic_vector (1 downto 0);
qnum : out std_logic_vector (3 downto 0);
qcon : out std_logic_vector (6 downto 0);
quser: out std_logic_vector (2 downto 0);
qbeep: out std_logic);
end ok;
architecture behav of ok is
component fenxi is
port (
clk : in std_logic;
inf : in std_logic;
reset : in std_logic;
jian : in std_logic_vector(3 downto 0);
code : out std_logic_vector(4 downto 0);
con : out std_logic_vector (6 downto 0);
user: out std_logic_vector (2 downto 0);
beep: out std_logic );
end component fenxi;
component xianshi is
port (
acode : in std_logic_vector (4 downto 0);
aclk : in std_logic;
abit : out std_logic_vector(1 downto 0);
anum : out std_logic_vector (3 downto 0)
);
end component xianshi;
signal s : std_logic_vector(4 downto 0);
begin
t1: fenxi port map(
qclk,qinf,qreset,qjian,s,qcon,quser,qbeep
);
t2: xianshi port map(
s,qclk,qbit,qnum
);
end behav;
--FENXI.VHD
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fenxi is
port (
clk : in std_logic; --时钟信号
inf : in std_logic; --串行输入信号
reset : in std_logic; --复位信号
jian : in std_logic_vector(3 downto 0); --键盘输入信号
code : out std_logic_vector(4 downto 0); --二进制编码,输入CD4511显像
con : out std_logic_vector (6 downto 0); --彩灯控制信号
user: out std_logic_vector (2 downto 0); --用户端信号
beep: out std_logic ); --蜂鸣信号
end fenxi;
architecture behav of fenxi is
type statetype is (s0, s1, s2,sk,t0,action);
signal state : statetype ;
constant beeptime : integer := 28 ;
begin
st: process (clk,inf)
variable cnt1,cnt2,cnta : integer range 0 to 30; -- ,cnta
variable reg : std_logic_vector(11 downto 0);
variable temp : std_logic_vector (4 downto 0);
variable tempcon : std_logic_vector (6 downto 0);
begin
-------------------------------------------------------------------------------------------------
-- 检测键盘输入和开始远程端接收部分
if reset= '1' then
state <= s0; code <= "00000"; con <= "1111111"; user <="111";
elsif rising_edge (clk) then
case state is
when s0 =>
if inf = '0' then
reg:="000000000000"; tempcon:="1111111"; temp:="00000";
cnt1:=0; cnt2:=0; cnta := 0;
state <= sk;
elsif jian = "0111" then
code <= "00001"; beep<='1'; con <= "1011111"; user <="111";
elsif jian = "1011" then
code <= "00010"; beep<='1'; con <= "1101111"; user <="111";
elsif jian = "1101" then
code <= "00011"; beep<='1'; con <= "1110111"; user <="111";
elsif jian = "1110" then
code <= "00100"; beep<='1'; con <= "1111011"; user <="111";
else
state <= s0;beep<='0';con (6) <= '1';
end if;
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
----译码部分,检测发射端的发射信号
when sk =>
if inf = '0' then
state <= s1;
else
state <= sk;
end if;
when s1 =>
if inf = '0' then
cnt1:=cnt1 + 1;
state <= s1;
elsif inf='1' then
state <= s2;
end if;
when s2 =>
cnt2:=cnt2 + 1; -- 计算已记多少位数
if cnt1 < 7 then
reg:=reg(10 downto 0) & '0';
else
reg:=reg(10 downto 0) & '1';
end if;
if cnt2 = 12 then state <= t0;
else cnt1:= 0 ;
state <= sk;
end if;
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
--译码部分,对译码之后的信号进行相应的译码输出
when t0 =>
beep <= '1' ;
case reg(8 downto 0) is
--continuous 1~6------------
when "100100000" => --1
temp := "00001";
when "100010000" => --2
temp := "00010";
when "100001000" => --3
temp := "00011";
when "100000100" => --4
temp := "00100";
when "100000010" => --5
temp := "00101";
when "100000001" => --6
temp := "00110";
---single 7~18---------
when "010100000" => --7
temp := "00111";
when "010010000" => --8
temp := "01000";
when "010001000" => --9
temp := "01001";
when "010000100" => --10
temp := "10000";
when "010000010" => --11
temp := "10001";
when "010000001" => --12
temp := "10010";
when "001100000" => --13
temp := "10011";
when "001010000" => --14
temp := "10100";
when "001001000" => --15
temp := "10101";
when "001000100" => --16
temp := "10110";
when "001000010" => --17
temp := "10111";
when "001000001" => --18
temp := "11000";
when others =>
temp := "00000";
end case;
user <= reg(11 downto 9);
tempcon := not reg(8) & not reg (5 downto 0);
state <= action ;
--------------------------------------------------------------------------------------------------
when action =>
con <= tempcon;
code <= temp;
cnta := cnta+1;
if cnta = beeptime then
beep <= '0';
state <= s0 ;
else
state <= action ;
end if;
when others =>
state <= s0;
end case;
end if;
end process st;
end behav;