前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >串口通信控制器的Verilog HDL实现(一) 顶层模块

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

作者头像
瓜大三哥
发布2018-02-24 17:32:47
1.6K0
发布2018-02-24 17:32:47
举报
文章被收录于专栏:瓜大三哥

本设计采用分层设计思想,主要由顶层模块、波特率发生器、接收模块和发送模块这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的代码如下所列。

代码语言:js
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜大三哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档