编辑:我忘了加一个i =i+1,代码工作了,但对于0值还是不行,这就是我现在要解决的问题。
我试图模拟一个3位数的7段LED阵列,所以我正在接受一个常量输入(在这种情况下,1,2,3......),这是二进制的,并把它变成二进制编码的十进制,然后把它放在7段的模块中来显示数字。
我的代码一直显示XXXXXX,而不是11111111,而11111111应该作为默认情况下的语句显示。如果有人知道可能是什么原因,请告诉我。
下面是我用来显示结果的代码。
module m_top();
reg clk =0;
reg[7:0] eight_bit_value;
wire[3:0] r_in;//ones
wire[3:0] r2_in;//tens
wire[3:0] r3_in;//hundreds
wire [6:0] w_led;
wire [6:0] w2_led;
wire [6:0] w3_led;
integer i;
always#5 clk=~clk;//clock
initial $display (" gfedcba gfedcba");
double_dabble segmentbits(clk,eight_bit_value,r_in,r2_in,r3_in);
initial begin
eight_bit_value<= 8'd0; i = 0;
#1 $display("%3d -> %b %b %b %b", i,eight_bit_value, w_led,w2_led,w3_led);
for(i = 1; i <= 99; i = i + 1) begin
#1000 eight_bit_value <= eight_bit_value + 1;
#1000 $display("%3d ->%b %b %b %b", i, eight_bit_value,w_led,w2_led,w3_led);
end
end
//double_dabble segmentbits(clk,eight_bit_value,r_in,r2_in,r3_in);
m_7segled m_7segled1(r_in, w_led);
m_7segled m_7segled2(r2_in,w2_led);
m_7segled m_7segled3(r3_in,w3_led);
这是我在代码中使用的2个函数。
module double_dabble(input clk,
input [7:0] original_value,
output reg[3:0] ones,
output reg[3:0] tens,
output reg[3:0] hundreds);
reg[3:0] i=0;
reg[19:0] shift_register =0;
reg[3:0] temp_ones=0;
reg[3:0] temp_tens=0;
reg[3:0] temp_hundreds=0;
reg[7:0]temp_original_value=0;
always@(posedge clk)
begin//as long as value doesnt change)
if(i==0&(temp_original_value !=original_value))
begin
shift_register = 20'd0;
temp_original_value = original_value;
//setting up the register to be shifted
temp_hundreds = shift_register[19:16];
temp_tens =shift_register[15:12];
temp_ones=shift_register[11:8];
shift_register[7:0] = original_value;
i=i+1;// I FORGOT TO ADD THIS , NOW I DID AND IT WORKS FOR >0 but not for 0;
end
if(i>0 & i<9)
begin
//check if they are greater than 5 if so add 3
if(temp_hundreds>=5) temp_hundreds=temp_hundreds+3;
if(temp_tens>=5) temp_tens=temp_tens+3;
if(temp_ones>=5) temp_ones=temp_ones+3;
shift_register[19:8] = {temp_hundreds,temp_tens,temp_ones};
shift_register= shift_register<<1;
temp_hundreds = shift_register[19:16];
temp_tens =shift_register[15:12];
temp_ones=shift_register[11:8];
i=i+1;
end
if(i==9)
begin
i=0;
hundreds = temp_hundreds;
tens=temp_tens;
ones=temp_ones;
end
end
endmodule
七段模块是这样的。
module m_7segled (w_in,r_led);
input wire [3:0] w_in;
output reg [6:0] r_led;
always@(*) begin
case (w_in%10)
4'd0 : r_led <= 7'b1000000;
4'd1 : r_led <= 7'b1111001;
4'd2 : r_led <= 7'b0100100;
4'd3 : r_led <= 7'b0110000;
4'd4 : r_led <= 7'b0011001;
4'd5 : r_led <= 7'b0010010;
4'd6 : r_led <= 7'b0000010;
4'd7 : r_led <= 7'b1011000;
4'd8 : r_led <= 7'b0000000;
4'd9 : r_led <= 7'b0010000;
default : r_led <= 7'b1111111;
endcase
end
endmodule
你的程序充满了verilog和编程错误。我发现的错误很少。
操作符 &
不等于操作者 &&
的if语句中。它的工作方式不同,优先顺序也不同。所以,你的 if
语句在任何情况下都不能正常工作。你用了 &
在所有条件语句中。
在你的语句中 i>0 & i<9
应该是这样 i >= 0 && i < 9
失踪 >=
造成你 x
问题(结合#1)。
你错用了 blocking
的顺序逻辑中的作业。double_dabble
. 其中一些应该是 non-blocking
.
你错误地使用了变量初始化。这在模拟和一些FPGA中可能有效,但在现实世界中不起作用。你需要重置。
您不正确地使用了 non-blocking
赋值的组合逻辑 m_7segled
他们都应该 blocking
.
回答评论。关于 reg
初始化。
使用诸如 reg[3:0] i=0;
虽然在verilog中是合法的,但它会给你带来合成问题。它们可以在一些FPGA或仿真系统中正确合成,但不会被原理图合成工具合成。所以,在一般情况下,你应该使用一个复位信号,用复位来初始化这些变量,类似于下面的东西。
always @(posedge clk) begin
if (reset)
i <= 0;
else
i <= i + 1;
end