串行数据转换并行数据的原理图

接口/总线/驱动

1116人已加入

描述

  串行(chuan xing)是中文“通用串行总线”的简称。英文为USB(Universal Serial Bus)是1995年Microsoft、Compaq、IBM等公司联合制定的一种新的PC串行通信协议。USB协议出台后得到各PC厂商、芯片制造商和PC外设厂商的广泛支持。USB本身也处于不断的发展和完善中,从当初的0.7、0.8到现在广泛采用的1.0、1.1,2.0版本以及已经被采用,即将被量产应用的3.0版本

  串行数据与并行数据是相对的一对概念。串行数据是指传输过程中各数据位按顺序进行传输的数据,并行数据则是各数据位同时传送的数据。串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。

  数据并行的含义是计算机内包含一组处理单元(PE),每一个处理单元存储一个(或多个)数据元素。当机器执行顺序程序时,可对应于全部或部分的内部处理单元所存的数据同时操作。

  数据级并行依赖于并行处理机,它属于SIMD系统内的并行。并行处理机的特点是重复设置许多个同样的处理单元,按照一定的方式相互连接,在统一的控制部件作用下,各自对分配来的数据并行地完成同一指令规定的操作。

  控制部件实际上是一台高性能单处理机,它执行控制指令和只适用于串行处理的操作指令,而把适用于并行处理的指令传送给所用的处理单元,但仅有那些处于“活动”状态的处理单元才并行地对各自的数据进行同一操作。为了实现快速有效的数据处理,数据应在各处理单元之间合理分配与存储,使各处理单元主要对自身存储器内的数据进行运算。

  串行数据转换并行数据的原理图

  串行数据

  module UART_Receiver(

  Serial_in,

  istartofpacket,

  iendofpacket,

  clk,RSTn,

  Data_Bus,

  datavalid,

  oempty,

  oendofpacket,

  ostartofpacket

  );

  parameterword_size=16;

  parameterNum_counter_bits=4;

  parameterNum_state_bits=3;

  parameterword_deepth_size=7;

  parameterdeepth_counter_size=3;

  parameteridle=3‘b001;

  parameterreceiving=3’b010;

  parametersending=3‘b100;

  output[word_size-1:0]Data_Bus;

  output

  oendofpacket,ostartofpacket;

  oempty,datavalid,

  inputSerial_in;inputclk;inputRSTn;

  inputistartofpacket;inputiendofpacket;

  reg[word_size-1:0]RCV_datareg[word_deepth_size -1:0];

  reg[word_size-1:0]RCV_shftreg;

  reg[Num_counter_bits-1:0]bit_count;

  reg[deepth_counter_size-1:0] deepth_count1,deepth_count2;

  reg[Num_state_bits-1:0]state,next_state;

  reginc_bit_counter,clr_bit_counter;

  regclr_deepth_counter1;

  regclr_deepth_counter2;

  regclr_deepth_counter2;regshift,load_datareg;regoutputstart,outputend;regsend_word;

  regoendofpacket,ostartofpacket;regoempty;regdatavalid;

  reg

  [word_size-1:0]

  Data_Bus;

  clr_deepth_counter1=0;clr_deepth_counter2=0;clr_bit_counter=0;inc_bit_counter=0;shift=0;

  load_datareg=0;outputstart = 0;outputend = 0;send_word =0;

  next_state

  =state;

  if(istartofpacket==1)next_state=receiving;shift =1;begin

  end

  idle:

  inc_bit_counter =1;shift = 1;begin

  endif(bit_count != word_size-1)

  clr_bit_counter =1;load_datareg =1;shift = 1;begin

  endif(deepth_count1!=word_deepth_size-1)

  load_datareg =1;clr_bit_counter =1;

  clr_deepth_counter1 = 1;next_state = sending;begin

  end

  end

  end

  send_word = 1;outputstart = 1;begin

  end

  if(deepth_count2 == 0)

  outputend = 1;send_word = 1;

  clr_deepth_counter2 =1;next_state = idle;begin

  endelse if(deepth_count2 == word_deepth_size-1)

  send_word = 1;

  else

  sending:

  next_state=idle;

  default:

  endcaseend

  state《=idle;bit_count《=0;deepth_count1《=0;deepth_count2《=0;RCV_shftreg《=0;ostartofpacket 《= 0;oendofpacket 《= 0;Data_Bus 《= 0;begin

  endif(RSTn == 0)

  state《=next_state;oempty 《= 0;

  bit_count《=0;

  if(clr_bit_counter == 1)

  bit_count《=bit_count + 1;

  else if(inc_bit_counter == 1)

  deepth_count1《=0;if(clr_deepth_counter1 == 1)deepth_count1《=deepth_count1 + 1;

  else if(load_datareg == 1)

  RCV_shftreg《={Serial_in,RCV_shftreg[word_size-1:1]};

  if(shift == 1)

  begin

  else

  begin

  always @ (posedge clk)

  RCV_datareg[deepth_count1] 《=RCV_shftreg;if(load_datareg == 1)

  deepth_count2《=0;if(clr_deepth_counter2 == 1)

  deepth_count2《=deepth_count2 + 1;else if(send_word == 1)

  ostartofpacket 《= 1;if(outputstart ==1)

  ostartofpacket 《= 0;

  else

  oendofpacket 《= 1;if(outputend == 1)

  oendofpacket 《= 0;

  else

  Data_Bus 《= RCV_datareg[deepth_count2];datavalid 《= 1;begin

  endif(send_word == 1)

  Data_Bus 《= 0;datavalid 《= 0;begin

  endelse

  end

  endendmodule

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分