日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一...

發(fā)布時(shí)間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.一個(gè)完整版實(shí)例

上一次Verilog學(xué)習(xí)筆記中,我通過幾個(gè)小例子,較為直觀的對(duì)Verilog編程有了一些了解。這次筆記,我開始著重的系統(tǒng)學(xué)習(xí)Verilog編程語法基礎(chǔ)。在我系統(tǒng)學(xué)習(xí)語法之前,我先用一個(gè)實(shí)例,引入這次筆記。

上圖被測(cè)試器件被測(cè)試器件DUT 是一個(gè)二選一多路器。測(cè)試裝置(test testbench or fixture)提供測(cè)試激勵(lì)及驗(yàn)證機(jī)制。TestBench 使用行為級(jí)描述,DUT采用門級(jí)描述。下面將給出 采用門級(jí)描述。下面將給出TestBench的描述、DUT的描述及如何進(jìn)行混合仿真。

1)書寫Verilog程序

上圖依舊是我們?cè)?jīng)提到的經(jīng)典二選一電路,現(xiàn)在我對(duì)其進(jìn)行Verilog編程(以后文章中程序均為筆者在Sublime Text3中書寫):

2)書寫該程序的TestBench

書寫TestBench時(shí)候應(yīng)注意,此驗(yàn)證性程序是沒有端口的,這是因?yàn)門estBench是最頂層模塊,不會(huì)被其他模塊實(shí)例化,所以不需要端口。同時(shí)硬件描述程序中,即MUX2_1.V程序在TestBench中需要進(jìn)行實(shí)例化,應(yīng)注意模塊名字要與引用模塊(即MUX2_1)相同;實(shí)例的名字可以任意,但是要符合標(biāo)記命名規(guī)則;端口列表與引用模塊次序相同(即out ,a,b,sel)。

在書寫TestBench時(shí)候常用initial和always這兩個(gè)過程語句,二者區(qū)別為:initial:只能執(zhí)行一次;always:循環(huán)執(zhí)行。值得注意的是所有過程在時(shí)間0執(zhí)行一次,過程之間是并行執(zhí)行的(FPGA的特點(diǎn))。

激勵(lì)描述:

(本圖同數(shù)字電路中真值表)

? 例子中,a, b, sel說明為reg類數(shù)據(jù)。reg類數(shù)據(jù)是寄存器類數(shù)據(jù)信號(hào),在重新賦值前一直保持當(dāng)前數(shù)據(jù)。例子中,a, b, sel說明為reg類數(shù)據(jù)。reg類數(shù)據(jù)是寄存器類數(shù)據(jù)信號(hào),在重新賦值前一直保持當(dāng)前數(shù)據(jù)。

? #5 用于指示等待5個(gè)時(shí)間單位。

? $ stop是結(jié)束仿真的系統(tǒng)任務(wù),也可以寫成$finish。

3)TestBench 響應(yīng)的產(chǎn)生

Verilog 提供了一些系統(tǒng)任務(wù)和系統(tǒng)函數(shù),包括:

? $time 系統(tǒng)函數(shù),給出當(dāng)前仿真時(shí)間;

? $monitor 系統(tǒng)任務(wù),若參數(shù)列表中的參數(shù)值發(fā)生變化,則在時(shí)間單位末顯示參數(shù)值。

格式:$monitor ([“format_specifiers”,] <arguments>);

例如:$monitor($time, o, in1, in2);

$monitor($time, “%b %h%d %o”, sig1, sig2, sig3,sig4);

說明:

a)$time 是一個(gè)系統(tǒng)函數(shù),返回當(dāng)前返回仿真時(shí)間。時(shí)間用64位整數(shù)表示。

b)$monitor 在時(shí)間單位末,若參數(shù)列表中的參數(shù)值發(fā)生變化則顯示所列參數(shù)的值。由$time引起的變化不會(huì)顯示。

c)$monitor系統(tǒng)任務(wù)支持不同的數(shù)基。缺省數(shù)基是十進(jìn)制。支持的數(shù)基還有二進(jìn)制、八進(jìn)制、十進(jìn)制。
4)完整的TestBench

2.模塊的結(jié)構(gòu)

Verilog的基本設(shè)計(jì)單元是“模塊”(block) 。一個(gè)模塊是由兩部分組成的,一部分描述接口,另一部分描述邏輯功能,即定義輸入是如何影響輸出的。

Verilog 模塊的結(jié)構(gòu)由在module和endmodule 關(guān)鍵詞之間的四個(gè)主要部分組成:

1)模塊端口的定義

模塊的端口聲明了模塊的輸入輸出口。其格式如下:

module 模塊名(口1,口2,口3,口4, ………);

模塊名(標(biāo)識(shí)符)的命名規(guī)則:

? 標(biāo)識(shí)符是用戶在描述時(shí)給 標(biāo)識(shí)符是用戶在描述時(shí)給Verilog對(duì)象起的名字;

