For loop 对于循环内部始终是posedge时钟
先生, 我对For loop 对于循环内部始终是posedge时钟,for-loop,verilog,For Loop,Verilog,先生, 我对始终块中的for循环有一些疑问。请澄清。所有迭代都在单个时钟周期内完成?。当for循环在另一个for循环中时会发生什么情况,该循环始终位于块中? 请帮我找出以下程序中的错误。谢谢 reg [5:0] c; reg [2:0] m; reg G[5:0][2:0] = {{1'b1,1'b0,1'b0},{1'b0,1'b1,1'b0},{1'b0,1'b0,1'b1}, {1'b1,1'b1,1'b0},{1'b0,1'b1,1'b1},{1'b1,1'b0,1'b1}};
始终
块中的for循环有一些疑问。请澄清。所有迭代都在单个时钟周期内完成?。当for
循环在另一个for
循环中时会发生什么情况,该循环始终位于块中?
请帮我找出以下程序中的错误。谢谢
reg [5:0] c;
reg [2:0] m;
reg G[5:0][2:0] = {{1'b1,1'b0,1'b0},{1'b0,1'b1,1'b0},{1'b0,1'b0,1'b1}, {1'b1,1'b1,1'b0},{1'b0,1'b1,1'b1},{1'b1,1'b0,1'b1}};
integer i;
integer j;
always @(posedge clk1)
begin
for(i=0;i<6;i=i+1)
begin
c[i]=0;
for(j=2;j>=0;j=j-1)
begin
c[i] <= c[i]^( m[j]&G[2-j][i]);
end
end
end
reg[5:0]c;
reg[2:0]m;
reg[5:0][2:0]={1'b1,1'b0,1'b0}、{1'b0,1'b1,1'b0}、{1'b0,1'b0,1'b1}、{1'b1,1'b1,1'b0}、{1'b0,1'b1,1'b1}、{1'b1,1'b1};
整数i;
整数j;
始终@(posedge clk1)
开始
对于(i=0;i=0;j=j-1)
开始
c[i]将始终块看作是一个模拟一点硬件的一点软件。灵敏度列表是一个触发器列表,当其中任何一个发生变化时,软件将执行该列表以计算新的输出应该是什么
对于组合始终
块,所有输入都在灵敏度列表中(使用@(*)
结构),因此,如果任何输入发生变化,那么这一小块硬件的输出可能会发生变化(相当于组合逻辑的定义)。因此,如果任何一个输入发生变化,软件就会执行,以计算这一点点组合逻辑的新输出将是什么
对于顺序始终
块,只有时钟和(如果存在)异步复位在灵敏度列表中,因为没有其他输入直接导致输出改变。因此,对于顺序块,如果时钟(或异步复位)发生变化,则软件将执行以计算该小段顺序逻辑的新输出
因此,在您的例子中,您有一个顺序始终块,没有异步重置。这是一个模拟一点顺序逻辑的一点软件。该顺序逻辑的输出仅在时钟改变时才会改变(如果clk1上有上升沿)。因此,如果clk1
上有上升沿,则始终
块内的代码开始执行,以计算数组c
的新值(顺序逻辑的输出,因为这是在该特定始终
块中分配的变量)。在这个特定的代码中碰巧有循环这一事实并不重要。如果clk1
上有上升沿,则循环将完全执行(无需等待clk1
上的任何上升沿),以计算c
的新值。您的代码看起来像c
代码。不要将任何代码作为软件代码写入HDL。首先,您应该考虑要创建的硬件,然后相应地编写代码。你的设计是什么?