电脑com口进入的串行数据怎么转化成并行数据的

电脑com口进入的串行数据怎么转化成并行数据的,第1张

串行数据(位流)转换为并行数据(字节)是由串口硬件电路完成的。转换过程大致为:

1)串口开始按位接收,存入位移寄存器

2)当位移寄存器接收到一个字节(8位)后,再将位移寄存器的字节值(这时,数据已经成为并行数据了),移动到接收缓冲寄存器。

至此,完成了串行到并行的转换。

串并转换很简单,就是移位寄存器,后面最好跟一个锁存器,实现你所要求的功能需要四位移位寄存器和四位锁存器,锁存器的作用就是保持并行数据在移位时不发生变化:

module shift(nreset,clk,en,in,out)

input nreset,clk,en,in

output [3:0] out

reg [1:0] count//移位计数,控制并行数据更新,这里是4bit并行数据

reg [3:0] data

reg [3:0] out

/* 移位计数,用于并行数据输出,也可以外加一个脉冲控制数据边界,这里移位4bit就并行输出一次*/

always@(posedge clk or negedge nreset)

begin

if(~nreset)

count <= 2'b00

else if(en)

count <= count + 2'b01

end

//移位

always@(posedge clk or negedge nreset)

begin

if(~nreset)

data <= 4'b0000

eale if(en)

data <= {data[2:0],in}

end

//并行输出

always@(posedge clk or negedge nreset)

begin

if(~nreset)

out <= 4'b0000

else if(en &&(count==2'b11))

out <= data

end

endmodule

我编译、仿真过了,没有问题,你原有的out<={out,in}应该写成像这样data <= {data[2:0],in}这就是一个移位寄存器!

library IEEE

use IEEE.STD_LOGIC_1164.ALL

entity serial2parallel is

Port ( clk,rst : in STD_LOGIC

serial_in : in STD_LOGIC

parallel_out : out STD_LOGIC_VECTOR (2 downto 0))

end serial2parallel

architecture Behavioral of serial2parallel is

signal tmp : std_logic_vector(2 downto 0)

signal flag : std_logic

begin

process(clk,rst)--串入并出 *** 作,每完成移动1个字符(3位)

--将flag标志位置位,通知下一进程输出结果

variable cnt : integer range 0 to 3 := 0

begin

if rst= '1' then

tmp <= (others =>'0')

elsif rising_edge(clk) then

tmp <= tmp(1 downto 0) &serial_in

if cnt = 2 then

cnt := 0

flag <= '1'

else

cnt := cnt + 1

flag <= '0'

end if

end if

end process

process(flag) --根据flag标志位输出并行结果

begin

if rising_edge(flag) then

parallel_out <= tmp

end if

end process

end Behavioral


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12197688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存