????????筆者之前主要是使用c語言和matab 進(jìn)行編程,從2024年年初開始接觸verilog,通過了一周的學(xué)習(xí),基本上對verilog 的語法有了基本認(rèn)知??偨y(tǒng)來說,verilog 的語法還是很簡單的,主要難點(diǎn)是verilog是并行運(yùn)行,并且強(qiáng)烈和硬件實(shí)際電路相關(guān),在設(shè)計(jì)到的時(shí)候需要考慮時(shí)序問題和可綜合問題。
時(shí)序問題:因?yàn)関erilog 是基于硬件實(shí)現(xiàn),在實(shí)現(xiàn)的時(shí)候要考慮到硬件電路的建立時(shí)間和穩(wěn)定時(shí)間,所以會(huì)遇到鎖存器。并且在多個(gè)并行的運(yùn)算在耦合到一起時(shí),需要考慮時(shí)序。
可綜合:指的是是否可以生成對應(yīng)的電路,如果一段程序無法生成對應(yīng)的電路,那么這個(gè)程序可能只能進(jìn)行仿真,最后實(shí)際無法在硬件上實(shí)際運(yùn)行。
?
基本設(shè)計(jì)單元
對于c語言中一個(gè)最基本的設(shè)計(jì)單元稱為函數(shù)
void functionname(parameter)
{
funtion description
}
對于verilog 基本設(shè)計(jì)單元?jiǎng)t稱為模塊,結(jié)構(gòu)也類似
module block(parameter)
block desription
endmodule
具體實(shí)例:
module test(a,b,c,d)
input a,b,c;// 可以在block 內(nèi)部進(jìn)行輸入輸出定義 這里沒有指明為寬 則默認(rèn)a,b,c,d 寬帶為1bit
output d;
assign d=a|b|c; // 這里 是對輸入的三個(gè)信號線 abc 進(jìn)行按位求或,主要有一個(gè)問題高電平,則輸出d為高電平
endmodule
如果輸入輸出的數(shù)據(jù)位寬不為1,可以按照如下方式進(jìn)行定義
input [信號位寬-1:0] 端口名字1;
output[信號位寬-1:0] 輸出端口名字;
inout[信號位寬-1:0]? 端口名字;// 這個(gè)端口即是輸入端口又是輸出端口
數(shù)據(jù)定義
數(shù)字表現(xiàn)形式
數(shù)子常用的表現(xiàn)形式包括二進(jìn)制十進(jìn)制和十六進(jìn)制,下面展示了用不同進(jìn)制表示一個(gè)字為10
二進(jìn)制? 4'b1010;
十進(jìn)制 4’d10;
十六進(jìn)制 4‘hA;
如果直接寫10,則默認(rèn)是十進(jìn)制。
對于負(fù)數(shù)則如下表示:
二進(jìn)制? -4'b1010;
十進(jìn)制 -4’d10;
十六進(jìn)制 -4‘hA;
對于c編程中一個(gè)bit只能有兩種情況 true或者false 也即 1或者0.但是對于實(shí)際電路中出了0或者1 還有另外兩個(gè)值,使用x表示不定值,使用z/?代表高阻值
如
二進(jìn)制? 4'b101z;
十進(jìn)制 4’dz;
十六進(jìn)制 4‘hx;
另外一個(gè)讓我感覺verilog 很貼心的是增加了_ 來對數(shù)據(jù)進(jìn)行分隔,從而提高可讀性,
32’b1111_1110_0001_1101_1011_0011_0101_1101,
希望其他語言中也早點(diǎn)支持這種分隔符,有的時(shí)候真是數(shù)的讓人眼花繚亂。
數(shù)據(jù)類型
verilog 中一共有19個(gè)數(shù)據(jù)類型,其中最常用的為wire,reg,integer和parameter。
1. wire 數(shù)據(jù)類型 常用在表示以assign 關(guān)鍵字指定的組合邏輯信號,verilog 程序模塊中輸入和輸出默認(rèn)為wire 類型,wire 數(shù)據(jù)可以作為任何方程的輸入,但是輸出的時(shí)候需要用到assign
如
wire[3:0] b;
assign b=10;//定義了一個(gè)wire類型的b 并且給b賦值為10,注意 給wire 賦值的時(shí)候必須用assign。
2. reg型數(shù)據(jù),register? 是數(shù)據(jù)存儲(chǔ)對象的抽象,通過賦值語句可以修改寄存器儲(chǔ)存的數(shù)據(jù),reg數(shù)據(jù)常和always 使用,
reg[3:0] b;
always*?
?b=10;
3. parameter 型數(shù)據(jù)是用來定義常量
module Test()
parameter b=7;// 定義了一個(gè) 參數(shù) 為7? 這個(gè)參數(shù)可以通過上層的模塊修改
........
endmodule
module Topfun()
Test #(10) testexample;//在這里實(shí)例化了Test 并且修改b=10
endmodule
運(yùn)算符和表達(dá)式
verilog 中的運(yùn)算符基本都和c語言中使用方法一致,唯有拼接運(yùn)算符是一個(gè)新的。
reg [7:0] var1;
reg [15:0] var2;文章來源:http://www.zghlxwxcb.cn/news/detail-841117.html
wire [22:0] combined = {var1, var2};// 通過拼接運(yùn)算符把var1和var2 合并到了一起文章來源地址http://www.zghlxwxcb.cn/news/detail-841117.html
到了這里,關(guān)于verilog 從入門到看得懂---verilog 的基本語法數(shù)據(jù)和運(yùn)算的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!