VHDLシーケンシャル・ロジック・デバイスの研究ノート

1.トリガー・デザイン

1.1基本的なDフリップフロップの設計

信号入力端子D、信号出力端子Q、及びクロック入力CLK:実質的に3ポートにDフリップフロップ。
その動作特性:クロックの立ち上がりエッジの瞬間、信号Q D出力ポートを更新するために、入力端子からの信号を取得するために、出力信号Dの残り時間が一定のままです。
以下は、実装コードです:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DFF1 IS
	PORT(
	CLK,D	:	IN STD_LOGIC;
	Q		:	OUT STD_LOGIC
	);
END DFF1;

ARCHITECTURE BHV OF DFF1 IS
SIGNAL Q1	:	STD_LOGIC;
	BEGIN
	PROCESS(CLK,D)	BEGIN
	IF CLK'EVENT AND CLK='1'
		THEN Q1<=D;
	END IF;
	END PROCESS;
	Q<=Q1;
END BHV;

図に示すように、最終的なシミュレーション結果。
ここに画像を挿入説明

1.1.1いくつかの異なるトリガ立ち上り検出方法

  1. そして、イベント・ロジックと機能の組み合わせを使用
CLK'EVENT AND CLK='1'
  1. その他の保険の組み合わせロジックとイベント+
CLK'EVENT AND (CLK='1') AND (CLK'LAST_VALUE='0')
  1. lastvalue関数形
CLK='1' AND CLK'LAST_VALUE='0'
  1. の形態でrising_edge()関数
IF RISING_EDGE(CLK)

1.2非同期リセットDクロックイネーブルフリップフロップと

名前が示唆するように、Dフリップフロップの2つの入力端子よりも塩基性である:非同期リセット端子RST、クロック端子ENを可能にします。RSTの非同期リセット端子のため、長い入力が直ちにクリア「1」、Dフリップフロップの出力端子である限り、クロックは、「1」である端子ENを、有効、Dフリップフロップは、クロックの立ち上がりエッジに信号を受信するの更新信号出力ポートを生成します。次のようにコードは次のとおりです。

library ieee;
use ieee.STD_logic_1164.all;
entity dff2 is
port (
  D,CLK,EN,RST    :   IN std_logic;-- EN时钟使能  RST异步清零
  Q              :   OUT std_logic
) ;
end dff2;

architecture behav of dff2 is

  signal Q1   :   std_logic;

