歡迎您光臨本站 登入註冊首頁

如何拆分大的組合邏輯?

admin @ 2014-03-26 , reply:0

概述

lflhust:圖1是很多為了提高系統時鐘採用的拆分大組合邏輯的方法,但是沒有提供具體如何拆分的實例。我覺得實例才是重要的。但我不明白在寫代碼時,如何知道這樣寫會被綜合成一個很大的邏輯,一些簡單的可以……

lflhust:
圖1是很多為了提高系統時鐘採用的拆分大組合邏輯的方法,但是沒有提供具體如何拆分的實例。我覺得實例才是重要的。但我不明白在寫代碼時,如何知道這樣寫會被綜合成一個很大的邏輯,一些簡單的可以想到(比如大的計數器應該分成多個來做),但是更複雜的實在是不好理解。
 
圖1

fpga521:
可以通過流水線的方式分拆組合邏輯,這也是一種提高晶元速度的一種方式。 在組合邏輯中間插入寄存器,設計成流水。 很典型的例子就是調度器,如果做64調度器,可能中間的延時太長,不能滿足系統速度要求,這時候就可以做成一級16調度,一級4調度,來完成64調度的功能。

zf0579:
用加法器做例子,設輸入ABCD輸出OUT 上半部分就是: out = A+B+C+D;
下半部分就是:
always @(posedge clk)
begin
sumreg1 <= sum1;
sumreg2 <= sum2;
sumreg3 < = sum3; end
assign sum1 = A+B;
assign sum2 = C+D;
assign sum3 = sumrge1+sumreg2;
assign OUT = sumreg3;
通常建議使用下半部分的演算法,如果可以使用流水線。

lflhust:
通常是這樣的,沒有例子看起來是不好理解,但是一有具體的例子就非常清楚了。我也來學著給個計數器的例子計數255,如果用一個寄存器來計那麼需要開的深度為8的,如果拆分為兩個那麼只需容量為4的兩個寄存器,所需的邏輯較小,不知道對不對。
reg[3:0]ad1;
reg[3:0]ad2;
always @(posedge clk)
if(!rest)
begin
out<=0;
ad1<=0;
ad2<=0;
end
else
if(ad1==15)
begin
ad2<=ad2+1;
ad1<=0;
end
else
if (ad2==15)
begin out<=1;
end
else
ad1<=ad1+1;
ad1加滿後去觸發ad2加。

zf0579:
always @(posedge clk)
if (reset)
counter0 = 0;
else
counter0 = counter0 + 1;
always @(posedge clk)
begin
counterreg0 <= counter0;
if (counterreg0 == 4'b1111)
outreg0 <= 1;
else
outreg0 <= 0;
end
assign counter1 = counterreg1 + outreg0;
always @(posedge clk)
begin
counterreg1 <= counter1;
if (counterreg1 == 4'b1111)
out <= 1;
else
out <= 0;
end

lflhust:
zf0579 你好,麻煩你說明一下你寫的這個思路是什麼? 我寫的那個能不能達到組合邏輯拆分的目的,謝謝! 你有沒有這方面的資料,我有這樣的思想,但是實際中還是很難寫出程序來,這也行主要是看的太少了。

chips:
lflhust 寫的程序沒有達到邏輯拆分的目的, 原因很簡單, 那個程序綜合後生成的電路的流水線深度還是1。 zf0579那個程序的流水線深度才是2,達到了拆分的目的。 作邏輯的出發點不是寫HDL代碼,而是在寫代碼前腦子裡面要有 你需要實現的邏輯的電路結構。

zf0579:
Chips一語中的,樓主當牢記所言。

lflhust:
作邏輯的出發點不是寫HDL代碼,而是在寫代碼前腦子裡面要有。你需要實現的邏輯的電路結構。真是金玉良言呀,謝謝!


[admin via 研發互助社區 ] 如何拆分大的組合邏輯?已經有3709次圍觀

http://cocdig.com/docs/show-post-42955.html