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 端口样式,这推断S
和clk
是 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
。如果未使用,则不要包含,否则您将收到有关它的警告消息。