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...