? 標(biāo)識(shí)符必須以字母 標(biāo)識(shí)符必須以字母(a-z, A-Z) 或( _ ) 開頭,后面可以是字母、數(shù)字、( $ )或( _ )。

? 最長可以是1023個(gè)字符個(gè)字符。

? 標(biāo)識(shí)符區(qū)分大小寫,標(biāo)識(shí)符區(qū)分大小寫,sel 和SEL是不同的標(biāo)識(shí)符。

? 模塊、端口和實(shí)例的名字都是標(biāo)識(shí)符。

? 標(biāo)識(shí)符要區(qū)別與關(guān)鍵字,這個(gè)命名規(guī)則和C語言大同小異。

2)編程命名規(guī)范

a)匈牙利命名:

開頭字母用變量類型的縮寫,其余部分用變量的英文或英文的縮寫,要求單詞第一個(gè)字母大寫。

int iMyAge; “i”是int類型的縮寫; char cMyName[10]; “c”是char類型的縮寫; float fManHeight; “f”是float類型的縮寫;

b)駝峰式命名法:

又叫小駝峰式命名法。第一個(gè)單詞首字母小寫,后面其他單詞首字母大寫。

int myAge;
char myName[10];
float manHeight;

c)帕斯卡命名法:

又叫大駝峰式命名法。每個(gè)單詞的第一個(gè)字母都大寫。

int MyAge;
char MyName[10];
float ManHeight;

個(gè)人比較喜歡駝峰命名法和下劃線結(jié)合來用。

3)模塊內(nèi)容

模塊的內(nèi)容包括I/O說明、內(nèi)部信號(hào)聲明、功能定義。

I/O說明的格式:

輸入口:input[信號(hào)位寬-1:0] 端口名1;

input[信號(hào)位寬-1:0] 端口名2;

input[信號(hào)位寬-1:0] 端口名i; //(共有i個(gè)輸入口)

輸出口:output[信號(hào)位寬-1:0] 端口名1;

output[信號(hào)位寬-1:0] 端口名2;

output[信號(hào)位寬-1:0] 端口名j; //(共有j個(gè)輸出口)

輸入/輸出口:inout[信號(hào)位寬-1:0] 端口名1;

inout[信號(hào)位寬-1:0] 端口名2;

inout[信號(hào)位寬-1:0] 端口名k; //(共有k個(gè)雙向總線端口)

注:I/O說明也可以寫在端口聲明語句里。其格式如下:

module module_name(input port1,input port2,… output port1,output port2… );

4)內(nèi)部信號(hào)說明

在模塊內(nèi)用到的和與端口有關(guān)的wire 和 reg 變量的聲明。

如: reg [width-1 :0] R變量1,R變量2 …;

wire [width-1 : 0] W變量1,W變量2 …;

5)功能定義

模塊中最重要的部分是邏輯功能定義部分。有三種方法可在模塊中產(chǎn)生邏輯。

a)用 assign 語句(數(shù)據(jù)流描述):assign a = b & c ;

b)用實(shí)例元件(結(jié)構(gòu)化描述):and2 and_inst ( q, a, b);

c)用 “always” 塊(行為描述):

always @ (posedge clk or
posedge clr)//敏感性列表

begin

if (clr) q<= 0;
else if (en) q<= d;

end //begin……end相當(dāng)于C語言中的()

說明:上述三條語句是并行的,他們產(chǎn)生獨(dú)立的邏輯電路;而在always塊中:begin和end之間是順序執(zhí)行的。

3.數(shù)據(jù)類型及常量和變量

1)常量

在程序運(yùn)行過程中,其值不能被改變的量稱為常量。

I.數(shù)字:

(1)整數(shù)

在Verilog HDL中,整型常量即整常數(shù)有以下四種進(jìn)制表示形式:

a)二進(jìn)制整數(shù)(b或B)

b) 十進(jìn)制整數(shù)(d或D)

c) 十六進(jìn)制整數(shù)(h或H)

d) 八進(jìn)制整數(shù)(o或O)

數(shù)字表達(dá)方式有以下三種:

a) <位寬><進(jìn)制><數(shù)字>這是一種全面的描述方式。

b) <進(jìn)制><數(shù)字>在這種描述方式中,數(shù)字的位寬采用缺省位寬(這由具體的機(jī)器系統(tǒng)決定,但至少32位)。

c) <數(shù)字>在這種描述方式中,采用缺省進(jìn)制十進(jìn)制。

(2)X,Z,0,1的含義

在數(shù)字電路中,x代表不定值,z代表高阻值。一個(gè)x可以用來定義十六進(jìn)制數(shù)的4位二進(jìn)制數(shù)的狀態(tài),八進(jìn)制數(shù)的3位,二進(jìn)制數(shù)的1位。z的表示方式同x類似。z還有一種表達(dá)方式是可以寫作“?”。

(3)負(fù)數(shù)

一個(gè)數(shù)字可以被定義為負(fù)數(shù),只需在位寬表達(dá)式前加一個(gè)減號(hào),減號(hào)必須寫在數(shù)字定義表達(dá)式的最前面。注意減號(hào)不可以放在位寬和進(jìn)制之間也不可以放在進(jìn)制和具體的數(shù)之間。

