FPGA学习笔记之串口收发

FPGA学习笔记之串口收发_第1张图片
仿真测试
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
仿真错误
这里写图片描述
解决办法
仿真中不能例化key_model的原因在于我把uart_ram_vlg_tst,key_model加到testbench中,但是取了不同的顶层模块名,也就是如果在uart_ram_vlg_tst中调用key_model必须将key_model加到仿真平台,但是顶层模块的名字依然是uart_ram_vlg_tst,即两个.v文件必须沿用同一个顶层模块名字,不然就会例化失败,在quartus中也一样,只能有一个顶层模块
FPGA学习笔记之串口收发_第2张图片

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

你可能感兴趣的:(FPGA学习心得)