使用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中断脉冲。
本文引用地址://www.cazqn.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来区分的。
评论