Mil STD 1553 Encoder Decoder Design
Mil STD 1553 Encoder Decoder Design
input
input
enc_clk ;
rst_n ;
input [0:15]
input
input
tx_dword ;
tx_csw ;
tx_dw ;
output
output
output
tx_busy ;
tx_data ;
tx_dval ;
reg
reg
reg [5:0]
reg [0:16]
reg [5:0]
reg
reg
cnt_en ;
cnt_en_reg ;
busy_cnt ;
data_reg ;
sync_bits ;
tx_data ;
tx_dval ;
wire
wire [0:40]
wire
parity ;
enc_data ;
data_out ;
module decoder_1553 (
// Clock and Reset
dec_clk ,
rst_n ,
// Inputs
rx_data ,
// Outputs
rx_dword ,
rx_dval ,
rx_csw ,
rx_dw ,
rx_perr
) ;
input
input
dec_clk ;
rst_n ;
input
rx_data ;
output [0:15]
output
output
output
output
rx_dword ;
rx_dval ;
rx_csw ;
rx_dw ;
rx_perr ;
//
//
//
//
//
reg [0:15]
reg
reg
reg
reg
rx_dword ;
rx_dval ;
rx_csw ;
rx_dw ;
rx_perr ;
reg
reg
reg
reg
reg
reg
reg
[0:23]
[0:4]
wire
wire
wire
wire
wire
wire
[7:0]
[0:16]
sync_sftreg ;
data_sftreg ;
cnt_enb ;
cnt ;
dword_int ;
sync_csw_reg ;
sync_dw_reg ;
sync_edge ;
data_edge ;
sync_csw ;
sync_dw ;
data_sample ;
parity ;
// Detect transitions.
assign data_edge = data_sftreg[3] ^ data_sftreg[4] ;
// Detect sync pattern for command and status word
assign sync_csw = (sync_sftreg == 24'hFFF_000) & data_edge ;
// Detect sync pattern for data word
assign sync_dw = (sync_sftreg == 24'h000_FFF) & data_edge ;
// Count number of clocks to get complete word after
// detecting the sync pattern
always @(posedge dec_clk or negedge rst_n) begin
if (!rst_n )
cnt_enb <= 1'b0 ;
else if (sync_csw || sync_dw)
cnt_enb <= 1'b1 ;
else if (cnt == 'd131)
cnt_enb <= 1'b0 ;
else
cnt_enb <= cnt_enb ;
end
always @(posedge dec_clk or negedge rst_n) begin
if (!rst_n )
cnt <= 8'hFF ;
else if (cnt_enb)
cnt <= cnt + 1 ;
else if (!cnt_enb)
cnt <= 8'hFF ;
else
cnt <= cnt ;
end
end
endmodule