begin
reg : process( RST,EN,CLK,D )
begin
  if RST='1' then --触发器被清零
      Q1<='0';
      elsif EN='1' then
          if (CLK'EVENT AND CLK='1') then
              Q1 <= D;
          end if ;
  end if ;
end process ; -- reg
Q <= Q1;
end behav ; -- behav 

このセクションでは二つの質問、フォローアップを解決するには、左があります。

  • 敏感な変数の敏感な変数テーブルを処理し、どのようにそれを選択するには?
    声明の中で表示される変数、右側の変数の代入記号を決定するための内部プロセスが敏感な変数テーブルに含まれています。
  • 10nsの遅延がシミュレーションを行うことが妥当である程度あるのでしょうか?
    リーズナブル!

1.3コントロール同期リセットDフリップフロップ

名前が示唆するように、4つの入力ポート、信号入力端子D、クロック信号CLK、クロックイネーブル信号ENと同期リセット端子RSTを含むトリガー、「RST = 1」のみの役割を果たしているために、クリアされるまで信号が立ち上がりエッジに到達したとき。
我々は2つの点に注意を払う必要があります。

  • クロック同期信号がエッジ検出(下)内に配置され、非同期信号はエッジ検出クロック(またはそれ以上)の外側に配置されています。
  • Elseステートメントは、ステートメントかどうかを判断する決意が肯定文は組み合わせ論理デバイスでインスタンス化、完了していることを示す表示されます。

以下は、実装コードです:

library IEEE;
use IEEE.std_logic_1164.all;

entity dff3 is 
port(
	RST,EN,CLK,D	:	in  std_logic;
	Q				:	out std_logic
);
end dff3;

architecture behav of dff3 is
	signal Q1	: 	std_logic;
	
	begin ---千万不要忘记architecture里的begin!
	reg:process (CLK,EN)	begin
	if (CLK'event and CLK='1' and EN='1') then --外部的if语句是不完整的,构成了时序逻辑器件
		if RST = '1' then --内部的if是完整的,构成了一个多路选择器
			Q1<='0';
			else --加上了else肯定是完整的判断语句
				Q1 <=D;
		end if;
	end if;	
	end process;
	Q <= Q1;
end behav;

次のようにシミュレーション結果は次のとおりです。

ここに画像を挿入説明

2.ラッチデザイン

2.1基本的なラッチ

基本的なラッチポートコンポーネント:

  • 入力:クロック信号CLKと入力信号D
  • 出力ポート:出力信号Q

基本的なラッチ動作特性:ときCLK =「1」は、出力信号Qは、入力されたタイミング信号D、CLK =「0」、出力信号Qが残るに等しいです。
次のようにコードは次のとおりです。

library IEEE;
use IEEE.std_logic_1164.all;

entity LTCH1 is 
	port(
		CLK,D	:	in  std_logic;
		Q		:	out std_logic
	);
end LTCH1;

architecture bhv of LTCH1 is 
signal Q1		:	std_logic;

begin
	reg:process(CLK,D)	begin
		if CLK='1' then
			Q1 <= D;
		end if;
	end process;
	Q <= Q1;
end; --bhv

シミュレーション波形次のように:
ここに画像を挿入説明

含むラッチ2.2クリア制御

3.カウンタの設計

4進カウンタの3.1シンプル追加

同期ロードおよび非同期リセット機能付き3.2 10進加算カウンタ

シフトレジスタの4デザイン

実験対象

1)カウントイネーブル設計、キャリー出力、及び同期プリセット番号で2進カウンタで0にクリア

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity CNT20 is
  port (
	CLK,RST,EN,LOAD	:	in std_logic;-- 时钟信号、同步清零信号、计数使能信号、预置数信号
	DATA			:	in std_logic_vector(4 downto 0);--预置数信号
	DOUT			:	out std_logic_vector(4 downto 0);--计数输出
	COUT			:	out std_logic--进位输出
  ) ;
end CNT20;

architecture bhv of CNT20 is
	signal Q		:	std_logic_vector(4 downto 0);
begin
	REG : process( CLK,RST,EN,LOAD )
	begin
		if CLK'EVENT and CLK='1' then
			if RST='0' then	Q <= (others=>'0');-- 同步清零
			elsif EN='1' then
				if LOAD='0' then Q <= DATA;--采用低电平进行预置数
				elsif Q<19 then
					Q <= Q + 1;--未达到进位条件则进位
				else
					Q <= (others=>'0');--手动清零
				end if ;
			end if ;			
		end if ;
	end process ; -- REG

	COM : process( Q )
	begin
		if Q="10011" then --20进制计数到19
			COUT <= '1';
		else
			COUT <= '0';	
		end if ;
	end process ; -- COM
	DOUT <= Q;
end bhv ; -- bhv

2)設計と非同期クリアし、カウントした8ビットのバイナリカウンタを実装0増加イネーブル

3)設計及び有効バンドを実装カウント、キャリー出力、及び8ビットのバイナリカウンタの非同期プリセット数が増加0にクリアする/減少

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity CNT_8 is
  port (
	CLK,RST,EN,LOAD	:	in std_logic;-- 时钟信号、异步清零信号、计数使能信号、预置数信号
	DATA			:	in std_logic_vector(7 downto 0);--预置数信号
	DOUT			:	out std_logic_vector(7 downto 0);--计数输出
	COUT			:	out std_logic--进位输出
  ) ;
end CNT_8;

architecture bhv of CNT_8 is
	signal Q		:	std_logic_vector(7 downto 0);
begin
	REG : process( CLK,RST,EN,LOAD )
	begin
		if RST='0' then	Q <= (others=>'0');
			elsif CLK'EVENT and CLK='1' then
				if EN='1' then
					if LOAD='0' then Q <= DATA;
						else
							Q <= Q + 1;
					end if ;
				end if ;			
		end if ;
	end process ; -- REG

	COM : process( Q )
	begin
		if Q="11111111" then --
			COUT <= '1';
		else
			COUT <= '0';	
		end if ;
	end process ; -- COM
	DOUT <= Q;
