农业工程学院课程设计说明书
if g='1' then y<='0'; else
case s is
when \ when \ when \ when \ when \ when \ when \ when \
when others => y <='x'; end case; end if; end process; end one;
3.3奇偶校验器的设计原理
在数据传输过程中,由于受到噪声干扰或传输中断等因素的影响容易使接收到的数据出现误码。为了能及时可靠地把数据传输给对方并有效地检测错误,在传输时必须要进行校验,而奇偶校验是比较常用的一种检错码。
奇偶校验码是一种通过增加冗余位使得码字中\的个数恒为奇数或偶数的编码方法。只能检测出奇数个错误,但由于其简单方便,在数据传输的差错控制上仍然得到广泛的使用。以前,大多采用通用的逻辑元器件进行设计,导致了设计和调试过程冗长、系统稳定性不高,非常不便。如今,随着以FPGA和CPLD为代表的可编程ASIC技术的日趋成熟和完善,用户完全可以根据自己的需要,以EDA技术作为开发手段,用一块FPGA或CPLD设计出符合自己需要的芯片。 尽管当前有很多针对奇偶校验的可编程逻辑芯片的设计,但几乎都是针对并行输入数据进行校验的,很少有针对串行通信的。而本文实现的10位时序奇偶校验器完全可以满足串行奇偶校验的需要。 下面是关于奇偶校验的相关知识:奇偶校验原理:通过计算数据中“1”的个数是奇数还是偶数来判断数据的正确性。在被校验的数据后加一位校验位或校验字符用作校验码实现校验。
校验位的生成方法 :
奇校验:确保整个被传输的数据中“1”的个数是奇数个,即载荷数据中“1”的个数是奇数个时校验位填“0”,否则填“1”;
- 6 -
农业工程学院课程设计说明书
偶校验:确保整个被传输的数据中“1”的个数是偶数个,即载荷数据中“1”的个数是奇数个时校验位填“1”,否则填“0”。
使用奇偶校验码校验的特点:
校验处理过程简单,但如果数据中发生多位数据错误就可能检测不出来,更检测不到错误发生在哪一位;主要应用于低速数字通信系统中,一般异步传输模式选用偶校验,同步传输模式选用奇校验。
本设计先从最基本的偶校验部分出发,通过条件选择模式,扩展为奇校验和偶校验可选择模式,再添加校验成功指示信号,和复位端,校验的数据输入部分采用拨码开关(作为数据输入)和可复位按键(作为时序脉冲)来实现。
3.4奇偶校验器的设计
设计实体名称为UPDATE,设置有三个输入信号,分别为:
clock,reset,a,odd_eve。Clock输入端接按键用来模拟产生时钟信号,reset信号是异步置位信号,用以置初始状态s0,a信号用以输入数据,odd_eve信号用以设置奇偶校验的模式。设置两个输出信号,分别是:disp,success。Disp输出要显示的编码。Success输出校验成功时的信号,初始值为0。
本设计分为两个进程,进程first用来描述时序状态的变化,进程second用来描述组合逻辑状态的变化。我们设一个初始状态s0,紧接着是ST作为开始位状态,然后在每个数据位到来时,都设置两个状态,一个表示奇状态,一个表示偶状态。s1、s2分别表示第一位数据位到达时的奇偶状态;s3、s4表示第二位数据位到达时的奇偶状态;以此类推,s15,s16表示第8位的数据位到达时的奇偶状态。如果下一个接收的数据位为“0”,则继续保持原先的奇偶状态,若下一个数据位为“1”,则改变原先的奇偶状态。最后,再依据奇偶状态和校验位做比较。
- 7 -
农业工程学院课程设计说明书
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity update is
port(clock,reset ,odd_eve:in std_logic; a :in std_logic_vector(7 downto 0); success:out std_logic;
disp:out std_logic_vector(39 downto 0)); end;
architecture asm of update is type state is
( s0,st,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16); signal present_state,next_state:state; begin
first:process(clock,reset) begin
if reset='1' then present_state<=s0;
elsif rising_edge(clock)then present_state<=next_state; end if; end process;
second:process(present_state,a,odd_eve)is begin
if odd_eve='1' then 进入偶校验模式的条件 success<='0';
case present_state is when
s0=>disp<=\ if a='0' then next_state<=st; else
next_state<=st;
- 8 -
农业工程学院课程设计说明书
end if; when
st=>disp<=\ if a='0' then
next_state<=s1; else next_state<=s2; end if; when
s1=>disp<=\ if a='0' then
next_state<=s3; else
next_state<=s4; end if; when
s2=>disp<=\ if a='0' then
next_state<=s4; else
next_state<=s3; end if; when
s3=>disp<=\ if a='0' then
next_state<=s5; else
next_state<=s6; end if; when
s4=>disp<=\ if a='0' then
next_state<=s6; else
next_state<=s5; end if; when
s5=>disp<=\ if a='0' then
next_state<=s7; else
next_state<=s8; end if; when
s6=>disp<=\
- 9 -
农业工程学院课程设计说明书
if a='0' then
next_state<=s8; else
next_state<=s7; end if; when
s7=>disp<=\ if a='0' then
next_state<=s9; else
next_state<=s10; end if; when
s8=>disp<=\ if a='0' then
next_state<=s10; else
next_state<=s9; end if; when
s9=>disp<=\ if a='0' then
next_state<=s11; else
next_state<=s12; end if; when
s10=>disp<=\ if a='0' then
next_state<=s12; else
next_state<=s11; end if; when
s11=>disp<=\ if a='0' then
next_state<=s13; else
next_state<=s14; end if; when
s12=>disp<=\ if a='0' then
next_state<=s14;
- 10 -