数字逻辑实验 课设
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
红外线数据传输
.
《数字逻辑》课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
实验报告
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目:红外线数据传输系统
姓 名: 刘 x
学 号: U20091519x
专 业:计算机科学与技术
班 级: 0 9 1 1
同组人姓名:黄 xx
完成日期:2010年 10 月 8日
.
.
一、实验目的
通过硬件描述语言VHDL的编程,深入了解并掌握可编程芯片PLD的设计技术,加强学生对《数字逻辑》课程所学知识综合运用能力。培养学生创造性思维能力和独立解决实际问题的能力。
二、实验器材
DICE-SEM型实验箱,若干电源接线
三、实验内容
1、 实验任务及要求
实验任务:设计红外线数据传输系统:红外线传输系统包括发送方和接收方两端,都可以单独初始化清零处理。在发送端可以设置准备发送的8bits数据信息,连同一个偶校验位一起发送。接收端接收到8bits的数据信息和一位偶校验信息后,显示接收到的数据信息校验信息,并根据偶校验判定接收到的信息是否出错。实验时若无红外发送接收元件,则可用一根导线连接两端代替。
设计要求:
?通过开关K1~K8设定要传送的8bits信息,再通过置数按钮存放在系统内部,生成校验码,同时发送校验码指示灯显示。置数按钮在系统发送信息期间无效。
?按发送按钮进入发送态,发送灯亮,系统先发送最低位,通过寄存器循环右移再连续发送其它位,此时3个数码管上的信息也随着变化,最后还要传送一个校验码,每按一次发送按钮,系统就发送一次信息。
?接收端也采用循环右移方式存入信息,在接收第一位数据时寄存器先清零,接收时数码管上的信息随着寄存器内容的变化而变化,接收到校验码后立即设置校验码指示灯,同时按偶校验判定接收是否正确,将结果在接受错指示灯上显示。
?传输的过程中,接收端的教研指示灯熄灭,当接收端接收9个数据后(8位数据和1位校验码),接收端根据相应的校验方式来判断所接收的数据是否正确。接收端的接受错指示灯亮,表示传输的数据错误;接受错指示灯为熄灭状态,表示传输的数据正确。
?发送端发送所有的数据后,要有“嘟”的一声报警;同样接收端接收完数据并校验完毕后,要有“嘟嘟嘟”的一声报警。(本实验用灯的一次闪烁代替一声“嘟”)。
?干扰测试:发送高电平状态若出现低电平,接收端不予接收;发送过程出现干.
.
扰,干扰前的数据保证正确。
2、 系统界面图
校验码 校验码
结束灯
K4 K6 K8 K5 接收错 K7 K3 K1 K2 接收灯
在发送端,按下设置按钮后发送端将K1~K8的数据存入到系统中,送到3个数码管,同时声称校验位并由指示灯显示。按下清零键按钮使得数据信息变0。按下发送按钮后发送信息,
置数 清零 发送 清零 数据发送期间旁边的发送指示灯亮,发送完后发送指示灯熄灭,结束灯闪烁1次。
在发送端,按下设置按钮后发送端将K1~K8的数据存入到系统中,送到3个数码管,同时生成校验位并由指示灯显示,按下清零按钮使得数据信息变为0。按下发送按钮后发送信息,数据发送期间旁边的发送指示灯亮,发送完后发送指示灯熄灭,结束灯闪烁1次。
在接收端,将接受到的校验码用一个指示灯显示,同时根据接收到的数据信息和校验码判断接受是否正确。若错误,接受错灯亮。接受完数据后,接受灯闪烁3次。
3、 输入
开关K1~K8(电平信号),发送端清零开关(电平信号),发送按钮(脉冲信号),置数按钮(电平信号),接收端清零开关(电平信号)。
4、 输出
发送端: 发送数据的8bits数据信息用3个数码管显示(分别为2bits,3bits,3bits),发送期间发送指示灯亮,校验码指示灯亮。
接收端: 接收到的8bits数据信息用用3个数码管显示(分别为2bits,3bits,3bits),校验码指示灯亮,接受错指示灯亮。
.
.
四、主要设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
设计框图如上图所示。由于发送端和接收端可能属于两个独立的设备,即各自产生自己的工作CP,因此如何提高可靠性就成为设计时要考虑的一个关键问题,而两个CP也只能是相对接近,系统允许的误差越大,系统可靠性越好。
为提高可靠性,本实验是在工作CP的基础上采用16分频技术(即通过分频实现采样标准化)。如下图,在发送端,计数器在0~7输出为0,在8~15输出为1,则CP1高电平部分为CP的8倍,在接收端,计数器在0~14输出为0,在15输出为1,则CP2高电平部分为CP的1倍。这样只需要使CP2处于CP1中间处,则可以准确采样。
.
.
一个设计的工作波形如上图所示。先观察发送数据波形:平时无传输信号时为低电平,开始发送时先保持一段固定高电平,在此时间段内,一旦出现低电平则接收端认为是噪音,不予接受。固定高电平过后,就发送有效的数据,然后再将校验位发送出去,发送完后再等待下次操作。每个所传送的信息为的保持时间为一个CP1周期。
总体上可以用状态机的思想来设计,在发送端,4位计数器2为控制状态
其工作周期为CP1周期。系统清零之后的状态为“准备好态”,计数器计数器,
2的初始状态为“0011”,在“0011”~“0110”为“固定高电平态”,在“0111”
位,之后通过寄存器循环有意来依~“1110”为“发送有效数据态”,先发送最低
次发送其它位;当计数器到“1111”时进入“发送校验码态”,发送校验码信息。发送完后返回初始状态。在接收端,4位计数器4为控制状态计数器,其工作周期为CP2周期。系统清零之后就可以准备接收数据了,接受过程有接收信号触发。其初始状态为“0011”,在“0011”~“0110”为“接受固定高电平”,在“0111”~“1110”为“接受有效数据态”, 先接受最低位,采用循环右移位方式按位存入信息,当计数器到“1111”为“接受校验码态”,接受校验信息。
五、实验步骤与记录
1、程序设计端口(具体定义见源代码)
?发送端
输入:input [7 downto 0]:8bits的电平信号
clock1:时钟控制
clr1:清零按钮信号,低电平有效
start:发送按钮信号,高脉冲有效
set:置数按钮信号,高电平有效
输出:output1[7 downto 0]:8bits接入数码管的信号
send:当前发送到接收端的数据位
state:发送灯控制信号
checklight1:偶校验灯信号
.
.
?接收端
输入:clock2:时钟控制
clr2:清零按钮信号,低电平有效
receive:当前接收到来自发送端的数据位
输出:output2:8bits接入数码管的信号
wrong:接受错指示灯信号
checklight2:接收到的偶校验码信号
checkcount4:显示计数器4的变化情况(用于调试程序)
ringbell:接收完毕指示灯(闪烁3次)
2、引脚绑定
3、下载到芯片进行测试
?操作:发送端清零
现象:发送端3个数码管显示为“000”,做好了发送准备。 ?操作:接收端清零
现象:接收端3个数码管显示为“000”,做好了接收准备。 ?操作:将发送端K7~K0置为“10110011”,给置数按钮一个高电平信号
现象:发送端3个数码管显示“263”,偶校验码灯亮。 .
.
?操作:给发送按钮一个高脉冲信号
现象:发送灯亮,接着接收端与发送端的3 个数码管连续变化,发送完信号
后,发送灯熄灭,结束灯闪烁1次,发送端3个数码管显示“263”;接
收端偶校验码灯亮,接受错灯一直是熄灭状态,接收完毕时,接收端3
个数码管显示“263”,接收灯闪烁3次。
?操作:置数后,给发送按钮一个高脉冲信号,在发送数据期间,给置数按钮一
个高电平信号
现象:仍能进行正常发送和接收数据。
?操作:接收端清零,发送端再次给发送按钮一个高脉冲信号,在三个半高脉冲
期间人工用低电位干扰
现象:发送灯亮,发送端3个数码管连续变化,发送完毕后发送灯熄灭,结束
灯闪烁1次,发送端数码管显示“263”,接收端无任何反应。 ?操作:接收端清零,发送端再次给发送按钮一个高脉冲信号,在发送数据过程
中人工用低电位干扰
现象:发送灯亮,发送端3个数码管连续变化,发送完毕后发送灯熄灭,结束
灯闪烁1次,发送端数码管显示“263”;接收端3个数码管显示“267”,
接收端偶校验灯亮,接受错信号灯亮,接收完毕时,接受灯闪烁3次。
10110011”,给置数?操作:将时钟脉冲接到1KHZ处,将发送端K7~K0置为“
按钮一个高电平信号
现象:发送灯亮,接着接收端与发送端的3 个数码管快速连续变化,发送完
信号后,发送灯熄灭,结束灯闪烁1次,发送端3个数码管显示“263”;
接收端偶校验码灯亮,接受错灯一直是熄灭状态,接收完毕时,接收端
3个数码管显示“263”,接收灯闪烁3次。
4、结果展示(以“354”为例)
.
.
六、实验体会
本次实验是我第一次使用VHDL语言,刚开始感觉困难重重,最主要是因为以前从未接触过进程process,所以完全不知道整个程序是如何运行的。实验前2天主要是学习VHDL语言的基本用法。再结合实验指导书上的设计思想,渐渐地,我才找到头绪开始编写代码。接下来就是调试、测试程序。和学习其他语言一样,调试是最麻烦的一件事,编写完代码没花多久的时间,可调式却整整花了2天多,一遍遍修改、一遍遍连线测试,最终才准确运行。经过本次实验,不仅让我大致了解了VHDL语言的使用,也加强我对《数字逻辑》课程所学知识综合运用能力,更锻炼了我作为程序员的基本素质--毅力。
七、源代码【本程序包含3个文件,1个顶层模块电路(hongwai.vhd) 和2
和接收部分(receivepart.vhd)】 个子层模块电路发送部分(sendpart.vhd)
--顶层模块电路(hongwai.vhd)
library ieee;
use ieee.std_logic_1164.all;
entity hongwai is
port(
d_clock,d_clr1,d_clr2,d_start,d_set:in std_logic;
d_input:in std_logic_vector(7 downto 0);
d_output1:out std_logic_vector(7 downto 0);
d_output2:out std_logic_vector(7 downto 0);
sendbit:out std_logic;
receivebit:in std_logic;
d_state:out std_logic;
d_light1:out std_logic;
d_wrong:out std_logic;
d_light2:out std_logic;
d_count:out std_logic_vector(3 downto 0);
d_ring:out std_logic);
end;
architecture behave of hongwai is
component sendpart --元件
port(
clock1,clr1,start,set:in std_logic;
input:in std_logic_vector(7 downto 0); .
.
output1:out std_logic_vector(7 downto 0);
send:out std_logic;
state:out std_logic;
checklight1:out std_logic); end component;
component receivepart --元件
port(
clock2,clr2:in std_logic;
output2:out std_logic_vector(7 downto 0);
receive:in std_logic;
wrong:out std_logic;
checklight2:out std_logic;
checkcount4:out std_logic_vector(3 downto 0);
ringbell:out std_logic
);
end component;
begin
step1:sendpart port map(clock1=>d_clock,
clr1=>d_clr1,
start=>d_start,
set=>d_set,
input=>d_input,
output1=>d_output1,
send=>sendbit,
state=>d_state,
checklight1=>d_light1 ); step2:receivepart port map(clock2=>d_clock,
clr2=>d_clr2,
output2=>d_output2,
receive=>receivebit,
wrong=>d_wrong,
checklight2=>d_light2,
checkcount4=>d_count,
ringbell=>d_ring ); end behave;
--子层模块电路(sendpart.vhd)
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity sendpart is
.
.
port(
clock1,clr1,start,set:in std_logic;
input:in std_logic_vector(7 downto 0); --输入的8bits数据信息
output1:out std_logic_vector(7 downto 0);
send:out std_logic;
state:out std_logic; --发送状态指示灯
checklight1:out std_logic); --发送的校验码指示灯 end;
architecture behave of sendpart is
signal cp1:std_logic;
signal sendout:std_logic;
signal sendstate:integer range 0 to 3; --状态机
signal register8:std_logic_vector (7 downto 0);
begin
p1:process(clr1,start,set,input,cp1)
variable i:integer range 0 to 7;
variable count2:std_logic_vector(3 downto 0);
variable check:std_logic;
variable statelight:std_logic;
begin
if(clr1='1') then
register8<="00000000";
count2:="0011";
sendstate<=0;
sendout<='0';
check:='0';
statelight:='0';
elsif(set='1' and sendstate=0) then
register8<=input;
check:='0';
sendstate<=0;
for i in 7 downto 0 loop --for-loop循环,用于计算校验码
check:= check XOR register8(i);
end loop;
elsif(start='1' and sendstate=0) then
sendstate<=1;
sendout<='1';
count2:="0011";
statelight:='1';
elsif(cp1'event and cp1='1') then --cp1出现一个上升沿
case sendstate is
when(0)=>
.
.
sendout<='0';
sendstate<=0;
statelight:='0';
when(1)=>
sendout<='1';
count2:=count2+1;
if(count2="0110") then
sendstate<=2;
else sendstate<=1;
end if;
when(2)=>
sendout<=register8(0);
register8(6 downto 0)<=register8(7 downto 1);
register8(7)<=register8(0);
count2:=count2+1;
if(count2="1110") then
sendstate<=3;
else sendstate<=2;
end if;
when(3)=>
sendout<=check;
sendstate<=0;
count2:="1111";
end case;
end if;
state<=statelight;
checklight1<=check;
end process p1;
send<=sendout;
output1<=register8;
p3:process(clock1,start) --该进程用于得到时钟cp1
variable i2:integer range 0 to 7 :=0;
begin
if(clock1'event and clock1='1') then
if(i2=7) then
cp1<=NOT cp1;
i2:=0;
else i2:=i2+1;
end if;
end if;
end process p3;
.
.
end behave;
--子层模块电路receivepart.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity receivepart is
port(
clock2,clr2:in std_logic;
output2:out std_logic_vector(7 downto 0);
receive:in std_logic;
wrong:out std_logic; --接受错指示灯,根据偶校验判断9位数据是否接收正确
checklight2:out std_logic; --接收到的偶校验码指示灯
-- checkcount4调试程序时,用于观察计数器4的变化
checkcount4:out std_logic_vector(3 downto 0);
ringbell:out std_logic); --接收完毕后闪烁3次
end;
architecture behave of receivepart is
signal cp2:std_logic;
signal receivestate:integer range 0 to 4;
signal register8:std_logic_vector (7 downto 0);
signal receivelight:std_logic;
begin
p2:process(clr2,cp2,receive)
variable i: integer range 0 to 7;
variable check1,check2:std_logic;
variable count4:std_logic_vector(3 downto 0);
variable wronglight:std_logic;
variable k: integer range 0 to 6:=0;
variable bell: std_logic;
begin
if(clr2='1') then
register8<="00000000";
count4:="0011";
receivestate<=0;
wronglight:='0';
receivelight<='0';
check1:='0';
.
.
check2:='0';
bell:= '0';
elsif(receivestate=1 and receive ='0') then
receivestate<=0;
receivelight<='0';
count4:="0011";
elsif(receivestate=0 and receive='1' and count4="0011") then
receivestate<=1;
receivelight<='1';
elsif(cp2'event and cp2='1') then --cp2出现一个上升沿
case receivestate is
when(0)=>
receivelight<='0';
receivestate<=0;
count4:="0011";
when(1)=>
count4:=count4+1;
if(count4="0110") then
receivestate<=2;
else receivestate<=1;
end if;
when(2)=>
register8(6 downto 0)<=register8(7 downto 1);
register8(7)<=receive;
count4:=count4+1;
if(count4="1110") then
receivestate<=3;
else receivestate<=2;
end if;
when(3)=>
check1:=receive;
check2:='0';
for i in 7 downto 0 loop
check2:=register8(i) XOR check2;
end loop;
check2:=check1 XOR check2;
if(check2='0') then wronglight:='0';
else wronglight:='1';
end if;
count4:="1111";
receivestate<=4;
when(4)=> --接收完毕,闪烁3次
if (bell = '0') then
bell := '1';
.
.
k := k + 1;
else
bell := '0';
k := k + 1;
end if;
if (k = 6) then
k := 0;
receivestate <= 0;
receivelight<='0';
end if;
end case;
end if;
checkcount4<=count4;
checklight2<=check1;
ringbell<=bell;
wrong<=wronglight;
end process p2;
p3:process(clock2,receivelight) --该进程用于得到cp2
variable i3:integer range 0 to 15 :=0;
begin
if(receivelight='0') then
i3:=0;
cp2<='0';
elsif(clock2'event and clock2='1')then
if(i3=15) then i3:=0;
else i3:=i3+1;
end if;
if(i3=15) then cp2<='1';
else cp2<='0';
end if;
end if;
end process p3;
output2<=register8;
end behave;
.