end bhv ; -- bhv

必要が手動で最高のカウントビットはジャンプをクリアして設定するように、8ビットカウンタいるため、すべてのビットをカウントアップする、ということに注意してください。

シフトレジスタへと出て6列の4)デザイン(使用自動データローディング上)

--串行输入并行输出
library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity SHIFT6_LEFT is
  port (
	CR,CLK,SHIFT    :   IN STD_LOGIC;  --清零信号、时钟信号、串行输入信号
	Y               :   OUT STD_LOGIC_VECTOR(5 DOwNTO 0)   --并行四位输出
	) ;
end SHIFT6_LEFT;

architecture A of SHIFT6_LEFT is

	signal TEMP_DATA    :   STD_LOGIC_VECTOR(6 DOWNTO 0); --共计7位,增加一位作为状态位

begin

REG1:process( CLK ) --状态位"011111"工作特性的设定
begin
	if CLK'EVENT AND CLK='1' then
		if CR='0' then--信号清零
			TEMP_DATA<="0000000";
			elsif TEMP_DATA(6)='0' then--状态位重载    --此句更改了TEMP_DATA
			--默认信号初始值都为0 (一般会先存在CR信号对TEMP_DATA进行清零)
				TEMP_DATA<="111110" & SHIFT ;
				else
					TEMP_DATA <= TEMP_DATA(5 DOWNTO 0) & SHIFT ;--信号左移:串行输入一位 & 高四位右移
		end if ;
	end if ;
end process ;


REG2:process( TEMP_DATA ) --并行输出时刻的设定
--每 移动一位\状态位重载 检测一次
begin
	if CLK'event and CLK='1' then
	   if TEMP_DATA(6)='0' then --输出状态位到达
		   Y <= TEMP_DATA(5 DOWNTO 0);
	   --else
		   --Y<="0000";
		end if ; 
	end if ;
end process ;
end A ;  

5)文字列6のデザインは、取り込まれたシフトレジスタであります

library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity SHIFT6_RIGHT is
  port (
	CR,CLK    		:   IN STD_LOGIC; 
	SHIFT			:	IN STD_LOGIC_VECTOR(5 DOwNTO 0);
	Y               :   OUT STD_LOGIC   
	) ;
end SHIFT6_RIGHT;

architecture A of SHIFT6_RIGHT is

	signal TEMP_DATA    :   STD_LOGIC_VECTOR(11 DOWNTO 0);
begin

REG1:process( CLK )
begin
	if CLK'EVENT AND CLK='1' then
		if CR='0' then
			TEMP_DATA<=(others=>'0');
			elsif TEMP_DATA(0)='0' then 
				TEMP_DATA<=SHIFT & "011111";
				else
					TEMP_DATA(10 DOWNTO 0) <= TEMP_DATA(11 DOWNTO 1);
		end if ;
	end if ;
end process ;
Y <= TEMP_DATA(6);
end A ;  



ビット列6シフトレジスタに文字列の6)デザイン

7)設計図6は、シフトレジスタに出し入れ組み込ま

6. VHDL言語の書き込み仕様

:私は改善の必要がいくつか抜粋を提示し、それが習慣を書いVHDL理解されている
(フルバージョンリファレンス:VHDLの書き込み仕様

  • 大文字定数を識別するエンティティ構造名、ポート信号は、同様に、変数は、大文字の最初の文字を用いた一般的な信号を表しています。
    ここに画像を挿入説明
  • VHDLは小文字で予約語
  • マルチビット信号とdowntoを使用して記載されています
  • あなたはライブラリIEEEを呼び出すと、IEEEは、小文字の残りの部分を大文字
    ここに画像を挿入説明
  • 各信号、変数、定数、およびポートを定義するには、コメントを持つべきです
  • 分離する - 「********」複数のプロセスが機能モジュール間で使用される機能モジュールを実現する場合の処理​​の間に使用する「--------」は、分離しました。
  • ポート名を合わせます。結腸を整列させるために、ジェネリックが整列することで、または外、配向ベクトルを定義します。
  • いくつかの一般的な略語信号
    ここに画像を挿入説明
リリース5元の記事 ウォンの賞賛6 ビュー2217

おすすめ

転載: blog.csdn.net/qq_35000721/article/details/102782061