verilog學習總結及練習

2021-09-19 17:02:58 字數 4390 閱讀 2055

1、乙個程式模組有多個initial和always過程塊,每個initial和always說明語句在**一開始同時立即開始執行。initial語句只執行一次,always語句則是不斷迴圈往復的執行,所以initial過程快比較適合做變數的初始化。乙個模組中可以有多個initial模組,它們都是並行執行的,initial塊常用於測試檔案和虛擬模組的編寫。

2、mealy狀態機與moore狀態機的區別?

前者的輸出不但取決於狀態還取決於輸出。moore狀態機只與 當前狀態有關。

3、復位訊號的邊沿跳變與時鐘訊號的要錯開。

4、verilog中的begin和end類似c語言中的{},即每個分支條件下的語句只要超過一句就要加上begin end,每個模組的起始和結尾也要加上。

5、建議使用獨熱編碼

學習了好幾天了,做一些小練習(最近快放五一假了,心態有點飄哈哈)

題目一:

1、設計乙個週期性產生二進位制序列01001011001的序列產生器。

//確定外特性以及輸入與輸出

module gen(

input clk,input rstn,output reg dout

);reg [4:0] c_s,n_s;

//第乙個always塊表示觸發器內邏輯

always@(posedge clk or negedge rstn)

begin

if(!rstn)

c_s<=0;

else

c_s<=n_s;//將當前狀態值儲存在d觸發器給到下一狀態值

end//第二個always表示狀態轉化邏輯

always@(c_s)

begin

case(c_s)

0: n_s = 1;

1: n_s = 2;

...//簡略

10:n_s=0;

default:n_s=0;

endcase

end//第三個always塊表示輸出邏輯

always@(*)//敏感表怕漏寫輸入訊號可以用*表示

always@(c_s)

begin

case(c_s)

0: dout =0;

1: dout = 1;

...//簡略

10:dout=1;

default:dout=0;

endcase

endendmodule

總結:這是乙個簡單的時序邏輯電路,即由兩個組合邏輯電路和乙個d觸發器組成的。這是乙個moore狀態機

題目二

2、設計乙個密碼鎖,依次輸入9、3、1即密碼正確,傳送乙個正脈衝

//首先還是確定外特性,輸入輸出等等  在草稿紙上畫出狀態轉移圖

module lock(input clk,input rst,output reg result)

reg [3:0] key ;//定義乙個四位的key

reg [4:0] c_s,n_s;

//第乙個always塊 還是寫狀態暫存器內部

always@(posedge clk or negedge rst)//如果想偷懶就都寫成*號

begin

if(!rst)

c_s<=2`b0;

else

c_s = n_s;

end//第二個always塊寫狀態轉移邏輯

always@(c_s or key)

begin

case(c_s)

2`b00: if(key ==4`d9)

n_s = 2`b01;

else n_s = 2`b00;

2`b01: if(key==4`d3)

n_s=2`b10;

else

n_s=2`b00;

2`b10:

n_s=2`b00;

default:n_s=2`b00;

endcase

end//第三個always塊寫輸出邏輯

always@()

begin

case (c_s)

2`b10:

begin

if(key==4`d1)

result =1`b1;

else

result =1`b0;

enddefault :result =1`b0;

endcase

endendmodule

總結:這是乙個melay狀態機,因為它的輸出不止與狀態有關,而且還與輸入有關

題目三(複雜時序邏輯設計)

3、設計乙個針對兩個運動員的時鐘秒錶,輸入只有時鐘和按鍵,每按下一次key,會產生乙個高電平的脈衝。假設key已做過防抖動和脈衝寬度處理。

key的主要功能是,按第一下開始計時,並顯示計數值。第乙個運動員到達終點時按下第二下key,這個時候秒錶需要記下第乙個運動員的時間,並繼續輸出計數值,第二個運動員到達終點後按下第三下key停止計數,輸出計數值為第二個運動員的成績,再按就是第乙個運動員的成績,再按乙個清0.

//第一步確定外特性

module watch(input clk,input rst,output reg count,input key)

reg counter1,counter2;

reg start1,start2,sel;

reg [3:0] current_state,next_state;

always @(posedge clk or negedge rst) begin

if(!rst) count1<=4'd0;

else begin

if (start1)

count1<=count1+1;

else if (clear)

count1<=4'd0;

endend

//一般復位訊號與時鐘訊號要錯開觸發 即一高一低

always @(posedge clk or negedge rst) begin

if(!rst) count2<=4'd0;

else begin

if (start2)

count2<=count2+1;

else if (clear)

count2<=4'd0;

endend

ays @(posedge clk or negedge rst)

begin

if(!rst)

current_state<=3'b0;

else

current_state<=next_state;

end//

always @(*) begin

case(current_state)

3'b000: begin

if(key==1'b1) begin //第一次按下按鍵,開始計時

next_state<=3'b001; =4'b1100; end

else begin

next_state<=3'b000; =4'b0000; end

end3'b001: begin

if(key==1'b1) begin //第二次按下,計數器一停止,計數器二開始

next_state<=3'b010; =4'b0100; end

else begin

next_state<=3'b001; =4'b1100; end

end

3'b010:begin

if(key==1`b1)begin//第三次按下按鍵,停止計數,輸出計數器二的值

next_state<=3'b011; =4'b0000; end

else begin

next_state<=3'b010; =4'b0100; end

3'b011:begin

if(key==1`b1)begin//第四次按下按鍵,輸出計數器1的值

next_state<=3'b100;=4'b0001;end

else begin

next_state<=3'b011; =4'b0000; end

3'b100:begin

if(key==1`b1)begin//第五次按下按鍵,計數器清空

next_state<=3'b000;=4'b0010;end

else begin

next_state<=3'b100; =4'b0001; end

end //輸出邏輯

always @(*)

begin

if (sel)

count<=count1;

else

count<=count2;

end//

2020 10 12 Verilog學習總結

1.結構說明語句 1 initial 只執行一次 2 always語句 多次執行 1.常用always生成時鐘激勵訊號 always clk period 2 clk clk 每過半個週期時鐘翻轉一次2.always邊沿觸發 always posedge clk or negedge rst 在cl...

Verilog語法總結

1.阻塞賦值 與非阻塞賦值 的區別 一條非阻塞過程賦值語句對應的賦值操作執行完之前,下一語句也可以開始執行。各條阻塞型過程賦值語句將以他們在順序塊中的排列次序得到執行。2.關係運算子 關係運算子的優先順序比算數運算子的優先順序低.3.縮減運算 縮減運算的過程 第一步將運算元的第一位與第二位進行與或非...

SOC設計及Verilog學習筆記三

soc設計課 3.20 assign 2 out in 過於理想,放於test benchs 電路設計 考慮可綜合性 綜合工具 1 hdl 功能網表 2 約束條件 效能要求 根據約束自動選擇合適的電路結構進行網表優化 3 8解碼器例項 兩種實現方式 不在case條件中的狀態賦值 defult cas...