串口通信控制器的Verilog HDL实现(一) 顶层模块

时间:2022-04-28
本文章向大家介绍串口通信控制器的Verilog HDL实现(一) 顶层模块,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本设计采用分层设计思想,主要由顶层模块、波特率发生器、接收模块和发送模块这4个模块组成,强调功能划分明确,便于系统设计和调试。

本系统要求在Xilinx Spartan 3E Starter开发板上实现波特率为9600,停止位为1比特、不带校验位并且具备复位功能的串口通信控制器,并要求和PC机通过超级终端完成双向通信。不仅要求将板极发送数据显示在PC机的超级终端上,还要求用PC发送数据的ASCII码来驱动电路板的8个LED灯。为了便于测试,要求当按下开发板上的button_s时,板级发送的数值恢复到48,对应着字符0(字符0的ASCII码为48),然后按下一次button_n,发送数据加1。

因此,在系统实现时,不仅要包括完整的串口通信模块,还需要有相应的按键处理模块。这是因为按键按下的持续时间很长,对发送模块来讲,是一个电平信号,而不是脉冲信号,因此需要利用同步整形电路,将其处理成单时钟周期宽度的脉冲信号。

顶层模块作为设计的主干,用于例化各个模块以及响应外部按键,不包含串口收发模块的处理代码。串口通信控制器的顶层模块uart_top的代码如下所列。

module uart_top(
sys_clk_50MHz,rst_p,txd,rxd,LED,button_n,button_s
    );
 input sys_clk_50MHz;
 input rst_p;
 input rxd;
 output txd;
 input button;
 input button_s;
 output [7:0]LED;
 reg [7:0]LED;
 wire bclk;
 wire [7:0]rx_dout;
 wire ready;
 reg [7:0]din;
 wire tx_ready;
 reg tx_cmd;
 baud_gen u1(
.clk_50MHz(sys_clk_50MHz),
.rst_p(rst_p),
.bclk(bclk)
);
reg [2:0]bv1,bv2;
wire bv1_posedge,bv2_posedge;
always @(posedge bclk)
begin
bv1<={bv1[1:0],button_n};
bv2<={bv2[1:0],rx_ready};
end
assign bv1_posedge=(!bv1[2])&bv1[1];
assign bv2_posedge=(!bv2[2])&bv2[1];
always@(posedge bclk)
begin
if(button_s==1'b1)
begin
din<=48;//ASCII   0
tx_cmd<=1'b0;
end
else
begin
if(bv1_posedge==1'b1)
begin
din<=din+1'b1;
tx_cmd<=1'b1&tx_ready;
end
else
begin
din<=din;
tx_cmd<=1'b0;
end
end
end
always@(posedge bclk)
begin
if(bv2_posedge==1'b1)
begin
LED<=rx_dout;
end
end
uart_tx u2(
.bclk(bclk),
.reset(rst_p),
.tx_din(din),
.tx_cmd(tx_cmd),
.tx_ready(tx_ready),
.txd(txd)
);
uart_rx u3(
.bclk(bclk),
.reset(rst_p),
.rxd(rxd),
.rx_out(rx_out),
.rx_ready(rx_ready)
);
endmodule