基於VHDL的層次化設計:非同步清零和同步使能4位十六進位制加法計數器和七段顯示譯碼器的元件例化實現
-----------------------------------------------------------------------------------------------方案一----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------(本實現方案只編寫了一個vhdl檔案,計數器和譯碼器的vhdl描述寫在了一個檔案裡。本檔案包含三個實體:分別是計數器counter4,譯碼器decoder,以及一個頂層實體HIERARCHIC,頂層檔案裡實現了計數器和譯碼器的結合。)
方案一源程式如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY HIERARCHIC IS
PORT(CP,R,EN:IN STD_LOGIC;
CO:OUT STD_LOGIC;
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END HIERARCHIC;
ARCHITECTURE HI OF HIERARCHIC IS
SIGNAL SIGN1:STD_LOGIC_VECTOR(3 DOWNTO 0);
COMPONENT COUNTER4
PORT(CP,R,EN:IN STD_LOGIC;
CO:OUT STD_LOGIC;
Q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO0));
END COMPONENT;
COMPONENT DECODER
PORT(Ain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END COMPONENT;
BEGIN
U1:COUNTER4 PORT MAP(CP,R,EN,CO,SIGN1);
U2:DECODER PORT MAP(SIGN1,LED);
END HI;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER4 IS
PORT(CP,R,EN:IN STD_LOGIC;
Q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
CO:OUT STD_LOGIC);
END COUNTER4;
ARCHITECTURE COUNT OF COUNTER4 IS
BEGIN
PROCESS(CP,R)
BEGIN
IF(R='1')THEN Q<="0000";
ELSIF(CP'EVENT AND CP='1'AND EN='1')THEN
IF(Q="1111")THEN Q<="0000";
ELSE Q<=Q+1;
END IF;
END IF;
END PROCESS;
CO<='1'WHEN Q=15 AND EN='1'ELSE'0';
END COUNT;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECODER IS
PORT(Ain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DECODER;
ARCHITECTURE DECODE OF DECODER IS
SIGNAL SIGN2:STD_LOGIC_VECTOR(6 DOWNTO 0);
BEGIN
WITH Ain SELECT
SIGN2<="0111111"WHEN"0000",
"0000110"WHEN"0001",
"1011011"WHEN"0010",
"1001111"WHEN"0011",
"1100110"WHEN"0100",
"1101101"WHEN"0101",
"1111101"WHEN"0110",
"0000111"WHEN"0111",
"1111111"WHEN"1000",
"1101111"WHEN"1001",
"1110111"WHEN"1010",
"1111100"WHEN"1011",
"0111001"WHEN"1100",
"1011110"WHEN"1101",
"1111001"WHEN"1110",
"1110001"WHEN"1111",
NULL WHEN OTHERS;
LED(6)<=SIGN2(6);
LED(5)<=SIGN2(5);
LED(4)<=SIGN2(4);
LED(3)<=SIGN2(3);
LED(2)<=SIGN2(2);
LED(1)<=SIGN2(1);
LED(0)<=SIGN2(0);
END DECODE;
-----------------------------------------------------------------------------------------------方案二
方案二源程式如下:
--程式1(頂層實體)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY HIERARCHIC IS
PORT(CP,R,EN:IN STD_LOGIC;
CO:OUT STD_LOGIC;
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END HIERARCHIC;
ARCHITECTURE HI OF HIERARCHIC IS
SIGNAL SIGN1:STD_LOGIC_VECTOR(3 DOWNTO 0);
COMPONENT COUNTER4
PORT(CP,R,EN:IN STD_LOGIC;
CO:OUT STD_LOGIC;
Q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO0));
END COMPONENT;
COMPONENT DECODER
PORT(Ain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END COMPONENT;
BEGIN
U1:COUNTER4 PORT MAP(CP,R,EN,CO,SIGN1);
U2:DECODER PORT MAP(SIGN1,LED);
END HI;
--程式2(4位十六進位制計數器counter4)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER4 IS
PORT(CP,R,EN:IN STD_LOGIC;
Q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
CO:OUT STD_LOGIC);
END COUNTER4;
ARCHITECTURE COUNT OF COUNTER4 IS
BEGIN
PROCESS(CP,R)
BEGIN
IF(R='1')THEN Q<="0000";
ELSIF(CP'EVENT AND CP='1'AND EN='1')THEN
IF(Q="1111")THEN Q<="0000";
ELSE Q<=Q+1;
END IF;
END IF;
END PROCESS;
CO<='1'WHEN Q=15 AND EN='1'ELSE'0';
END COUNT;
--程式3(七段顯示譯碼器decoder)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECODER IS
PORT(Ain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DECODER;
ARCHITECTURE DECODE OF DECODER IS
SIGNAL SIGN2:STD_LOGIC_VECTOR(6 DOWNTO 0);
BEGIN
WITH Ain SELECT
SIGN2<="0111111"WHEN"0000",
"0000110"WHEN"0001",
"1011011"WHEN"0010",
"1001111"WHEN"0011",
"1100110"WHEN"0100",
"1101101"WHEN"0101",
"1111101"WHEN"0110",
"0000111"WHEN"0111",
"1111111"WHEN"1000",
"1101111"WHEN"1001",
"1110111"WHEN"1010",
"1111100"WHEN"1011",
"0111001"WHEN"1100",
"1011110"WHEN"1101",
"1111001"WHEN"1110",
"1110001"WHEN"1111",
NULL WHEN OTHERS;
LED(6)<=SIGN2(6);
LED(5)<=SIGN2(5);
LED(4)<=SIGN2(4);
LED(3)<=SIGN2(3);
LED(2)<=SIGN2(2);
LED(1)<=SIGN2(1);
LED(0)<=SIGN2(0);
END DECODE;
--後話:譯碼器的實現方案是多種多樣的,大家在學習hdl語言時應充分注意活學活用。以下再附三則decoder的實現方案,供各位參考。 --decoder實現方法之一: (說明:本例直接在select語句中將結果賦給埠輸出,而不再像源程式藉助signal的那樣。) LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECODER IS
PORT(Ain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DECODER;
ARCHITECTURE DECODE OF DECODER IS
BEGIN
WITH Ain SELECT
LED<="0111111"WHEN"0000",
"0000110"WHEN"0001",
"1011011"WHEN"0010",
"1001111"WHEN"0011",
"1100110"WHEN"0100",
"1101101"WHEN"0101",
"1111101"WHEN"0110",
"0000111"WHEN"0111",
"1111111"WHEN"1000",
"1101111"WHEN"1001",
"1110111"WHEN"1010",
"1111100"WHEN"1011",
"0111001"WHEN"1100",
"1011110"WHEN"1101",
"1111001"WHEN"1110",
"1110001"WHEN"1111",
NULL WHEN OTHERS;
END DECODE;
--decoder實現方法之二:
(說明:本例的妙處是在process中使用for-loop語句,從而使訊號的賦值變得簡潔。當賦值語句更多時,使用迴圈來實現重複的工作的優勢將更加顯著。注意:for-loop只能在process中出現。)
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECODER IS
PORT(Ain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DECODER;
ARCHITECTURE DECODE OF DECODER IS
SIGNAL SIGN2:STD_LOGIC_VECTOR(6 DOWNTO 0);
BEGIN
WITH Ain SELECT
SIGN2<="0111111"WHEN"0000",
"0000110"WHEN"0001",
"1011011"WHEN"0010",
"1001111"WHEN"0011",
"1100110"WHEN"0100",
"1101101"WHEN"0101",
"1111101"WHEN"0110",
"0000111"WHEN"0111",
"1111111"WHEN"1000",
"1101111"WHEN"1001",
"1110111"WHEN"1010",
"1111100"WHEN"1011",
"0111001"WHEN"1100",
"1011110"WHEN"1101",
"1111001"WHEN"1110",
"1110001"WHEN"1111",
NULL WHEN OTHERS;
PROCESS(SIGN2)
BEGIN
FOR N IN 6 DOWNTO 0 LOOP
LED(N)<=SIGN2(N);
END LOOP;
END PROCESS;
END DECODE;
--decoder實現方法之三:(說明:本例基於case語句。)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECODER IS
PORT(Ain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DECODER;
ARCHITECTURE DECODE OF DECODER IS
BEGIN
PROCESS(Ain)
BEGIN
CASE Ain IS
WHEN"0000"=>LED<="0111111";
WHEN"0001"=>LED<="0000110";
WHEN"0010"=>LED<="1011011";
WHEN"0011"=>LED<="1001111";
WHEN"0100"=>LED<="1100110";
WHEN"0101"=>LED<="1101101";
WHEN"0110"=>LED<="1111101";
WHEN"0111"=>LED<="0000111";
WHEN"1000"=>LED<="1111111";
WHEN"1001"=>LED<="1101111";
WHEN"1010"=>LED<="1110111";
WHEN"1011"=>LED<="1111100";
WHEN"1100"=>LED<="0111001";
WHEN"1101"=>LED<="1011110";
WHEN"1110"=>LED<="1111001";
WHEN"1111"=>LED<="1110001";
WHEN OTHERS=>LED<=NULL;
END CASE;
END PROCESS;
END DECODE;
相關推薦
基於VHDL的層次化設計:非同步清零和同步使能4位十六進位制加法計數器和七段顯示譯碼器的元件例化實現
-----------------------------------------------------------------------------------------------方案一--------------------------------------
工作記錄:處理閃燈資料檔案,需要將10進位制轉為3位十六進位制
Vixen生成的.csv檔案,需要把裡面的資料轉為3位的16進位制。自己寫了一個程式來處理,在此記錄一下。 平臺:Qt Creator /*********************** * Name : main.cpp * Author : Lon * Date
UDF函式:對字串實現sha256加密,返回64位十六進位制字串
實際需求多一些特殊資料需要加密儲存。下面 實現sha256加密,返回64位十六進位制字串package cnsuning.udf.functions.string; import org.apache
Python程式設計:二進位制,八進位制,十六進位制與十進位制之間的轉換
進位制轉換的函式 bin() 10進位制轉2進位制 oct() 10進位制轉8進位制 hex()10進位制轉16進位制 int() *進位制轉10進位制 各進位制之間轉換 ↓ 2進位制 8進位制
藍橋杯: 基礎練習 十六進位制轉八進位制
問題描述 給定n個十六進位制正整數,輸出它們對應的八進位制數。 輸入格式 輸入的第一行為一個正整數n (1<=n<=10)。 接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。 輸出格式 輸出n行,每行
組合語言:將主程式中BX暫存器內的二進位制數用十六進位制數的形式在螢幕上顯示出來。
上機程式碼: code segment assume cs:code start: mov bx,1234H
python : 二進位制、八進位制,十進位制和十六進位制的相互轉換
二進位制、八進位制和十六進位制轉化為十進位制: 二進位制轉化為十進位制:print(int("111",2)) 輸出為7 八進位制轉化為十進位制:print(int("11",8)) 輸出為9 十六進位制轉化為十
進位制轉換:二進位制、八進位制、十六進位制、轉十進位制
將二進位制、八進位制、十六進位制等轉換為十進位制 二進位制、八進位制和十六進位制向十進位制轉換都非常容易,就是“按權相加”。所謂“權”,也即“位權”。 假設當前數字是 N 進位制,那麼: 對於整數部分,從右往左看,第 i 位的位權等於Ni-1 對於小數部分,恰好相反,要從左往右看,第 i 位
易學筆記-第5章:數字/5.10 十六進位制、八進位制、二進位制
各種進製表示 二進位制開頭:0b >>> 0b1,0b1000,0b11111111 (1, 8, 255) 八進位制開頭 :0o >>> 0o10,0o20,0o30 (8, 16, 24) 十六進位制
Go:十六進位制顏色程式碼轉換為RGB值
func ColorToRGB(colorstr string) (red, green, blue int) { colorstr = strings.TrimPrefix(colorstr, "#") color64, err := strconv.ParseInt(
“全棧2019”Java第十四章:二進位制、八進位制、十六進位制
難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第十四章:二進位制、八進位制、十六進位制 下一章 “全棧2019”Java第十五章:Unic
編碼的奧祕:位元組與十六進位制
轉自:《編碼的奧祕》 第十五章 上一章中的兩個改進的加法機清晰地解釋了資料路徑的概念。在整個電路中, 8位值從一個部件傳到另一個部件。它們是加法器、
劍指offer----輸入用字母表示的列號編碼,核心內容:二十六進位制變十進位制
題目: 用A表示第一列,用B表示第二列。。。。用Z表示第26列,用AA表示第27列。。。請寫出一個函式,輸入用字母表示的列號編碼,輸出它是第幾列。 思路: 此問題最精彩之處,核心---二十六進位制變十進位制 function calColumn(){ // va
如何優化Java程式:十進位制轉十六進位制(2的31次方以內的正整數)
程式碼如下: package com.java; import java.util.Scanner; public class TestTransform { public static void main(String[] args) { Scanner
數字轉換為十六進位制數(leetcode簡單篇四百零五題)
給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。對於負整數,我們通常使用 補碼運算 方法。 注意: 十六進位制中所有字母(a-f)都必須是小寫。 十六進位制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元’0’來表示;對於其他情況,十六進位制字串中
藍橋杯演算法題:十六進位制轉8進位制
問題描述 給定n個十六進位制正整數,輸出它們對應的八進位制數。 輸入格式 輸入的第一行為一個正整數n (1<=n<=10)。 接下來n行,每行一個由09、大寫字母AF組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過10
藍橋杯試題:十六進位制轉10進位制
問題描述 從鍵盤輸入一個不超過8位的正的十六進位制數字符串,將它轉換為正的十進位制數後輸出。 注:十六進位制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。 樣例輸入 FFFF 樣例輸出 65535 import java.util.Sc
藍橋杯(java):特殊迴文數,十進位制轉十六進位制,十六進位制轉十進位制,十六進位制轉八進位制,數列排序
人生不易,生活無趣。一起來找點樂子吧。 特殊迴文數: 問題描述 123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。 輸入一個正整數n, 程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 。 輸入格式 輸入一行,包
VHDL-邊沿觸發的加法計數器與七段數碼管顯示
將加法計數器的輸出DOUT作為七段數碼管的輸入,顯示計數的結果。該程式由四部分組成,分別是:加法計數器、數碼管顯示、通用偶數分頻器、頂層呼叫檔案。1)頂層呼叫檔案--數碼管顯示 --通過撥碼開關控
Java程式設計題:將一個十六進位制的字串轉換成一個十進位制的整數
思路: 1.將字串轉換成一個一個的字元2.將字元轉換成十六進位制的數字 3.計算出結果 package test; public class Test { public static void main(String[] args) { String st