如何将一个32位长的数组按照8位一个数组长度逐次写入FIFO,
时间:10-02
整理:3721RD
点击:
本人现在要将一个32位长的数组写入FIFO,但每次只能8位8位逐次写入,也就是需要4个时钟周期,
可是每次编程都出现错误,下面是本人的程序思想,有点像C语言,请各位赐教一下,应该怎么修改才能实现。
wr_data <= datain [8*i+7:8*i];
i <= i +1;
wr_data <= datain [8*i+7:8*i]; 这个句子一直提示有问题,不知道怎么解决了?
可是每次编程都出现错误,下面是本人的程序思想,有点像C语言,请各位赐教一下,应该怎么修改才能实现。
wr_data <= datain [8*i+7:8*i];
i <= i +1;
wr_data <= datain [8*i+7:8*i]; 这个句子一直提示有问题,不知道怎么解决了?
首先要保证datain在这4个周期内没有变化,然后做一个cnt[1:0]
always @(posedge clk or negedge rstn) begin
if(!rstn) wr_data <= 'd0;
else if (cnt == 0) wr_data <= datain[7:0];
else if (cnt == 1) wr_data <= datain[15:8];
else if (cnt == 2) wr_data <= datain[23:16];
else wr_data <= datain[31:24];
end
非常感谢回复!其实32位只是我的一个小测试程序,实际上可能一次传输的数据就不只有32位,可能会达到1000左右个位的数据量,这个时候如果用循环可能会方便很多,但我总不能用case语句实现,因此,还是希望通过循环来实现。这个已经有人建议我再开个Ram块,但我目前还没吸收到,基础太差,只能慢慢来!不知道老兄有没更好的建议,谢谢!
写fifo之前先把数据unpack成8bit的形式,unpack的实现用generate语句实现
用for循环可以吧,别人回复之后,发现并不是真的是这个问题,其实,你可以直接把你的问题放上来解决。
移位操作简单啊, 我仿照你的应用写了个,仿真是正确的。贴在下面,供参考。
- reg [7:0]i;
-
- always @ (posedge clk or posedge rst)
- if (rst)
- i <= 8'b0;
- else if (i < 3)
- i <= i + 8'b01;
- else
- i <= 8'b0;
- always @ (posedge clk or posedge rst)
- if (rst)
- outdata <= 8'b0;
- else
- outdata <= indata >> (i << 3);
贴个完整的 更清楚些。
- module fifo(input wire clk,
- input wire rst,
- input wire [31:0] indata,
- output reg [7:0] outdata);
-
- reg [7:0]i;
-
- always @ (posedge clk or posedge rst)
- if (rst)
- i <= 8'b0;
- else if (i < 3)
- i <= i + 8'b01;
- else
- i <= 8'b0;
- always @ (posedge clk or posedge rst)
- if (rst)
- outdata <= 8'b0;
- else
- outdata <= indata >> (i << 3);
-
- endmodule
