1.1 概述


1.2 模块(kuài)Module

1.3 數據(jù)類(lèi)型
1.3.1 wire/reg線(xiàn)网(wǎng)
wire和(hé)reg都是(shì)線(xiàn)類(lèi)型,工程上(shàng)沒(méi)區(qū)别;只(zhī)是(shì)always/initial模块(kuài)中(zhōng)輸出(chū)定(dìng)義需要(yào)为(wèi)reg型;
注意(yì):不(bù)要(yào)将reg類(lèi)型與(yǔ)D觸發(fà)器混淆,reg理解(jiě)为(wèi)因(yīn)为(wèi)代(dài)碼所(suǒ)産生(shēng)的(de)。例如(rú):
|
wire [7:0] a; //定(dìng)義了(le)8位的(de)wire型數據(jù) wireb; // 定(dìng)義了(le)1位的(de)wire型數據(jù) |
|
reg [3:0]sum;//定(dìng)義了(le)一(yī)个(gè)4位的(de)reg型數據(jù) |
類(lèi)型
格式
说(shuō)明(míng)
parameter
parameter數據(jù)名= 表(biǎo)达(dá)式
parameterMSB = 7;
常量(liàng)
<位宽(kuān)><進(jìn)制><數字(zì)>
二(èr)進(jìn)制:B或(huò)b;
十(shí)進(jìn)制:D或(huò)d;
八(bā)進(jìn)制:O或(huò)o;
8’b1010_1100 (‘b表(biǎo)示二(èr)進(jìn)制)
<數字(zì)>
默認十(shí)進(jìn)制;
4值邏輯
0:Logic Low
低電(diàn)平;
1:Logic High
高(gāo)電(diàn)平;
x:Unknow;
不(bù)确定(dìng);
z:High Impedance;
高(gāo)阻态; //三(sān)态門(mén)
1.4 運算符
//定(dìng)義參數MSB为(wèi)常量(liàng)7;推薦大写;
十(shí)六(liù)進(jìn)制:H或(huò)h;
下(xià)画(huà)線(xiàn)“_”,提(tí)高(gāo)閱读(dú)性(xìng)。
1.4.1 概述
|
運算符 |
说(shuō)明(míng) |
|
算術(shù)運算符 |
+(加),-(減),*(乘),/(除),%(取(qǔ)模); |
|
每个(gè)運算符在(zài)電(diàn)路(lù)中(zhōng)都是(shì)个(gè)模块(kuài),如(rú)加法器,減法器; !注意(yì):除法,除2^n,是(shì)移位運算, 浮點(diǎn)運算就(jiù)複雜了(le),因(yīn)此(cǐ)浮點(diǎn)運算要(yào)專用(yòng)除法器; |
|
|
關(guān)系(xì)運算符 |
>, <, >=, <=,==(相等), !=(不(bù)相等); |
|
邏輯運算符 |
&&(邏輯與(yǔ)). ||(邏輯或(huò)), !(邏輯非(fēi)); 条(tiáo)件(jiàn)判斷語(yǔ)句(jù)中(zhōng),为(wèi)避免歧義,邏輯運算符二(èr)邊(biān)推薦为(wèi)1bit; |
|
位運算符 |
&(與(yǔ)),|(或(huò)), ~(非(fēi)), ^(异(yì)或(huò)); ~^(同(tóng)或(huò)); |
|
移位運算符 |
<<(左(zuǒ)移),>>(右(yòu)移); |
|
歸約操作 |
&,~&, |, ~|,^, ~^;//unary reduction; |
|
条(tiáo)件(jiàn)運算符 |
?: |
|
拼接運算符 |
{} //{3{a[0]}}:代(dài)表(biǎo)3根(gēn)同(tóng)樣(yàng)的(de)a[0]線(xiàn),{a[0],a[0],a[0]} |
1.5.1 assign(連(lián)續賦值)