-8'd5 //這個(gè)表達(dá)式代表5的補(bǔ)數(shù)(用八位二進(jìn)制數(shù)表示)

8‘d-5 //非法格式

(4)下畫線(underscore_)

下劃線可以用來分隔開數(shù)的表達(dá)以提高程序可讀性。但不可以用在位寬和進(jìn)制處,只能用在具體的數(shù)字之間。

16'b1010_1011_1111_1010 //合法格式

8'b_0011_1010 //非法格式

當(dāng)常量不說明位數(shù)時(shí),默認(rèn)值是32位,每個(gè)字母用8位的ASCII值表示。

(5)基數(shù)符號(hào)及其合法的表示值

舉例:

(6)實(shí)型數(shù)及其表示

Verilog中的實(shí)數(shù)可以用十進(jìn)制與科學(xué)計(jì)數(shù)法兩種格式來表示,如果采用十進(jìn)制格式,小數(shù)點(diǎn)兩邊必須都有數(shù)字,否則為非法的表示形式。

實(shí)例:

排版太困難了,原諒我用圖片了

II. 參數(shù)型(parameter)

a)用參數(shù)聲明一個(gè)可變常量,常用于定義延時(shí)及寬度變量。

b)參數(shù)定義的語法:parameter <list_of_assignment>;

c)可一次定義多個(gè)參數(shù),用逗號(hào)隔開。

d)在使用文字(literal)的地方都可以使用參數(shù)。

e)參數(shù)的定義是局部的,只在當(dāng)前模塊中有效。

f)參數(shù)定義可使用以前定義的整數(shù)和實(shí)數(shù)參數(shù)。

2)變量

變量即在程序運(yùn)行過程中其值可以改變的量。常用的網(wǎng)絡(luò)數(shù)據(jù)類型包括wire型和tri型。wire型變量通常是用來表示單個(gè)門驅(qū)動(dòng)或連續(xù)賦值語句驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù),tri型變量則用來表示多驅(qū)動(dòng)器驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù)。

a)wire型

wire型數(shù)據(jù)常用來表示用于以assign關(guān)鍵字指定的組合邏輯信號(hào)。Verilog程序模塊中輸入輸出信號(hào)類型缺省時(shí)自動(dòng)定義為wire型。其格式如下:

wire [n-1:0] 數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名i; //共有i條總線,每條總線內(nèi)有n條線路,或

wire [n:1] 數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名i;

b)reg型

寄存器是數(shù)據(jù)儲(chǔ)存單元的抽象。寄存器數(shù)據(jù)類型的關(guān)鍵字是

reg。 reg類型數(shù)據(jù)的默認(rèn)初始值為不定值x。reg型數(shù)據(jù)常用來表示用于“always”模塊內(nèi)的指定信號(hào),常代表觸發(fā)器。在“always”塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg型。

reg型數(shù)據(jù)的格式如下:

reg [n-1:0] 數(shù)據(jù)名1,數(shù)據(jù)名2,… 數(shù)據(jù)名i;

reg [n:1] 數(shù)據(jù)名1,數(shù)據(jù)名2,… 數(shù)據(jù)名i;

c)memory型

Verilog HDL通過對(duì)reg型變量建立數(shù)組來對(duì)存儲(chǔ)器建模,可以描述RAM型存儲(chǔ)器,ROM存儲(chǔ)器和reg文件。數(shù)組中的每一個(gè)單元通過一個(gè)數(shù)組索引進(jìn)行尋址。在Verilog語言中沒有多維數(shù)組存在。 memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。其格式如下:

reg [n-1:0] 存儲(chǔ)器名[m-1:0];

reg [n-1:0] 存儲(chǔ)器名[m:1];

3)如何選擇正確的數(shù)據(jù)類型

a)輸入口(input)可以由寄存器或網(wǎng)絡(luò)連接驅(qū)動(dòng),但它本身只能驅(qū)動(dòng)網(wǎng)絡(luò)連接。

b)輸出口 (output)可以由寄存器或網(wǎng)絡(luò)連接驅(qū)動(dòng),但它本身只能驅(qū)動(dòng)網(wǎng)絡(luò)連接。

c)輸入/輸出口(inout)只可以由網(wǎng)絡(luò)連接驅(qū)動(dòng),它本身也只能驅(qū)動(dòng)網(wǎng)絡(luò)連接。

d)如果信號(hào)變量是在過程塊 (initial塊或always塊)中被賦值的,必須把它聲明為寄存器類型變量。

『文末說明』

本文作者:小強(qiáng)子

知乎ID:Power小強(qiáng)

一個(gè)細(xì)膩不油膩,嗜好多能力小的普通人,專注于分享電子電氣相關(guān)知識(shí)的打雜碩士生

總結(jié)

以上是生活随笔為你收集整理的b 计数器位选信号 verilog_Verilog HDL菜鸟学习笔记———三、Verilog常用语法之一...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。