基于串口通信的数据传送硬件实现

基于串口通信的数据传送硬件实现,第1张

用verilog设计,可以用modulesim做软件编写和仿真,如果有条件的话用一块cpld或者fpga做硬件的实现,不过我觉得本科的毕设应该不用这么严格吧。所以用modulesim软件仿真我感觉就好了,把仿真结果放到你的毕设里。至于编写的程序,很多书上都会有介绍,程序不是很难。祝你成功

你写的代码有问题呗。。。

Library ieee;

use ieeestd_logic_1164all;

use ieeestd_logic_arithall;

use ieeestd_logic_unsignedall;

entity atel2_bin is

port(

txclk: in std_logic; --2400Hz的波特率时钟

reset: in std_logic; --复位信号

din: in std_logic_vector(15 downto 0); --发送的数据

start: in std_logic; --允许传输信号

sout: out std_logic --串行输出端口

);

end atel2_bin;

architecture behav of atel2_bin is

signal thr,len: std_logic_vector(15 downto 0);

signal txcnt_r: std_logic_vector(2 downto 0); --数据位计数

signal sout1: std_logic;

signal cou: integer:=0;

signal oddb:std_logic;

type s is(start1,start2,shift1,shift2,odd1,odd2,stop1,stop2);

signal state:s:=start1;

begin

process(txclk)

begin

if rising_edge(txclk) then

if cou<3 then

thr<=0000000001010101; --发送的文件头

elsif cou=3 then

thr<=0000000000000010; --发送的文件长度

elsif (cou>3 and state=stop2) then

thr<=din;--发送的数据

end if;

end if;

end process;

process(reset,txclk)

variable tsr,tsr1,oddb1,oddb2: std_logic_vector(7 downto 0);

begin

if reset=1 then

txcnt_r<=(others=>0);

sout1<=1;

state<=start1;

cou<=0;

elsif txclkevent and txclk=1 then

case state is

when start1=> ----低8位

if start=1 then

if cou=3 then

len<=thr;

end if;

tsr:=thr(7 downto 0);

oddb1:=thr(7 downto 0);

sout1<=0; --起始位

txcnt_r<=(others=>0);

state<=shift1;

else

state<=start1;

end if;

when shift1=>

oddb<=oddb1(7) xor oddb1(6) xor oddb1(5) xor oddb1(4) xor oddb1(3) xor oddb1(2) xor oddb1(1) xor oddb1(0);

sout1<=tsr(0); --数据位

tsr(6 downto 0):=tsr(7 downto 1);

tsr(7):=0;

txcnt_r<=txcnt_r+1;

if (txcnt_r=7) then

state<=odd1;cou<=cou+1;

end if;

when odd1=> --奇校验位

if oddb=1 then

sout1<=0; state<=stop1;

else

sout1<=1; state<=stop1;

end if;

when stop1=>

sout1<=1; --停止位

if cou<4 then

state<=start1;

else

state<=start2;

end if;

when start2=> ----高8位

tsr1:=thr(15 downto 8);

oddb2:=thr(15 downto 8);

sout1<=0; --起始位

txcnt_r<=(others=>0);

state<=shift2;

when shift2=>

oddb<=oddb2(7) xor oddb2(6) xor oddb2(5) xor oddb2(4) xor oddb2(3) xor oddb2(2) xor oddb2(1) xor oddb2(0);

sout1<=tsr1(0); --数据位

tsr1(6 downto 0):=tsr1(7 downto 1);

tsr1(7):=0;

txcnt_r<=txcnt_r+1;

if (txcnt_r=7) then

state<=odd2;

end if;

when odd2=> --奇校验位

if oddb=1 then

sout1<=0;state<=stop2;

else

sout1<=1;state<=stop2;

end if;

when stop2=>

sout1<=1; --停止位

if len=0000000000000000 then

state<=stop2;

else

state<=start1;

len<=len-1;

end if;

end case;

end if;

end process;

sout<=sout1;

end behav;

你如果是用FPGA逻辑实现的串口收发控制器的话应该是用状态机实现的串并转换,那么你加一个变量I你的发送BUF也就是并行的数据是16位的,你只用作一个8位的串并转换,再每个状态下I都加1像下面这样:

bit1 : begin dataout <= data_buf[i]; state <= bit2; i<=i+1; end

bit2 : begin dataout <= data_buf[i]; state <= bit3; i<=i+1; end

bit3 : begin dataout <= data_buf[i]; state <= bit4; i<=i+1; end

bit4 : begin dataout <= data_buf[i]; state <= bit5; i<=i+1; end

bit5 : begin dataout <= data_buf[i]; state <= bit6; i<=i+1; end

bit6 : begin dataout <= data_buf[i]; state <= bit7; i<=i+1; end

bit7 : begin dataout <= data_buf[i]; state <= bit8; i<=i+1; end

bit8 : begin dataout <= data_buf[i]; state <= over; i<=i+1; end

再搞一个控制I的值的判断向控制I的值在0-15之间就可以了。

当然你如果是用NIOS2实现的话就更简单了,你去看看资料或者去网上找点例程一看就明白我这里就不说了。

你是要用非标的uart还是用标准的串口协议?

如果用非标的uart自己编写一个就是了,很简单的,当然接收和发送都要非标uart

如果还用标准串口, 32位数据按照字节顺序发四次不就成了,当然要用报文方式组织存储,这不是什么问题啊

1、硬件上FPGA板肯定要有RS232接口与PC连接才行,没有的话,一切免谈。 2、软件上写一个串口接收模块,设置好波特率和数据位宽。 就这两点东西。 我有验证过的串口verilog程序,可直接拿去用。

以上就是关于基于串口通信的数据传送硬件实现全部的内容,包括:基于串口通信的数据传送硬件实现、verilog串口通信实现pc发送一个字符给fpga,fpga收到以后,发送另外一串字符串给电脑应答。、用FPGA串口发送一个16位的数据 怎么做等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9773286.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存