打印

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

[复制链接]
5513|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了.

使用特权

评论回复
5
AutoESL| | 2011-10-2 19:43 | 只看该作者
我记得没必要完全接收才做CRC

使用特权

评论回复
6
AutoESL| | 2011-10-2 19:44 | 只看该作者
只需要缓存少量数据,用移动窗口的方式,边接收边计算

使用特权

评论回复
7
linqing171| | 2011-10-2 19:49 | 只看该作者
CRC 本来就是一边接收一边计算的。

使用特权

评论回复
8
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 精品文章
9
AutoESL| | 2011-10-2 20:07 | 只看该作者
32的话是以此类推吧

使用特权

评论回复
10
GoldSunMonkey| | 2011-10-2 20:19 | 只看该作者
是呀是呀,我给出的16的代码
还是A兄厉害啊

使用特权

评论回复
11
AutoESL| | 2011-10-2 20:21 | 只看该作者
:lol

使用特权

评论回复
12
GoldSunMonkey| | 2011-10-3 09:36 | 只看该作者
;P

使用特权

评论回复
13
heitai|  楼主 | 2011-10-4 12:07 | 只看该作者
多谢诸位解答。

使用特权

评论回复
14
GoldSunMonkey| | 2011-10-4 12:09 | 只看该作者
:lol

使用特权

评论回复
15
AutoESL| | 2011-10-4 13:43 | 只看该作者
13# heitai
欢迎常来:lol

使用特权

评论回复
16
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


这个方式其实麻烦了,用串行方式更简单,一行语句就搞定

使用特权

评论回复
17
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
18
AutoESL| | 2011-10-4 18:21 | 只看该作者
不错,非常详细全面

使用特权

评论回复
19
GoldSunMonkey| | 2011-10-4 22:11 | 只看该作者
:'(为什么我回答没人给我加分呢?

使用特权

评论回复
20
GoldSunMonkey| | 2011-10-4 22:22 | 只看该作者
;P要求被加分。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

192

帖子

0

粉丝