verilog中reg變數賦初始值問題

時間 2021-05-07 19:59:54

1樓:丁香娛

reg型變數能在定義的時候直接賦值,這跟綜合工具有關,一般不建議將這樣的**直接綜合而是僅僅**用。

不用按reset 鍵也能賦值,是因為你的硬體有一個上電覆位電容,就是但凡剛啟動,都會自動復位。

2樓:匿名使用者

1.reg型別的不可以直接賦值的,一般在always塊中進行賦值。

2.有上電覆位的。

3樓:匿名使用者

求可綜合,可以簡單寫成:

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

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

能力有限,錯誤請指正

4樓:

不能,可不可以把完整的程式,發給我看下!!

verilog中的reg型變數,wire型變數初值是多少

5樓:單詞用記嗎

reg型變數需要賦初值,否則會在reset前是x,具體值要看具體的設計,reg [7:0] a='h0;wire最好不要賦初值,賦值會和assign造成多驅動的問題,從而產生x,就是wire a=0;assign a=b;那麼會在b=1的時候a的波形是x。若是後面不用assign賦值是沒問題的(以上屬於個人觀點)

6樓:匿名使用者

reg型是x,如果如果是reg型需要給他們賦初值才行,wire一般是不需要的

7樓:旗語彤潘漫

a、b**時是紅線;上板時不定,一般情況下是0。需要給其賦初值可以定義時賦值,如rega=

1;或者always塊中賦值

為什麼在verilog中要定義wire

有幾種情況變數需要定義成wire。第一。assign 語句 例如 reg a,b wire and result assign and result a b 你可以試試把wire定義成reg。綜合器會報錯。第二。元件例化時候的輸出必須用wire 例如 wire dout ram u ram out ...

verilog中頂層模組例項引用多個模組時埠怎麼連線

假定sub module1和sub module2是已經定義好的兩個子模組,top是頂層。那麼子模組之間的連線可以之間用wire連線。頂層的輸入輸出也用wire連線進到子模組中。這是一般的,當然也有特殊的,比如雙向io等。module top in1,out1 input in1 output ou...

在verilog中,模組例項化能用在always嗎

死神吧日語帝 在不同的地方使用同一個基本模組是很常見的事,這樣可以避免重複的 以加法器為例,比如你的加法器是adder,你需要在不同的地方使用它,那麼可以這樣例項化 adder adder 1 clk clk rst rst in a a1 in b b1 sum out s1 adder adde...