[爆卦]Verilog always是什麼?優點缺點精華區懶人包

為什麼這篇Verilog always鄉民發文收入到精華區:因為在Verilog always這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者henry666666 (雨四光)看板Electronics標題Re: [請益] verilog...


※ 引述《tkhan (腦殘綠吱吱)》之銘言:
: 標題: Re: [請益] verilog如何在一個always判斷觸發源?
: 時間: Fri Apr 18 00:27:29 2008
:
: ※ 引述《icetofux (豆腐)》之銘言:
: : input in0,in1;
: : reg a;
: : always@(in0)
: : begin
: : a=0;
: : end
: : always@(in1)
: : begin
: : a=1;
: : end
: : 在軟體模擬上,compile會通過,也能進行波形模擬,但是以donwload用的軟體去進行
: : compile,則會告訴不能讓兩個always敘述去變動同一個變數值。
: : 如果我想改成:
: : always@(in0 or in1)
: : begin
: : ...
: : end
: : 我要怎麼去判斷到底是in0有動作還是in1有動作而進入always敘述呢?
:
: always @(in0 or in1)
: begin
: if(in0)
: a=0;
: else if(in1)
: a=1;
: else
: a=0;
: end
: 上課要認真..
: 這是基礎中的基礎..

上課不認真的來問問題了:


//程式如下
module test(in0,in1,a);
input in0,in1;
output a;
reg a;
always @(in0 or in1)
begin
if(~in0)
a=0;
else if(~in1)
a=1;
else
a=0;
end
endmodule


我希望能做到,當in0改變的時候,執行a=0
當in1改變的時候,執行a=1


但是這樣寫……


當我按下in0的時候
進入always裡面,然後進入if判斷,a=0。
到此都沒有問題。

但我in0還沒放開(~in0還是==1)時,
我又按下in1
這時候雖然是因為in1改變進入always裡面
不過它仍會執行a=0。

所以請問是:

a.要避免這種行為?
b.有其它寫法?


///////////題外話///////////

為什麼會用到這個呢,
原因就是我們的fpga板子的七段顯示器

它一次只能控制一個數字,所以要一次顯示4個數字的時候(EX:1142)
要先跳到第一個七段顯示器
然後顯示1
接著跳到第二個
然後顯示1
……
刷快一點就像1142了

現在的問題是我想要更改數字,
七段顯示器在兩種情況下會改值

一是它很快的刷刷刷
二是因為我按下更改數字的按鈕

他在刷的時候,觸發的是clock
改數字的時候,觸發的是按鈕

這不同的兩個情況,要對同一個值(七段顯示器)作不一樣的變更動作


如果always可以分開寫就好了……

--
儘管生命的起源只是一種化學反應
儘管人類的存在只是記憶數據的影子
儘管靈魂並不存在,精神只是神經細胞的火花
   儘管世上沒有神,人一定要靠一己之力在這殘酷的世界中掙扎求存
  我還是......
我還是...... 要以意識之名命令你───「活下去」

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.216.126
※ 編輯: henry666666 來自: 140.114.216.126 (04/05 18:41)
arksbubble:寫一個case怎麼樣? 針對in0 in1的四種組合做判斷 04/05 18:53
arksbubble:這樣應該就可避掉in0還沒放開時 輸入in1的問題了 04/05 18:54
finalhaven:因為你in0先按了阿,所以他就一直作到in0條件成立 04/05 18:55
finalhaven:他就跳出那個always迴圈了@@,當然不會跳到in1裡面去 04/05 18:56
finalhaven:就如上面大大講得用Case就可避免XD 04/05 18:56

還是不會寫Q__Q

case({in1,in0})
有以下幾種排列
00
01
10
11

那這個00呢,

究竟是 10 (in0按住不放) 的時候按下「in1」變成的,

還是 01 (in1按住不放) 的時候按下「in0」變成的?

前者的話是in1 trigger的,後者相反呢……
※ 編輯: henry666666 來自: 140.114.216.126 (04/05 19:05)
ksmrt0123:把輸入(按鈕處理與register值變更)與輸出(把register值 04/05 20:25
ksmrt0123:以scan方式在7-seg顯示)分別寫成兩個blocks 04/05 20:26

這樣寫會過嗎?

串一下這篇文章開頭,似乎不行呢

還是我理解錯誤?

……

或者指的是下面這種方法


顯示器為D[7:0]

然後暫存是r1[7:0] r2[7:0] r3[7:0] r4[7:0]


scan的block裡

更改D對應到r1 r2 r3 r4

再來一個block

更改r1 r2 r3 r4裡的值

然後因為改的東西不一樣,就會過

是這嗎?



※ 編輯: henry666666 來自: 140.114.216.126 (04/05 21:03)
scan應該可以用迴圈寫的說……嗯
※ 編輯: henry666666 來自: 140.114.216.126 (04/05 21:05)
ksmrt0123:嗯... 就是這樣 04/05 21:33
目前scan的問題已經解決了,用上面的方法


ksmrt0123:補充一下, 你code問題不在分block, 分block也無法解決 04/06 00:12
ksmrt0123:multiple drivers for a net 的問題... 問題在那你沒給 04/06 00:13
ksmrt0123:完整的code看不太出來... 可能是 scan 的處理沒弄好, 04/06 00:14
ksmrt0123:也可能是"改數字的時候,觸發的是按鈕"這句話... 04/06 00:15
^^^^^^^^^^^^^^^^^^^^^^^^^^
其實是改數字的時候,觸發的是按鈕
可是if判斷成clock
--

那如果回到上面的code
(叫multiple drivers for a net?)
是不可能辦到的嗎?
※ 編輯: henry666666 來自: 140.114.216.126 (04/06 12:56)
ksmrt0123:抱歉 multiple drivers 是最上面的code 不是你的 頭昏了 04/06 21:40
sneak: 寫一個case怎麼樣? https://muxiv.com 11/11 15:03
sneak: 他就跳出那個alway https://noxiv.com 01/04 21:54

你可能也想看看

搜尋相關網站