當前位置:首頁 » 課程大全 » edavhdl課程設計uart

edavhdl課程設計uart

發布時間: 2021-03-12 05:27:54

Ⅰ EDA課程設計,用VHDL編程做計程車計費器

課程設計內容與要求
1,用開關按鍵表示脈沖,每個脈沖代表100米,10個脈沖1公里,每公里1.4元,能同步顯示里程和費用;
2,低於2公里5元計費,高於2公里總費用=起步費用+(里程-2公里)*里程單價+
等候時間*等後單價;
3,等候時間大於2分鍾,按每分鍾1.3元計費;
4,可以設定起步價和里程單價。
一、設計原理與技術方法:
包括:電路工作原理分析與原理圖、元器件選擇與參數計算、電路調試方法與結果說明;
軟體設計說明書與流程圖、軟體源程序代碼、軟體調試方法與運行結果說明。
根據設計要求,系統的輸入信號clk,計價開始信號start,等待信號stop,里程脈沖信號fin。系統的輸出信號有:總費用數C0—c3,行駛距離k0—k1,等待時間m0—m1等。系統有兩個脈沖輸入信號clk_750k,fin,其中clk_750k將根據設計要求分頻成14hz,15hz和1hz分別作為公里計費和超時計費的脈沖。兩個控制輸入開關start,stop;控制過程為:start作為計費開始的開關,當start為高電平時,系統開始根據輸入的情況計費。當有乘客上車並開始行駛時,fin脈沖到來,進行行駛計費,此時的stop需要置為0;如需停車等待,就把stop變為高電平,
並去除fin輸入脈沖,進行等待計費;當乘客下車且不等待時,直接將start置為0,系統停止工作;價格開始歸為起步價5.0元。
整個設計由分頻模塊,計量模塊,計費模塊,控制模塊和顯示模塊五個部分組成。
其中計量模塊是整個系統實現里程計數和時間計數的重要部分;控制模塊是實現不同計費方式的選擇部分,根據所設計的使能端選擇是根據里程計費還是根據等待時間計費,同時設計通過分頻模塊產生不同頻率的脈沖信號來實現系統的計費。計量模塊採用1hz的驅動信號,計費模塊採用14hz,13hz的驅動信號;計量模塊每計數一次,計量模塊就實現14次或者13次計數,即為實現計時的1.3元/min,計程時的1.4元/km的收費。組成框圖如下所示:

1.百進制模塊:
實現百米脈沖的驅動信號,元件框圖如圖3所示:

圖3 百進制模塊框圖
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jin is
port(start,clk2: in std_logic; --秒脈沖
a: out std_logic_vector(3 downto 0));
end jin;
architecture rt1 of jin is
signal count_1:std_logic_vector(3 downto 0);
begin
a<=count_1;
process(start,clk2)
begin
if(start='0')then
count_1<="0000";
elsif(clk2'event and clk2='1')then
if(count_1="0111")then
count_1<="0000";
else
count_1<=count_1+'1';
end if;
end if;
end process;
end rt1

2.計費模塊
; 實現里程和等候時間的計費並輸出到顯示,元件框圖4如下:

圖4 計費模塊框圖

源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jifei is
port(clk2:in std_logic; --計費驅動信號
start:in std_logic; --計費開始信號
c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));
end jifei;
architecture rt1 of jifei is
begin
process(clk2,start)
begin
if start='0'then c3<="0000";c2<="0000";c1<="0101";c0<="0000"; --起步價5元
elsif clk2'event and clk2='1'then
if c0="1001" then c0<="0000";
if c1="1001" then c1<="0000";
if c2="1001" then c2<="0000";
if c3="1001" then c3<="0000";
else c3<=c3+1;
end if;
else c2<=c2+1;
end if;
else c1<=c1+1;
end if;
else c0<=c0+1;
end if;
end if;
end process;
end rt1;

3.公里模塊
實現歷程的計數和輸出計費脈沖,元件框圖5如下:

圖5 公里模塊框圖
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity gongli is
port(clk1,start: in std_logic; --百米脈沖
k1,k2,k3,k4: out std_logic_vector(3 downto 0); --里程顯示
temp2 : out std_logic);
end gongli;

