天天看點

12.3明德楊UART_TX調試經驗

根據明德楊的學習資料,一步一步敲寫UART_TX代碼。發現以下問題

總結如下:

12.3明德楊UART_TX調試經驗

12.2晚上代碼寫完後,仿真波形出不來,12.3早上通過檢視波形,定位到flag不能變成高電平,計數器就無法工作,tx_begin是時序邏輯flag變成1的條件。

always @(posedge clk or negedge rst_n) begin

       if (rst_n == 1'b0) begin

              // reset

              flag <= 0;    

       end

       else if (tx_begin) begin

              flag <= 1;

       end

       else if (end_cnt2) begin

              flag <= 0;

       end

end

assign tx_begin = tx_vld && !flag ;

tx_begin是組合邏輯,結果發現,tx_vld和clk,對齊了,導緻tx_begin和clk也對齊了,下一個時鐘上升沿,flag信号就變化不了,或者無法判斷tx_begin到底是低電平或者高電平。是以flag不能變成高電平。

是以對輸入端口tx_vld波形有要求,要麼波形長度大于一個時鐘周期,要麼不要和clk對齊。

改完波形如下:

12.3明德楊UART_TX調試經驗

改完後波形能夠正常輸出,但是自己觀察tx_begin,末端還是和clk上升沿對齊,但是flag還是能正常變成1,目前自己能力,隻考慮到後仿真,或者時序不能對齊時,可能還是會對flag跳轉為1有影響,修改tx_begin組合邏輯

assign tx_begin = tx_vld && !tx_rdy ;

修改完後,波形如下:

12.3明德楊UART_TX調試經驗

可以看到,tx_begin長度和tx_vld一緻了,後面自己還是有疑問,這樣tx_begin信号波形和tx_vld信号波形是一樣的,豈不是多此一舉。

想到flag是計數器開始标志,這會對整個計數開始時間

計算十個資料傳輸時間:

12.3明德楊UART_TX調試經驗

仿真波形顯示也是1.0416ms。

12.3明德楊UART_TX調試經驗

目前考慮到的就這麼多