1. 程式人生 > >基於VHDL的層次化設計:非同步清零和同步使能4位十六進位制加法計數器和七段顯示譯碼器的元件例化實現

基於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;
 
 
-----------------------------------------------------------------------------------------------方案二
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------(該實現方案編寫了三個vhdl檔案,即將方案一中的三個實體分開來寫。在quartusII開發環境下,只要使新建工程名與實體名一致,然後將程式2、3包含到工程中即可。同樣,在頂層實體中實現計數器和譯碼器的結合。方案一和方案二的頂層實體檔案是完全相同的。)

方案二源程式如下:

--程式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