一、模块框图及基本思路

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写入缓冲的串口发送接口封装的更多相关文章

  1. 基于Verilog的带FIFO输出缓冲的串口接收接口封装

    一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见“基于Verilog的串口接收实验” rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能 ...

  2. 基于Verilog的简单FIFO读写实验

    一.模块框图及基本思路 fifo_ip:ISE生成的IP fifo_control:在fifo未满情况下不断写入递增的四位数,每隔1s读出一个数据驱动Led显示 fifo_top:前两个模块的组合 二 ...

  3. 基于Zabbix API文档二次开发与java接口封装

    (继续贴一篇之前工作期间写的经验案例) 一.           案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...

  4. 带发送FIFO缓冲的RX232串口发送以及把众多文件变成“黑匣子”用于其它工程的调用

    如果需要发送端不断地接收新的数据,而发送端的数据传输率低就需要一个缓冲器FIFO来缓冲数据.当你为别人做项目只是想实现功能而不想让自己的代码让别人看到,想保护自己的算法时,你可以用以下的方法.我使用的 ...

  5. 基于Verilog的奇数偶数小数分频器设计

    今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然 ...

  6. 基于Verilog HDL整数乘法器设计与仿真验证

    基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...

  7. 基于jquery左侧带选项卡切换的焦点图

    今天给大家分享一款基于jquery左侧带选项卡切换的焦点图.这款焦点图左侧有短标题,单击切换并显示长标题.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class ...

  8. 基于Verilog HDL 各种实验

    菜鸟做的的小实验链接汇总:           1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...

  9. 基于Verilog HDL 的数字电压表设计

    本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管. ADC0 ...

随机推荐

  1. 【 记忆网络 2 】 End-to-End Memory Network

    继上一篇:Memory Network 1. 摘要 引入了一个神经网络,在一个可能很大的外部记忆上建立了一个recurrent attention模型. 该体系结构是记忆网络的一种形式,但与该工作中的 ...

  2. Shell 常用技巧

    Shell 常用技巧 echo $RANDOM | cksum | cut -c - openssl rand -base64 | cksum | cut -c - date +%N | cut -c ...

  3. Linux 默认线程栈大小 调优

    Linux 线程栈介绍 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等:和堆相比,栈通常很小. Linux 查询线程栈 1.查看默认的 ...

  4. Windows下用python来获取微信撤回消息

    转自:https://blog.csdn.net/sunzhibin1/article/details/83348304 娱乐(windows系统) 安装itchat itchat是一个开源的pyth ...

  5. echarts2.0tooltip边框限制导致tooltip显示不全解决办法

    1.显示常数位置x和y; 2.根据鼠标移动显示:tooltip : { trigger: 'axis', position:function(p){ //其中p为当前鼠标的位置 return [p[0 ...

  6. android中SELINUX规则分析和语法简介【转】

    本文转载自:https://blog.csdn.net/LoongEmbedded/article/details/62430039 1. SELINUX是可以理解为一种Android上面的安全机制, ...

  7. 论文笔记:Real-Time MDNet

    Real-Time MDNet ECCV 2018  2018-10-22 15:52:01 Paper:http://openaccess.thecvf.com/content_ECCV_2018/ ...

  8. (转载)Unity3D开发之编辑器统一修改Text字体

    最近遇到一个需求,就是我们在做完一个场景后,美工感觉字体不好看,效果不是很好,想要换一种字体.UGUI的界面已经搭完,如果要一个一个Text寻找,工作量将是巨大.而且作为程序人员是不会容忍自己做这些机 ...

  9. HTML基础【3】:列表标签

    无序列表 作用:给一堆内容添加无序列表语义(一个没有先后顺序整体),列表中的条目不分先后 格式: li 英文是 list item,翻译为列表项 <h4>选择居住城市(CN)</h4 ...

  10. 在客户端先通过JS验证后再将表单提交到服务器

    问题:想要在客户端先通过JS验证后再将表单提交到服务器 参考资料: jQuery 事件 - submit() 方法 试验过程: 服务器端使用PHP <html> <head> ...