基于FPGA verilog的点阵显示.docVIP

  • 54
  • 0
  • 约2.19千字
  • 约 4页
  • 2020-12-29 发布于浙江
  • 举报
点阵显示 LED点阵就是由发光二极管组成的矩阵,我们下面介绍的8*8点阵,即是8行*8列LED构成。下面是共阳8*8点阵的内部结构图: 从图中可以看出在横向上,每行LED的阳极连在一块,并引出一个引脚到外面;在竖向上,每列的LED阴极连在一块,并引出一个引脚到外面。所以,要让某行某列的LED亮,就要使该行引出的引脚接高电平,该列引出的引脚接低电平。 好了,我们现在说一下驱动方法。由于每行(每列)LED的一个极被连在一块,所以这个驱动方法只能是动态扫描法。从本质上来讲同数码管的动态扫描方法是类似的。 结合VHDL程序,我们来解说一下如何让点阵产生隔列的亮竖柱(第一列亮,第二列灭,第三列亮,第四列灭,依次类推)。 首先我们定义两个数组:line:out std_logic_vector(7 downto 0)--点阵列;row:out std_logic_vector(7 downto 0)--点阵行。line(0)对应于第一列的引脚输入,其它成员对应关系依次类推,row(0)对应于第一行的引脚输入,其它成员对应关系依次类推。时刻1:首先我们置line为0XFE,即第一列的引脚置低电平0,其余列的引脚置高电平1,这样,只有第一列上的LED可根据row的值来点亮或者熄灭,其余列上的LED不管row值是什么,都是灭的。与此同时,把row置为0xFF,即全部为高电平1,这样结合“只有第一列上的LED可根据row的值来点亮或者熄灭,其余列上的LED不管row值是什么,都是灭的”的状态,只有第一列上的LED全亮。第一个竖柱点亮了。紧接着,时刻2:置line为0xFF,即所有列上的led都是灭的,不管row上的值是什么值。第二个竖柱是灭的。然后,时刻3:置line为0XFB,即只有第三列的引脚是高电平,其余列的引脚都是低电平,这样,只有第三列上的LED可根据row值来点亮或者熄灭,其余列上的LED不管row值是什么,都是灭的。与此同时,把row置为0xFF,即全部为高电平1,所以只有第三列的led亮。第三个竖柱是点亮了。这样,依次循环,第一行亮,第二行灭,第三行亮,第四行灭…..当扫描完到第八列,我们控制程序回到第一列重新扫描。只要这个扫描的速度小于人眼的视觉暂留时间,我们就不会感到闪烁,而是以为这些个时刻发生的事情是在一个时刻发生的。这样,隔列点亮竖柱就完成了。 //产生横亮条 代码如下: module led_88 ( clk, rst, row, col ); input clk,rst; output [7:0] row,col; reg [7:0] col,row; wire clk_1k; reg [2:0] cnt; //1k时钟 defparam Gen_RxClk.divdFACTOR=24000,Gen_RxClk.divdWIDTH=14;//分频出1k的时钟 gen_divd Gen_RxClk(.reset(!rst),.clkin(clk),.clkout(clk_1k));//端口名称关联 always @(posedge clk_1k or negedge rst) begin if(!rst) cnt=3b000; else cnt=cnt+1b1; end always @(cnt) begin case(cnt) 3b000:begin row=8col=8hff;end 3b001:begin row=8col=8h00;end 3b010:begin row=8col=8hff;end 3b011:begin row=8col=8h00;end 3b100:begin row=8col=8hff;end 3b101:begin row=8col=8h00;end 3b110:begin row=8col=8hff;end 3b111:begin row=8col=8h00;end default:; endcase end module gen_divd(reset,clkin,clkout); input reset,clkin; output clkout; parameter divdWIDTH=1; parameter divdFACTOR=1; reg clkout; reg [divdWIDTH:0] cnt; always @ (posedge reset or posedge clkin) if(reset) begin

文档评论(0)

1亿VIP精品文档

相关文档