由于课程设计中用到七段译码显示器的使用,下面雅乐网将部分资料整理如下:
basys2开发板提供4个七段译码显示器(对应的FPGA引脚分别表示:AN0-AN3对应选中那一个显示器、L14~N13对应要显示的值);
F12 J12 M13和K14分别对应控制哪个显示器显示与否,而L14到N13 也就是CA到CG以及DP控制8个段显示,8个段指的是每个数字7画加上小数点
而我们可以用这8个位对应 来形成数字的显示效果
比如数字1 显然CB和CC为显示状态 其余6个位不显示状态。
首先写一个模块实现数字到这种图形的转化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//七段译码器 module qiduanyimaqi(q_num, q_out); input[3:0] q_num; output[7:0] q_out; reg[7:0] q_out; always @(q_num) begin case(q_num) 4'b0000:q_out = 8'b00000011; 4'b0001:q_out = 8'b10011111; 4'b0010:q_out = 8'b00100101; 4'b0011:q_out = 8'b00001101; 4'b0100:q_out = 8'b10011001; 4'b0101:q_out = 8'b01001001; 4'b0110:q_out = 8'b01000001; 4'b0111:q_out = 8'b00011011; 4'b1000:q_out = 8'b00000001; 4'b1001:q_out = 8'b00001001; endcase end endmodule |
动态扫描
由于四个显示数字的地方使用同一个8位来控制,所以如果四个位同时显示,一定是显示同一个数字。那么怎么实现四个数字显示不同的数字的效果呢?答案就是动态扫描。
数码显示板上一共有8 个数码管,如果按照传统的数码管驱动方式(静态扫描方式),则需要8 个七段译码器进行驱动,这样既浪费资源,有时电路工作也不可靠。所以现在最常见的数码管驱动电路已经不用上述的静态扫描方式了,而是采用动态扫描显示的方式,这种方式只需一个译码器就可以实现电路正常、可靠的工作,这样大大节省资源。
动态数码扫描显示方式是利用了人眼的视觉暂留效应,把八个数码管按一定顺序(从左至右或从右至左)进行点亮,当点亮的频率(即扫描频率)不大时,我们看到的是数码管一个个的点亮,然而,当点亮频率足够大时,我们看到的不再是一个一个的点亮,而是全部同时显示(点亮),与传统方式得到的视觉效果完全一样。因此我们只要给数码管这样一个扫描频率,那么就可以实现两个以上的数码管同时点亮。而这个频率我们可以通过一个计数器来产生,只要计数频率足够大,就可以实现我们的要求。事实上,因为数码管点亮不是瞬间就可以的,它也需要一定的时间,该时间与数码管的选择有关系。为了折中这一对矛盾,实验中一般可将计数频率选择在100Hz左右肯定可以满足上述两个要求。
频率不能太大!如果太大显示效果是4个数字在4个屏幕上同时显示,都乱套了!效果如下
不要用basys板子默认的时钟,分几次频再用,雅乐网用的是分了9次
实现代码如下 d_num1到d_num4分别为要显示的4个数字。d1_wx和d1_out分别绑定位选和8段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//七段译码器显示处理模块 用于将num1,num2,num3和num4的数字显示在屏幕上 module dtsm(MCLK9, d_num1, d_num2, d_num3, d_num4, d1_wx, d1_out); input MCLK9; input[3:0] d_num1; input[3:0] d_num2; input[3:0] d_num3; input[3:0] d_num4; output[3:0] d1_wx; output[7:0] d1_out; reg[3:0] d1_wx = 4'b1110; wire[7:0] d1_out; reg[3:0] d_tmp_num; always @(posedge MCLK9) begin case(d1_wx) 4'b1110:begin d_tmp_num = d_num2; d1_wx = 4'b1101; end 4'b1101:begin d_tmp_num = d_num3; d1_wx = 4'b1011; end 4'b1011:begin d_tmp_num = d_num4; d1_wx = 4'b0111; end 4'b0111:begin d_tmp_num = d_num1; d1_wx = 4'b1110; end default: d1_wx = 4'b1110; endcase end qiduanyimaqi qiduanyimaqi(d_tmp_num, d1_out); endmodule |
引脚绑定代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#4个七段译码器 NET "d1_wx[3]" LOC = F12; NET "d1_wx[2]" LOC = J12; NET "d1_wx[1]" LOC = M13; NET "d1_wx[0]" LOC = K14; NET "d1_out[7]" LOC = L14; NET "d1_out[6]" LOC = H12; NET "d1_out[5]" LOC = N14; NET "d1_out[4]" LOC = N11; NET "d1_out[3]" LOC = P12; NET "d1_out[2]" LOC = L13; NET "d1_out[1]" LOC = M12; NET "d1_out[0]" LOC = N13; |
我按照你的程序试了试,出错了,编译没通过
不对啊
请问数码管中间冒号UCF是什么?
不好意思啊 我做这个实验已经过去好久了 当时也没用到冒号 百度了一下似乎也没发现是哪个引脚控制的[可怜]
嗯,谢谢我找了半天也找不着控制冒号的