查看: 2575|回复: 2

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

[复制链接]
  • TA的每日心情
    开心
    2016-9-21 20:33
  • 签到天数: 29 天

    连续签到: 1 天

    [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 没写好,明天继续。
    回复

    使用道具 举报

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

    连续签到: 1 天

    [LV.4]偶尔看看III

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

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 03:28 , Processed in 0.134271 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.