verilog如何處理需要在兩個always中賦值的變數

2022-01-31 08:27:13 字數 5026 閱讀 9173

1樓:匿名使用者

以分頻器為例,你可以再定義2個變數讓他們分別在時鐘上升和下降沿分頻然後將2個異或值賦給你要的變數

2樓:

一旦遇到這個問題。verilog中的解決方法是兩個變一個。一個always塊只對一個變數賦值。最後將其用組合邏輯將其變為一個訊號。

舉例:always @ (posedge clk or negedge rst)

if (!rst)

cnt1 <= #1 3'd0;

else if (cnt==4)

cnt1 <= #1 3'd0;

else

cnt <= #1 cnt+1;

always @ (negedge clk or negedge rst)

if (!rst)

cnt2 <= #1 4'd0;

else if (cnt==5)

cnt2 <= #1 4'd0;

else

cnt2 <= #1 cnt2 +1;

always @ (cnt1 or cnt2 )

if (cnt1==2)

ckout = 1'b1;

else if (cnt2==4)

ckout = 1'b0;

else

ckout = 1'b1; // logic part to combine the two cnt to one output

你看到了。前兩個是定義了兩個不同沿觸發的時序電路就是計數器。最後一個組合邏輯來將兩個做成一個使能訊號。

這個做法可以做出不同沿觸發的時序使能訊號。但是這麼做出的一個訊號強烈建議不作為高質量時鐘輸出。由於編寫程式風格。所以做為時鐘可能延遲以及抖動都不能作為高質量時鐘的設計。

verilog 如何處理需要在兩個always 中賦值的變數?

3樓:玩世

一旦遇到這個問題。verilog中的解決方法是兩個變一個。一個always塊只對一個變數賦值。最後將其用組合邏輯將其變為一個訊號。

舉例:always @ (posedge clk or negedge rst)if (!rst)cnt1 <= #1 3'd0;

else if (cnt==4)

cnt1 <= #1 3'd0;elsecnt <= #1 cnt+1;

always @ (negedge clk or negedge rst)if (!rst)cnt2 <= #1 4'd0;

else if (cnt==5)

cnt2 <= #1 4'd0;elsecnt2 <= #1 cnt2 +1;

always @ (cnt1 or cnt2 )

if (cnt1==2)

ckout = 1'b1;

else if (cnt2==4)

ckout = 1'b0;elseckout = 1'b1; // logic part to combine the two cnt to one output

你看到了。前兩個是定義了兩個不同沿觸發的時序電路就是計數器。最後一個組合邏輯來將兩個做成一個使能訊號。

這個做法可以做出不同沿觸發的時序使能訊號。但是這麼做出的一個訊號強烈建議不作為高質量時鐘輸出。由於編寫程式風格。所以做為時鐘可能延遲以及抖動都不能作為高質量時鐘的設計。7

verilog 中為什麼不能再兩個always中同時賦值同一引數

4樓:匿名使用者

廢話,硬體是並行處理的關係,兩個硬體同時給一個引數賦值,必然會產生競爭關係,哪怕你的訊號源是截然不同的。如果在某一時刻,同時收到兩個訊號,一個在還在th,一個在ts,你說硬體賦值哪一個?根據墨菲法則,絕對不能在兩個always中同時賦值同一引數

5樓:匿名使用者

這個沒有什麼為什麼,就是不可以。就好像人做事不能分身一樣,你不可能在兩個地方同時做兩件事情。

6樓:匿名使用者

因為那樣是電路不可以實現的,一個always中要進行賦值必須是reg變數,一個reg變數對應在時序邏輯電路里是一個觸發器的輸出,你兩個always模組中對同一個reg變數賦值是綜合不出來的。。。我的理解是這樣。所以寫到一個模組裡吧。

如果還解決不了可以附**出來,我幫你改改。本人菜鳥,多交流。

7樓:

這是語法規定,

在兩個always中同時賦值同一引數,綜合時會報錯

verilog中一個訊號在不同的always中的賦值問題

8樓:

你想啊,always塊實際綜合出來的就是dff,當時鐘上升沿或者下降沿到了,才能把值打過去。如果你在不同的always中對同一個訊號賦值,怎麼綜合?沒見過這種dff吧?

呵呵~!~~~

如果有實現,你就在一個always中設一個flag,另一個always中,通過判斷這個flag來進行賦值,間接進行賦值就行了~~~~~不過得設計好你的時序

有問題在聯絡哈~~~~~

9樓:匿名使用者

我也是在學習中,你仔細看看夏老師的書,有專門講解有關賦值方面的講解。(中級篇的第六講)

