查看: 438|回复: 2

[原创] 从零开始学FPGA我的第八个实验(上1.1)(记录一下)

[复制链接]

19

主题

2

好友

370

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    开心
    2016-9-21 20:33
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    发表于 2016-7-26 22:46:24 |显示全部楼层
    先记录一下,每天一点一点琢磨,学fpga也就半个月左右,看了一学期夏宇闻的书,现在留在学校学FPGA想做一个FPAG+STM32F7的示波器,希望大家多多指教。
    继续完成我的UART_TX模块的代码编写(每天一点一点琢磨把我学明白的记录下来)
    我是根据UART模型一个一个模块来代码实现
    P60726-223508.jpg

    代码:
    1. module uart_tx(Clk,Rst_n,data,bps_set,send_en,TX);
    2.                
    3.                 input Clk;//系统时钟
    4.                 input Rst_n;//复位
    5.                 input [7:0]data;//要发送的数据
    6.                
    7.                 input [2:0]bps_set;//波特率设置
    8.            input send_en;//发送使能
    9.                
    10.                 output reg  TX;//UART_TX
    11.                 reg uart_state;//TX口的状态
    12.                
    13.                
    14.                 reg bps_clk;//波特率时钟
    15.                 reg [15:0]bps_DR;//分频计数的最大值
    16.            reg [3:0]bps_cnt;        //波特率时钟计数器
    17.                
    18.                 localparam Start = 1'b0;//开始发送数据的标志
    19.                 localparam Stop = 1'b1;//发送结束的标志
    20.                 reg [7:0] data_r;//缓存要发送的数据 以防止在发送过程中数据被修改
    21.                
    22.                
    23. //波特率设置模块通过bps_set[0:3]来选择波特率 bps_DR 其实是一个查找表
    24.       always @(posedge Clk or negedge Rst_n )
    25.       if(!Rst_n)
    26.          bps_DR  <= 16'd5207;//默认的波特率是9600
    27.            else begin
    28.                    case (bps_set)
    29.                         0: bps_DR <= 16'd5207;//9600
    30.                         1: bps_DR <= 16'd2603;//19200
    31.                         2: bps_DR <= 16'd1301;//38400
    32.                         3: bps_DR <= 16'd807;//57000
    33.                         4: bps_DR <= 16'd433;//115200
    34.                         default : bps_DR  <= 16'd5207;//其他情况的波特率是9600
    35.          endcase
    36.       end                 
    37.                
    38.                 //分频计数器 根据上面选择的波特率 也就是分频计数的最大值来实现计数的范围达到分频
    39.       reg[15:0] div_cnt;
    40.                 always@(posedge Clk or negedge Rst_n)
    41.                 if(!Rst_n)
    42.                       div_cnt <= 16'd0;
    43.                 else if(uart_state)begin //如果有发送使能则开始计数
    44.                     if(div_cnt == bps_DR)
    45.                         div_cnt <= 16'd0;
    46.                     else
    47.                    div_cnt <= div_cnt + 1'b1;
    48.                     end
    49.                 else
    50.                                 div_cnt <= 16'b0;
    51.         //产生bps时钟        由bps_cnt 计数实现不同波特率bps_clk 就是最终实现的波特率的时钟信号                        
    52.       always@(posedge Clk or negedge Rst_n)
    53.                 if(!Rst_n)
    54.                    bps_clk <= 1'b0;
    55.                 else if(div_cnt == 16'd1)//防止滞后的情况
    56.                    bps_clk <= 1'b1;
    57.                 else
    58.                         bps_clk <= 1'b0;
    59. //11MUX 模块
    60.       always @(posedge Clk or negedge Rst_n)
    61.                    if(!Rst_n)
    62.                         bps_cnt <= 4'd0;
    63.                         else if(send_en)//发送使能
    64.                            uart_state <= 1'b1;
    65.                         else if(bps_cnt == 4'd11)//一个字节的数据发送完成了
    66.                            uart_state <= 1'b0;
    67.                                 else
    68.                    uart_state <= uart_state ;
    69. //先缓存要发送的数据 防止数据在发送过程中被修改了
    70.                         always @(posedge Clk or negedge Rst_n)
    71.          if(!Rst_n)
    72.                          data_r <= 8'd0;
    73.                          else if(send_en )
    74.                             data_r <= data;
    75.                     else
    76.                            data_r <= data_r;
    77.         //最终数据发送的模块                        
    78.       always@(posedge Clk or negedge Rst_n)               
    79.                  if(!Rst_n)
    80.                   TX <= 1'b1;
    81.                   else begin
    82.                        case(bps_cnt)
    83.                                 0:TX <= 1'b1;
    84.                                 1:TX <= Start;
    85.                                 2:TX <= data[0];
    86.                                 3:TX <= data[1];
    87.                                 4:TX <= data[2];
    88.                                 5:TX <= data[3];
    89.                                 6:TX <= data[4];
    90.                                 7:TX <= data[5];
    91.                                 8:TX <= data[6];
    92.                                 9:TX <= data[7];
    93.                                 10:TX <=Stop;
    94.                                 default: TX <= 1'b1;
    95.                              endcase
    96.                         end               
    97. endmodule
    复制代码
    刚才写的testbeach 没写好,明天继续。
    回复

    使用道具 举报

    19

    主题

    2

    好友

    370

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    开心
    2016-9-21 20:33
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    发表于 2016-7-26 23:01:51 |显示全部楼层
        占楼     
    回复

    使用道具 举报

    112

    主题

    62

    好友

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    该用户从未签到

    分区版主职务勋章

    发表于 2016-7-27 16:03:49 |显示全部楼层
    这边有夏宇闻教学视频,http://www.moore8.com/tags/index/71,供学习
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-9 04:12 , Processed in 0.135614 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部