一、模块框图及基本思路

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. 使用shiro框架,注销问题的解决

    在使用shiro框架的时候,有时候会因为登录问题找不到注销的controller.所以会报404的错误,下面是解决办法: 1.首先写一个类SystemLogoutFilter继承LogoutFilte ...

  2. 2019/4/12 wen 常用类3

  3. BIOS备忘录之EC常用知识点

    BIOS工程师眼中常用的EC知识点汇总: EC的硬件架构 EC硬件结构上主要分为两部分:Host Domain和EC Domain Host Domain就是通过LPC与CPU通信的部分(LPC部分需 ...

  4. php window系统 xdebug+phpstorm 本地断点调试使用教程

    运行环境: phpStorm 2017.2 PHP 7.1.5 Xdebug 2.6.1 php.ini添加xdebug模块 你需要仔细分析和选择要下载的对应版本,否则无法调试.由于非常容易出错,建议 ...

  5. Shell 实践、常用脚本

    (1)计算1-100的和. #!/bin/bash n= ` do n=$[$i+$n] done echo $n (2)输一个数字,然后计算出1到数字的和,要求如果输入数字小于1,则重新输入,知道输 ...

  6. IdentityServer4中Code/Token/IdToken对应可访问的资源(api/identity)

    { OidcConstants.ResponseTypes.Code, ScopeRequirement.None }, { OidcConstants.ResponseTypes.Token, Sc ...

  7. 2、haproxy配置参数详解

    代理相关配置参数 内容参考自马哥教育 HAProxy官方文档 https://cbonte.github.io/haproxy-dconv/2.0/configuration.html URI Syn ...

  8. 如何用 python 优雅地完成数据库课设

    0 前言 偶然间发现 Google 收录了学校实验打卡系统的接口,正好要做数据库课设,便拿来作为 environment. 机房居然装了 python ,早就听说 python 写爬虫速度一流,课上的 ...

  9. 全局解释器锁GIL & 线程锁

    1.GIL锁(Global Interpreter Lock) Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行 ...

  10. 5th,Python购物车模拟

    1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4.可随时退出,退 ...