兩個always中本身是同時進行的,所以輸出時會產生競爭冒險現象。這是我理解到的。至於怎麼解決我現在還沒那道行。

verilog語言中,如何給變數賦初值,並能保證賦初值的語句與後面的always是順序執行的。

10樓:匿名使用者

不知道你是要做驗證還是設計,如果是驗證的話,不要求可綜合,可以簡單寫成:

always@ (posedge a)

begin

@ (negedge b)

c<=...;

end如果要想可綜合的話,需要用狀態機類似的概念,

即設一個標誌位,當a上升沿來是,把它賦值為1,

當它為1且b下降沿來時,給c賦值,並將它賦值回0:

並且,如果a,b不是時鐘的話,不推薦使用posedge的寫法

採用下面的方法比較好:

reg a_dly,b_dly; //a,b的1始終delay訊號

wire a_pos,b_pos; //a,b的上升沿抓取訊號

assign a_pos = a & !a_dly;

assign b_pos = b & !b_dly;

reg flag;//標誌位

always@(posedge clk or posedge rst)

begin

if(rst) begin

a_pos <= 1'b0;

b_pos <= 1'b0;

endelse begin

a_pos <= a;

b_pos <= b;

endend

always@(posedge clk or posedge rst)

begin

if(rst)

flag <= 1'b0;

else if(a_pos)

flag <= 1'b1;

else if(b_pos)

flag <= 1'b0;

endalways@(posedge clk)

begin

if(flag & b_pos)

c<=....

end把flag賦值回為0很重要,不然邏輯有問題。

用3段狀態機寫就是

parameter idle = 2'h0;

parameter wait_b_pos = 2'h1;

parameter get_c = 2'h2;

reg [1:0] cs; //current state

reg [1:0] ns; //next state

//1段 狀態轉換

always@(posedge clk or posedge rst)

begin

if(rst)

cs <= idle;

else

cs <= ns;

end//2段 狀態遷移

always@(a_pos or b_pos or cs or ns)

begin

ns = xx; //設定ns為xx

case(cs)

idle: begin

if(a_pos) ns = wait_b_pos;//用阻塞賦值

else ns = idle;

endwait_b_pos:begin

if(b_pos) ns = get_c;

else ns = wait_b_pos;

endget_c:begin

ns = idle;

enddefault:;

endcase

end//3段 賦值

always@(posedge clk or posedge rst)

begin

if(rst)

c<=1'b0;

else begin

if(ns == get_c)

c <= .....;

endend

用狀態機寫的好處就是不用加標誌位了,但是個人覺得沒有必要這樣寫。

能力有限,錯誤請指正

11樓:匿名使用者

你可以加入一個非同步復位的訊號,來進行初始化工作。

一般情況下,模組都應該有一個非同步復位訊號來進行初始化工作。有時候,不進行初始化會造成誤碼,誤操作等情況。

格式如下:

always @ (posedge clk or posedge rst) begin

if (rst) begin

//這裡填初始值

endelse begin

//這裡是你的邏輯

endend

12樓:匿名使用者

initial是初始化時使用的吧?

你可以這樣,先定義變數的位寬,再做別的

always@(觸發條件)

begin

具體語句end

如何處理tcga的資料,如何處理TCGA的資料

首先說下背景,bai我畢論有大量涉 du及到生存曲線分zhi析。針dao 對某個我們已挖內掘到白血病中的差異基因容,利用了tcga上的臨床資料。需要的資料 tcga上的臨床資料。當你下下來時會發現有一大堆。這時需要你做的就是篩選你所需要的。你需要的有 目的基因的表達量 患者生存時間 患者生存 死亡狀...

如何處理受潮牆面,牆面受潮如何處理?

多數情況不需找平牆面 由於膩子都是鹼性,洇水後會返鹼,牆面乾透後容易出現黃色的痕跡,特別是牆面溼 幹交界處,痕跡最為明顯。以前裝修用的膩子可能出現牆面發黴的情況,現在施工多采用抗黴膩子,牆面洇水後一般都不會發黴。修補返鹼和發黴牆面的方法相同,先用普通砂紙將返鹼或發黴的部分打磨掉,然後再重新刷漆。如果...

異地戀要如何處理,如何處理異地戀

你好,異地戀還是要好好處理的,要保持聯絡,保持關心,經常性的互動,異地戀本來就是件很難的事情,還是要好好維護。異地戀的話最重要的就是保持神秘感和新鮮感,這樣對方才有好奇心,不能把自己的所有事情都跟對方說。我覺得兩個人異地戀,早晚也是需要走到一起的,如果兩個人不想分開那麼就應該儘快的要兩個人在一個城市...