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 IEEEuse 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)