用verilog實現串行信號轉8bit並行信號

串行信號轉並行信號即爲解串器(deserialize)。

輸入信號有時鐘信號clk,復位信號rst和串行數據輸入信號din。

輸出信號爲8bit並行信號dout。

每經過8個時鐘週期,便把收到的8個串行信號合成並行信號並輸出,等下8個時鐘週期過後再輸出下一個並行信號。

verilog代碼:

module deserialize(
input rst,clk,din,
output reg[7:0] dout
);

reg[7:0] data;
reg[2:0] cnt;


always@(negedge rst, posedge clk)
begin
	if(rst == 1'b0)//reset signial
	begin
		data <= 0;
		cnt <= 0;
		dout <= 0;
	end
	
	else
	begin
		if (cnt == 3'b111)//get all 8bit data,change dout
		begin		
			dout[7-cnt] <= din;
			dout[7:1] <= data[7:1];
			cnt <= 0;
		end
		else
		begin
			data[7-cnt] <= din;
			cnt <= cnt + 1;
		end		
	end
end


endmodule

testbench:

`timescale 1ns/1ns

module deseralize_tb;

reg RST,CLK,DIN;
wire[7:0] DOUT;
integer i,j;

deserialize U_deserialize(.rst(RST),.clk(CLK),.din(DIN),.dout(DOUT));

initial 
begin
	RST = 1;
	#5 RST = 0;
	#2 RST = 1;
end

initial 
begin
	CLK = 0;
	for(i = 0;i<100000;i = i+1)
	begin
		#2 CLK = ~CLK;
	end
end

initial
begin
	#1 DIN = 0;
	for(j = 0;j<10000;j = j+1)
	begin
		#4 DIN = 0;
		#4 DIN = 1;
		#4 DIN = 1;
		#4 DIN = 0;
		#4 DIN = 1;
		#4 DIN = 0;
		#4 DIN = 1;
	end
end

endmodule

這裏testbench中的串行輸入序列爲‘0110101’共7bit(dout是8bit並行數據)的循環,故可以造成相鄰dout的不同。

仿真波形:

目前還沒想明白並行轉串行的時鐘問題,需要繼續學習

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章