| // A simple circuit that can be used to detect brownouts and other hardware issues |
| |
| module top ( |
| input clk, |
| output LED1, |
| output LED2, |
| output LED3, |
| output LED4, |
| output LED5 |
| ); |
| reg [7:0] reset_counter = 0; |
| reg resetn = 0; |
| |
| always @(posedge clk) begin |
| reset_counter <= reset_counter + 1; |
| resetn <= resetn | &reset_counter; |
| end |
| |
| reg error, rdmode, rdfin; |
| |
| reg [31:0] scratchpad [0:1023]; |
| reg [31:0] xorshift32_state; |
| reg [9:0] index; |
| |
| reg [31:0] next_xorshift32_state; |
| |
| always @* begin |
| next_xorshift32_state = xorshift32_state ^ ( xorshift32_state << 13); |
| next_xorshift32_state = next_xorshift32_state ^ (next_xorshift32_state >> 17); |
| next_xorshift32_state = next_xorshift32_state ^ (next_xorshift32_state << 5); |
| end |
| |
| always @(posedge clk) begin |
| xorshift32_state <= &index ? 123456789 : next_xorshift32_state; |
| index <= index + 1; |
| |
| if (!resetn) begin |
| xorshift32_state <= 123456789; |
| index <= 0; |
| error <= 0; |
| rdmode <= 0; |
| rdfin <= 0; |
| end else |
| if (!rdmode) begin |
| scratchpad[index] <= xorshift32_state; |
| rdmode <= &index; |
| end else begin |
| if (scratchpad[index] != xorshift32_state) error <= 1; |
| rdfin <= rdfin || &index; |
| end |
| end |
| |
| wire ok = resetn && rdfin && !error; |
| assign LED1 = 0, LED2 = error, LED3 = 0, LED4 = error, LED5 = ok; |
| endmodule |