問題描述
在run_sim能正確運作uart_fifo,但無法在PS端執行對應功能
更改部分
- UART的RX是從mprj[5]進來的,當UART的character開始近來,uart_rx.v會detect到start bit,並開始把rx收到的bit放到rx_buffer。目前改動,在uart_rx.v中加入count來數一下FIFO收了多少筆資料。
- 原本的uart_rx.v中,接收stop bit如果沒有問題,就會跳到IRQ state,並且拉起往CPU的"irq"訊號(irq<=1'b1;)。改動為跳到IRQ這個state之後,如果count還沒到FIFO的深度,就拉起假的irq (fake_irq)來通知uart_ctrl.v,而非直接傳到CPU,並且在最後一次才會真的拉起irq,通知CPU,FIFO滿了。
- 原本uart_ctrl.v中,rx_buffer直接收下uart_rx.v組好的character,並且在i_wb_adr==RX_DATA,也就是CPU要抓uart的rx data的時候,將rx_buffer送出去。改動為rx_buffer變成一個array,並且把每次從uart_rx.v收到的character送到FIFO尾端(rx_buffer[UART_FIFO_DEPTH-1]),持續丟進此FIFO (shift register)。並且在CPU要抓rx data的時候,輸出rx_buffer[0],並且shift一次此rx_buffer array。(也就是從FIFO中pop出來)
- 把isr.c中改成讀depth的深度的次數,並loop back。可以觀察到,當uart_rx.v、uart_ctrl.v、isr.c中uart fifo depth都設為2的話,模擬起來可以看到原本wlos的時候,我把兩個character (61跟10)弄成重疊的(61在收的時候也在送10),現在則是可以完全分開,故證明只發一次interrupt。
可能解法
目前是在猜pynq的PS需要跟uart.v handshake,可能要設立新的register來表示uart正在收,還沒收好,請不要再傳下一個character的情況。
因為原本是用interrupt隔開每個傳送的character,所以沒有這個問題。