串口通信控制器的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

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2016-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏owent

游戏服务器的不停服更新

我们目前的游戏第一次测试的时候笔记送匆忙,导致上线之后频繁更新。 比如BOSS战由于大区的人数和预期不一样导致的难度调整,或者是任务链或者数值调整,再加上一些...

48530
来自专栏java一日一条

13 年的 Bug 调试经验总结

在《Learning From Your Bugs》一文中,我写了关于我是如何追踪我所遇到的一些最有趣的bug。最近,我回顾了我所有的194个条目(从13岁开始...

11520
来自专栏张戈的专栏

WordPress后台首页显示RSS错误的解决办法

这两天,麻烦不断,可能是因为我折腾的比较频繁吧!老是出现奇奇怪怪的问题,而且百度、GG 居然搜不到有用的解决办法!折腾了大半天,终于被我搞定,虽然还是很笨的方法...

42660
来自专栏Golang语言社区

13 年的 Bug 调试经验总结

在《Learning From Your Bugs》一文中,我写了关于我是如何追踪我所遇到的一些最有趣的bug。最近,我回顾了我所有的194个条目(从13岁开始...

36060
来自专栏java思维导图

几分钟几张图教你学会如何使用UML

很多初次接触UML的朋友们可能会感觉它各种各样的线条、关系、描述等晦涩难懂。本篇文章简单介绍了一下其中几个图,用最朴实的语言结合上图片来让你一眼就能理解他们,如...

12430
来自专栏大愚Talk

为什么要用Redis

最近阅读了《Redis开发与运维》,非常不错。这里对书中的知识整理一下,方便自己回顾一下Redis的整个体系,来对相关知识点查漏补缺。

35720
来自专栏Golang语言社区

13 年的 Bug 调试经验总结

在《Learning From Your Bugs》一文中,我写了关于我是如何追踪我所遇到的一些最有趣的bug。最近,我回顾了我所有的194个条目(从13岁开始...

33760
来自专栏林冠宏的技术文章

Android 5.0 到 Android 6.0 + 的深坑之一 之 .so 动态库的适配

(原创:https://cloud.tencent.com/developer/user/1148436/activities) 目录:   前序   一,问题...

376100
来自专栏程序源代码

springcloud学习手册-微服务架构中的进程间通信

导读 | 通信即是连接 ? 一、通信即是连接,事务与事务的交流就是通过通信传输的 【定义】 通信,指人与人或人与自然之间通过某种行为或媒介进行的信息交流与...

37740
来自专栏杨建荣的学习笔记

Greenplum工具GPCC和GP日志中时间不匹配的问题分析

今天同事反馈了一个问题,之前看到没有太在意,虽然无伤大雅,但是想如果不重视,那么后期要遇到的问题就层出不穷,所以就作为我今天的任务之一来看看吧。能不能定位和解决...

17530

扫码关注云+社区

领取腾讯云代金券