本帖最后由 Zhao_kar 于 2023-12-8 23:50 编辑
【Tang Primer25K Dock】二——拨码开关和LED的简单测试
备注:
- 按照测评计划来,这一节先把拨码开关和led都测试一遍,然后接下来是数码管的测试,后续应该分成两节,这里先提前说一下,这个数码管和我之前接触到的数码管设计都不太一样,之前我接触到的数码管,都是一个数码管由一个位选来控制,位选实际上就是控制亮灭的,也就是说,如果一个4个数码管的,根据原理来(后面讲),我给一个值,四个数码管若全部为亮,,则四个数码管会同时显示一个值,所以为了不一样,需要动态显示。
- 然而这个数码管,没办法控制亮灭,起码目前我没搞明白,他只有一个位选信号,高低电平分别决定左边和右边哪个亮,所以要想让他像其他的数码管同时显示一个值,别的数码管不需要动态显示电路,而这个设计是默认了你必须使用动态显示,所以后续两节分别为:
- 一节单独测试数码管从0-9+led的辅助显示的测试,同时计数满一个周期,切换到下一个数码管显示;
- 一节为数码管的动态显示电路,从00到11,从而到99,去做一个基础的动态显示测试,后续的时钟再考虑别的,然后我是打算画一个数码管模块,这个只有两个和我预期的数字时钟有点差别。
- 然后本节是一个4_16的译码测试,使用四个拨码开关,分别赋予+1、2、4、8的能力,然后通过16个led去显示结果
一、译码的基本原理的简单解释
- 先从3_8译码入手,3_8译码其实就是把一个3位的二进制数,转换成8个值,说白了就是类似数值转换,比如3位2进制的所有值,换成十进制,一个道理,换句话说,你可以拿这个3位二进制表示0-7,但是这个只是一个换位的理解,因为实际上一般译码的操作结果并不是这样,比如3‘b000,实际得到的应该是0000_0001,而3’b111,得到的是1000_0000,这个其实是独热码,实际上你的编码方式译码方式可以不用按照这个。
- 而本节的4_16,是利用现有模块做的一个简单测试,这一节甚至没有时序,上一节怎么说都用了一个时序的计数,这一节就是纯粹的组合逻辑电路。
二、代码和注释
-
- module SwitchToLED(
- input [3:0] switch,
- input [3:0] button,
- output reg [15:0] leds
- );
-
-
- always @(*) begin
- case (switch)
- 4'b0000: leds = 16'b1111111111111110;
- 4'b0001: leds = 16'b1111111111111101;
- 4'b0010: leds = 16'b1111111111111011;
- 4'b0011: leds = 16'b1111111111110111;
- 4'b0100: leds = 16'b1111111111101111;
- 4'b0101: leds = 16'b1111111111011111;
- 4'b0110: leds = 16'b1111111110111111;
- 4'b0111: leds = 16'b1111111101111111;
- 4'b1000: leds = 16'b1111111011111111;
- 4'b1001: leds = 16'b1111110111111111;
- 4'b1010: leds = 16'b1111101111111111;
- 4'b1011: leds = 16'b1111011111111111;
- 4'b1100: leds = 16'b1110111111111111;
- 4'b1101: leds = 16'b1101111111111111;
- 4'b1110: leds = 16'b1011111111111111;
- 4'b1111: leds = 16'b0111111111111111;
- default: leds = 16'b1111111111111111;//默认状态下全部灭灯
- endcase
- end
-
- endmodule
-
-
-
三、引脚约束
引脚为16个led和4个拨码开关,具体见下图(附带cst)
-
-
-
-
-
-
-
-
-
- IO_LOC "leds[15]" K5;
- IO_PORT "leds[15]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[14]" L5;
- IO_PORT "leds[14]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[13]" L11;
- IO_PORT "leds[13]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[12]" K11;
- IO_PORT "leds[12]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[11]" E10;
- IO_PORT "leds[11]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[10]" E11;
- IO_PORT "leds[10]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[9]" A10;
- IO_PORT "leds[9]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[8]" A11;
- IO_PORT "leds[8]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[7]" C10;
- IO_PORT "leds[7]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[6]" C11;
- IO_PORT "leds[6]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[5]" B10;
- IO_PORT "leds[5]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[4]" B11;
- IO_PORT "leds[4]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[3]" D10;
- IO_PORT "leds[3]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[2]" D11;
- IO_PORT "leds[2]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[1]" G10;
- IO_PORT "leds[1]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "leds[0]" G11;
- IO_PORT "leds[0]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
- IO_LOC "button[3]" F5;
- IO_PORT "button[3]" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
- IO_LOC "button[2]" G7;
- IO_PORT "button[2]" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
- IO_LOC "button[1]" H7;
- IO_PORT "button[1]" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
- IO_LOC "button[0]" J5;
- IO_PORT "button[0]" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
- IO_LOC "switch[3]" G5;
- IO_PORT "switch[3]" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
- IO_LOC "switch[0]" H5;
- IO_PORT "switch[0]" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
- IO_LOC "switch[1]" H8;
- IO_PORT "switch[1]" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
- IO_LOC "switch[2]" G8;
- IO_PORT "switch[2]" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
-
四、补充说明
1、上一节一个东西我忘记说了,就是涉及到时钟的,请在约束部分进行如下设置,不如无法编译,然后这一节是组合逻辑的,其实不需要这个,但是后续时序都要按这个改,后续就不强调了。
2、附带演示视频(背景可能吵,请静音观看)
播放器加载失败: 未检测到Flash Player,请到
安装
演示