#system #quartus #digital
#verilog #system-verilog #quartus #цифровой
Вопрос:
Я пытаюсь разработать логический калькулятор, который может складывать, умножать, делить, … но я застрял на 1 части, когда пытаюсь запустить его на плате DE 10, он не действует как логика, хотя моя логика заключается в том, что при count = 0 операнд A будет иметь шестнадцатеричное значение 4,5и count = 1 DoOpt будет равен 2, а count = 2 операнд B будет отображаться в шестнадцатеричном формате 1,0, затем счетчик будет сброшен. Однако, когда я запускаю, он показывает только операнд B. можете ли вы понять, что не так с моим кодом?
module group_project (
input logic clk, Set, AC,
input logic [3:0] Operand,
input logic [2:0] DoOp,
output logic [6:0] Seg5, Seg4, Seg3, Seg2, Seg1, Seg0
);
logic [1:0] count;
always_ff@(posedge clk) begin
if(!AC) begin
Seg5 = 7'b000_1000;
Seg4 = 7'b000_0110;
Seg3 = 7'b000_1000;
Seg2 = 7'b100_0000;
Seg1 = 7'b001_0001;
Seg0 = 7'b011_1111;
count <= 2'b00;
end
if(!Set amp;amp; count == 2'b00) begin
count <= count 1;
Seg3 = 7'b111_1111;
Seg2 = 7'b111_1111;
Seg1 = 7'b111_1111;
Seg0 = 7'b111_1111;
if(Operand < 4'b1010) begin
Seg5 = 7'b100_0000;
case (Operand)
4'b0000: Seg4 = 7'b100_0000;
4'b0001: Seg4 = 7'b111_1001;
4'b0010: Seg4 = 7'b010_0100;
4'b0011: Seg4 = 7'b011_0000;
4'b0100: Seg4 = 7'b001_1001;
4'b0101: Seg4 = 7'b001_0010;
4'b0110: Seg4 = 7'b000_0010;
4'b0111: Seg4 = 7'b111_1000;
4'b1000: Seg4 = 7'b000_0000;
4'b1001: Seg4 = 7'b001_0000;
endcase
end
else begin
Seg5 = 7'b111_1001;
case (Operand)
4'b1010: Seg4 = 7'b100_0000;
4'b1011: Seg4 = 7'b111_1001;
4'b1100: Seg4 = 7'b010_0100;
4'b1101: Seg4 = 7'b011_0000;
4'b1110: Seg4 = 7'b001_1001;
4'b1111: Seg4 = 7'b001_0010;
endcase
end
end
if(!Set amp;amp; count == 2'b01) begin
count <= count 1;
Seg5 = 7'b111_1111;
Seg4 = 7'b111_1111;
Seg3 = 7'b111_1111;
Seg1 = 7'b111_1111;
Seg0 = 7'b111_1111;
case(DoOp)
3'b001: Seg2 = 7'b111_1001;
3'b010: Seg2 = 7'b010_0100;
3'b011: Seg2 = 7'b011_0000;
3'b100: Seg2 = 7'b001_1001;
3'b101: Seg2 = 7'b001_0010;
endcase
end
/*else if(!Set amp;amp; count == 2'b10) begin
Seg5 = 7'b111_1111;
Seg4 = 7'b111_1111;
Seg3 = 7'b111_1111;
Seg2 = 7'b111_1111;
count <= count;
if(Operand < 4'b1010) begin
Seg1 = 7'b100_0000;
case (Operand)
4'b0000: Seg0 = 7'b100_0000;
4'b0001: Seg0 = 7'b111_1001;
4'b0010: Seg0 = 7'b010_0100;
4'b0011: Seg0 = 7'b011_0000;
4'b0100: Seg0 = 7'b001_1001;
4'b0101: Seg0 = 7'b001_0010;
4'b0110: Seg0 = 7'b000_0010;
4'b0111: Seg0 = 7'b111_1000;
4'b1000: Seg0 = 7'b000_0000;
4'b1001: Seg0 = 7'b001_0000;
endcase
end
else begin
Seg1 = 7'b111_1001;
case (Operand)
4'b1010: Seg0 = 7'b100_0000;
4'b1011: Seg0 = 7'b111_1001;
4'b1100: Seg0 = 7'b010_0100;
4'b1101: Seg0 = 7'b011_0000;
4'b1110: Seg0 = 7'b001_1001;
4'b1111: Seg0 = 7'b001_0010;
endcase
end
end
end
endmodule
Ответ №1:
Есть что-то, что связано с AC
и Set
.
Если AC
используется только в качестве начального сброса, и после этого Set
остается постоянным низким, то count
, наконец, останется на 2. Он длится всего 1 clk
цикл для count
= 0 и 1. Таким образом, пока clk
он достаточно быстр, вы не сможете заметить count
= 0 и 1 и увидите только count
состояние = 2.
Возможно, вам нужно AC
периодически отключать и контролировать Set
, чтобы видеть переход каждого count
состояния.
Комментарии:
1. можете ли вы показать мне небольшой пример этого? Я не могу продумать логику этого
2. @Hieu Не могли бы вы опубликовать свой тестовый стенд? Или опишите синхронизацию переменного тока и Set. Потому что эти 2 управляющих сигнала важны и выводятся за пределы вашего модуля.