architecture rt1 of gongli is
signal count_1: std_logic_vector(3 downto 0);
signal count_2: std_logic_vector(3 downto 0);
signal count_3: std_logic_vector(3 downto 0);
signal count_4: std_logic_vector(3 downto 0);
begin
k1<=count_1;
k2<=count_2;
k3<=count_3;
k4<=count_4;
process(start,clk1)
begin
if(start='0')then
count_1<="0000";
count_2<="0000";
count_3<="0000";
count_4<="0000"; ---公里清零
elsif(clk1'event and clk1='1')then
if(count_1="1001")then --公里計數器
count_1<="0000";count_2<=count_2+1;temp2<='1';
if(count_2="1001")then
count_2<="0000";count_3<=count_3+'1';
if(count_3="1001")then
count_3<="0000";count_4<=count_4+'1';
end if;
end if;
else
count_1<=count_1+'1';temp2<='0';
end if;
end if;
end process;
end rt1;

4.輸出模塊
實現所有數據的輸出,元件框圖6如下:

圖6 輸出模塊框圖
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity shuchu is
port(y: in std_logic_vector(3 downto 0);
e: out std_logic_vector(6 downto 0));
end shuchu;

architecture rt1of shuchu is
begin
process
begin
case y is
when"0000"=>e<="0111111";
when"0001"=>e<="0000110";
when"0010"=>e<="1011011";
when"0011"=>e<="1001111";
when"0100"=>e<="1100110";
when"0101"=>e<="1101101";
when"0110"=>e<="1111101";
when"0111"=>e<="0000111";
when"1000"=>e<="1111111";
when"1001"=>e<="1100111";
when others=>e<="0000000";
end case;
end process;
end rt1;

5.顯示模塊
實現所有數據的顯示,元件框圖7如下:

圖7 顯示模塊框圖
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity xianshi is
port(start: in std_logic;
a:in std_logic_vector(3 downto 0); --選擇信號
c1,c2,c3,c4,out1,out2,out3,out4:in std_logic_vector(3 downto 0); --里程顯示,時間顯示輸入
y:out std_logic_vector(3 downto 0)); --里程顯示,時間顯示輸出
end xianshi;
architecture rt1 of xianshi is
begin
process
begin
if(start='0')then
y<="0000";
else case a is
when "0000"=> y<=c1 ;
when "0001"=> y<=c2 ;
when "0010"=> y<=c3 ;
when "0011"=> y<=c4 ;
when "0100"=> y<=out1 ;
when "0101"=> y<=out2;
when "0110"=> y<=out3 ;
when "0111"=> y<=out4;
when others =>y<= "0000";
end case;
end if;
end process;
end rt1;

6.dian模塊

圖8 dian模塊框圖
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity dian is
port(a: in std_logic_vector(3 downto 0);
e: out std_logic);
end dian;
architecture rt1 of dian is
begin
process
begin
case a is
when "0001"=>e<='1';
when "0101"=>e<='1';
when others=>e<='0';
end case;
end process;
end rt1;

三、中各個模塊設計分析
系統總體頂層框圖如下:

系統總體頂層框圖

程序最終功能實現波形模擬

1. 分頻模塊
由於實驗箱上沒有14hz和13hz的整數倍時鍾信號,因此採用頻率較大的750khz進行分頻,以近似得到14hz,13hz和1hz的時鍾頻率。通過以上三種不同頻率的脈沖信號實行計程車行駛,等待兩種情況下的不同計費。模塊元件如下:

分頻模塊框圖
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity fenpin is
port(clk_750k:in std_logic; --系統時鍾
clk_14:buffer std_logic; --14分頻
clk_13:buffer std_logic; --13分頻
clk_1 : buffer std_logic); --1分頻
end fenpin ;
architecture rt1 of fenpin is
signal q_14:integer range 0 to 53570; --定義中間信號量
signal q_13:integer range 0 to 57691;
signal q_1:integer range 0 to 749999;
begin
process(clk_750k)
begin
If(clk_750k' event and clk_750k='1')then
If q_14=53570 then q_14<=0;clk_14<=not clk_14;
else q_14<=q_14+1;
end if; --得14hz頻率信號
If q_13=57691 then q_13<=0;clk_13<=not clk_13;
else q_13<=q_13+1;
end if; --得13hz頻率信號
If q_1=749999 then q_1<=0;clk_1<=not clk_1;
else q_1<=q_1+1;
end if; --得1hz頻率信號
end if;
end process;
end rt1;

2. 計量模塊
計量模塊主要完成計時和計程功能。
計時部分:計算乘客的等待累積時間,當等待時間大於2min時,本模塊中en1使能信號變為1;當clk1每來一個上升沿,計時器就自增1,計時器的量程為59min,滿量程後自動歸零。
計程部分:計算乘客所行駛的公里數,當行駛里程大於2km時,本模塊中en0使能信號變為1;當clk每來一個上升沿,計程器就自增1,計程器的量程為99km,滿量程後自動歸零。
元件框圖為:

計量模塊框圖

計量模塊模擬波形為:

源程序如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity jiliang is
port(start:in std_logic; --計費開始信號
fin:in std_logic; --里程脈沖信號
stop:in std_logic; --行駛中途等待信號
clk1:in std_logic; --驅動脈沖
en1,en0:buffer std_logic; --計費單價使能信號
k1,k0:buffer std_logic_vector(3 downto 0); --行駛公里計數
m1,m0:buffer std_logic_vector(3 downto 0)); --等待時間計數
end jiliang;
architecture rt2 of jiliang is
signal w:integer range 0 to 59; --計時范圍0~59
begin
process(clk1)
begin
if(clk1'event and clk1='1')then
if start='0' then
w<=0;en1<='0';en0<='0';m1<="0000";
m0<="0000";k1<="0000";k0<="0000";
elsif stop='1' then --計時開始信號
if w=59 then
w<=0;
else w<=w+1;
end if;
if m0="1001" then
m0<="0000";
if m1="0101" then
m1<="0000";
else m1<=m1+1;
end if;
else m0<=m0+1;
end if;
if stop='1' then en0<='0';
if m1&m0>"00000001" then en1<='1'; --若等待時間大於2min則en1置1
else en1<='0';
end if;
end if;
elsif fin='1' then --里程計數開始
if k0="1001" then k0<="0000";
if k1="1001" then k1<="0000"; --計程范圍0~99
else k1<=k1+1;
end if;
else k0<=k0+1;
end if;
if stop='0' then
en1<='0';
if k1&k0>"00000001" then
en0<='1'; --若行使里程大於2km,則en0置1
else en0<='0';
end if;
end if;
end if;
end if;
end process;
end rt2;

3. 控制模塊
本模塊主要是通過計量模塊產生的兩個不同的輸入使能信號en0,en1,對每個分頻模塊輸出的14hz,13hz的脈沖進行選擇輸出的過程;本模塊實現了雙脈沖的二選一;最終目的為了計費模塊中對行駛過程中不同的時段進行計價。
模塊元件如下:

控制模塊框圖
控制模塊模擬波形為:

源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity kong is
port(en0,en1:in std_logic; --使能選擇信號
clk_in1:in std_logic; --14分頻輸入信號
clk_in2:in std_logic; --13分頻輸入信號
clk_out:out std_logic); --輸出信號
end kong;
architecture rt3 of kong is
begin
process(en0,en1)
begin
if en0='1' then --實現二選一功能
clk_out<=clk_in1;
elsif en1='1' then
clk_out<=clk_in2;
end if;
end process;
end rt3;

4.計費模塊
當計費信號start一直處於高電平即計費狀態時,本模塊根據控制模塊選擇出的信號從而對不同的單價時段進行計費。即行程在2km內,而且等待累計時間小於2min則為起步價5元;2km外以每公里1.4.元計費,等待累積時間超過2min則按每分鍾1.3元計費。c0,c1,c2,c3分別表示費用的顯示。
模塊元件為:

計費模塊框圖

計費模塊模擬波形為:

源程序如下:

Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jifei is
port(clk2:in std_logic; --計費驅動信號
start:in std_logic; --計費開始信號
c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));
end jifei;
architecture rt4 of jifei is
begin
process(clk2,start)
begin
if start='0'then c3<="0000";c2<="0000";c1<="0101";c0<="0000"; --起步價5元
elsif clk2'event and clk2='1'then
if c0="1001" then c0<="0000";
if c1="1001" then c1<="0000";
if c2="1001" then c2<="0000";
if c3="1001" then c3<="0000"; --計價范圍0~999.9
else c3<=c3+1;
end if;
else c2<=c2+1;
end if;
else c1<=c1+1;
end if;
else c0<=c0+1;
end if;
end if;
end process;
end rt4;

5.顯示模塊
顯示模塊完成計價,計時和計程數據顯示。計費數據送入顯示模塊進行解碼,最後送至以百元,十元,元,角為單位對應的數碼管上顯示。計時數據送入顯示模塊進行解碼,最後送至以分為單位對應的數碼管上顯示。計程數據送入顯示模塊進行解碼,最後送至以km為單位的數碼管上顯示。
模塊元件為:

顯示模塊框圖
源程序如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; --定義庫包

entity xianshi is --定義實體
port(
clk_scan:in std_logic; --掃描時鍾信號埠設置
c3,c2,c1,c0:in std_logic_vector(3 downto 0); --總費用輸入埠
k0,k1:in std_logic_vector(3 downto 0); --里程輸入埠
m0,m1:in std_logic_vector(3 downto 0); --等待時間輸入埠
sel:out std_logic_vector(2 downto 0); --控制數碼管位選信號的掃描信號輸出埠
led:out std_logic_vector(6 downto 0); --數碼管的控制埠
led_dp:out std_logic --數碼管的小數點輸出埠
);
end xianshi;
architecture rt5 of xianshi is
signal an:std_logic_vector(6 downto 0); --數碼顯示管中間變數
signal shuju:std_logic_vector(3 downto 0); --選擇輸入端的中間變數
signal cnt:std_logic_vector(2 downto 0); --控制數碼管的中間變數
signal xiaodian:std_logic; --小數點的中間變數
begin
process(clk_scan) --開始進程
begin
if clk_scan'event and clk_scan='1' then
cnt<=cnt+1; --每有一個掃描信號上升沿實現加1掃描
end if;
end process; --結束進程

process(cnt) --開始進程(選擇掃描顯示數碼管)
begin
case cnt is --掃描時給每個數碼管賦值
when "000"=>shuju<=c0;
when "001"=>shuju<=c1;
when "010"=>shuju<=c2;
when "011"=>shuju<=c3;
when "100"=>shuju<=k0;
when "101"=>shuju<=k1;
when "110"=>shuju<=m0;
when "111"=>shuju<=m1;
when others=> null;
end case;
if (cnt="001" or cnt="110")
then xiaodian<='1'; --在里程和總費用的個位處顯示小數點
else xiaodian<='0';
end if;
end process; --結束進程

process(shuju) --開始進程(解碼顯示)
begin
case shuju is
when "0000"=>an<="0111111"; --0
when "0001"=>an<="0000110"; --1
when "0010"=>an<="1011011"; --2
when "0011"=>an<="1001111"; --3
when "0100"=>an<="1100110"; --4
when "0101"=>an<="1101101"; --5
when "0110"=>an<="1111101"; --6
when "0111"=>an<="0000111"; --7
when "1000"=>an<="1111111"; --8
when "1001"=>an<="1101111"; --9
when others=>null;
end case;
end process;
sel<=cnt;
led<=an;
led_dp<=xiaodian;
end rt5;
二、課程設計工作記錄:
包括:設計步驟與時間安排、調試步驟與時間安排、課題完成結果說明
2.課題完成結果說明:
此計費器能實現起步價是5元;實現實驗要求的1公里計費一次單價,行駛公里大於2km時每公里按1.4元計費並能顯示里程和總共的費用。當行駛了6公里,等待了4分鍾時,費用顯示為15.8元。與計算公式總費用=起步費用+(里程-2公里)*里程單價+等候時間*等後單價;即15.8=5+(6-2)*1.4+4*1.3。實驗結果與理論結果完全一致,實驗設計成功。

Ⅱ EDA課程設計VHDL信號發生器設計 要求: (1) 產生方波、三角波、鋸齒波、正弦波 (2)頻率為10KHz

要求DDS方式實現么。。。你要看你的時鍾頻率。。。然後計算你需要的頻率控制字。。。

Ⅲ EDA課程設計五進制計數器的VHDL語言設計的源程序

隨便編了一個,能通過模擬。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity cnt5 is
port(clk,rst:in std_logic;
SEL:in std_logic_vector(1 downto 0);
data1_out,data2_out,data3_out:out std_logic_vector(6 downto 0));
end cnt5;

architecture arch of cnt5 is

signal count:integer range 0 to 9;
signal state:std_logic_vector(1 downto 0);
begin
process(clk,rst)
begin
if rst='1' then
state<="00";data1_out<="1111110";data2_out<="1111110";data3_out<="1111110";count<=0;
elsif clk'event and clk='1' then
case state is
when "00" =>
data1_out<="1111110";data2_out<="1111110";
if count=4 then count<=0; else count<=count+1;end if;
case SEL is
when "01" => state<="01";count<=0;
when "10" => state<="10";count<=1;
when "11" => state<="11";count<=5;
when others => null;
end case;
when "01" =>
data1_out<="1111110";data2_out<="0110000";
if count=8 then count<=0; else count<=count+2;end if;
case SEL is
when "00" => state<="00";count<=0;
when "10" => state<="10";count<=1;
when "11" => state<="11";count<=5;
when others => null;
end case;
when "10" =>
data1_out<="0110000";data2_out<="1111110";
if count=9 then count<=1; else count<=count+2;end if;
case SEL is
when "00" => state<="00";count<=0;
when "01" => state<="01";count<=0;
when "11" => state<="11";count<=5;
when others => null;
end case;
when "11" =>
data1_out<="0110000";data2_out<="0110000";
if count=1 then count<=5; else count<=count-1;end if;
case SEL is
when "00" => state<="00";count<=0;
when "01" => state<="01";count<=0;
when "10" => state<="10";count<=1;
when others => null;
end case;
when others => state <= "00";
end case;

case count is
when 0 => data3_out<="1111110";
when 1 => data3_out<="0110000";
when 2 => data3_out<="1101101";
when 3 => data3_out<="1111001";
when 4 => data3_out<="0110011";
when 5 => data3_out<="1011011";
when 6 => data3_out<="1011111";
when 7 => data3_out<="1110000";
when 8 => data3_out<="1111111";
when 9 => data3_out<="1111011";
when others => data3_out<="0000000";
end case;

end if;
end process;
end arch;

Ⅳ 書上有很全的uart(vhdl)實現程序,可是把程序燒入fpga後,用串口調試助手發送數字後在接收區沒有顯示

1、檢查一下引腳約束對不對
2、看看串口調試助手的波特率和程序中是不是一致
調試的時候可以逐級構成環回,以定位鏈路問題位置:
1、用一根導線將水晶頭里的tx,rx線接觸,看線路是否正常
2、在FPGA程序里直接將txd賦給rxd(透傳)構成環回,檢測是否有輸出

Ⅳ 求完整的基於vhdl的拔河游戲機EDA課程設計

用9個LED等當作拔河繩子,通過倒計時作為比賽開始信號
採用5局3勝制,完成一局比賽通過數碼管記錄雙方比分
當有一方得分為3則比賽結束,播放音樂。通過復位鍵重置比賽
這個我能夠給你

Ⅵ 用VHDL語言設計一個交通燈,EDA課程設計

首先最簡單的方法是列出真值表。寫出邏輯表達式。然後根據邏輯表達式來寫出vhdl程序。在編譯=》模擬=》功能分析=》輸出延時=》下載程序 1.設計原理
在這個實例中,我們設計一個簡單的十字路口交通燈。交通燈分東西和南北兩個方向,均通過數碼管和指示燈指示當前的狀態。設兩個方向的流量相當,紅燈時間45s,綠燈時間40s,黃燈時間5s.
從交通燈的工作機理來看,無論是東西方向還是南北方向,都是一個減法計數器。只不過計數時還要判斷紅綠燈情況,再設置計數器的模值。
下表所示為一個初始狀態和4個跳變狀態。交通燈工作時狀態將在4個狀態間循環跳變,整個交通燈則完全按照減計數器原理進行設計。
狀態 當前計數值 下一個CLOCK到來時新模值
東西方向指示 南北方向指示 東西-南北方向指示 東西方向指示 南北方向指示 東西-南北方向指示
初始 0 0 45 40 紅-綠
1 6 1 紅-綠 5 5 紅-黃
2 1 1 紅-黃 40 45 綠-紅
3 1 6 綠-紅 5 5 黃-紅
4 1 1 45 40 紅-綠
2.部分程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity traffic is
port(clk, urgency: in std_logic;
east_west:buffer std_logic_vector(7 downto 0);--東西方向時鍾計數
south_north: buffer std_logic_vector(7 downto 0); --南北方向的時鍾計數
led:buffer std_logic_vector(5 downto 0)); --交通指示燈
end traffic;

architecture arch of traffic is
。。。。。。。
end arch;

3.具體設計步驟
1) 建立一個新的工程完成上面的電路設計
2) 編譯電路並使用功能模擬來驗證設計
3) 引腳配置,如Part I中討論的,這些配置是確保VHDL代碼中輸出埠能使用PFGA晶元上連接到LEDR和LEDG的引腳。重新編譯項目,並下載到FPGA晶元上。
4) 測試電路的正確性。

