多重Switchを使いif文の実装

조회 수: 6 (최근 30일)
maruti
maruti 2019년 12월 3일
답변: Shoumei 2019년 12월 3일
Switchブロックを使いif文を実装していますが、
条件が同じ幅で増加する条件でSwitchブロックを何個も並列で繋げるのはさすがにきれいには見えない、
読みにくくなるため質問します。
下記のif文を例としたら簡単に実装する方法は何がありますか?
always@(posedge clk or negedge resetn)begin
if(~resetn)begin
x<=4'b0000;
end
if(a==1)
x<=4'b0001;
else if(a==2)
x<=4'b0001;
else if(a==3)
x<=4'b0010;
else if(a==4)
x<=4'b0100;
else if(a==5)
x<=4'b1000;
else if(a==6)
x<=4'b1001;
.....
end
このように同じ幅を持つ条件がある場合ただ単にSwitchブロックを並ばせるしかないのでしょうか?

채택된 답변

Shoumei
Shoumei 2019년 12월 3일
HDL Coderのご質問でしょうか?ご質問または製品欄に何の製品の質問か書いておいたほうが良いですよ。
MATLAB Functionブロックを使うと良いです。
こんなMATLABコードから
function x = fcn(a)
if a ==1
x = fi(1, 0, 4, 0);
elseif a==2
x = fi(1, 0, 4, 0);
elseif a==3
x = fi(2, 0, 4, 0);
elseif a==4
x = fi(4, 0, 4, 0);
elseif a==5
x = fi(8, 0, 4, 0);
else
x = fi(9, 0, 4, 0);
end
こんなVerilogが生成できます。
always @(a) begin
if (a == 8'd1) begin
x_1 = 4'b0001;
end
else if (a == 8'd2) begin
x_1 = 4'b0001;
end
else if (a == 8'd3) begin
x_1 = 4'b0010;
end
else if (a == 8'd4) begin
x_1 = 4'b0100;
end
else if (a == 8'd5) begin
x_1 = 4'b1000;
end
else begin
x_1 = 4'b1001;
end
 end
リセットが必要であれば、FFの記述をpersistentを使って追加しましょう。

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 HDL Coder 入門에 대해 자세히 알아보기

제품


릴리스

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!