1. 程式人生 > >【verilog】數碼管動態掃描實現方法

【verilog】數碼管動態掃描實現方法

一. 實驗目的

熟練掌握時序邏輯電路的設計方法

掌握暫存器檔案的實現原理掌握

數碼管動態掃描實現方法

二. 實驗內容

用模組化設計,實現 16*16bit 的暫存器檔案

– 具備 2 組讀埠及 1 組寫埠

– 通過讀埠可從 0~15 號的任意地址讀取資料

– 通過寫埠可向 0~15 號的任意地址寫入資料

– 讀寫埠為“全雙工”的工作方式

– 0~15 號暫存器的復位初值依次為:“0x0000,0x1100,0x2200,...,0xFF00”

– 通過 1 組讀埠及寫埠,所有暫存器的值每 0.5s 秒鐘加 1

– 通過撥動開關做為另 1 組讀埠地址輸入,將讀出結果以16 進位制顯示在七段數碼管上

三.實驗結果

1)編寫 verilog程式碼

Top 模組

 

module regfile(  
input clk, 
input reset_n, 
input [3:0]addr_a, 
input [3:0]addr_b, 
input [3:0]addr_c, 
input [15:0]data_c, 
input wen_c, 
output reg[15:0]q_a, 
output reg[15:0]q_b 
    );  	
reg[15:0] a0;reg[15:0] a1;reg[15:0] a2;
reg[15:0] a3;  	
reg[15:0] a4;
reg[15:0] a5;
reg[15:0] a6;
reg[15:0] a7;  	
reg[15:0] a8;
reg[15:0] a9;
reg[15:0] a10;
reg[15:0] a11;  	
reg[15:0] a12;
reg[15:0] a13;
reg[15:0] a14;
reg[15:0] a15;  	
    always @(posedge clk or negedge reset_n) 
 	 	if(~reset_n) 	 	 	 	 	 	//復位  	 	 	
                    begin  	 	 	 	
                       a0<=16'h0000;  	 	 	 	                  
                        a1<=16'h1100;  	 	 	 	
                        a2<=16'h2200;
  	 	 	 	a3<=16'h3300;
  	 	 	 	a4<=16'h4400;
  	 	 	 	a5<=16'h5500; 
 	 	 	 	a6<=16'h6600; 
 	 	 	 	a7<=16'h7700; 
 	 	 	 	a8<=16'h8800;  
	 	 	 	a9<=16'h9900; 
 	 	 	 	a10<=16'haa00; 
 	 	 	 	a11<=16'hbb00;
  	 	 	 	a12<=16'hcc00; 
 	 	 	 	a13<=16'hdd00;
  	 	 	 	a14<=16'hee00;
  	 	 	 	a15<=16'hff00; 
 	 	 	end 
 	 	else  	 	 	
begin
  	 	 	 if(wen_c)
  	 	 	 	begin 
 	 	 	 	 	case(addr_c)
  	 	 	 	 	 	4'b0000: a0<=data_c; 
 	 	 	 	 	 	4'b0001: a1<=data_c; 
 	 	 	 	 	  	4'b0010: a2<=data_c; 
 	 	 	 	 	  	4'b0011: a3<=data_c; 
 	 	 	 	 	  	4'b0100: a4<=data_c; 
 	 	 	 	 	  	4'b0101: a5<=data_c; 
	 	 	 	 	        4'b0110: a6<=data_c; 
 	 	 	 	                4'b0111: a7<=data_c;
                                      	 	4'b1000: a8<=data_c; 
	 	 	 	                4'b1001: a9<=data_c; 
	 	 	                       4'b1010: a10<=data_c; 
	 	                                4'b1011: a11<=data_c; 
 	 	 	                        4'b1100: a12<=data_c;
          	 	 	 	 	4'b1101: a13<=data_c; 
                                                4'b1110: a14<=data_c;
                                                4'b1111: a15<=data_c;
                                                default: a0<=0;     
                                        endcase 
 	 	 	 	 	 	q_b[15:0]<=data_c; 
 	 	 	 	end  	 	 	 	
                                    else  	 	 	 	 	
                                             begin 
 	 	 	 	 	 	case(addr_b) 
 	 	 	 	 	 	 	4'b0000: q_b[15:0]<=a0; 
 	 	 	 	 	 	 	4'b0001: q_b[15:0]<=a1; 
 	 	 	 	 	 	 	4'b0010: q_b[15:0]<=a2; 
 	 	 	 	 	 	 	4'b0011: q_b[15:0]<=a3; 
 	 	 	 	 	 	 	4'b0100: q_b[15:0]<=a4; 
 	 	 	 	 	 	 	4'b0101: q_b[15:0]<=a5; 
 	 	 	 	 	 	 	4'b0110: q_b[15:0]<=a6; 
 	 	 	 	 	 	 	4'b0111: q_b[15:0]<=a7; 
 	 	 	 	 	 	 	4'b1000: q_b[15:0]<=a8; 
 	 	 	 	 	 	 	4'b1001: q_b[15:0]<=a9; 
 	 	 	 	 	 	 	4'b1010: q_b[15:0]<=a10; 
 	 	 	 	 	 	 	4'b1011: q_b[15:0]<=a11; 
 	 	 	 	 	 	 	4'b1100: q_b[15:0]<=a12; 
 	 	 	 	 	 	 	4'b1101: q_b[15:0]<=a13; 
 	 	 	 	 	 	 	4'b1110: q_b[15:0]<=a14; 
 	 	 	 	 	 	 	4'b1111: q_b[15:0]<=a15;
  	 	 	 	 	 	 	default: q_b[15:0]<=16'h0000; 
 	 	 	 	 	 	endcase
  	 	 	 	 	end
  	 	 	end 
 	 	
