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 编辑 ]
此帖出自
小平头技术问答
是你设计程序就是这个结果。串口发送这个程序很简单的。但是从你设计程序上看,搞的复杂的很!
怎么会出现这样的结果呢??下面这段程序,应该是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 编辑 ]
http://bbs.eeworld.com.cn/viewth ... p;extra=&page=1
只是我发现我的控制芯片(DSP)的 ld_tx_data只是一个短脉冲,时间太短,用tx_clk来采样,会采不到这个信号,出现有时发送丢失的情况(比如ld_tx_data没出现在tx_clk的上升沿)。。。。 。。。所以我想在always里加一个@posedge ld_tx_data,但是出现了上面的问题
针对异步信号控制问题,第一步用本地时钟多次同步,避免亚稳态传递。
对低速采集高速信号,除了用双口RAM异步缓冲,没用啥比较好的方法。
一周热门 更多>