本次所做的项目比较复杂(对我本人来讲),设计一个Uart IP核,在其基础,封装axi接口,使其成为面向AXI口的IP,再例化个microblaze作为主机,使microblaze与Uart之间通过AXI总线进行通信。具体模块图如下,包含主机microblaze,主接口模块,从接口模块,从机Uart。
本文首先介绍Uart基本模块。该顶层模块包含接受模块、发送模块、发送波特率设置模块、接受波特率设置模块。为了方便验证,我们将接受模块与发送模块连接,采用回环的形式。
接受模块
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2019/05/24 16:58:41
// Design Name:
// Module Name: uart_rx
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module uart_rx(
clk,
rst_n,
Rs232_rx,
bps_clk,
rx_data,
rx_int,
bps_start
);
input clk;
input rst_n;
input bps_clk;
input Rs232_rx;
output [7:0] rx_data;
output reg rx_int;
output reg bps_start;
reg Rs232_rx0,Rs232_rx1,Rs232_rx2,Rs232_rx3;
wire neg_edge;
reg [3:0] num;
reg [7:0] rx_data_t1;
reg [7:0] rx_data_t2;
always@(posedge clk or negedge rst_n)
if(!rst_n) begin
Rs232_rx0 <= 1'b1;
Rs232_rx1 <= 1'b1;
Rs232_rx2 <= 1'b1;
Rs232_rx3 <= 1'b1;
end
else begin
Rs232_rx0 <= Rs232_rx;
Rs232_rx1 <= Rs232_rx0;
Rs232_rx2 <= Rs232_rx1;
Rs232_rx3 <= Rs232_rx2;
end
assign neg_edge = Rs232_rx3 & Rs232_rx2 & ~Rs232_rx1 & ~Rs232_rx0;
always@(posedge clk or negedge rst_n)
if(!rst_n) begin
bps_start <= 1'b0;
rx_int <= 1'b0;
end
else if (neg_edge) begin
bps_start <= 1'b1;
rx_int <= 1'b1;
end
else if (num == 4'd10) begin
bps_start <= 1'b0;
rx_int <= 1'b0;
end
always@(posedge clk or negedge rst_n)
if(!rst_n) begin
rx_data_t1 <= 8'd0;
rx_data_t2 <=8'd0;
num <= 4'd0;
end
else if(rx_int) begin
if (bps_clk) begin
num <= num+1'b1;
case(num)
4'd1: rx_data_t1[0] <= Rs232_rx