根據明德楊的學習資料,一步一步敲寫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對齊。
改完波形如下:
改完後波形能夠正常輸出,但是自己觀察tx_begin,末端還是和clk上升沿對齊,但是flag還是能正常變成1,目前自己能力,隻考慮到後仿真,或者時序不能對齊時,可能還是會對flag跳轉為1有影響,修改tx_begin組合邏輯
assign tx_begin = tx_vld && !tx_rdy ;
修改完後,波形如下:
可以看到,tx_begin長度和tx_vld一緻了,後面自己還是有疑問,這樣tx_begin信号波形和tx_vld信号波形是一樣的,豈不是多此一舉。
想到flag是計數器開始标志,這會對整個計數開始時間
計算十個資料傳輸時間:
仿真波形顯示也是1.0416ms。
目前考慮到的就這麼多