[email protected]
(posedge clk or negedge reset_n) if(~reset_n) q_a[15:0]<=16'h0000; else case(addr_a) 4'b0000: q_a[15:0]<=a0; 4'b0001: q_a[15:0]<=a1; 4'b0010: q_a[15:0]<=a2; 4'b0011: q_a[15:0]<=a3; 4'b0100: q_a[15:0]<=a4; 4'b0101: q_a[15:0]<=a5; 4'b0110: q_a[15:0]<=a6; 4'b0111: q_a[15:0]<=a7; 4'b1000: q_a[15:0]<=a8; 4'b1001: q_a[15:0]<=a9; 4'b1010: q_a[15:0]<=a10; 4'b1011: q_a[15:0]<=a11; 4'b1100: q_a[15:0]<=a12; 4'b1101: q_a[15:0]<=a13; 4'b1110: q_a[15:0]<=a14; 4'b1111: q_a[15:0]<=a15; default: q_a[15:0]<=16'h0000; endcase endmodule



module inc(  	input clk,  	input reset_n,  	input [15:0]q_b,  	output reg[3:0] addr_b,  	output reg[3:0] addr_c,  	output reg[15:0] data_c,  	output reg wen_c 
    );  	reg [29:0]cnt;  	reg clk0;  	[email protected](posedge clk or negedge reset_n)  	 	if(~reset_n)  	 	 	cnt<=0;  	 	else  	 	 	begin  	 	 	 	cnt<=cnt+1;  	 	 	 	if(cnt==100000-1) 
 	 	 	 	 	clk0<=1; 
 	 	 	 	else if(cnt==1000000-1)  	 	 	 	 	begin  	 	 	 	 	 	clk0<=0;  	 	 	 	 	 	cnt<=0;  	 	 	 	 	end  	 	 	end 
 	[email protected](posedge clk0 or negedge reset_n) 