1.1.1 always(过(guò)程块(kuài))
|
賦值方(fāng)式 |
说(shuō)明(míng) |
|
=,阻塞賦值 |
always @(a or b or C or …) begin 語(yǔ)句(jù)块(kuài)(=, if語(yǔ)句(jù), case語(yǔ)句(jù)) end |
|
实現(xiàn):組合邏輯電(diàn)路(lù);(注意(yì)!禁止用(yòng)于(yú)时(shí)序邏輯電(diàn)路(lù)) always块(kuài)內(nèi),阻塞賦值:是(shì)順序執行(類(lèi)似C); |
|
|
敏感(gǎn)表(biǎo):@(*) //“*”自(zì)動(dòng)添加相關(guān)輸入(rù)信(xìn)号(hào); |
|
|
避免出(chū)現(xiàn)Latch(鎖存器) 分(fēn)支語(yǔ)句(jù)(if語(yǔ)句(jù),case語(yǔ)句(jù))条(tiáo)件(jiàn)不(bù)滿时(shí),会(huì)在(zài)電(diàn)路(lù)中(zhōng)自(zì)動(dòng)生(shēng)成(chéng)鎖存器来(lái)保存不(bù)滿足条(tiáo)件(jiàn)的(de)值,因(yīn)此(cǐ)要(yào)補全(quán)if-else,和(hé)case的(de)defalut語(yǔ)句(jù); |
|
|
<=,非(fēi)阻塞賦值 |
always @(posedge clk or negedge rst_n) begin 語(yǔ)句(jù)块(kuài)(<=, if語(yǔ)句(jù), case語(yǔ)句(jù)) end |
|
实現(xiàn):时(shí)序邏輯電(diàn)路(lù);(注意(yì)!禁止用(yòng)于(yú)組合邏輯電(diàn)路(lù)) always块(kuài)內(nèi),阻塞賦值:并行執行; |
if語(yǔ)句(jù)
|
条(tiáo)目 |
说(shuō)明(míng) |
|
格式1 |
if(条(tiáo)件(jiàn))begin 語(yǔ)句(jù)1; 語(yǔ)句(jù)2; end else begin 語(yǔ)句(jù)1; 語(yǔ)句(jù)2; end |
|
格式2 |
if(条(tiáo)件(jiàn))begin 語(yǔ)句(jù)1; 語(yǔ)句(jù)2; end else if begin 語(yǔ)句(jù)1; 語(yǔ)句(jù)2; end else begin 語(yǔ)句(jù)1; 語(yǔ)句(jù)2 end |
|
特(tè)點(diǎn) |
分(fēn)支語(yǔ)句(jù),各(gè)个(gè)分(fēn)支条(tiáo)件(jiàn)不(bù)同(tóng);順序執行判斷; |
|
注意(yì) |
if-else成(chéng)对(duì)使用(yòng); |
case語(yǔ)句(jù)
条(tiáo)目
说(shuō)明(míng)
格式
case(表(biǎo)达(dá)式)
常量(liàng)表(biǎo)达(dá)式1:begin
語(yǔ)句(jù);
end
常量(liàng)表(biǎo)达(dá)式2:begin
語(yǔ)句(jù);
end
常量(liàng)表(biǎo)达(dá)式3:begin
語(yǔ)句(jù);
end
default:
語(yǔ)句(jù);
endcase
特(tè)點(diǎn)
分(fēn)支語(yǔ)句(jù),各(gè)个(gè)分(fēn)支条(tiáo)件(jiàn)相同(tóng);并行執行判斷;
注意(yì)
default語(yǔ)句(jù)不(bù)可(kě)省(shěng)略;
代(dài)碼&硬(yìng)件(jiàn)

