基于Verilog的带FIFO写入缓冲的串口发送接口封装
一、模块框图及基本思路

tx_module:串口发送的核心模块,详细介绍请参照前面的“基于Verilog的串口发送实验”
fifo2tx_module:当fifo不为空时,读取fifo中的数据并使能发送
tx_fifo:深度为1024,8位宽度fifo
tx_interface:前面几个模块的组合
tx_interface_control:不断向tx_fifo中写入递增的8位数据(8’d0-8’hff)
tx_interface_top:顶层模块
二、软件部分
tx_bps_module:
module tx_bps_module #(parameter Baud=)(
CLK,RSTn,
Count_Sig,
BPS_CLK
);
input CLK;
input RSTn;
input Count_Sig;
output BPS_CLK; /***************************/
localparam Baud_Div=50_000_000/Baud-;
localparam Baud_Div2=Baud_Div/; reg[:] Count_BPS;
/*************************/
always @(posedge CLK or negedge RSTn)
begin
if(!RSTn)
Count_BPS<='d0;
else if(Count_BPS==Baud_Div)
Count_BPS<='d0;
else if(Count_Sig)
Count_BPS<=Count_BPS+;
else Count_BPS<='d0;
end
/************************/
assign BPS_CLK=(Count_BPS==Baud_Div2)?'b1:1'b0;
endmodule
tx_control_module:
module tx_control_module(
CLK,RSTn,
TX_En_Sig,TX_Data,BPS_CLK,
TX_Done_Sig,TX_Pin_Out
);
input CLK,RSTn;
input TX_En_Sig,BPS_CLK;
input [:]TX_Data;
output TX_Done_Sig,TX_Pin_Out;
/***************************************/
reg rTX;
reg isDone;
reg[:] i;
always @(posedge CLK or negedge RSTn)
begin
if(!RSTn)
begin
rTX<='b1;
isDone<='b0;
i<='d0;
end
else if(TX_En_Sig)
begin
case(i)
'd0:if(BPS_CLK) begin rTX<=0;i<=i+1'b1; end
'd1,4'd2,'d3,4'd4,'d5,4'd6,'d7,4'd8:
if(BPS_CLK) begin rTX<=TX_Data[i-];i<=i+'b1; end
'd9:if(BPS_CLK) begin rTX<=1;i<=i+1'b1; end
'd10:if(BPS_CLK) begin rTX<=1;i<=i+1'b1; end
'd11:if(BPS_CLK) begin isDone<=1;i<=i+1'b1; end
'd12: begin isDone<=0;i<=1'b0; end
endcase
end
end
/***************************************/
assign TX_Pin_Out=rTX;
assign TX_Done_Sig=isDone;
endmodule
tx_module:
module tx_module(
CLK,RSTn,
TX_En_Sig,TX_Data,TX_Pin_Out,TX_Done_Sig
);
input CLK;
input RSTn;
input TX_En_Sig;
input [:] TX_Data;
output TX_Pin_Out;
output TX_Done_Sig; wire BPS_CLK; tx_bps_module U0(.CLK(CLK),.RSTn(RSTn),.Count_Sig(TX_En_Sig),.BPS_CLK(BPS_CLK));
tx_control_module U1(.CLK(CLK),.RSTn(RSTn),.TX_En_Sig(TX_En_Sig),
.BPS_CLK(BPS_CLK),.TX_Data(TX_Data),.TX_Done_Sig(TX_Done_Sig),
.TX_Pin_Out(TX_Pin_Out));
endmodule
fifo2tx_module:
module fifo2tx_module(
input CLK,
input RSTn,
//fifo接口
input Empty_Sig,
input [:] FIFO_Read_Data,
output Read_Req_Sig,
//tx_module接口
input TX_Done_Sig,
output [:]TX_Data,
output TX_En_Sig
); /*************************************************/
reg isRead;
reg isTX;
reg [:]i;
always @(posedge CLK or negedge RSTn)
if(!RSTn)
begin
i<='d0;
isRead<='b0;
isTX<='b0;
end
else
case(i)
'd0:if(!Empty_Sig) begin isRead<=1'b1;i<=i+'b1; end
'd1:begin isRead<=1'b0;i<=+'b1; end
'd2:if(TX_Done_Sig) begin isTX<=1'b0;i<='d0; end
else isTX<='b1;
endcase
/************************************************/
assign Read_Req_Sig=isRead;
assign TX_En_Sig=isTX;
assign TX_Data=FIFO_Read_Data; endmodule
tx_interface:
module tx_interface(
input CLK,
input RSTn,
//FIFO写入接口
input Write_Req_Sig,
input [:]FIFO_Write_Data,
output Full_Sig, output TX_Pin_Out
); wire Empty_Sig;
wire Read_Req_Sig;
wire [:] FIFO_Read_Data; wire TX_En_Sig;
wire TX_Done_Sig;
wire [:]TX_Data; tx_fifo U0 (
.clk(CLK), // input clk
.rst(!RSTn), // input rst
.din(FIFO_Write_Data), // input [7 : 0] din
.wr_en(Write_Req_Sig), // input wr_en
.rd_en(Read_Req_Sig), // input rd_en
.dout(FIFO_Read_Data), // output [7 : 0] dout
.full(Full_Sig), // output full
.empty(Empty_Sig) // output empty
); fifo2tx_module U1 (
.CLK(CLK),
.RSTn(RSTn),
.Empty_Sig(Empty_Sig),
.FIFO_Read_Data(FIFO_Read_Data),
.Read_Req_Sig(Read_Req_Sig),
.TX_Done_Sig(TX_Done_Sig),
.TX_Data(TX_Data),
.TX_En_Sig(TX_En_Sig)
); tx_module U2 (
.CLK(CLK),
.RSTn(RSTn),
.TX_En_Sig(TX_En_Sig),
.TX_Data(TX_Data),
.TX_Pin_Out(TX_Pin_Out),
.TX_Done_Sig(TX_Done_Sig)
); endmodule
tx_interface_control:
module tx_interface_control(
input CLK,
input RSTn,
output Write_Req_Sig,
output [:]FIFO_Write_Data,
input Full_Sig
); /*****************FIFO写入部分********************/
reg [:] i;
reg Write_Req_Sig_r;
reg [:]FIFO_Write_Data_r; always @(posedge CLK or negedge RSTn)
if(!RSTn)
begin
FIFO_Write_Data_r<='d0;
i<='d0;
Write_Req_Sig_r<='b0;
end
else if(!Full_Sig)
case(i)
'd0:begin FIFO_Write_Data_r<=FIFO_Write_Data_r+1'b1;i<=i+'b1;Write_Req_Sig_r<=1'b1;end
'd1:begin i<=2'd0;Write_Req_Sig_r<='b0;end
endcase
assign Write_Req_Sig=Write_Req_Sig_r;
assign FIFO_Write_Data=FIFO_Write_Data_r; endmodule
tx_interface_top:
module tx_interface_top(
input CLK,
input RSTn,
output TX_Pin_Out
); wire Write_Req_Sig;
wire [:]FIFO_Write_Data;
wire Full_Sig; tx_interface_control U0 (
.CLK(CLK),
.RSTn(RSTn),
.Write_Req_Sig(Write_Req_Sig),
.FIFO_Write_Data(FIFO_Write_Data),
.Full_Sig(Full_Sig)
);
tx_interface U1 (
.CLK(CLK),
.RSTn(RSTn),
.Write_Req_Sig(Write_Req_Sig),
.FIFO_Write_Data(FIFO_Write_Data),
.Full_Sig(Full_Sig),
.TX_Pin_Out(TX_Pin_Out)
); endmodule
三、硬件部分
黑金SPARTAN开发板
NET "CLK" LOC = T8;
NET "RSTn" LOC = L3;
NET "TX_Pin_Out" LOC = D12;
基于Verilog的带FIFO写入缓冲的串口发送接口封装的更多相关文章
- 基于Verilog的带FIFO输出缓冲的串口接收接口封装
一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见“基于Verilog的串口接收实验” rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能 ...
- 基于Verilog的简单FIFO读写实验
一.模块框图及基本思路 fifo_ip:ISE生成的IP fifo_control:在fifo未满情况下不断写入递增的四位数,每隔1s读出一个数据驱动Led显示 fifo_top:前两个模块的组合 二 ...
- 基于Zabbix API文档二次开发与java接口封装
(继续贴一篇之前工作期间写的经验案例) 一. 案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...
- 带发送FIFO缓冲的RX232串口发送以及把众多文件变成“黑匣子”用于其它工程的调用
如果需要发送端不断地接收新的数据,而发送端的数据传输率低就需要一个缓冲器FIFO来缓冲数据.当你为别人做项目只是想实现功能而不想让自己的代码让别人看到,想保护自己的算法时,你可以用以下的方法.我使用的 ...
- 基于Verilog的奇数偶数小数分频器设计
今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然 ...
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- 基于jquery左侧带选项卡切换的焦点图
今天给大家分享一款基于jquery左侧带选项卡切换的焦点图.这款焦点图左侧有短标题,单击切换并显示长标题.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class ...
- 基于Verilog HDL 各种实验
菜鸟做的的小实验链接汇总: 1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...
- 基于Verilog HDL 的数字电压表设计
本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管. ADC0 ...
随机推荐
- 使用查询分析器和SQLCMD分别登录远程的SQL2005的1434端口
SQLCMD是操作SQLSERVER的一个命令行工具, 而查询分析器是它的图形工具 查询分析器(SQL2005下叫managerment studio),连接远程的SQLSERVER2005, ...
- Centosphp安装cassandra扩展
一.准备 当前php版本PHP Version 5.5.10,首先去http://pecl.php.net/package/cassandra,找到对应的php版本 二.下载安装 # wget htt ...
- Docker Swarm 常用命令
# 管理配置文件 docker config # 查看已创建配置文件 - docker config ls # 将已有配置文件添加到docker配置文件中 - dock ...
- VMware安装步骤既常见问题
一.vmware出问题? 可以使用vmvare的修复功能. 二.创建虚拟机 1)第一步:选择自定义下一步,典型里是都设定好了的. 2)第二步:选择12默认下一步 3)第三步:可以从光驱中安装,可以从文 ...
- python传参是传值还是传引用
在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象.而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的.例 ...
- linux中使用ifconfig命令查看网卡信息时显示为eth1,但是在network-scripts中只有ifcfg-eth0的配置文件,并且里面的NAME="eth0"。
除了题目中的问题,其实在执行命令:service network restart时,会报错: 解决办法: 首先需要修改70-persistent-net.rules文件: vim /etc/udev/ ...
- js实现千位分隔
最近一个项目中使用到了千位分隔这个功能,在网上也看见一些例子,但是实现起来总觉有些复杂.因此,自己实现了一个千位分隔,留给后来的我们. 先上源码吧. 该方法支持传入的是一个数字字符串,数字.第二个参数 ...
- Codeforces Round #FF (Div. 2) D. DZY Loves Modification 优先队列
D. DZY Loves Modification time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用
因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...
- DAY9 函数
一.脚本文件的执行 1.存放当前文件作为脚本文件执行的参数们:[‘当前文件的绝对路径’,手动传入的参数们] 2.脚本文件执行:直接用python解释器运行该文件 print(sys.argv) # ...