if(~reset_n) begin 
wen_c<=0; addr_b<=0; addr_c<=0; data_c<=0; 
end else 
 	begin  	 	if(wen_c) 
 	 	 	begin  	 	 	 	wen_c<=~wen_c;  	 	 	 	 	 	addr_b<=addr_b;  	 	 	 	 	 	if(addr_c>=4'b1111)  	 	 	 	 	 	 	addr_c<=4'b0000; 
 	 	 	 	 	 	else 
 	 	 	 	 	 	 	addr_c<=addr_c+1;  	 	 	 	 	 	 	data_c<=data_c; 
 	 	 	 	 	end  	 	 	 	else  	 	 	 	 	begin 
 	 	 	 	 	 	wen_c<=~wen_c;  	 	 	 	 	 	if(addr_b>=4'b1111)  	 	 	 	 	 	 	addr_b<=4'b0000; 
 	 	 	 	 	 	else 
 	 	 	 	 	 	 	addr_b<=addr_b+1;  	 	 	 	 	 	 	data_c<=q_b+1'b1; 
 	 	 	 	 	end  	 	 	end 
endmodule 
module seg(  	input clk,  	input reset_n,  	input [15:0]q_a,  	output reg[7:0]data,  	output reg[3:0]sel 
    );  	reg [29:0]cnt;  	reg [1:0]scn_cnt;  	reg clk0;  	[email protected](posedge clk or negedge reset_n) 
if(~reset_n) 
 	cnt<=0; else begin 
cnt<=cnt+1; 
if(cnt==10000-1)  	clk0<=1; 
else if(cnt==100000-1) 
 	begin  	 	clk0<=0;  	 	cnt<=0;  	end 
 	 	 	end 
 	[email protected](posedge clk0 or negedge reset_n)  	 	if(~reset_n)  	 	 	scn_cnt<=2'b00;  	 	else  	 	 	begin 
 	 	 	 	if(scn_cnt==2'b11)  	 	 	 	 	scn_cnt<=2'b00;  	 	 	 	else 
 	 	 	 	 	scn_cnt<=scn_cnt+1'b1; 
 	 	 	end 
 	[email protected](posedge clk0 or negedge reset_n)  	 	if(~reset_n)  	 	 	sel<=4'b1111;  	 	else 
 	 	 	case(scn_cnt)  	 	 	 	2'b00: 	sel<=4'b1110; 
 	 	 	 	2'b01: 	sel<=4'b1101; 
    2'b10: sel<=4'b1011;     2'b11: sel<=4'b0111;     default: sel<=4'b1111;    endcase 
 	always @(posedge clk0 or negedge reset_n)  	if(~reset_n)  	 	data=8'b11111111;  	else 
 	 	begin 
 	 	 	if(sel==4'b0111)  	 	 	 	begin 
 	 	 	 	 	case(q_a[15:12])  	 	 	 	 	 	4'h0: data=8'b00000011; 
 	 	 	 	 	 	4'h1: data=8'b10011111; 
	 	 	 	 	4'h2: data=8'b00100101; 
	 	 	 	 	4'h3: data=8'b00001101; 
	 	 	 	 	4'h4: data=8'b10011001; 
 	 	 	4'h5: data=8'b01001001;  	 	4'h6: data=8'b01000001;  	 	4'h7: data=8'b00011111; 
	 	 	4'h8: data=8'b00000001; 
 	 	4'h9: data=8'b00001001;  	 	4'ha: data=8'b00010001; 
	 	 	4'hb: data=8'b11000001; 
	 	 	4'hc: data=8'b01100011; 
	 	 	4'hd: data=8'b10000101; 
 	 	 	 	 	 	4'he: data=8'b01100001;  	 	 	 	 	 	4'hf: data=8'b01110001;  	 	 	 	 	 	default: data=8'b11111111; 
 	 	 	 	 	endcase  	 	 	 	end 
 	 	 	else if(sel==4'b1011) 
 	 	 	 	begin 
 	 	 	 	 	case(q_a[11:8])  	 	 	 	 	 	4'h0: data=8'b00000011; 
 	 	 	 	 	 	4'h1: data=8'b10011111; 
 	 	 	 	 	 	4'h2: data=8'b00100101; 
 	 	 	 	 	 	4'h3: data=8'b00001101; 
 	 	 	 	 	 	4'h4: data=8'b10011001; 
 	 	 	 	 	 	4'h5: data=8'b01001001; 
 	 	 	 	 	 	4'h6: data=8'b01000001; 
 	 	 	 	 	 	4'h7: data=8'b00011111; 
 	 	 	 	 	 	4'h8: data=8'b00000001; 
 	 	 	 	 	 	4'h9: data=8'b00001001;  	 	 	 	 	 	4'ha: data=8'b00010001;  	 	 	 	 	 	4'hb: data=8'b11000001; 
 	 	 	 	 	 	4'hc: data=8'b01100011; 
 	 	 	 	 	 	4'hd: data=8'b10000101;  	 	 	 	 	 	4'he: data=8'b01100001;  	 	 	 	 	 	4'hf: data=8'b01110001;  	 	 	 	 	 	default: data=8'b11111111; 
 	 	 	 	 	endcase  	 	 	 	end 
 	 	 	else if(sel==4'b1101)  	 	 	 	begin 
 	 	 	 	 	case(q_a[7:4])  	 	 	 	 	 	4'h0: data=8'b00000011; 
 	 	 	 	 	 	4'h1: data=8'b10011111; 
	 	 	 	 	4'h2: data=8'b00100101; 
	 	 	 	 	4'h3: data=8'b00001101; 
	 	 	 	 	4'h4: data=8'b10011001; 
 	 	 	4'h5: data=8'b01001001;  	 	4'h6: data=8'b01000001;  	 	4'h7: data=8'b00011111; 
	 	 	4'h8: data=8'b00000001; 
 	 	4'h9: data=8'b00001001;  	 	4'ha: data=8'b00010001; 
	 	 	4'hb: data=8'b11000001; 
	 	 	4'hc: data=8'b01100011; 
	 	 	4'hd: data=8'b10000101; 
 	 	 	 	 	 	4'he: data=8'b01100001;  	 	 	 	 	 	4'hf: data=8'b01110001;  	 	 	 	 	 	default: data=8'b11111111; 
 	 	 	 	 	endcase  	 	 	 	end 
 	 	 	else   	 	 	 	begin 
 	 	 	 	 	case(q_a[3:0])  	 	 	 	 	 	4'h0: data=8'b00000011; 
 	 	 	 	 	 	4'h1: data=8'b10011111; 
 	 	 	 	 	 	4'h2: data=8'b00100101; 
 	 	 	 	 	 	4'h3: data=8'b00001101; 
 	 	 	 	 	 	4'h4: data=8'b10011001; 
 	 	 	 	 	 	4'h5: data=8'b01001001; 
 	 	 	 	 	 	4'h6: data=8'b01000001; 
 	 	 	 	 	 	4'h7: data=8'b00011111; 
 	 	 	 	 	 	4'h8: data=8'b00000001; 
 	 	 	 	 	 	4'h9: data=8'b00001001;  	 	 	 	 	 	4'ha: data=8'b00010001;  	 	 	 	 	 	4'hb: data=8'b11000001; 
 	 	 	 	 	 	4'hc: data=8'b01100011; 
 	 	 	 	 	 	4'hd: data=8'b10000101;  	 	 	 	 	 	4'he: data=8'b01100001;  	 	 	 	 	 	4'hf: data=8'b01110001;  	 	 	 	 	 	default: data=8'b11111111; 
 	 	 	 	 	endcase  	 	 	 	end  	 	end endmodule 

2) Ucf 檔案設定

 

四.實驗分析

1.本實驗主要分為三個部分,暫存器檔案,數碼管的控制,以及加一運算實現這三個模組

2..暫存器檔案本質為一狀態機

3.對於時間上地要求,0.5s 採用統計地方式實現,達到一定地週期數後產生脈衝 

在同一時刻對同一地址進行讀寫,會有何結果?會將時鐘上升沿之前的內容讀出,然後將新內容寫進覆蓋原先內容,因為在reg 模組中可見採用的是非阻塞賦值的方式,讀寫同時進行不存在先後


相關推薦

verilog數碼動態掃描實現方法

一. 實驗目的熟練掌握時序邏輯電路的設計方法掌握暫存器檔案的實現原理掌握數碼管動態掃描實現方法二. 實驗內容用模組化設計,實現 16*16bit 的暫存器檔案 – 具備 2 組讀埠及 1 組寫埠 – 通過讀埠可從 0~15 號的任意地址讀取資料 – 通過寫埠可向 0~15 號

nexys4ddr數碼動態掃描Verilog例程

IT CA set edi OS ssi dict ref 十六進制 題目:實現數碼管動態掃描功能,將十六個開關的值以十六進制的方式在4個數碼管上同時顯示出來。 `timescale 1ns / 1ps module top( clk, sw, seg

FPGA——數碼動態掃描verilog

數碼管動態掃描原理——FPGA程式碼 1、動態掃描是利用人眼視覺滯留的特點,點亮某一位後,在人眼反應之前,進行下一位的顯示,故而出現重影現象。而人的視覺暫留時間大約在1/24秒左右,所以應該保持24幀以上才會保持連續而不會出現閃爍,通俗來講,應該在一秒內至少掃

proteus模擬之8位數碼動態掃描顯示試驗

/*Proteus 模擬之8位共陰數碼管動態掃描實驗*/ 程式: /*Proteus 模擬之8位共陰數碼管動態掃描實驗*/ #include<reg52.h> #define SegPort P0   //定義數碼管連線埠 sbit LE_Duan = P

KST-51微控制器:c語言程式設計實現數碼動態顯示秒錶的倒計時

/*60S倒計時*/ /*個位每1S變一次,從0~9*/ /*十位,個位為0的下一秒十位發生變化*/ #include<reg52.h> sbit ADDR0=P1^0; sbit ADDR1=P1^1; sbit ADDR2=P1^2; sbit ADDR3

作業系統C語言模擬作業系統實現動態分割槽分配演算法

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #defi

Python決策樹的python實現

uia bmp say 不知道 times otto outlook lru bgm 【Python】決策樹的python實現 2016-12-08 數據分析師Nieson 1. 決策樹是什麽? 簡單地理解,就是根據一些 feature 進行分類,每個節點提一個問

LeetCode9. Palindrome Number --java的實現

height determine 一模一樣 ava bool class -1 space pos Palindrome Number Determine whether an integer is a palindrome. Do this without

BZOJ2095[Poi2010]Bridges 動態加邊網絡流

mage ems output string get 之間 一行 ++ cpp 【BZOJ2095】[Poi2010]Bridges Description YYD為了減肥,他來到了瘦海,這是一個巨大的海,海中有n個小島,小島之間有m座橋連接,兩個小島之間不會有兩座

CSS3選擇器-純css實現輪播

ica 焦點 集合 meta 表示 style disable 設置 :active CSS選擇器: 基本選擇器: 通配符選擇器:*; 元素選擇器:元素標簽; class選擇器:相當於身份證上的名稱; id選擇器:相當於身份證號(唯一性); 多元素組合選擇器

CSS非常簡單的css實現div懸浮頁面底部

簡單的 fixed style 簡單 底部 demo 實現 clas post <div id="demo_div"></div> <style> #demo_div{    left: 0; positi

原創學習CGLIB動態代理中遇到的問題

tcl efi 類對象 devel ini debugging app 原創 sco 代碼清單1 CGLIB動態代理 1 package wulj.proxy.cglibProxy; 2 3 import java.lang.reflect.Method;

BZOJ3730震波(動態點分治)

www pre size getch post str http clu cto 【BZOJ3730】震波(動態點分治) 題面 BZOJ 題意 給定一棵樹, 每次詢問到一個點的距離\(<=K\)的點的權值之和 動態修改權值, 強制在線 題解 正常的\(DP\)???

BZOJ1899午餐(動態規劃)

需要 記錄 表示 列隊 其中 truct ble read namespace 【BZOJ1899】午餐(動態規劃) 題面 BZOJ 題解 我太弱了 這種\(dp\)完全做不動。。 首先,感性理解一些 如果所有人都要早點走, 那麽,吃飯時間長的就先吃 吃飯時間短的就晚點吃

代碼和非托代碼的區別

產生 沒有 匯編代碼 cati 一行 包含 虛擬機 被調用 庫類 什麽是托管代碼(managed code)? 托管代碼是一microsoft的中間語言(IL),他主要的作用是在.NET FRAMEWORK的公共語言運行庫(CLR)執行代碼前去編譯

AppDomain 詳解二-C#中動態加載和卸載DLL

all created 新版本 odin generic reflect 可能 params 詳細 在C++中加載和卸載DLL是一件很容易的事,LoadLibrary和FreeLibrary讓你能夠輕易的在程序中加載DLL,然後在任何地方 卸載。在C#中我們也能使用Asse

轉載關於generate用法的總結Verilog

case分支 intro 技術分享 結構 類型 img ora 做了 alt http://www.cnblogs.com/nanoty/archive/2012/11/13/2768933.html Abtract generate語句允許細化時間(Elabora

Servlet使用org.eclipse.jetty實現小型的Servlet服務器

服務器 onu ets get span iter() servlet final status import java.io.IOException; import javax.servlet.ServletException; import javax.se

排序選擇排序,C++實現

temp esp col rgb 結果 pac strong emp 元素 # 基本思想 每一趟從待排序的數據元素中選擇最小(或最大)的一個元素作為首元素,直到所有元素排完為止。排序實例初始關鍵字 [49 38 65 97 76 13 27 49]第一趟排序後 13

實驗題二:實現圖的遍歷算法

malloc for clu %d type font AS arc -- 遞歸深度優先遍歷算法 1 #include<stdio.h> 2 #include<malloc.h> 3 #define MAXV 100 4 #def