|
条(tiáo)目 |
说(shuō)明(míng) |
|
格式 |
case(表(biǎo)达(dá)式) 常量(liàng)表(biǎo)达(dá)式1:begin 語(yǔ)句(jù); end 常量(liàng)表(biǎo)达(dá)式2:begin 語(yǔ)句(jù); end 常量(liàng)表(biǎo)达(dá)式3:begin 語(yǔ)句(jù); end default: 語(yǔ)句(jù); endcase |
|
特(tè)點(diǎn) |
分(fēn)支語(yǔ)句(jù),各(gè)个(gè)分(fēn)支条(tiáo)件(jiàn)相同(tóng);并行執行判斷; |
|
注意(yì) |
default語(yǔ)句(jù)不(bù)可(kě)省(shěng)略; |
1.5.3 模块(kuài)例化(huà)
作用(yòng)
系(xì)統設計(jì)时(shí),建議遵循以(yǐ)下(xià)設計(jì)原則:
1.5.4 全(quán)加器
描述方(fāng)式
描述方(fāng)式
说(shuō)明(míng)
位置關(guān)聯
AND u1(a, b, and_out);
名字(zì)關(guān)聯
AND u1(.a(a), .b(b), .o(and_out)); //推薦使用(yòng)
1.6.1 結構
|
描述方(fāng)式 |
说(shuō)明(míng) |
|
位置關(guān)聯 |
AND u1(a, b, and_out); |
|
名字(zì)關(guān)聯 |
AND u1(.a(a), .b(b), .o(and_out)); //推薦使用(yòng) |
1.6.2 特(tè)殊符号(hào)
語(yǔ)句(jù)
说(shuō)明(míng)
`<标(biāo)識符>
表(biǎo)示:
編譯引導語(yǔ),用(yòng)于(yú)指導仿真(zhēn)編譯器在(zài)編譯时(shí)采取(qǔ)一(yī)些特(tè)殊处理;
編譯引導語(yǔ)句(jù)一(yī)直(zhí)保持(chí)有(yǒu)效,直(zhí)到(dào)被(bèi)取(qǔ)消或(huò)重(zhòng)写;
`timescale
`timescale <时(shí)間(jiān)單位>/<时(shí)間(jiān)精度(dù)>
例1:
`timescale 1ns/1ns //时(shí)間(jiān)單位1ns;时(shí)間(jiān)精度(dù)1ns;
#2 //延时(shí)2 ×1=2ns;
#2.1//延时(shí)2.1 × 1 = 2.1ns,精确到(dào)1ns,为(wèi)2ns;
例2:
`timescale 1ns/100ps //时(shí)間(jiān)單位1ns;时(shí)間(jiān)精度(dù)100ps;
#2 //延时(shí)2 ×1= 2ns;
#2.1//延时(shí)2.1 × 1 = 2.1ns,精确到(dào)100s,为(wèi)2.1ns;
`define
`include
`include “global.v”
包(bāo)含另(lìng)一(yī)个(gè)文(wén)件(jiàn),完整拷貝过(guò)来(lái);
`restall
把所(suǒ)有(yǒu)設置的(de)編譯引導恢複到(dào)缺省(shěng)狀态;
#<num>;
#10; //延遲10个(gè)时(shí)間(jiān)單位
1.6.3 語(yǔ)句(jù)
|
語(yǔ)句(jù) |
说(shuō)明(míng) |
|
`<标(biāo)識符> |
表(biǎo)示: 編譯引導語(yǔ),用(yòng)于(yú)指導仿真(zhēn)編譯器在(zài)編譯时(shí)采取(qǔ)一(yī)些特(tè)殊处理; 編譯引導語(yǔ)句(jù)一(yī)直(zhí)保持(chí)有(yǒu)效,直(zhí)到(dào)被(bèi)取(qǔ)消或(huò)重(zhòng)写; |
|
`timescale |
`timescale <时(shí)間(jiān)單位>/<时(shí)間(jiān)精度(dù)> 例1: `timescale 1ns/1ns //时(shí)間(jiān)單位1ns;时(shí)間(jiān)精度(dù)1ns; #2 //延时(shí)2 ×1=2ns; #2.1//延时(shí)2.1 × 1 = 2.1ns,精确到(dào)1ns,为(wèi)2ns; 例2: `timescale 1ns/100ps //时(shí)間(jiān)單位1ns;时(shí)間(jiān)精度(dù)100ps; #2 //延时(shí)2 ×1= 2ns; #2.1//延时(shí)2.1 × 1 = 2.1ns,精确到(dào)100s,为(wèi)2.1ns; |
|
`define |
|
|
`include |
`include “global.v” 包(bāo)含另(lìng)一(yī)个(gè)文(wén)件(jiàn),完整拷貝过(guò)来(lái); |
|
`restall |
把所(suǒ)有(yǒu)設置的(de)編譯引導恢複到(dào)缺省(shěng)狀态; |
|
|
|
|
#<num>; |
#10; //延遲10个(gè)时(shí)間(jiān)單位 |
語(yǔ)句(jù)
说(shuō)明(míng)
initial
块(kuài)語(yǔ)句(jù):只(zhī)執行一(yī)次(cì),always循环(huán)執行;不(bù)可(kě)綜合;
作用(yòng):
産生(shēng)激勵信(xìn)号(hào);
檢查輸出(chū)波(bō)形;
賦初值;
forever
//産生(shēng)周期(qī)信(xìn)号(hào):
intial begin
clk = 0;
forever
#10 clk = ~clk; //时(shí)鐘(zhōng)信(xìn)号(hào)
end
|
語(yǔ)句(jù) |
说(shuō)明(míng) |
|
initial |
块(kuài)語(yǔ)句(jù):只(zhī)執行一(yī)次(cì),always循环(huán)執行;不(bù)可(kě)綜合; |
|
作用(yòng): 産生(shēng)激勵信(xìn)号(hào); 檢查輸出(chū)波(bō)形; 賦初值; |
|
|
forever |
//産生(shēng)周期(qī)信(xìn)号(hào): intial begin clk = 0; forever #10 clk = ~clk; //时(shí)鐘(zhōng)信(xìn)号(hào) end |
1.6.4 系(xì)統任务和(hé)函(hán)數
条(tiáo)目
说(shuō)明(míng)
$<标(biāo)識符>
表(biǎo)示Verilg的(de)系(xì)統任务和(hé)函(hán)數
$time
當前(qián)的(de)仿真(zhēn)时(shí)間(jiān)
$display
顯示信(xìn)号(hào)值變(biàn)化(huà):只(zhī)執行一(yī)次(cì),打(dǎ)印(yìn)當前(qián)时(shí)刻;
$display($time, “b% %b %b”, rst,clk,dout);
$monitor
監視信(xìn)号(hào)值變(biàn)化(huà):所(suǒ)有(yǒu)过(guò)程时(shí)刻;
$monitor($time, “b% %b %b”, rst,clk,dout);
$stop
暫停仿真(zhēn)
$finish
結束(shù)仿真(zhēn),釋放(fàng)電(diàn)腦資源;
1.7.1 組合邏輯電(diàn)路(lù)
条(tiáo)目
说(shuō)明(míng)
assign
assign add_cnt = flag==1; //用(yòng)于(yú)簡單的(de)組合邏輯電(diàn)路(lù);
always
always @(*)begin//統一(yī)采用(yòng)“*”为(wèi)敏感(gǎn)列表(biǎo);
(=,if,case)語(yǔ)句(jù);//只(zhī)能(néng)使用(yòng)“=”賦值
end
1.7.2 时(shí)序邏輯電(diàn)路(lù)
計(jì)數器模板1
3段(duàn)式模板
模板1
1
計(jì)數段(duàn)
always @( posedge cllk or negedge rst_n) begin
if (!rst_n)
cnt <= 0; //初值規定(dìng)为(wèi)0
else if (add_cnt)begin//【位置1】
if(end_cnt)
cnt <= 0;
else
cnt <= cnt + 1;
end
end
2
加1条(tiáo)件(jiàn)
assingadd_cnt = d==1; //d==1: 什麼(me)时(shí)候開(kāi)始數脈沖
3
結束(shù)条(tiáo)件(jiàn)
assing end_cnt = add_cnt&& cnt == X-1; // X:數多(duō)少(shǎo)个(gè)脈沖
計(jì)數器模板2
3段(duàn)式模板
模板1
1
計(jì)數段(duàn)
always @( posedge cllk or negedge rst_n) begin
if (!rst_n)
cnt <= 0; //初值規定(dìng)为(wèi)0
else if (add_cnt) begin//【位置1】
if(end_cnt)
cnt <= 0;
else
cnt <= cnt + 1;
end
else
cnt <= 0; //不(bù)連(lián)續,需要(yào)清(qīng)0时(shí),使用(yòng)模板2;
end
2
加1条(tiáo)件(jiàn)
assingadd_cnt = d==1; //d==1: 什麼(me)时(shí)候開(kāi)始數脈沖
3
結束(shù)条(tiáo)件(jiàn)
assing end_cnt = add_cnt&& cnt == X-1; // X:數多(duō)少(shǎo)个(gè)脈沖
模板4段(duàn)式狀态機(jī)
段(duàn)号(hào)
代(dài)碼
1
// 初始化(huà),次(cì)态賦值給(gěi)現(xiàn)态,明(míng)确當前(qián)狀态;
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
state_c <= S00;//初始狀态
else
state_c <= state_n;
end
2
always @( * ) begin //組合邏輯,描述狀态轉(zhuǎn)換目标(biāo)
case(state_c)
S00: begin
if(s00_s20_start) // 条(tiáo)件(jiàn)名 S00->S20
state_n = S20;
else
state_n = state_c; // 方(fāng)便拷貝
end
S20: begin
if(s20_s21_start)
state_n = S21;
else
state_n = state_c;
end
S21: begin
if(s21_s00_start)
state_n = S00;
else
state_n = state_c;
end
default: begin
state_n = S00;
end
endcase
end
3
//具體(tǐ)的(de)轉(zhuǎn)換条(tiáo)件(jiàn)內(nèi)容
assign s00_s20_start = state_c==S00&& (条(tiáo)件(jiàn));
assign s20_s21_start = state_c==S20&& (条(tiáo)件(jiàn));
assign s21_s20_start = state_c==S21&& (条(tiáo)件(jiàn));
4
根(gēn)據(jù)轉(zhuǎn)态設計(jì)輸出(chū):
1个(gè) always 設計(jì)1个(gè)輸出(chū)信(xìn)号(hào);
1.7.3 Testbench
框架
条(tiáo)目
內(nèi)容
模块(kuài)名
`timescale 1 ns/1 ns
module testbench_name();
信(xìn)号(hào)定(dìng)義
reg clk ; //时(shí)鐘(zhōng)
reg rst_n; //複位
reg[3:0] din0 ; //uut的(de)輸入(rù)信(xìn)号(hào) ,定(dìng)義为(wèi)reg型,在(zài)initial中(zhōng)
reg din1 ;
wire dout0;//uut的(de)輸出(chū)信(xìn)号(hào), 定(dìng)義为(wèi)wire型
wire[4:0] dout1;
parameter CYCLE = 20; //參數定(dìng)義,方(fāng)便修改;
parameter RST_TIME = 3 ;
待测模块(kuài)例化(huà)
module_name uut( //統一(yī)采用(yòng)名字(zì)關(guān)聯
.clk ( clk ),
.rst_n ( rst_n ),
.din0 ( din0 ),
.din1 ( din1 ),
.dout0 ( dout0 ),
.dout1 ( dout1 )
);
激勵産生(shēng)
//複位,时(shí)鐘(zhōng) ,等
顯示輸出(chū)結果(guǒ)
$display //類(lèi)似printf;
複位
複位
initial begin
rst_n = 1;
#2;
rst_n = 0;
#(CYCLE*RST_TIME);
rst_n = 1;
end
仿真(zhēn)时(shí)鐘(zhōng)
仿真(zhēn)时(shí)鐘(zhōng)
initial begin
clk = 0;
forever
#(CYCLE/2)
clk=~clk;
end
激勵信(xìn)号(hào)
激勵信(xìn)号(hào)
initial begin
#1;//方(fāng)便观测
din1 = 0; //賦初值
#(10*CYCLE);
//開(kāi)始賦值
end
以(yǐ)上(shàng)就(jiù)是(shì)本(běn)人(rén)總(zǒng)結的(de)Verilog語(yǔ)法相關(guān)知識點(diǎn),當然明(míng)德揚還(huán)有(yǒu)很多(duō)比較簡便的(de)模板給(gěi)我(wǒ)们(men)使用(yòng),感(gǎn)興趣的(de)朋友可(kě)以(yǐ)進(jìn)入(rù)明(míng)德揚論壇(http://www.fpgabbs.cn/)進(jìn)行更(gèng)多(duō)FPGA 或(huò)者(zhě)語(yǔ)法相關(guān)讨論!
|
条(tiáo)目 |
说(shuō)明(míng) |
|
$<标(biāo)識符> |
表(biǎo)示Verilg的(de)系(xì)統任务和(hé)函(hán)數 |
|
$time |
當前(qián)的(de)仿真(zhēn)时(shí)間(jiān) |
|
$display |
顯示信(xìn)号(hào)值變(biàn)化(huà):只(zhī)執行一(yī)次(cì),打(dǎ)印(yìn)當前(qián)时(shí)刻; $display($time, “b% %b %b”, rst,clk,dout); |
|
$monitor |
監視信(xìn)号(hào)值變(biàn)化(huà):所(suǒ)有(yǒu)过(guò)程时(shí)刻; $monitor($time, “b% %b %b”, rst,clk,dout); |
|
$stop |
暫停仿真(zhēn) |
|
$finish |
結束(shù)仿真(zhēn),釋放(fàng)電(diàn)腦資源; |
|
条(tiáo)目 |
说(shuō)明(míng) |
|
assign |
assign add_cnt = flag==1; //用(yòng)于(yú)簡單的(de)組合邏輯電(diàn)路(lù); |
|
always |
always @(*)begin//統一(yī)采用(yòng)“*”为(wèi)敏感(gǎn)列表(biǎo); (=,if,case)語(yǔ)句(jù);//只(zhī)能(néng)使用(yòng)“=”賦值 end |
|
3段(duàn)式模板 |
模板1 |
|
|
1 |
計(jì)數段(duàn) |
always @( posedge cllk or negedge rst_n) begin if (!rst_n) cnt <= 0; //初值規定(dìng)为(wèi)0 else if (add_cnt)begin//【位置1】 if(end_cnt) cnt <= 0; else cnt <= cnt + 1; end end |
|
2 |
加1条(tiáo)件(jiàn) |
assingadd_cnt = d==1; //d==1: 什麼(me)时(shí)候開(kāi)始數脈沖 |
|
3 |
結束(shù)条(tiáo)件(jiàn) |
assing end_cnt = add_cnt&& cnt == X-1; // X:數多(duō)少(shǎo)个(gè)脈沖 |
計(jì)數器模板2
|
3段(duàn)式模板 |
模板1 |
|
|
1 |
計(jì)數段(duàn) |
always @( posedge cllk or negedge rst_n) begin if (!rst_n) cnt <= 0; //初值規定(dìng)为(wèi)0 else if (add_cnt) begin//【位置1】 if(end_cnt) cnt <= 0; else cnt <= cnt + 1; end else cnt <= 0; //不(bù)連(lián)續,需要(yào)清(qīng)0时(shí),使用(yòng)模板2; end |
|
2 |
加1条(tiáo)件(jiàn) |
assingadd_cnt = d==1; //d==1: 什麼(me)时(shí)候開(kāi)始數脈沖 |
|
3 |
結束(shù)条(tiáo)件(jiàn) |
assing end_cnt = add_cnt&& cnt == X-1; // X:數多(duō)少(shǎo)个(gè)脈沖 |
模板4段(duàn)式狀态機(jī)
段(duàn)号(hào)
代(dài)碼
1
// 初始化(huà),次(cì)态賦值給(gěi)現(xiàn)态,明(míng)确當前(qián)狀态;
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
state_c <= S00;//初始狀态
else
state_c <= state_n;
end
2
always @( * ) begin //組合邏輯,描述狀态轉(zhuǎn)換目标(biāo)
case(state_c)
S00: begin
if(s00_s20_start) // 条(tiáo)件(jiàn)名 S00->S20
state_n = S20;
else
state_n = state_c; // 方(fāng)便拷貝
end
S20: begin
if(s20_s21_start)
state_n = S21;
else
state_n = state_c;
end
S21: begin
if(s21_s00_start)
state_n = S00;
else
state_n = state_c;
end
default: begin
state_n = S00;
end
endcase
end
3
//具體(tǐ)的(de)轉(zhuǎn)換条(tiáo)件(jiàn)內(nèi)容
assign s00_s20_start = state_c==S00&& (条(tiáo)件(jiàn));
assign s20_s21_start = state_c==S20&& (条(tiáo)件(jiàn));
assign s21_s20_start = state_c==S21&& (条(tiáo)件(jiàn));
4
根(gēn)據(jù)轉(zhuǎn)态設計(jì)輸出(chū):
1个(gè) always 設計(jì)1个(gè)輸出(chū)信(xìn)号(hào);
1.7.3 Testbench
框架
|
段(duàn)号(hào) |
代(dài)碼 |
|
1 |
// 初始化(huà),次(cì)态賦值給(gěi)現(xiàn)态,明(míng)确當前(qián)狀态; always @(posedge clk or negedge rst_n) begin if(!rst_n) state_c <= S00;//初始狀态 else state_c <= state_n; end |
|
2 |
always @( * ) begin //組合邏輯,描述狀态轉(zhuǎn)換目标(biāo) case(state_c) S00: begin if(s00_s20_start) // 条(tiáo)件(jiàn)名 S00->S20 state_n = S20; else state_n = state_c; // 方(fāng)便拷貝 end S20: begin if(s20_s21_start) state_n = S21; else state_n = state_c; end S21: begin if(s21_s00_start) state_n = S00; else state_n = state_c; end default: begin state_n = S00; end endcase end |
|
3 |
//具體(tǐ)的(de)轉(zhuǎn)換条(tiáo)件(jiàn)內(nèi)容 assign s00_s20_start = state_c==S00&& (条(tiáo)件(jiàn)); assign s20_s21_start = state_c==S20&& (条(tiáo)件(jiàn)); assign s21_s20_start = state_c==S21&& (条(tiáo)件(jiàn)); |
|
4 |
根(gēn)據(jù)轉(zhuǎn)态設計(jì)輸出(chū): 1个(gè) always 設計(jì)1个(gè)輸出(chū)信(xìn)号(hào); |
|
条(tiáo)目 |
內(nèi)容 |
|
模块(kuài)名 |
`timescale 1 ns/1 ns module testbench_name(); |
|
信(xìn)号(hào)定(dìng)義 |
reg clk ; //时(shí)鐘(zhōng) reg rst_n; //複位 reg[3:0] din0 ; //uut的(de)輸入(rù)信(xìn)号(hào) ,定(dìng)義为(wèi)reg型,在(zài)initial中(zhōng) reg din1 ; wire dout0;//uut的(de)輸出(chū)信(xìn)号(hào), 定(dìng)義为(wèi)wire型 wire[4:0] dout1; parameter CYCLE = 20; //參數定(dìng)義,方(fāng)便修改; parameter RST_TIME = 3 ; |
|
待测模块(kuài)例化(huà) |
module_name uut( //統一(yī)采用(yòng)名字(zì)關(guān)聯 .clk ( clk ), .rst_n ( rst_n ), .din0 ( din0 ), .din1 ( din1 ), .dout0 ( dout0 ), .dout1 ( dout1 ) ); |
|
激勵産生(shēng) |
//複位,时(shí)鐘(zhōng) ,等 |
|
顯示輸出(chū)結果(guǒ) |
$display //類(lèi)似printf; |
複位
複位
initial begin
rst_n = 1;
#2;
rst_n = 0;
#(CYCLE*RST_TIME);
rst_n = 1;
end
仿真(zhēn)时(shí)鐘(zhōng)
仿真(zhēn)时(shí)鐘(zhōng)
initial begin
clk = 0;
forever
#(CYCLE/2)
clk=~clk;
end
|
複位 |
|
initial begin rst_n = 1; #2; rst_n = 0; #(CYCLE*RST_TIME); rst_n = 1; end |
|
仿真(zhēn)时(shí)鐘(zhōng) |
|
initial begin clk = 0; forever #(CYCLE/2) clk=~clk; end |
激勵信(xìn)号(hào)
激勵信(xìn)号(hào)
initial begin
#1;//方(fāng)便观测
din1 = 0; //賦初值
#(10*CYCLE);
//開(kāi)始賦值
end
以(yǐ)上(shàng)就(jiù)是(shì)本(běn)人(rén)總(zǒng)結的(de)Verilog語(yǔ)法相關(guān)知識點(diǎn),當然明(míng)德揚還(huán)有(yǒu)很多(duō)比較簡便的(de)模板給(gěi)我(wǒ)们(men)使用(yòng),感(gǎn)興趣的(de)朋友可(kě)以(yǐ)進(jìn)入(rù)明(míng)德揚論壇(http://www.fpgabbs.cn/)進(jìn)行更(gèng)多(duō)FPGA 或(huò)者(zhě)語(yǔ)法相關(guān)讨論!
|
激勵信(xìn)号(hào) |
|
initial begin #1;//方(fāng)便观测 din1 = 0; //賦初值 #(10*CYCLE); //開(kāi)始賦值 end |

















