硬件設計熱門培訓內容之assign連續賦值

時間:2018-12-06 17:28:23

“連續賦值語句用來驅動線型變量,這一線型變量必須已經事先定義過。只要輸入端操作數的值發生變化,該語句就重新計算并刷新賦值結果。我們可以使用連續賦 值語句來描述組合邏輯而不需要用門電路和互連線。在前面一節中已經對連續賦值做了介紹,關鍵詞assign用來區分連續賦值語句和過程賦值語句,下面一條 語句將線型變量int1和int2相與,并用這一結果去驅動out信號:
wire out ;
assign  out= int1 & int2 ;”
現在我不解的是,為什么在使用寄存器賦值的場合(過程賦值)也用到了
             “assign 端口=寄存器 ;”

下面是功能相同但寫法不同的兩段代碼:

第一段A

module assign_test_a (
                       clk,
                       lhold,
                       lholda
);

input clk;
input lhold;
output lholda;

reg lholda;

always @(posedge clk)
if (lhold)
 lholda<=lhold;
else
 lholda<=0;

endmodule


第二段B
module assign_test_b (
                       clk,
                       lhold,
                       lholda
);
input clk;
input lhold;
output lholda;

reg lholda_r;
  always @(posedge clk)
  if (lhold)
     lholda_r<=lhold;
  else
     lholda_r<=0;

 assign  lholda=lholda_r;
endmodule

分析:

1. 從代碼角度來看。 A是直接把內部reg信號做為輸出,因此相對外部來說,外部信號引腳lholda沒有選擇的連接到reg輸出信號。 這里其實暗含了用根導線直接把reg的輸出與lholda連接起來。因此B代碼就是把這個暗含的明顯化。因此他們的RTL沒有多大區別。
2. 從實用角度來說,這里的意義比較大。當內部有多個信號需要輸出,可是輸出引腳只有一個,那么這時就可以進行選擇。如下:
assign  lholda= (條件)? (lholda_ra): lholda_rb;  可以嵌套使用。
   或者在這種情況下也非常有用。
     Lholda 與 內部的reg輸出lholda_ra, lholda_rb,…., 存在邏輯函數關系。

 

? 江苏快3号码表