芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 183|回复: 1

做串口接送控制led的实验问题

[复制链接]
  • TA的每日心情
    难过
    7 天前
  • 1

    主题

    2

    帖子

    10

    积分

    新手入门

    Rank: 1

    积分
    10
    发表于 7 天前 | 显示全部楼层 |阅读模式
    有没有大佬能帮我一下,在这个实验中,我按照视频做了一下,仿真出来的波形也没有问题(如图一),但是我下载到板子上面,我论我怎么弄,灯(绑定的是PL端的T14引脚这个灯)都不会亮,除了在我传输数据的时候,EDA拓展板上的D12这个会闪一下;后面我又直接小梅哥例程的代码,发现例程的代码我下载到板子上有的时候有用有的时候又没用,这是为什么。下面的是我自己跟着视频写的代码:
    顶层:
    `timescale 1ns / 1ps
    module top(
        input clk,
        input rst_n,
        input uart_tx,
        output Led
        );
    wire [7:0] Ctrl           ;
    wire [31:0] Time           ;
    wire [7:0] uart_rx        ;
    wire rx_done        ;
    wire en_time;
    counter_led_4 uut(
       .Clk     (clk    ),
       .Reset_n (rst_n),
       .Ctrl    (Ctrl   ),
       .Time    (Time   ),
       .Led     (Led    )
    );
    uart_rx  uut0(
    .clk     (clk    )   ,
    .rst_n   (rst_n  )   ,
    .uart_tx (uart_tx)   ,
    .uart_rx (uart_rx)   ,
    .rx_done (rx_done)
        );
    uart_cmd  uut1(
    .clk     (clk    ),
    .rst_n   (rst_n  ),
    .uart_rx (uart_rx),
    .rx_done (rx_done),
    .Ctrl    (Ctrl   ),
    .Time    (Time   )
        );
    endmodule



    串口接收模块:
    `timescale 1ns / 1ps
    module uart_rx(
    input clk,
    input rst_n,
    input uart_tx,
    output reg [7:0] uart_rx,
    output reg rx_done
        );

    parameter CLK_P=50_000_000;
    parameter BAUT=9600;
    parameter BAUT_CNT_MAX=CLK_P/BAUT-1;

    reg [7:0] R_uart_rx;
    reg uart_tx_del;
    wire uart_tx_negedge;
    reg [12:0] baud_cnt;
    reg baud_cnt_en;
    reg [3:0] wei;
    reg dff0_uart_tx;
    reg dff1_uart_tx;
    always@(posedge clk )begin
            dff0_uart_tx<=uart_tx;
    end
    always@(posedge clk )begin
            dff1_uart_tx<=dff0_uart_tx;
    end
    //检测下降沿
    always@(posedge clk )begin
            uart_tx_del<=dff1_uart_tx;
    end
    assign uart_tx_negedge=(dff1_uart_tx==1'b0)&&(uart_tx_del==1'b1);//上升沿来时为1
    //波特率计数
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            baud_cnt<=13'b0;
        else if (baud_cnt_en)begin
            if(baud_cnt==BAUT_CNT_MAX)
                baud_cnt<=13'b0;
            else
                baud_cnt<=baud_cnt+13'b1;
        end
    end
    //baud_cnt_en波特计数使能
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            baud_cnt_en<=1'b0;
        else if (uart_tx_negedge)
            baud_cnt_en<=1'b1;
        else if( (baud_cnt==BAUT_CNT_MAX/2) && (wei==0) &&( dff1_uart_tx==1))
            baud_cnt_en<=1'b0;
        else if((baud_cnt==BAUT_CNT_MAX/2) &&(wei==9))
              baud_cnt_en<=1'b0;
        else
          baud_cnt_en<=baud_cnt_en;
    end
    //位计数
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            wei<=4'b0;
        else if((baud_cnt==BAUT_CNT_MAX/2)&&(wei==9))
               wei<=4'b0;
        else if(baud_cnt==BAUT_CNT_MAX)
                wei<=wei+1;
        else
            wei<=wei;
    end
    //输出
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            R_uart_rx<=8'b0;
        else if(baud_cnt==BAUT_CNT_MAX/2)begin
           case(wei)
                1:  R_uart_rx[0]   <= uart_tx;
                2:  R_uart_rx[1]   <= uart_tx;
                3:  R_uart_rx[2]   <= uart_tx;
                4:  R_uart_rx[3]   <= uart_tx;
                5:  R_uart_rx[4]   <= uart_tx;
                6:  R_uart_rx[5]   <= uart_tx;
                7:  R_uart_rx[6]   <= uart_tx;
                8:  R_uart_rx[7]   <= uart_tx;
             default:R_uart_rx<=R_uart_rx;
           endcase
         end
    end
    wire R_rx_done;
    //接收完成标志
    assign R_rx_done=(baud_cnt==BAUT_CNT_MAX/2) &&(wei==9);
    always@(posedge clk)begin
        rx_done<=R_rx_done;
    end
    always@(posedge clk)begin
        if(R_rx_done)
       uart_rx<=R_uart_rx;
    end

    endmodule


    串口接收控制模块:
    `timescale 1ns / 1ps
    module uart_cmd(
    input clk,
    input rst_n,
    input [7:0] uart_rx,
    input rx_done,
    output reg [7:0] Ctrl,
    output reg [31:0] Time

        );
    reg r_rx_done;
    always@(posedge clk )begin
            r_rx_done<=rx_done;
    end
    reg [7:0] huan [7:0];//二维寄存器,先每个值的宽度,再有几个数据,(宽度、深度)
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
           huan[0]<=0;
           huan[1]<=0;
           huan[2]<=0;
           huan[3]<=0;
           huan[4]<=0;
           huan[5]<=0;
           huan[6]<=0;
           huan[7]<=0;
        end
        else if (rx_done)begin
             huan[0]<=  huan[1]  ;
             huan[1]<=  huan[2]  ;
             huan[2]<=  huan[3]  ;
             huan[3]<=  huan[4]  ;
             huan[4]<=  huan[5]  ;
             huan[5]<=  huan[6]  ;
             huan[6]<=  huan[7]  ;
             huan[7]<=  uart_rx  ;
        end
    end
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            Ctrl<=8'b0;
            Time<=32'b0;
        end
        else if (r_rx_done)begin
            if((huan[0]==8'h55)&&(huan[1]==8'hA5)&&(huan[7]==8'hf0))begin
               Time[7:0]<=huan[5];
               Time[15:8]<=huan[4];
               Time[23:16]<=huan[3];
               Time[31:24]<=huan[2];
               Ctrl<=huan[6];
               end
            else begin
                 Ctrl<=Ctrl;  
                 Time<=Time;
             end
         end
    end
    endmodule


    灯的控制:
    `timescale 1ns/1ns
    module counter_led_4(
        Clk,
        Reset_n,
        Ctrl,
        Time,
        Led

    );
        input Clk;
        input Reset_n;
        input [7:0]Ctrl;
        input [31:0]Time;
        output reg Led;

        reg [31:0]counter;

        always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            counter <=  0;
        else if(counter >= Time - 1)
                counter <=  0;
        else
                counter <=  counter + 1'b1;

        reg [2:0]counter2;
        always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            counter2 <=  0;
        else if(counter >= Time - 1)
            counter2 <= counter2 + 1'b1;

        always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            Led <=  0;
        else case(counter2)
            0ed <=  Ctrl[0];
            1ed <=  Ctrl[1];
            2ed <=  Ctrl[2];
            3ed <=  Ctrl[3];
            4ed <=  Ctrl[4];
            5ed <=  Ctrl[5];
            6ed <=  Ctrl[6];
            7ed <=  Ctrl[7];
            defaulted <=  Led;
        endcase

    endmodule


    图一

    图一
    image.png
    回复

    使用道具 举报

  • TA的每日心情
    难过
    7 天前
  • 1

    主题

    2

    帖子

    10

    积分

    新手入门

    Rank: 1

    积分
    10
     楼主| 发表于 7 天前 | 显示全部楼层
    input uart_tx表示的是串口接收的数据
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2025-4-16 14:09 , Processed in 0.339692 second(s), 33 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表