FPGA 通过串口将rom中的10个初始数据发送给目标模块tx串口(最简单的数据处理)

思维分析图

rom模块的代码逻辑

`timescale 1ns / 1ps
module rom_2(
input        sys_clk    ,
input        sys_rst_n  ,
input        tx_done    ,
output [7:0] rom_data   ,//输出给tx
output  reg    rom_done   //一个8bit数据输出的结束信号
    );
reg [3:0] cnt;
reg ena             ;
reg [7: 0] addra    ;
reg flag;
reg [3:0] cnt_done;//计数tx——done
always@(posedge sys_clk)
if(!sys_rst_n)
   cnt<=0;
else if(cnt==10)
   cnt<=cnt;
else
   cnt<=cnt+1;
 //
 always@(posedge sys_clk)
if(!sys_rst_n)
     flag<=0;
else if(cnt==9)
     flag<=1;
else
     flag<=0;
     //cnt_done计数tx_done的次数
 always@(posedge sys_clk)
if(!sys_rst_n)
   cnt_done<=0;
else if(tx_done)begin
     if(cnt_done==9)
       cnt_done<=cnt_done;
     else 
       cnt_done<=cnt_done+1;
end
else
    cnt_done<=cnt_done;
   
 //
 always@(posedge sys_clk)
if(!sys_rst_n)
   rom_done<=0;
else if(flag)
   rom_done<=1; 
else if(tx_done && cnt_done<9)
   rom_done<=1;  
else if(tx_done && cnt_done==9)
     rom_done<=0;   
else
    rom_done<=0;
 //
  
always@(posedge sys_clk)
if(!sys_rst_n)
  ena<=0;
else
  ena<=1;
  
always@(posedge sys_clk)
if(!sys_rst_n)
   addra<=0;
else if(tx_done)begin
     if(addra==9)
        addra<=addra;
     else
        addra<=addra+1;
end
else
       addra<=addra;
rom_ten your_instance_name (
  .clka(sys_clk),    // input wire clka
  .ena(ena),      // input wire ena
  .addra(addra),  // input wire [7: 0] addra
  .douta(rom_data)  // output wire [7 : 0] douta
);
endmodule

tx端口模块

`timescale 1ns / 1ps


module tx(
    input           sysclk      ,
    input           rst_n       ,
    input [7:0]     data        ,//数据并行输入
    input           done        ,//tx的开始信号
    output          tx          ,//数据输出--串行输出
    output          tx_done
    );
    
    parameter clk = 50_000_000,//1s内部时钟晶振次数
               bps = 9600,//波特率
           CNT_MAX = clk/bps;//传输一个Bit需要的时间周期
    reg [31:0] cnt_bps;//传输一个bit需要的计时器
    reg [3:0] cnt_bit;//bit位计数器,看传输到第几个bit
    reg en;//工作时间阈值(包装数据--->tx)
    reg [7:0] data_reg;//输入数据寄存器
    reg tx_reg;
    reg    done_d1 =0;
    
    always@(posedge sysclk)begin
        done_d1<=done;
    
    end
    
    //en工作阈值
    always@(posedge sysclk)
        if(!rst_n)
            en<=0;
        else if(done==1)
            en<=1;
        else if(cnt_bit==9 && cnt_bps==CNT_MAX-1)
            en<=0;
        else    
            en<=en;
     
     //输入数据寄存模块
     always@(posedge sysclk)
        if(!rst_n)
            data_reg<=0;
        else if(done_d1)//开始工作时就寄存并行输入的data
            data_reg<=data;
        else
            data_reg<=data_reg;
            
     //cnt_bps-->包装一个bit需要的时间计时器
    always@(posedge sysclk )
         if(!rst_n)
             cnt_bps<=0;
         else if(en==1)begin
             if(cnt_bps==CNT_MAX-1)
                 cnt_bps<=0;
             else
                 cnt_bps<=cnt_bps+1;
         end
         else
             cnt_bps<=0;
   //cnt_bit-->表示包装到了哪一个Bit--bie位计数器
    always@(posedge sysclk )
         if(!rst_n)
             cnt_bit<=0;
         else if(en==1)begin
             if(cnt_bps==CNT_MAX-1)
                 cnt_bit<=cnt_bit+1;
             else
                 cnt_bit<=cnt_bit;
         end
         else
             cnt_bit<=0;     
    
    //tx_reg-->表示开始包装数据(数据包装流水线)
    always@(posedge sysclk )
        if(!rst_n)
            tx_reg<=1;//空闲,不需要打包数据
        else if(en==1)begin
            if(cnt_bit==0)//包装起始位
                tx_reg<=0;
            else if(cnt_bit==9)//包装停止位
                tx_reg<=1;
            else
                tx_reg<=data_reg[cnt_bit-1];//数据串行包装(由低位开始)        
        end
        else
            tx_reg<=1;
    
     assign tx = tx_reg;
     assign tx_done = (cnt_bit==9&&cnt_bps==CNT_MAX-1)?1:0;
    
endmodule

顶层模块

`timescale 1ns / 1ps


module top(
    input           sysclk      ,
    input           rst_n       ,
    output          tx          //数据输出--串行输出
   
    );
    wire              done    ;//tx的开始信号
    wire               tx_done ;
    wire     [7:0]     rom_data;

    

 rom_2 u(
.   sys_clk   ( sysclk  ) ,
.   sys_rst_n ( rst_n) ,
.   tx_done   ( tx_done  ) ,
.   rom_data  ( rom_data ) ,//输出给tx
.   rom_done  ( done ) //一个8bit数据输出的结束信号
    );   
    tx tx_u(
    . sysclk   ( sysclk  )   ,
    . rst_n    ( rst_n   )   ,
    . data     ( rom_data    )   ,//数据并行输入
    . done     ( done    )   ,//tx的开始信号
    . tx       ( tx      )   ,//数据输出--串行输出
    . tx_done  ( tx_done )
    );
endmodule

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值