練習三利用條件語句實現計數分頻時序電路
實驗目的:
1. 掌握條件語句在簡單時序模組設計中的使用;
2. 學習在verilog模組中應用計數器;
3. 學習測試模組的編寫、綜合和不同層次的**。
實驗理論:
實驗用到verilog hdl提供的條件語句供分支判斷,以描述較複雜的時序關係。在可綜合風格的verilog hdl模型中,常用的條件語句有if-else和case-endcase兩種結構。兩者相比,if-else用於不是很複雜的分支關係,實際編寫可綜合風格的模組,特別是用狀態機構成的模組時,更常用的是case-endcase風格的**。
在多重 if 巢狀語句中,else 與前面最近的 if 相對應(即與前面最近的 if 組成一對 if-else 語句。為確保程式的可讀性和語句的對應性,請使用 begin…end 塊語句。
下面給出的範例也是乙個可綜合風格的分頻器,可將10mb的時鐘分頻為500kb的時鐘。基本原理與1/2分頻器是一樣的,但是需要定義乙個計數器,對於實現占空比為1:1分頻,首先進行上公升沿觸發進行模j計數,計數從零開始,到19進行輸出時鐘翻轉,然後經過19再次進行翻轉得到乙個占空比非1:
1分頻時鐘。再者同時進行下降沿觸發的模19計數,到和上公升沿過19時,輸出時鐘再次翻轉生成占空比非1:1分頻時鐘。
兩個占空比非1:1分頻時鐘相或運算,得到占空比為1:1分頻時鐘。
以準確獲得1/20分頻。
verilog模組結構完全嵌在module和endmodule宣告語句之間;每個verilog程式包括四個主要部分:埠定義、i/o說明、內部訊號宣告、功能定義。
模組源**:
fdivision.v
module fdivision(reset,f10mb,f500kb);
input f10mb,reset; output f500kb輸出為500kb的輸出端
reg f500kb定義一位暫存器
reg [7:0]j定義資料寬為8的計數暫存器j
always @(posedge f10mb)
if(! reset) //當reset無效時,對輸出端和計數器初始化
begin
f500kb<=0;
j<=0;
end else
begin
if(j==19) //當j=19時,將時鐘翻轉,並將計數器清零
begin
j<=0;
f500kb=~f500kb;
endelse
j<=j+1; //當j不等於19時使j加1
endendmodule
測試模組常見的形式:
module t;
reg被測模組輸入/輸出變數型別定義
wire被測模組輸入/輸出變數型別定義
initial beginend … …//產生測試訊號
always #delay begin …; end … …//產生測試訊號
testedmd m(.in1(ina), .in2(inb), .out1(outa), .out2(outb) );
//被測模組的例項引用
initial beginend //記錄輸出和響應
endmodule
測試模組源**:
`timescale 1ns/100ps
`define clk_cycle 50
module division_top;
reg f10mb,reset;
wire f500kb_clk;
always #`clk_cycle f10mb=~f10mb;
initial
begin
reset=1;
f10mb=0;
#100 reset=0;
#100 reset=1;
#10000 $stop;
endfdivision fdivision (.reset(reset),.f10mb(f10mb),.f500kb(f500_clk));
endmodule
**結果:
練習:利用10mb的時鐘,設計乙個單週期形狀的週期波形。
基本原理:需要定義乙個計數器,對於實現占空比為2:1:
2分頻,首先進行上公升沿觸發進行模j計數,計數從零開始,到19進行輸出時鐘翻轉,然後經過29再次進行翻轉得到乙個占空比非2:1分頻時鐘,然後經過49再次進行翻轉得到乙個占空比非1:2分頻時鐘。
模組源**:
fdivision.v
module fdivision(reset,f10mb,f500kb);
input f10mb,reset;
output f500kb;
reg f500kb;
reg [7:0]j;
always @(posedge f10mb)
if(! reset)
begin
f500kb<=0;
j<=0;
end else
begin
if(j==19)
begin
f500kb<=~f500kb;
endif(j==29)
begin
f500kb<=~f500kb;
endif(j==49begin
f500kb<=~f500kb;
j<=0;
endelse
j<=j+1;
endendmodule
**結果:
練習四阻塞賦值與非阻塞賦值的區別
實驗目的:
1. 通過實驗,掌握阻塞賦值與非阻塞賦值的概念和區別;
2. 了解阻塞賦值與非阻塞賦值的不同使用場合;
3. 學習測試模組的編寫、綜合和不同層次的**。
實驗理論:阻塞賦值與非阻塞賦值的之間在語法上的區別以及綜合後所得到的電路結構上的區別。在always塊中,阻塞賦值可以理解為賦值語句是順序執行的,而非阻塞賦值可以理解為賦值語句是併發執行的。
(注意:在實現組合邏輯的結構中,無一例外地必須採用阻塞賦值語句。)賦值的型別的選擇取決於建模的邏輯型別:
在時序塊的 rtl **中使用非阻塞賦值。非阻塞賦值在塊結束後才完成賦值操作,此賦值方式可以避免在**出現冒險和競爭現象。在組合的 rtl **中使用阻塞賦值。
使用阻塞方式對乙個變數進行賦值時,此變數的值在在賦值語句執行完後就立即改變。使用非阻塞賦值方式進行賦值時,各個賦值語句同步執行;因此,通常在乙個時鐘沿對臨時變數進行賦值,而在另乙個時鐘沿對其進行取樣。
模組源**:
blocking.v
module blocking(clk,a,b,c);
output [3:0] b,c;
input [3:0] a;
input clk;
reg [3:0] b,c;
always @(posedge clk)
begin
b=a;
c=b;
$display("blocking:a=%d,b=%d,c=%d.",a,b,c);
endendmodule
module non_blocking(clk,a,b,c);
output [3:0] b,c;
input [3:0] a;
input clk;
reg [3:0] b,c;
always @(posedge clk)
begin
b<=a;
c<=b;
$display("non_blocking:a=%d,b=%d,c=%d.",a,b,c);
endendmodule
測試模組源**:
`timescale 1ns/100ps
`include"./blocking.v"
`include"./non_blocking.v"
module comparetop;
wire [3:0] b1,c1,b2,c2;
reg [3:0] a;
reg clk;
initial
begin
clk=0;
forever #50 clk=~clk;
endinitial
begin
a=4'h3;
$display
實驗報告電路實驗報告要求
三一文庫 報告范文 實驗報告 電路實驗報告要求 同學您好 電路實驗課已經結束,請按題目要求認真完成實驗報告,並要仔細檢查一遍,以免退回,具體要求如下 一 繪製電路圖要工整 選取合適比例,元件引數標註要準確 完整。二 計算題要有計算步驟 解題過程,要代具體資料進行計算,不能只寫得數。三 實驗中測試得到...
實驗報告 高中化學實驗報告
1 1 稱取4gnaoh,5.85gnacl 2 用量筒量取適量蒸餾水 3 置於燒杯中攪拌溶解冷卻 4 用玻璃棒將液體引流到1l的容量瓶中 5 再用蒸餾水洗燒杯,再引流到容量瓶中 6 用膠頭滴管定容 7 蓋上容量瓶蓋子,上下搖晃,混合均勻即可2 1 驗漏 2 用標準液和待測液潤洗滴定管 3 取高錳酸...
數學實驗實驗報告
天水師範學院數學與統計學院 實驗報告 實驗專案名稱 所屬課程名稱 實驗型別線性代數實驗 實驗日期 班級學號 姓名成績 附錄1 源程式 附錄2 實驗報告填寫說明 1 實驗專案名稱 要求與實驗教學大綱一致。2 實驗目的 目的要明確,要抓住重點,符合實驗教學大綱要求。3 實驗原理 簡要說明本實驗專案所涉及...