|
发表于 2013-11-16 11:00:39
|
显示全部楼层
- `define ROM_ADDR_WIDTH 14
- `define ASYNC_RESET 1
- module top (
- input clk100m,
- input rst,
- input xween /* synthesis xc_pulldown = 1 */,
- output rom_clk,
- output reg rom_err
- );
-
- reg [7:0] div;
- reg [2:0] rst_n_ff;
- wire rst_n;
-
-
- reg rst_1syn;
- reg rst_2syn;
- wire rst_n ;
- wire rom_clk ;
- always @(posedge clk100m)
- begin
- rst_1syn <= ~rst;
- rst_2syn <= rst_1syn;
- end
- assign rst_n =rst_2syn;
- always @(negedge rst_n or posedge clk100m)
- begin
- if (!rst_n)
- div <= 8'h00;
- else
- div <= div + 1;
- end
-
- assign rom_clk = (div[2:0] == 3'd0)?1'b1:1'b0; // 100MHz/8
-
- reg [`ROM_ADDR_WIDTH-1:0] irom_addr;
-
- always @(negedge rst_n or posedge clk100m)
- begin
- if (!rst_n)
- irom_addr <= 0;
- else if(rom_clk == 1'b1)
- irom_addr <= irom_addr + 1;
- end
- wire [7:0] irom_read_data;
- wire [7:0] irom_ref_data;
-
- c8051f_irom #(`ROM_ADDR_WIDTH) u_irom (
- .clk (clk),
- .addr (irom_addr[`ROM_ADDR_WIDTH-1:0]),
- .di (8'h00), // irom_addr[7:0]),
- .we (xween),
- .oe (1'b1),
- .ce (1'b1),
- .dout (irom_read_data)
- );
-
- c8051f_irom #(`ROM_ADDR_WIDTH) u_irom_ref (
- .clk (clk),
- .addr (irom_addr[`ROM_ADDR_WIDTH-1:0]),
- .di (8'h00),
- .we (1'b0),
- .oe (1'b1),
- .ce (1'b1),
- .dout (irom_ref_data)
- );
-
- always @(negedge rst_n or posedge clk100m)
- begin
- if (!rst_n)
- rom_err <= 1'b0;
- else
- rom_err <= irom_read_data != irom_ref_data;
- end
-
- endmodule
复制代码 |
|