使用LX9開發板對兼容ARM9處理器的開源軟核進行Dhrystone Benchmark測試(下)
我們把EN_KEY引入設計中,讓它連接入處理器內核的cpu_en輸入端口中。接下來,用一個計數器作為IRQ輸入中斷的觸發源。我們知道進行Dhrystone benchmark測試時,必須有一個實時時鐘來讓程序知道完成dhrystone運算花了多長時間。在Realview MDK提供的dhrystone例程中,里面有句注釋是這樣的:/* Timer Counter 0 Interrupt executes each 10ms @ 40 MHz Crystal Clock */,也就是每10 ms即要發送一次irq中斷脈沖。
本文引用地址:http://www.ex-cimer.com/article/142464.htm 然后,把兼容ARM9處理器內核例化到程序中。
reg [14:0] wr_addr;
always @ (posedge clk or posedge rst )
if ( rst )
wr_addr <= 14'b0;
else if (cpu_en)
wr_addr <= 14'b0;
else if (rx_vld)
wr_addr <= wr_addr + 1'b1;
else;
rom u_rom (
.clka ( clk ),
.ena ( cpu_en ? rom_en : rx_vld ),
.wea ( cpu_en ? 4'b0 : (1'b1<
.addra ( cpu_en ? rom_addr[14:2] : wr_addr[14:2] ),
.dina ( {4{rx_data[7:0]}} ),
.douta ( rom_data ),
.clkb ( clk ),
.enb ( ram_cen & ~ram_wen & (ram_addr[31:28]==4'h0 ) ),
.web ( 4'b0 ),
.addrb ( ram_addr[14:2] ),
.dinb ( 32'h0 ),
.doutb ( ram_rdata_rom )
后續的程序是對ROM模塊的描述。ROM模塊存放著程序,它除了供應給處理器內核的指令池外,還包括數據池對ROM模塊的訪問。另外,在編程態,從串口送入的字節,會依次寫入ROM模塊中,地址是不斷遞增的。采用wr_addr作為編程ROM的地址,不斷遞加。
接下來是RAM模塊的例化。RAM模塊是在地址ram_addr[31:28]等于4時,可以訪問。RAM模塊可以進行讀寫,讀寫操作由ram_wen控制。Wea可以控制RAM模塊的字節使能。
ram u_ram (
.clka ( clk ),
.ena ( ram_cen&(ram_addr[31:28]==4'h4) ),
.wea ( ram_wen ? ram_flag : 4'b0 ), // Bus [3 : 0]
.addra ( ram_addr[13:2] ), // Bus [11 : 0]
.dina ( ram_wdata ), // Bus [31 : 0]
.douta ( ram_rdata_ram )
); // Bus [31 : 0]
然后是例化了一個串口模塊。這個模塊是筆者寫一個串并轉換發送字節的模塊。只需要把tx_vld/tx_data[7:0]寫入相應的字節,那么它就會把tx_data[7:0]串行通過UART_TX發送出去。同理,如果收到字節,則會啟動rx_vld/rx_data[7:0],表示收到一個字節。rx_vld和tx_vld都是高電平使能信號。在rx_vld等于1時,表示收到的有效字節位于rx_data中。
rxtx u_uart (
.clk ( clk ),
.rst ( rst ),
.rx ( UART_RX ),
.tx_vld ( tx_vld ),
.tx_data ( tx_data ),
.rx_vld ( rx_vld ),
.rx_data ( rx_data ),
.tx ( UART_TX ),
.txrdy ( txrdy )
然后是讀選擇信號。由于會對ROM、RAM、串口這三個不同模塊進行讀寫,rd_sel可以區分此次讀操作該選擇哪一個數據。這當然是通過ram_addr來區分的。
評論