怎么在FPGA中描述类似C语言中的数组

[复制链接]
6614|25
 楼主| heitai 发表于 2011-10-1 21:37 | 显示全部楼层 |阅读模式
环境为SP3芯片,VHDL语言,现在要接收到一帧串行数据,最多可能有近千个字节,接收完成后进行CRC校验、根据数据内容执行操作等。在C语言中直接定义一个数组,存取ram会自动完成,在FPGA中如何实现这样的存取操作呢?
GoldSunMonkey 发表于 2011-10-2 18:47 | 显示全部楼层
也可以定义数组,但是会比较烦
GoldSunMonkey 发表于 2011-10-2 18:48 | 显示全部楼层
--定义matrix_index 为数组
TYPE matrix_index is array (3 downto 0) of std_logic_vector(7 downto 0);
SIGNAL a: matrix_index;--定义了数组a[4],即数组元素为a[0],a[1],a[2],a[3]
aozima 发表于 2011-10-2 19:05 | 显示全部楼层
看CRC的原理.如果是在硬件上面实现的话,应该可以在接收串行的时候直接就CRC了.
AutoESL 发表于 2011-10-2 19:43 | 显示全部楼层
我记得没必要完全接收才做CRC
AutoESL 发表于 2011-10-2 19:44 | 显示全部楼层
只需要缓存少量数据,用移动窗口的方式,边接收边计算
linqing171 发表于 2011-10-2 19:49 | 显示全部楼层
CRC 本来就是一边接收一边计算的。
GoldSunMonkey 发表于 2011-10-2 19:51 | 显示全部楼层
;P CRC16并行算法的verilog - hdl程序
module crc(crc_reg,crc,d,calc_valid,clk,reset);
output [15:0]crc_reg;
output [7:0]crc;
input [7:0]d;
input calc_valid;
input clk;
input reset;
reg [15:0]crc_reg;
reg [7:0]crc;
wire [15:0]next_crc;

always @(posedge clk or posedge reset)
   begin
   if(reset)
   begin
   crc_reg<=16'h0000;
   crc<=8'h00;
   end
   
   else if (calc_valid)
begin
   crc_reg<=next_crc;
   crc<=~{next_crc[8],next_crc[9],next_crc[10],next_crc[11],next_crc[12] ,next_crc[13] ,next_crc[14] ,next_crc[15]};
   end

   else
   begin
   crc_reg<={crc_reg[7:0],8'h00};
   crc<=~{crc_reg[0], crc_reg[1], crc_reg[2], crc_reg[3], crc_reg[4],crc_reg[5], crc_reg[6], crc_reg[7]};
   end
end

assign next_crc[0]=crc_reg[12]^d[7]^crc_reg[8]^d[3];
assign next_crc[1]=crc_reg[13]^d[6]^d[2]^crc_reg[9];
assign next_crc[2]=d[5]^crc_reg[14]^d[1]^crc_reg[10];
assign next_crc[3]=d[4]^crc_reg[15]^d[0]^crc_reg[11];
assign next_crc[4]=crc_reg[12]^d[3];
assign next_crc[5]=crc_reg[12]^crc_reg[13]^d[7]^crc_reg[8]^d[3]^d[3];
assign next_crc[6]=crc_reg[13]^d[6]^crc_reg[14]^d[1]^d[2]^crc_reg[9];
assign next_crc[7]=d[5]^crc_reg[14]^crc_reg[15]^d[0]^d[1]^crc_reg[10];
assign next_crc[8]=d[4]^crc_reg[15]^d[0]^crc_reg[10]^crc_reg[11];
assign next_crc[9]=crc_reg[12]^crc_reg[1]^d[3];
assign next_crc[10]=crc_reg[13]^d[2]^crc_reg[2];
assign next_crc[11]=crc_reg[3]^crc_reg[14]^d[1];
assign next_crc[12]=crc_reg[12]^crc_reg[4]^d[7]^crc_reg[15]^d[0]^crc_reg[8]^d[3];
assign next_crc[13]=crc_reg[13]^d[6]^crc_reg[5]^d[2]^crc_reg[9];
assign next_crc[14]=d[5]^crc_reg[14]^crc_reg[6]^d[1]^crc_reg[10];
assign next_crc[15]=d[4]^crc_reg[15]^d[0]^crc_reg[7]^crc_reg[11];
endmodule

评分

参与人数 1威望 +1 收起 理由
heitai + 1 精品文章

查看全部评分

AutoESL 发表于 2011-10-2 20:07 | 显示全部楼层
32的话是以此类推吧
GoldSunMonkey 发表于 2011-10-2 20:19 | 显示全部楼层
是呀是呀,我给出的16的代码
还是A兄厉害啊
AutoESL 发表于 2011-10-2 20:21 | 显示全部楼层
GoldSunMonkey 发表于 2011-10-3 09:36 | 显示全部楼层
 楼主| heitai 发表于 2011-10-4 12:07 | 显示全部楼层
多谢诸位解答。
GoldSunMonkey 发表于 2011-10-4 12:09 | 显示全部楼层
AutoESL 发表于 2011-10-4 13:43 | 显示全部楼层
13# heitai
欢迎常来:lol
dan_xb 发表于 2011-10-4 16:58 | 显示全部楼层
;P CRC16并行算法的verilog - hdl程序
module crc(crc_reg,crc,d,calc_valid,clk,reset);
output [15:0]crc_reg;
output [7:0]crc;
input [7:0]d;
input calc_valid;
input clk;
input reset;
reg [15:0]crc_reg;
re ...
GoldSunMonkey 发表于 2011-10-2 19:51


这个方式其实麻烦了,用串行方式更简单,一行语句就搞定
dan_xb 发表于 2011-10-4 17:01 | 显示全部楼层
仔细看这里:http://en.wikipedia.org/wiki/Cyclic_redundancy_check
CRC其实是一个串行的算法,如果你用串行方式的话,消耗资源非常少,16位的CRC,也就消耗17个FF和几个LUT而已

评分

参与人数 1威望 +1 收起 理由
AutoESL + 1

查看全部评分

AutoESL 发表于 2011-10-4 18:21 | 显示全部楼层
不错,非常详细全面
GoldSunMonkey 发表于 2011-10-4 22:11 | 显示全部楼层
:'(为什么我回答没人给我加分呢?
GoldSunMonkey 发表于 2011-10-4 22:22 | 显示全部楼层
;P要求被加分。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

192

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部