微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > FPGA并行的研究与困惑!

FPGA并行的研究与困惑!

时间:10-02 整理:3721RD 点击:
问一 个弱弱的问题,
对FPGA并行的理解,是不是就是每个功能模块,在同一个时刻都在执行自己的功能?
可是从输入到 输出不是在一条线上吗?
模块之间不是有联系的嘛,比如!,就像交通灯!我要一个倒计时模块倒计时,到0时就让另一个模块的输出改变状态!
状态的改变条件是由倒计时模块产生的,到0时我就得重新赋值,可是由不能在两个模块给同一变量赋值,这样我就得把所有的程序放在一个模块里,才能对其重新赋值!难到不同模块的相同变量我要起两个名才行!
说的很乱,因为我不知道FPGA并行是什么意思,在我看来除了时钟的产生(分频)是自己干自己的,其他的模块都是有联系的,一个模块状态的改变要看上一模块结果才行啊!
1:FPGA并行是什么意思
2:不能给不同模块的同一变量赋值也让我很郁闷!
3:组合逻辑判断和时序逻辑的状态改变是同时进行的吗,比如说状态机的三段是同时变的吗
4:没有输入变量的MOORE状态机状态的变化条件是不是其他逻辑模块产生的
不会的很多,问题说的可能不太明白,各位帮帮忙举个例子帮我理解一下并行执行是什么意思,各模块之间的关系!,(组合模块和时序模块的联系!
5:对与并行的理解,就是把一个FPGA分成几大块,每一块相当于一个小FPGA,不知道这样想行不行
6:组合逻辑的状态的输出,只有敏感变量发生变化是才变化,这么理解对吧,他的敏感变量是在时序逻辑中改变的,
他们之间只有逻辑变量的联系,没有时间上的绝对关系(同步,异步),不知道我这样理解对不对?


我想这些问题我搞不明白,只能用一个模块(always)编下去了!
强烈感谢大家的回复先!!
一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!一定要帮我啊!

一家之言!
你的并行是否指fpga要实现的功能模块使用并行算法?

我最近在看viterbi 算法方面的资料,里面有并行、串行、串并合用几种情况的!

觉得的你可以从某个模块来理解并行!

***********************************************
一家之言!
***********************************************

也许我对逻辑理解是有些问题!也许是我没说明白!
我的理解:
比如说状态机:

1:
always @(CS or in)
case(CS)
S0: if(in)NS=S1;
elseNS=S0;

组合逻辑跟时序没有关系,它不断的对输入信号(in)进行判断,只要输入信号发生变化就改变NS,反之NS=CS保持原状态,也就是说这个逻辑就相当与一逻辑选择开关

always@(posedge clk)

case(NS)
S0ut<=2'b00;

如果这样说的没错,可不可以理解为在第一个上升沿对当前输入进行判断,决定下一状态,同时输出上一状态NS,也就是说在输出的同时进行判断!算是同步吧!

不知道我理解的对不对,愿大家指导!
2:
我想要问的是:

如果我改变状态的条件不是有输入决定的,而是由逻辑的运算结果决定的,可不可以去代替输入(IN)进行判断?
比如:
always@(posedge clk)
begin
count<=count+1;
if(count==10)
in<=1;
count<=0;
else
in<=0;

end

3:
我想解决的:

就是我想把一个大模块,分成小模块,想用状态机解决,可是试了好多次,结果不正确,有时候就是不同步,当然加上RESET也不行!中间变量的传递我也试了,可还是不行!
所以我 对FPGA的工作流程产生的不小的疑问!希望大家能解决我的疑惑!

你可以把一个大模块分成小模块,每一个小模块用状态机,大模块用状态机,大模块的状态机在适当的时候产生信号激活小模块状态机,这就是所谓major FSM和minor FSM。

LZ的理解有问题
编C,C++,JAVA和用Verilog描述硬件电路有本质上的区别.
编C就是按照逻辑一层一层编下来,前后顺序要求高,因为是一步一步往下compile
描述一个硬件电路,首先要知道有几个模块,每个模块的出入端口,每个模块内部用到的寄存器,信号等
然后在用Verilog描述出来
不能两次赋值是肯定的,因为在电路里,那就是一条线,在每个具体的时间这条线的高低电平是个确定的值(不考虑竞争冒险等状态)
在时钟的触发沿这条线的数据是会刷新,
并发的思想我觉得是: 因为整个电路模块的各个动作是在时钟的触发沿才有效的,所以各个线的信号仅仅只是按照时钟和自身的逻辑工作而不考虑别的线的数据值.所以很多信号可以同时被触发,工作
强调一点:在开始编之前一定要清楚整个电路的样子,各个模块之间的接口,这个非常重要!
LZ可以仔细学一学Verilog或者VHDL,看看数字电路设计方向的书,自己做做几个项目.这样成长的会很快
PS:我是菜鸟,说的不对大家指正~

lz的帖子看得我头晕◎◎

建议小编重新学习数字电子技术

同意小编仔细研究数字电路,分清硬件和软件的区别。

终于分成模块了!谢谢大家的指点

//LAMP:灯的状态
//num: 倒计时
//numa: 倒计时赋值的中间变量
module traffic0(CLK,LAMP,nrst,num);
output[7:0] num;
output[2:0] LAMP;
input CLK,nrst;
reg[7:0] num,numa;
reg[3:0] CS,NS;
reg[2:0] LAMP;
reg temp;//倒计时赋值标志
parameter IDLE=4'b001, S1=4'b0010, S2=4'b0100,S3=4'b1000; //one_hot
parameter red=8'd15,yellow=8'd10,bule=8'd5; //红,黄,蓝各亮的时间
always @(posedge CLK )
if(!nrst)
CS<=IDLE;
else
CS<=NS;
always @(CS or temp )
begin
NS=4'bx;
case(CS)
IDLE:
if(temp)
NS=IDLE;
else
NS=S1;
S1:
if(temp)
NS=S1;
else
NS=S2;
S2:
if(temp)
NS=S2;
else
NS=S3;

S3:
if(temp)
NS=S3;
else
NS=S1;

default:NS=IDLE;
endcase
end
//
always @(NS or nrst)//倒计时模块 赋值模块

if(!nrst)
begin
numa=8'd0;
end
else
begin
case(NS)
IDLE:
numa=8'd0;
S1:
numa=red;
S2:
numa=yellow;
S3:
numa=bule;
endcase
end

always @(posedge CLK)//灯的状态模块

if(!nrst)
LAMP<=3'b000;
else
begin
case(NS)
IDLE:
LAMP<=3'b000;
S1:
LAMP<=3'b001;

S2:
LAMP<=3'b010;

S3:
LAMP<=3'b100;
endcase
end
//~

always @(posedge CLK ) //倒计时模块
if(!nrst)
begin
num<=0;
temp<=0;
end
else
begin

if(!temp)
begin
num<=numa;
temp<=1;
end

else
begin
if(num>0)

begin
if(num[3:0]==0)
begin
num[3:0]<=9;
num[7:4]<=num[7:4]-4'b0001;
end
else
num[3:0]<=num[3:0]-4'b0001;

if(num==1)
temp<=0;
else
temp<=1;
end

else
temp<=0;
end

end


endmodule

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top