Ⅶ VHDL語言UART代碼

UART通信
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity UART is --通用非同步串列收發器實體
Port ( UART_clk : in STD_LOGIC; --收發器時鍾輸入,50MHz
UART_rst : in std_logic;

UART_TX_buf : in STD_LOGIC_VECTOR(7 downto 0);
UART_TX_TI : out std_logic;
UART_TX_EN : in std_logic;
UART_TXD : out std_logic;

UART_baudrate : out STD_LOGIC); --收發器波特率輸出19200的14倍頻(測試完成後可以取消)
end UART;
architecture Behavioral of UART is
signal baudrate_counter :std_logic_vector(6 downto 0):="0000000"; --波特率發生器分頻計數器
signal baudrate_out :std_logic:='0'; --波特率發生器波特率信號
signal TX_clk : std_logic:='0';
signal tx_clk_counter : std_logic_vector(3 downto 0) :="0000";
type TX_STATE is (TX_idle,TX_transfer);
signal TX_current_state,TX_next_state : Tx_state;
signal TX_buf_shift : std_logic_vector(9 downto 0):= "0111111111";
signal TX_counter :std_logic_vector(3 downto 0):="0000";
signal TX_start : std_logic:='0';
signal TXD_buf: std_logic:='0';
signal TX_TI : std_logic:='1';
begin
baudrate: process (UART_clk) --波特率發生器進程
begin
if rising_edge(UART_clk) then --對輸入時鍾進行分頻獲得所需波特率的14倍頻
if (baudrate_counter >= "1011100") then
baudrate_counter <= "0000000";
baudrate_out <= not baudrate_out;
else
baudrate_counter <= baudrate_counter + '1';
baudrate_out <= baudrate_out;
end if;
end if;
end process;
UART_baudrate <= baudrate_out; --將波特率信號傳給輸出介面
sync_proc_tx: process(baudrate_out,UART_rst) --同步進程,狀態機轉換
begin
if (UART_rst = '1') then
tx_current_state <= tx_idle;
elsif (falling_edge(baudrate_out)) then
tx_current_state <= TX_next_state;
end if;
end process;
comb_proc_tx: process(baudrate_out,UART_rst) --組合邏輯,狀態機轉換、輸出
begin
if (UART_rst = '1') then
TX_next_state <= TX_idle;
TX_counter <= "0000";
TXD_buf <= '1';
TX_start <= '0';
TX_TI <= '1';
TX_clk_counter <= "0000";
TX_buf_shift <= "1111111111";
elsif (rising_edge(baudrate_out)) then
case TX_current_state is
when TX_idle =>
if (UART_TX_EN = '1' and TX_TI = '1') then --如果滿足發送起始條件
TX_next_state <= TX_transfer; --轉換下一狀態到發送
TX_counter <= "1010"; --發送bit計數器置數,發送10個bit,8bit數據加上開始結束位
TXD_buf <= '1'; --發送寄存器發送『1』
TX_start <= '1'; --發送過程標志
TX_TI <= '0'; --發送進行中標志,表示發送器不可用
TX_clk_counter <= "1101"; --分頻計數器置數
TX_buf_shift <= '1' & UART_TX_buf & '0'; --寄存器保存數據與開始結束位
else
TX_next_state <= TX_idle;
TX_counter <= "0000";
TXD_buf <= '1';
TX_start <= '0';
TX_TI <= '1';
TX_clk_counter <= "0000";
TX_buf_shift <= "1111111111";
end if;
when TX_transfer =>
if (TX_start = '1' and TX_TI = '0' and TX_counter /= "0000") then --進入正常發送狀態
if (TX_clk_counter >= "1101") then --如果分頻完成
TX_next_state <= TX_transfer; --沒有發送完成,繼續進入發送狀態
TX_counter <= TX_counter - '1'; --發送bit計數器自減
TXD_buf <= TX_buf_shift(0); --發送數據
TX_start <= '1'; --發送過程標志繼續允許
TX_TI <= '0'; --發送器不允許使用
TX_clk_counter <= "0000"; --分頻計數器清靈,繼續下一次
TX_buf_shift <= '1' & TX_buf_shift(9 downto 1); --數據移位
else
TX_next_state <= TX_transfer;
TX_counter <= TX_counter;
TXD_buf <= TXD_buf;
TX_start <= '1';
TX_TI <= '0';
TX_clk_counter <= TX_clk_counter + '1';
TX_buf_shift <= TX_buf_shift;
end if;
else
TX_next_state <= TX_idle;
TX_counter <= "0000";
TXD_buf <= '1';
TX_start <= '0';
TX_TI <= '1';
TX_clk_counter <= "0000";
TX_buf_shift <= "1111111111";
end if;
when others =>
TX_next_state <= TX_idle;
TX_counter <= "0000";
TXD_buf <= '1';
TX_start <= '0';
TX_TI <= '1';
TX_clk_counter <= "0000";
TX_buf_shift <= "1111111111";
end case;
end if;
end process;
UART_TXD <= TXD_buf;
UART_TX_TI <= TX_TI;
end Behavioral;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity transmitter is
port(cs,clk,rx:in std_logic;
indata:in std_logic_vector(7 downto 0);
txd,ti:out std_logic);
end transmitter;
architecture tr1 of transmitter is
signal sig_count:std_logic_vector(3 downto 0);
signal sig_ti,sig_ti1,sig_txd,sig_buffer:std_logic;
signal sig_data:std_logic_vector(7 downto 0);
signal sig_txddata:std_logic_vector(9 downto 0);
begin
process(cs,clk,rx)
begin
if(clk'event and clk='1')then
if(cs='0')then
if(sig_buffer='0')then
if(rx='0')then
for i in 8 downto 1 loop
sig_txddata(i)<=indata(i-1);
end loop;
sig_txddata(9)<='0'; --加起始位
sig_data<=indata;
sig_buffer<='1';
end if;
else
for i in 9 downto 1 loop
sig_txddata(i)<=sig_txddata(i-1);
end loop;
sig_txd<=sig_txddata(9);
sig_txddata(0)<='1'; --加停止位
if(sig_count="1000")then
sig_count<="0000";
elsif(sig_count="0000"and sig_ti='1')then
sig_buffer<='0';
sig_ti<='0';
else
sig_count<=sig_count+'1';
sig_ti<='1';
end if;
end if;
end if;
end if;
end process;
process
begin
if(sig_ti='0')then
txd<='1';
else txd<=sig_txd;
end if;
end process;
ti<=not sig_ti;
end tr1;

Ⅷ EDA VHDL 八位除法器 課程設計

看你要什麼樣的除法器了,最簡單的是採取向右移位的方式實現,每一一位就是處以2,移兩位就是除以4,以此類推。如果你想任意兩個數做除法,又要保持一定精度就比較麻煩了,代碼也會比較長,建議而且從時序角度看,計算周期也會比較長,單純計算沒有問題,但是實際應用起來可就難說了,很難保證計算周期足夠短。你去書庫裡面找找,肯定有的。

Ⅸ 求用VHDL語言編寫的UART通信程序,萬分感謝!!!

如果自己真的想學習VHDL,就先搞明白uart的通信協議,考慮整體的架構,包括波特率發生器,控制邏輯,發送模塊,接受模塊,可以加上FIFO,然後用VHDL實現,然後RTL模擬。如果只是應付一下作業或者考試,就上網down下吧

熱點內容
武漢大學學生會輔導員寄語 發布:2021-03-16 21:44:16 瀏覽:612
七年級學生作文輔導學案 發布:2021-03-16 21:42:09 瀏覽:1
不屑弟高考成績 發布:2021-03-16 21:40:59 瀏覽:754
大學畢業證會有成績單 發布:2021-03-16 21:40:07 瀏覽:756
2017信陽學院輔導員招聘名單 發布:2021-03-16 21:40:02 瀏覽:800
查詢重慶2018中考成績查詢 發布:2021-03-16 21:39:58 瀏覽:21
結業考試成績怎麼查詢 發布:2021-03-16 21:28:40 瀏覽:679
14中醫醫師資格筆試考試成績查分 發布:2021-03-16 21:28:39 瀏覽:655
名著賞析課程標准 發布:2021-03-16 21:27:57 瀏覽:881
北京大學商業領袖高端培訓課程 發布:2021-03-16 21:27:41 瀏覽:919