edavhdl课程设计uart
Ⅰ 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下吧