Verilog HDL语言实现16*16LED点阵滚动显示英文”red“的程序
时间: 2023-12-20 15:07:48 浏览: 211
下面是一个Verilog HDL程序,用于实现16x16 LED点阵的滚动显示英文单词“red”。该程序使用了一个FPGA板上的16位计数器和一个ROM存储器,其中存储了“red”单词的字模信息。每当计数器增加到特定值时,它将触发一个时钟信号,该信号用于读取ROM存储器并将相应的LED点亮。
```verilog
module led_matrix(
input clk,
input rst,
output reg [15:0] led_row,
output reg [15:0] led_col);
reg [3:0] row_counter;
reg [15:0] col_counter;
reg [7:0] rom_data;
parameter delay = 500000; //delay cycles between column shifts
//ROM memory containing "red" word pattern
//each byte represents a column of 8 LEDs
//MSB of each byte represents the top LED in the column
//LSB of each byte represents the bottom LED in the column
//16 bytes in total for 16x16 LED matrix
//pattern for "r"
reg [7:0] rom_r[16] = {
8'b00000010,
8'b00000010,
8'b00000100,
8'b00001000,
8'b00001000,
8'b00001110,
8'b00001010,
8'b00001010,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000
};
//pattern for "e"
reg [7:0] rom_e[16] = {
8'b00000000,
8'b00000000,
8'b00111100,
8'b01000010,
8'b01000000,
8'b01111000,
8'b01000000,
8'b01000010,
8'b00111100,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000
};
//pattern for "d"
reg [7:0] rom_d[16] = {
8'b00000000,
8'b00000000,
8'b00011100,
8'b00100010,
8'b00100010,
8'b00100010,
8'b00100010,
8'b00100010,
8'b00011100,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000,
8'b00000000
};
always @(posedge clk) begin
if (rst) begin
row_counter <= 4'd0;
col_counter <= 16'd0;
led_row <= 16'd0;
led_col <= 16'd0;
end else begin
if (col_counter >= delay) begin
col_counter <= 16'd0;
case (row_counter)
4'd0: rom_data <= rom_r[col_counter];
4'd1: rom_data <= rom_e[col_counter];
4'd2: rom_data <= rom_d[col_counter];
default: rom_data <= 8'b0;
endcase
led_col <= {led_col[14:0], led_row[15]};
led_row <= {led_row[14:0], rom_data};
if (row_counter == 4'd15) begin
row_counter <= 4'd0;
end else begin
row_counter <= row_counter + 4'd1;
end
end else begin
col_counter <= col_counter + 1;
end
end
end
endmodule
```
在这个程序中,LED点阵被表示为16x16的矩阵,其中每个元素都是一个LED。程序使用两个16位寄存器来控制LED点阵的输出:led_row和led_col。led_col寄存器用于存储点阵中的列,而led_row寄存器用于存储点阵中的行。
程序使用一个4位计数器来控制行的输出。当计数器增加到15时,它将被重置为0。程序还使用一个16位计数器来控制列的输出。每当计数器增加到特定值(delay)时,它将重置为0,并从ROM存储器中读取相应的字模信息。该程序使用了三个ROM存储器,分别存储字母“r”、“e”和“d”的字模信息。这些字模信息在ROM存储器中以每列8个LED的形式存储,总共有16列,因此需要16个字节来存储每个字母的字模信息。程序通过case语句来选择要读取哪个字母的字模信息,并将该信息存储到rom_data寄存器中。然后,程序使用led_col寄存器将该列左移一位,并使用led_row寄存器将rom_data信息向上移动一行,并将最后一行设置为相应的LED点亮。这样,程序就能够实现16x16 LED点阵的滚动显示英文单词“red”。
阅读全文