Help needed.. parallel to serial converter
here is a code, this will only work when the input en is changed along with the posedge of clock.
//------------- RTL --------------------//
module p2s(clk,rst,en,din,dout);
input clk,rst,en;
input [7:0] din;
output dout;
reg dout;
wire pos_edge_detect;
reg flag,enable;
reg [7:0] temp;
assign pos_edge_detect = (en && ~temp);
always@(posedge clk or negedge rst)
if(!rst)
temp <= 8'b0;
else if(en)
temp <= din;
else if(enable)
temp <= {1'b0,temp[7:1]};
else
temp <= temp;
always@(posedge clk or negedge rst)
if(!rst)
flag <= 1'b0;
else
flag <= en;
always@(posedge clk or negedge rst)
if(!rst)
enable <= 1'b0;
else if(pos_edge_detect && temp != 8'b0)
enable <= 1'b1;
else if(temp==8'b0)
enable <= 1'b0;
always@(posedge clk or negedge rst)
if(!rst)
dout <= 1'b0;
else if(enable)
dout <= temp[0];
endmodule
// --------------- Test bench --------------- //
`include "./rtl.v"
module tb_p2s();
reg clk,rst,en;
reg [7:0] din;
wire dout;
p2s p1(.clk(clk),
.rst(rst),
.din(din),
.en(en),
.dout(dout)
);
initial
begin
$recordfile("p2s.trn");
$recordvars();
end
initial
begin
clk = 1'b1;
rst = 1'b0;
en = 1'b0;
#25 rst = 1'b1;
#25 en=1'b1;
din = 8'h45;
#10 en = 1'b0;
#100 $finish();
end
always
clk = #5 ~clk;
endmodule