如何在 7 段显示器的捆绑阳极上显示不同的数据

  • 本文关键字:显示 数据 显示器 verilog
  • 更新时间 :
  • 英文 :

module main(
input [3:0] A, [3:0] B, S, clk,
output CA, CB, CC, CD, CE, CF, CG, [3:0] an
);
reg CA, CB, CC, CD, CE, CF, CG;
reg counter;
reg [3:0] an;
always @ (posedge clk)
    if (counter == 0) begin
        CA = (B == 4'd0 || B == 4'd2 || B == 4'd3 || B == 4'd5 || B == 4'd6 || B == 4'd7 || B == 4'd8 || B == 4'd9 || B == 4'd10 || B == 4'd12 || B == 4'd14 || B == 4'd15) ? 1'b0 : 1'b1;
        CB = (B == 4'd0 || B == 4'd1 || B == 4'd2 || B == 4'd3 || B == 4'd4 || B == 4'd7 || B == 4'd8 || B == 4'd9 || B == 4'd10 || B == 4'd13) ? 1'b0 : 1'b1;
        CC = (B == 4'd0 || B == 4'd1 || B == 4'd3 || B == 4'd4 || B == 4'd5 || B == 4'd6 || B == 4'd7 || B == 4'd8 || B == 4'd9 || B == 4'd10 || B == 4'd11 || B == 4'd13) ? 1'b0 : 1'b1;
        CD = (B == 4'd0 || B == 4'd2 || B == 4'd3 || B == 4'd5 || B == 4'd6 || B == 4'd8 || B == 4'd9 || B == 4'd11 || B == 4'd12 || B == 4'd13 || B == 4'd14) ? 1'b0 : 1'b1;
        CE = (B == 4'd0 || B == 4'd2 || B == 4'd6 || B == 4'd8 || B == 4'd10 || B == 4'd11 || B == 4'd12 || B == 4'd13 || B == 4'd14 || B == 4'd15) ? 1'b0 : 1'b1;
        CF = (B == 4'd0 || B == 4'd4 || B == 4'd5 || B == 4'd6 || B == 4'd8 || B == 4'd9 || B == 4'd10 || B == 4'd11 || B == 4'd12 || B == 4'd14 || B == 4'd15) ? 1'b0 : 1'b1;
        CG = (B == 4'd2 || B == 4'd3 || B == 4'd4 || B == 4'd5 || B == 4'd6 || B == 4'd8 || B == 4'd9 || B == 4'd10 || B == 4'd11 || B == 4'd13 || B == 4'd14|| B == 4'd15) ? 1'b0 : 1'b1;
        an[0] = counter;
        an[1] = ~counter;
        counter<= counter + 1;
    end
    else begin
        CA = (A == 4'd0 || A == 4'd2 || A == 4'd3 || A == 4'd5 || A == 4'd6 || A == 4'd7 || A == 4'd8 || A == 4'd9 || A == 4'd10 || A == 4'd12 || A == 4'd14 || A == 4'd15) ? 1'b0 : 1'b1;
        CB = (A == 4'd0 || A == 4'd1 || A == 4'd2 || A == 4'd3 || A == 4'd4 || A == 4'd7 || A == 4'd8 || A == 4'd9 || A == 4'd10 || A == 4'd13) ? 1'b0 : 1'b1;
        CC = (A == 4'd0 || A == 4'd1 || A == 4'd3 || A == 4'd4 || A == 4'd5 || A == 4'd6 || A == 4'd7 || A == 4'd8 || A == 4'd9 || A == 4'd10 || A == 4'd11 || A == 4'd13) ? 1'b0 : 1'b1;
        CD = (A == 4'd0 || A == 4'd2 || A == 4'd3 || A == 4'd5 || A == 4'd6 || A == 4'd8 || A == 4'd9 || A == 4'd11 || A == 4'd12 || A == 4'd13 || A == 4'd14) ? 1'b0 : 1'b1;
        CE = (A == 4'd0 || A == 4'd2 || A == 4'd6 || A == 4'd8 || A == 4'd10 || A == 4'd11 || A == 4'd12 || A == 4'd13 || A == 4'd14 || A == 4'd15) ? 1'b0 : 1'b1;
        CF = (A == 4'd0 || A == 4'd4 || A == 4'd5 || A == 4'd6 || A == 4'd8 || A == 4'd9 || A == 4'd10 || A == 4'd11 || A == 4'd12 || A == 4'd14 || A == 4'd15) ? 1'b0 : 1'b1;
        CG = (A == 4'd2 || A == 4'd3 || A == 4'd4 || A == 4'd5 || A == 4'd6 || A == 4'd8 || A == 4'd9 || A == 4'd10 || A == 4'd11 || A == 4'd13 || A == 4'd14|| A == 4'd15) ? 1'b0 : 1'b1;
        an[1] = counter;
        an[0] = ~counter;
        counter = 0;
    end
endmodule

这是我的代码,但我不能让它永远工作。
我不知道时钟信号是什么,我的教授从来没有教过我们,但他希望他的学生知道这一点。我正在使用具有数字 7 段显示的 Basys 3。为了使阳极[1]显示与阳极[0]不同的结果,我必须做什么?
请帮助我,谢谢你帮助我。

首先,您混合了 ANSI 和非 ANSI 端口样式,这推断Sclk是 4 位值。我建议你改变:

module main(
input [3:0] A, [3:0] B, S, clk, // S and clk are 4-bits here
output CA, CB, CC, CD, CE, CF, CG, [3:0] an
);
reg CA, CB, CC, CD, CE, CF, CG;
reg counter;
reg [3:0] an;

到下面的 ANSI 样式。IEEE Std 1364-1995 中要求非 ANSI。自IEEE Std 1364-2001起,增加了对ANSI的支持。许多人喜欢 ANSI,因为您可以在一行中定义端口名称、方向和类型,而非 ANSI 需要 3 行。

module main(
  input [3:0] A, B,
  input [3:0] S, // not sure if you intend S as 4-bits or 1-bit
  input clk, // clock is single bit
  output reg CA, CB, CC, CD, CE, CF, CG,
  output reg [3:0] an
);
reg counter; // you really want counter to be 1-bit wide?

对于同步逻辑,您应该使用非阻塞分配(<=(来避免模拟调度程序中的竞争条件。使用具有同步逻辑的阻塞分配(=(不会给你合成错误,但RTL和门可能会给出不同的功能结果。跨模拟器的 RTL 结果可能不同,即使在同一个模拟器中也是如此,具体取决于始终块之间的不确定处理顺序的编程方式。使用非阻塞分配(<=(进行同步逻辑功能不匹配几乎尿布。有关阻塞与非阻塞的更多信息,请阅读: Verilog 合成中的非阻塞分配、编码、杀人的样式!

仅供参考:你有很长的条件检查,? :运算符可以使用一些合成器创建显式复用器。您可能需要考虑使用 != 运算符并使用 ~! 进行反转。例:

CA = (B == 4'd0 || B == 4'd2 || B == 4'd3 || B == 4'd5 || B == 4'd6 || B == 4'd7 || B == 4'd8 || B == 4'd9 || B == 4'd10 || B == 4'd12 || B == 4'd14 || B == 4'd15) ? 1'b0 : 1'b1;

收件人:(这只是一个建议(

CA <= !(B !=4'd1 && B != 4'd4 && B != 4'd11 && B != 4'd13);

您也从不分配an[2]an[3],也从不使用S。如果未使用,则不要包含,否则您将收到有关它的警告消息。

最新更新