// 对输入信号进行同步 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin rx_reg_1 <= 1'b1; // 初值为1 end elsebegin rx_reg_1 <= rx; end end
// 用于同步数据 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin rx_reg_2 <= 1'b1; // 初值为1 end elsebegin rx_reg_2 <= rx_reg_1; end end
// 用于同步数据 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin rx_reg_3 <= 1'b1; // 初值为1 end elsebegin rx_reg_3 <= rx_reg_2; end end
// 开始标志信号 start_flag always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin start_flag <= 1'b0; // 初值为0 end elseif((rx_reg_3 == 1'b1) && (rx_reg_2== 1'b0) && (work_en == 1'b0)) begin start_flag <= 1'b1; end elsebegin start_flag <= 1'b0; end end
// 使能信号 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin work_en <= 1'b0; // 初值为0 end // 开始接收拉高 elseif(start_flag == 1'b1) begin work_en <= 1'b1; end // 接收结束拉低(比特计数器为8,且读取标志为高) elseif((bit_cnt == 4'd8) && (bit_flag == 1'b1)) begin work_en <= 1'b0; end elsebegin work_en <= work_en; end end
// 波特计数器 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin baud_cnt <= 1'b0; // 初值为0 end // 归零条件 elseif((baud_cnt == BAUD_CNT__MAX - 1'b1) || (work_en == 1'b0) ) begin baud_cnt <= 16'b0; end // 波特计数器递增 elseif (work_en == 1'b1) begin baud_cnt <= baud_cnt + 1'b1; end elsebegin baud_cnt <= baud_cnt; end end
// 比特标志信号 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin bit_flag <= 1'b0; // 初值为0 end // 波特计数器达到波特率的一半时,比特标志拉高 elseif(baud_cnt == BAUD_CNT__MAX/2 - 1'b1) begin bit_flag <= 1'b1; end elsebegin bit_flag <= 1'b0; end end
// 比特计数器 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin bit_cnt <= 4'b0; // 初值为0 end // 归零条件 elseif((bit_cnt == 4'd8) && (bit_flag == 1'b1)) begin bit_cnt <= 4'b0; end // 比特计数器递增 elseif (bit_flag == 1'b1) begin bit_cnt <= bit_cnt + 1'b1; end elsebegin bit_cnt <= bit_cnt; end end
// 数据拼接 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin rx_data <= 8'd0; // 初值为0 end // 数据拼接(串行转并行数据) elseif((bit_cnt >= 4'd1) && (bit_cnt <= 4'd8) && (bit_flag == 1'b1)) begin rx_data <= {rx_reg_3, rx_data[7:1]}; end elsebegin rx_data <= rx_data; end end
// rx标志信号 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin rx_flag <= 1'b0; // 初值为0 end elseif((bit_cnt == 4'd8) && (bit_flag == 1'b1)) begin rx_flag <= 1'b1; end elsebegin rx_flag <= 1'b0; end end
// 输出数据 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin po_data <= 8'd0; // 初值为0 end elseif(rx_flag == 1'b1) begin po_data <= rx_data; end elsebegin po_data <= po_data; end end
// 输出标志信号 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n)begin po_flag <= 1'b0; // 初值为0 end elsebegin po_flag <= rx_flag; end end endmodule
// 使能信号 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n) begin work_en <= 1'b0; end elseif(pi_flag == 1'b1) begin work_en <= 1'b1; end elseif((bit_cnt == 4'd9) && (bit_flag == 1'b1)) begin work_en <= 1'b0; end else work_en <= work_en; end
// 波特计数器 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n) begin baud_cnt <= 16'd0; end // 归零条件 elseif((work_en == 1'b0) || (baud_cnt == BAUD_CNT__MAX - 1'b1)) begin baud_cnt <= 16'd0; end // 计数条件 elseif(work_en == 1'b1) begin baud_cnt <= baud_cnt + 1'b1; end else baud_cnt <= baud_cnt; end
// 比特标志信号 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n) begin bit_flag <= 1'b0; end elseif(baud_cnt == 16'b1) begin bit_flag <= 1'b1; end elsebegin bit_flag <= 1'b0; end end
// 比特计数器 always @(posedge sys_clk ornegedge sys_rst_n) begin if(!sys_rst_n) begin bit_cnt <= 4'd0; end // 归零条件 elseif((bit_flag == 1'b1) && (bit_cnt == 4'd9)) begin bit_cnt <= 4'd0; end // 计数条件 elseif((bit_flag == 1'b1) && (work_en == 1'b1)) begin bit_cnt <= bit_cnt + 1'b1; end elsebegin bit_cnt <= bit_cnt; end