硬件設計熱門培訓內容之verilog中assign語句

時間:2018-12-06 17:25:35

/**************************************
* Module: assign
* Date:2014-08-10  
* Author: [email protected] 
*
* Description: verilog中的assign語句的用法
***************************************/
/*
一、引入語法的概念
     1、只有寄存器類型的信號才可以在always和initial 語句中進行賦值,類型定義通過reg語句實現。
  2、always 語句是一直重復執行,由敏感表(always 語句括號內的變量)中的變量觸發。
  3、always 語句從0 時刻開始。
  4、在begin 和end 之間的語句是順序執行,屬于串行語句。
*/
// assign 語句的用法
module  test;
// 1.作為信號量輸出,通過寄存器連續賦值
output [3:0] oLED;        // 默認是wire類型,需要持續輸出才行
//internal signal
reg [3:0] sr_LED; //用獨熱碼表示LED亮燈位置。
assign  oLED[3:0] = ~sr_LED[3:0]; //向LED燈接口輸出信號。
//2.作為信號量輸出,通過寄存器拼接數據位實現。
 
output [15: 0] oSI_DATA;
//internal signal
  reg [ 3: 0] s_HEX;
  reg [ 7: 0] s_SEGBINARY; // s_SEGBINARY[2] should be the DOT
  reg [ 3: 0] s_SEG_SEL;
assign oSI_DATA = {iLED_SEL,s_SEG_SEL,s_SEGBINARY};
//3.作為信號量輸出,通過判斷條件,賦值給信號
 
output[ 1: 0]   oSEG_STATE;
output          oCP_PLUSE;
wire            s_CNTEQCYCLE; 
parameter PARAM_7SEG_CYCLE = 32'd2500000;
reg [ 1: 0] sr_SEG_STATE;
reg [31: 0] sr_cnt;
reg         sr_cp_pluse;  
assign oSEG_STATE = sr_SEG_STATE;
assign oCP_PLUSE = sr_cp_pluse;
assign s_CNTEQCYCLE = ( sr_cnt == PARAM_7SEG_CYCLE ) ? 1 : 0;

//4.作為輸出信號量,通過輸入信號量賦值給輸出,同樣可以輸入信號量和寄存器組合邏輯,賦值給輸出信號量。
input        iCLK50M;
input        iCP_PULSE;
input[15:0]  iSI_DATA;
output       oSI;
output       oCP;
reg [ 3: 0] sr_cnt;
reg [15: 0] sr_si_data;
reg sr_cp;
reg sr_en;
assign oSI = sr_si_data[15];
assign oCP = sr_en & iCLK50M;

endmodule

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
// 下面是功能相同但寫法不同的兩段代碼:
// 第一段A
module assign_test_a (
                       clk,
                       lhold,
                       lholda
);
input clk;
input lhold;
output lholda;      // 將輸出定義為reg類型, 不用assign來持續輸出了
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;        // 默認是wire類型的
reg lholda_r;         // 定義一個內部的reg變量,
always @(posedge clk)
  if (lhold)
     lholda_r<=lhold;
  else
     lholda_r<=0;
assign  lholda=lholda_r;       // 進行持續賦值輸出
endmodule

// 分析
/*
 從實用角度來說,這里的意義比較大。當內部有多個信號需要輸出,可是輸出引腳只有一個,那么這時就可以進行選擇。如下:
assign  lholda= (條件)? (lholda_ra): lholda_rb;  可以嵌套使用。
   或者在這種情況下也非常有用。
     Lholda 與 內部的reg輸出lholda_ra, lholda_rb,…., 存在邏輯函數關系

? 江苏快3号码表