1. 程式人生 > >FPGA學習筆記之串列埠收發

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
模擬錯誤
這裡寫圖片描述
解決辦法
模擬中不能例化key_model的原因在於我把uart_ram_vlg_tst,key_model加到testbench中,但是取了不同的頂層模組名,也就是如果在uart_ram_vlg_tst中呼叫key_model必須將key_model加到模擬平臺,但是頂層模組的名字依然是uart_ram_vlg_tst,即兩個.v檔案必須沿用同一個頂層模組名字,不然就會例化失敗,在quartus中也一樣,只能有一個頂層模組
這裡寫圖片描述

模擬波形無誤,但是板級驗證出不來,看引腳分配,串列埠收發引腳順序,以及是否分配錯誤或者有其他多餘的引腳,多出來的引腳可以刪除
學習心得:
例化模組時一定要注意連線,最好是埠另取別的名字,不要圖省事用同樣的名字,不然多次例化的時候會出錯,比如我模擬的時候又呼叫了一個串列埠傳送模組,也就是說一共有兩個串列埠傳送,如果連線的名字都取同樣的名字,這兩個串列埠傳送就會連線在一起,會導致錯誤。