用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位的数据 怎么做等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)