Я думаю, дело в Ваших переходах в case. Наверно в case 0: не переходит. Да и как смотрите. Наверно все 1 надо посылать, чтобы от старта засинхронизироваться. Надо все смотреть. И моделирование все же должно все показать.
Все дело в том, что старт ИМХО надо анализировать отлично от остальных битов. И уровень 1 в линии тоже задействовать.
Могу свой набросок предоставить. мнтересно, будет у вас в железе работать.
`timescale 1 ns / 1 ns
module rxd_232
#( parameter xtal_clk = 20_000_000,
parameter baud = 115200
)
(
input sys_clk,
input rst,
input rxd,
output reg [7:0] rg_rs232_out,
output reg ochibka_kadra,
output reg int_rs232_cpu
);
localparam clk_div = xtal_clk / baud;
localparam cwidth = clog2(clk_div);
reg [1:0] dff_rxd;
reg [1:0] dff_rst;
reg [cwidth-1:0] ct_period;
reg [3:0] ct_bit;
reg dff_enable_work;
reg stop;
reg [8:0] rg_rs232;
wire clr_enable_work;
//////////////////////////////////////////////////////////////////////////////////
function integer clog2 (input integer depth); //// this function calculates ceil(log2(depth))
integer i, result; //// depth >= 2;
begin
result=0;
for (i=0; 2**i result = i+1;
clog2 = result;
end
endfunction
///////////////////////////////////////////////////////////////////////////////////assign clr_enable_work = dff_rst[1] | stop | (dff_rxd[1] & (dff_enable_work == 1'b0));
assign seredina_bita = (ct_period == (clk_div/2)-1);
always @ (posedge sys_clk)
begin
dff_rst <= {dff_rst[0], rst};
if (dff_rst[1]) dff_rxd <= 2'b11;
else dff_rxd <= {dff_rxd[0], rxd};
if (clr_enable_work) dff_enable_work <= 1'b0;
else if (seredina_bita) dff_enable_work <= 1'b1;
if (clr_enable_work) ct_period <= {cwidth{1'b0}};
else if (ct_period == clk_div-1) ct_period <= {cwidth{1'b0}};
else ct_period <= ct_period + 1'b1;
////////////////////////////// формирователь 8 отсчетов на несущей частоте baud
///////////////////////////// (без бита паритета)
if (dff_enable_work == 1'b0) ct_bit <= 4'h0;
else if (seredina_bita & (ct_bit != 4'h8)) ct_bit <= ct_bit + 1'b1;
///////////////////////////////////////////
if (seredina_bita & dff_enable_work) rg_rs232[ct_bit] <= dff_rxd[1];
stop <= seredina_bita & (ct_bit == 4'h8);
int_rs232_cpu <= stop;
if (stop) begin
rg_rs232_out <= rg_rs232[7:0];
ochibka_kadra <= ~rg_rs232[8]; end
end
endmodule