Заявление о деле Verilog
case
Оператор проверяет, соответствует ли данное выражение одному из других выражений в списке, и соответственно переходит. Обычно он используется для реализации мультиплексора. Конструкция if-else может оказаться непригодной, если необходимо проверить множество условий, и будет синтезирована в кодировщик с приоритетом вместо мультиплексора.
Синтаксис
Дело Verilog оператор начинается с case
ключевое слово и заканчивается endcase
ключевое слово. Выражение в скобках оценивается ровно один раз и сравнивается со списком альтернатив в том порядке, в котором они написаны, и выполняются операторы, для которых альтернатива соответствует данному выражению. Блок из нескольких операторов должен быть сгруппирован и находиться в пределах begin
и end
.
// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)
case_item1 : <single statement>
case_item2,
case_item3 : <single statement>
case_item4 : begin
<multiple statements>
end
default : <statement>
endcase
Если ни один из элементов case не соответствует заданному выражению, операторы в пределах default
пункт выполнен. default
оператор является необязательным, и может быть только один default
заявление в заявлении по делу. Операторы case могут быть вложенными.
Выполнение выйдет из блока case без каких-либо действий, если ни один из элементов не соответствует выражению и default
выписка не дается.
Пример
Модуль проектирования, показанный ниже, имеет 2-битный сигнал выбора для маршрутизации одного из трех других 3-битных входов к вызываемому выходному сигналу. case
оператор используется для назначения правильного ввода для вывода на основе значения sel. Так как sel — это 2-битный сигнал, он может иметь 2
2
комбинации, от 0 до 3. Оператор по умолчанию помогает установить вывод равным 0, если sel равно 3.
module my_mux (input [2:0] a, b, c, // Three 3-bit inputs
[1:0] sel, // 2-bit select signal to choose from a, b, c
output reg [2:0] out); // Output 3-bit signal
// This always block is executed whenever a, b, c or sel changes in value
always @ (a, b, c, sel) begin
case(sel)
2'b00 : out = a; // If sel=0, output is a
2'b01 : out = b; // If sel=1, output is b
2'b10 : out = c; // If sel=2, output is c
default : out = 0; // If sel is anything else, out is always 0
endcase
end
endmodule
Схема оборудования
Код rtl разработан для получения аппаратной схемы, представляющей мультиплексор 4:1.
Посмотрите, что выход равен нулю, когда sel равен 3, и соответствует назначенным входам для других значений.
Журнал моделированияncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0 [10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5 [20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5 [30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1 [40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
В операторе case сравнение завершается успешно только тогда, когда каждый бит выражения соответствует одной из альтернатив, включая 0, 1, x и z. В показанном выше примере, если любой из битов в sel равен x или z, default
оператор будет выполнен, потому что ни одна из других альтернатив не совпала. В таком случае на выходе будут все нули.
ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
Если оператор case в дизайне имеет x и z в альтернативах элемента case, результаты будут совсем другими.
module my_mux (input [2:0] a, b, c,
[1:0] sel,
output reg [2:0] out);
// Case items have x and z and sel has to match the exact value for
// output to be assigned with the corresponding input
always @ (a, b, c, sel) begin
case(sel)
2'bxz : out = a;
2'bzx : out = b;
2'bxx : out = c;
default : out = 0;
endcase
end
endmodule
Журнал моделирования ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5 ncsim: *W,RNQUIE: Simulation is complete.
Чем case отличается от if-else ?
case
оператор отличается от if-else-if
двумя способами:
- Выражения, заданные в
if-else
блока являются более общими, в то время как вcase
блок, одно выражение сопоставляется с несколькими элементами case
даст окончательный результат, если в выражении есть значения X и Z
Verilog