一个串口发送的verilog程序,运行结果很奇怪

2019-03-25 09:01发布

always @ (posedge txclk or posedge ld_tx_data or negedge reset)

if(!reset)
begin
        tx_reg      <=0;
        tx_over_run <=0;
        tx_empty        <=1;
        tx_cnt                <=0;
        tx_out                <=1;
end  
else if (ld_tx_data)
        begin     
                                  if (!tx_empty)
                begin
                        tx_over_run <= 1;
                end
                else
                        begin
                        tx_reg   <= tx_data;       //tx_data is put in tx_reg
                        tx_empty = 0;                           
                        end
        end
else begin
   if (tx_enable && !tx_empty) begin
     tx_cnt <= tx_cnt + 1;
     if (tx_cnt == 0) begin
       tx_out <= 0;                                                        //the start bit
     end
     if (tx_cnt > 0 && tx_cnt < 9) begin      //transport bit1-bit8
        tx_out <= tx_reg[tx_cnt -1];
     end
     if (tx_cnt == 9) begin               //when cnt=9,transport over.tx_out is set 1;
       tx_out <= 1;
       tx_cnt <= 0;
       tx_empty <= 1;                                         //when cnt=9,transport over,tx_empty is set 1,means the data in FIFO is transportant over                        
     end
   end
   if (!tx_enable) begin
     tx_cnt <= 0;
        end        
end


txclk            是串口发送波特率
tx_data        是DSP的低8位并行数据,即要通过串口发送出去的数据
ld_tx_data    是DSP的数据有效信号,为一个短时的脉冲。。。当ld_tx_data上升沿后,tx_data数据出现在DSP的数据线
reset            是复位信号

运行后用逻辑分析仪看结果,在ld_tx_data上的上升沿tx_empty和tx_over_run同时变化??难以理解。tx_empty从1变0,而同时tx_over_run从0变为1.。。。。。

tx_reg一直为0,不能把数据线的tx_data赋给tx_reg,串口发送数据00,而不是tx_data

[ 本帖最后由 nksosoon 于 2012-8-24 20:03 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
nksosoon
2019-03-25 19:10
在ld_tx_data上的上升沿tx_empty和tx_over_run同时变化??难以理解。tx_empty从1变0,而同时tx_over_run从0变为1.。。。。。

怎么会出现这样的结果呢??下面这段程序,应该是tx_empty为1的时候,执行tx_reg<=tx_data和tx_tempty<=0吧。。。。。。。为什么tx_over_run也会被置1呢
   if (ld_tx_data)
          begin     
                if (!tx_empty)
                begin
                        tx_over_run <= 1;
                end
                else
                        begin
                        tx_reg   <= tx_data;       //tx_data is put in tx_reg
                        tx_empty <= 0;                           
                        end
        end

我下进FPGA里面,从运行结果来看。似乎在ld_tx_data=1期间,上面这一段程序重复运行了很多次,但是always @()的边沿敏感信号里,没有这么一个高频信号来驱动这段程序重复运行啊。。。。

[ 本帖最后由 nksosoon 于 2012-8-25 10:35 编辑 ]

一周热门 更多>