怎样向一个寄存器赋值后,就会发送这个寄存器中值
看到实现一个uart接口时,那个例子里面用的是input load_tx_data;作为一个向发送缓冲区写入数据的标志位,只要load_tx_data==1,就向发送缓冲区写数据。我在想怎样能够实现不用标志位,因为用这种标志位发送还是半自动的,而是只要向缓冲区里写入数据就自动发送,不向里面写就不发送。就像单片机的uart一样,等到txrdy为1时就可以向发送缓冲区写入数据,然后自动发送,不写入数据就不发送。
我的想法是发送缓冲区初始值为8‘bzzzzzzzz,写入数据后状态就是确定的一个数值,并设置一个状态位load_tx_data =1,发送完成恢复为全高阻,load_tx_data = 0;
不知道这样写不行,也就是说缓冲区从高阻状态到确定的一个值的状态,用下面这种能不能实现?
always @(tx_buf)
begin
load_tx_data = 0;
if(tx_buf>=0||tx_buf<=255)
load_tx_data = 1;
end
就是这种组合逻辑能不能实现高阻到确定值,我对于z ,x这两个值很不清楚,不会判断,不知大侠怎样看。
个人觉得对于串行通信的东西用状态机来写比较好,你下面的代码if-else判断条件一定要写全,不能只写if,否则对于组合逻辑会产生latch
还有就是如果你想往缓冲区写入数据就自动发送的话我觉得要是你在写入前就知道这次会写多少数据的话,那还是不难控制的,如果不知道数据长度,那么你可能需要一个特别的信号来表示你的数据已经发完了
z是髙阻态
x是不定态
为什么不这样写?
always @(tx_buf)
begin
if(tx_buf>=0||tx_buf<=255) load_tx_data = 1;
else load_tx_data = 0;
end
另外,猜测小编是要判断地址范围0~255时成立,应为if(tx_buf>=0 & tx_buf<=255)
是确定长度的数据,比如说就8位,我不知道的是怎样一写入就发送,比如第一次写入一个0,发送一个0,过一段时间再写入一个0,又发送一个0。前后都是0,如果简单用always@(tx_buf[/email])好像不行吧,所以我想发送完后tx_buf置为高阻,然后再写入后用
always@(tx_buf[/email])从高阻到0的会不会触发这个always.
好垃圾的人啊,郁闷死了,不要用程序去理解硬体,VERILOG如C一样,但有本质的曲别的.
你的想法体现了,你没做过硬体.
假设你往缓冲区只写入1个Byte的数据,用时序翻译如下
1 2 3 4 5 6 7 8 9 10
__ __ __ __ __ __ __ __ __ __
clk __| |__| |__| |__| |__| |__| |__| |__| |__| |__| |__
__
wr_en __| |______________________________________________
________________________________________
tx_en _______| |_____
假设你在第一个周期将1Byte数据写入缓冲区,然后在接下来的8个周期分别将8bit数据通过串口发送出去
硬件设计和软件设计不一样的,硬件上面一般不会出现出现 不定态 或者 高阻.
如果你想实现一个buffer转数据的话,可以调用现成的buffer模块,去了解它的信号的说明,或者你自己设计一个buffer,自己做一个计数器,初始为0,写+1,读(发)-1,这样,你可以直接根据这个信号作一些判断了。
暂时只能观看
有没有高手带带新手?
看来LZ语法都还有问题
