串行(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
);
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
评论
查看更多