微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 串口求助

串口求助

时间:10-02 整理:3721RD 点击:
module UartRecv (
              //input
              sys_clk        ,
              sys_rst_n      ,
              uart_rxd       ,
              //output
              LED
              );
//input ports
input                    sys_clk             ;    //system clock;
input                    sys_rst_n           ;    //system reset, low is active;
input                    uart_rxd            ;    //uart rxd input ;   
//output ports
output reg [WIDTH-1:0]   LED                ;
//reg define
reg    [WIDTH-1:0]       buff                ;         
reg    [WIDTH-1:0]       data_out            ;
reg                      uart_rxd_dly1       ;    //uart rxd input ;   
reg                      uart_rxd_dly2       ;    //uart rxd input ;   
reg                      uart_rxd_dly3       ;    //uart rxd input ;
reg                      uart_rxd_dly4       ;    //uart rxd input ;
reg                      rxd_negdge_sig_dly1 ;

reg  [SIZE-1:0]          counter             ;     
//wire define
wire                     rxd_negdge_sig      ;
//parameter define
parameter WIDTH = 8;
parameter SIZE  = 16;
/*******************************************************************************************************
**                              Main Program   
**  
********************************************************************************************************/
always @(posedge sys_clk or negedge sys_rst_n) begin
        if (sys_rst_n ==1'b0) begin
           uart_rxd_dly1 <= 1'b0;
           uart_rxd_dly2 <= 1'b0;
           uart_rxd_dly3 <= 1'b0;           
           uart_rxd_dly4 <= 1'b0;           
        end
        else begin
           uart_rxd_dly1  <= uart_rxd     ;
           uart_rxd_dly2  <= uart_rxd_dly1;
           uart_rxd_dly3  <= uart_rxd_dly2;           
           uart_rxd_dly4  <= uart_rxd_dly3;            
        end   
end
assign rxd_negdge_sig = (~uart_rxd_dly3) & uart_rxd_dly4;  
always @(posedge sys_clk or negedge sys_rst_n) begin
        if (sys_rst_n ==1'b0)  
           rxd_negdge_sig_dly1 <= 1'b0;        
        else  
           rxd_negdge_sig_dly1  <= rxd_negdge_sig;                    
end
always @(posedge sys_clk or negedge sys_rst_n) begin
        if ( sys_rst_n == 1'b0 )  
            counter <= 16'b0;
        else if ( rxd_negdge_sig_dly1 == 1'b1 && counter > 57200 )
            counter <= 16'b0;
        else if ( counter <= 57200 )  
            counter  <= counter + 16'b1;   
        else ;
end
always @(posedge sys_clk or negedge sys_rst_n) begin
    if ( sys_rst_n == 1'b0 )  
        buff <= 8'b0;   
    else begin
        case ( counter )
             7800     :   buff[0]  <=  uart_rxd_dly4     ;
             13000    :   buff[1]  <=  uart_rxd_dly4     ;
             18200    :   buff[2]  <=  uart_rxd_dly4     ;
             23400    :   buff[3]  <=  uart_rxd_dly4     ;
             28600    :   buff[4]  <=  uart_rxd_dly4     ;
             33800    :   buff[5]  <=  uart_rxd_dly4     ;
             39000    :   buff[6]  <=  uart_rxd_dly4     ;
             44200    :   buff[7]  <=  uart_rxd_dly4     ;
             default  :   buff     <=  buff              ;   
        endcase
    end
end
always @(posedge sys_clk or negedge sys_rst_n) begin
        if (sys_rst_n ==1'b0)  
           LED <= 8'b0;        
        else  
           LED <= buff;        
end
endmodule
//end of RTL code        

请教一下rxd_negdge_sig_dly1什么时候会为1?   感觉assign rxd_negdge_sig = (~uart_rxd_dly3) & uart_rxd_dly4;  这个永远不会为1?( uart_rxd_dly3 =0  uart_rxd_dly3 =1的时候我知道是会为1,但是好像这个情况不会出现吧? )       当uart_rxd =1时候,uart_rxd_dly4赋值给BUFF 我是认为这些值都是同样的值,但是实验起来指示灯只有3个亮,说明这些值赋值给BUFF后有几个时段为1,几个时段为0,不知道啥原因,向各位大虾请教一下,谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top