选题三:点阵显示

https://v.youku.com/v_show/id_XNTkyNjM3ODgyOA==.html?x&sharefrom=android&sharekey=0d6b8cf134bb521f3b15f853ec7ad4d82

1.课程设计目的

熟悉VerilogHDL硬件描述语言,掌握仿真软件的使用方法,熟悉并使用点阵进行电路 设计,掌握查表法设计电路的基本思想。

2.课程设计题目描述和要求

本课程设计使用8x8的点阵,完成如下设计功能。

(1)能显示Verilog的英文字母。

(2)在正常显示字母的基础上,完成滚动显示,滚动速度自定。

3.设计思想和过程

点阵即一系列发光二极管所构成的矩形阵列,其大小不一,本设计中使用的是比较简 单的8x8点阵。对于点阵的控制其实很简单,因为就是控制发光二极管的亮灭,从而使亮 起的二极管能够显示出某些特定的字符,如把中间一行二极管点亮就显示为“一”,等等。 控制二极管的亮灭就是控制二极管的正负极,使其阳极接高电平,阴极接低电平,二极管就 能发光,而8x8点阵的64个发光二极管也是通过这种简单的方式进行亮灭显示的。8x8点 阵共有8行8列,每行每列都有一组输入信号,都是8位的控制信号,按照点阵设计的共阴 极和共阳极等特点使其行列交叉点亮起即可。对于特定字符的显示,可以自己进行设计,也 可以利用一些显示工具直接给出。

如果单纯显示英文字母,本设计是很容易的,但是要滚动显示字母就需要额外添加一 些设计,因为整个字母滚动过程中的滚动情况都是设计者指定的,所以采用计数并取模的方 式完成显示信息的向左滚动。

编译代码成功如下图所示:

d5bcc8acf4fa42ed827a6555c4a722b5.png

 功能仿真就是在每次时钟信号的上升沿时产生一 组输出的行列信号,需要在实际电路中才能得到最后的直观结果。该设计代码放入Quartus  中运行可得图12-10所示的电路结构图,由于该电路的面积较大,所以只截取了其中结构比  较密集的部分,并没有给出全部的电路图。

仿真波形图:

db03dd45b0d34174ad60b381585f7e38.png

 电路结构图:

8b493941da0c449c9aafe8011aff2b1a.png

 

以下是一个基本的Verilog HDL代码实现16*16 LED点阵滚动显示英文"red win"的程序: ``` module led_matrix( input clk, // 钟信号 input rst, // 复位信号 output reg [15:0] row, // 行信号 output reg [15:0] col, // 列信号 output reg [15:0] led_data // LED数据信号 ); // 定义LED点阵的字符映射 reg [7:0] r, e, d, space, w, i, n; // "red win"的每个字母以及空格的字符映射 // 定义滚动显示的变量 reg [3:0] x; // x轴滚动位置 reg [3:0] y; // y轴滚动位置 reg [3:0] count; // 滚动计数器 reg [3:0] offset; // 字符偏移量 // 初始化字符映射滚动变量 initial begin r = 8'b11111111; // "r"的字符映射 e = 8'b10011110; // "e"的字符映射 d = 8'b10011000; // "d"的字符映射 space = 8'b00000000; // 空格的字符映射 w = 8'b10101010; // "w"的字符映射 i = 8'b00100100; // "i"的字符映射 n = 8'b01010100; // "n"的字符映射 x = 4'b0000; // 初始化x轴滚动位置 y = 4'b0000; // 初始化y轴滚动位置 count = 4'b0000; // 初始化滚动计数器 offset = 4'b0000; // 初始化字符偏移量 end // 定义钟上升沿的行为 always @(posedge clk) begin if (rst) begin // 复位信号 row <= 16'b0000000000000001; // 初始化行信号 col <= 16'b1111111111111110; // 初始化列信号 led_data <= 16'b0000000000000000; // 初始化LED数据信号 end else begin // 正常运行 // 更新滚动变量 if (count == 4'b1111) begin count <= 4'b0000; x <= x + 1; if (x == 4'b1111) begin x <= 4'b0000; y <= y + 1; if (y == 4'b1111) begin y <= 4'b0000; end end offset <= offset + 1; end else begin count <= count + 1; end // 根据滚动位置字符偏移量更新LED数据信号 case (y) 4'b0000: led_data <= {w, w, w, w, w, w, w, w, w, w, w, w, w, w, w, w}; 4'b0001: led_data <= {w, space, space, i, space, space, space, space, space, space, space, space, space, space, space, w}; 4'b0010: led_data <= {w, space, i, space, i, space, space, space, space, space, space, space, space, space, space, w}; 4'b0011: led_data <= {w, i, space, space, i, space, space, space, space, space, space, space, space, space, space, w}; 4'b0100: led_data <= {w, i, space, space, i, space, space, space, space, space, space, space, space, space, space, w}; 4'b0101: led_data <= {w, i, space, space, i, space, space, space, space, space, space, space, space, space, space, w}; 4'b0110: led_data <= {w, i, space, space, i, space, space, space, space, space, space, space, space, space, space, w}; 4'b0111: led_data <= {w, space, i, space, i, space, space, space, space, space, space, space, space, space, space, w}; 4'b1000: led_data <= {w, space, space, i, space, space, space, space, space, space, space, space, space, space, space, w}; 4'b1001: led_data <= {w, w, w, w, w, w, w, w, w, w, w, w, w, w, w, w}; default: led_data <= 16'b0000000000000000; endcase // 更新行信号列信号 if (offset == 4'b1000) begin offset <= 4'b0000; row <= {row[14:0], row[15]}; col <= {col[14:0], col[15]}; end else begin col <= {col[14:0], col[15]}; end end end endmodule ``` 该代码通过在钟上升沿的行为中更新LED点阵的行信号、列信号LED数据信号来实现16*16 LED点阵滚动显示英文"red win"。具体来说,代码首先定义了LED点阵的字符映射滚动变量,然后在钟上升沿的行为中根据滚动位置字符偏移量更新LED数据信号,并通过更新行信号列信号来控制LED点阵的滚动。需要注意的是,该代码中使用了复位信号来初始化各个变量。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值