欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FPGA学习笔记之串口收发

程序员文章站 2022-03-15 22:58:00
...

FPGA学习笔记之串口收发
仿真测试
timescale 1 ps/ 1 ps
define clock_period 20
module uart_ram_vlg_tst();

reg clk;
reg rst_n;
wire Rx232_rx;
wire key_in;
wire Rs232_tx;
wire [2:0] baud_set;

reg send_en;
reg press;
reg [7:0] data_Byte_t;
wire Tx_done;
assign band_set=3’d0;

// port map - connection between master ports and signals/registers
uart_tx uart_tx1(
.Rs232_tx(Rs232_rx),
.Tx_done(Tx_done),
.Uart_state(),
.baud_set(3’d0),
.clk(clk),
.data_Byte(data_Byte_t),
.rst_n(rst_n),
.send_en(send_en)
);
key_model key_model1(
.press(press),
.key(key_in)
);
uart_ram uart_ram1 (
// port map - connection between master ports and signals/registers
.Rs232_tx(Rs232_tx),
.Rx232_rx(Rx232_rx),
.clk(clk),
.key_in(key_in),
.rst_n(rst_n)
);

initial clk=1;
always #(`clock_period/2) clk = ~clk;

initial
begin
#0 rst_n = 1’b0;
press=0;
data_Byte_t=8’b0;
#(clock_period*50);
rst_n = 1'b1;
#(
clock_period*50);
data_Byte_t=8’haa;
send_en=1’d1;
#clock_period;
send_en=1'd0;
@(posedge Tx_done)
#(
clock_period*5000);

   data_Byte_t=8'h55;
    send_en=1'd1;
    #`clock_period;
   send_en=1'd0;
  @(posedge Tx_done)
#(`clock_period*5000);

    data_Byte_t=8'haf;
   send_en=1'd1;
    #`clock_period;
    send_en=1'd0;
  @(posedge Tx_done)
 #(`clock_period*5000);

  data_Byte_t=8'h33;
   send_en=1'd0;
   #`clock_period;
  send_en=1'd0;
  @(posedge Tx_done)
#(`clock_period*5000);


press=1;
#(`clock_period*3);
press=0;

$stop;

end

endmodule
仿真错误
FPGA学习笔记之串口收发
解决办法
仿真中不能例化key_model的原因在于我把uart_ram_vlg_tst,key_model加到testbench中,但是取了不同的顶层模块名,也就是如果在uart_ram_vlg_tst中调用key_model必须将key_model加到仿真平台,但是顶层模块的名字依然是uart_ram_vlg_tst,即两个.v文件必须沿用同一个顶层模块名字,不然就会例化失败,在quartus中也一样,只能有一个顶层模块
FPGA学习笔记之串口收发

仿真波形无误,但是板级验证出不来,看引脚分配,串口收发引脚顺序,以及是否分配错误或者有其他多余的引脚,多出来的引脚可以删除
学习心得:
例化模块时一定要注意连线,最好是端口另取别的名字,不要图省事用同样的名字,不然多次例化的时候会出错,比如我仿真的时候又调用了一个串口发送模块,也就是说一共有两个串口发送,如果连线的名字都取同样的名字,这两个串口发送就会连接在一起,会导致错误。

相关标签: 心得