始終塊(組合)【Always blocks(combinational)】
答案:
Always blocks (clocked)
答案:
module top_module(input clk,input a,input b,output wire out_assign,output reg out_always_comb,output reg out_always_ff );assign out_assign=a^b;always@(*)beginout_always_comb=a^b;end always@(posedge clk)beginout_always_ff<=a^b;end endmodule
注意:
^代表或非
時序邏輯使用非阻塞語句<=(并行執行)在同一時間下一起運行,所以是時序
組合邏輯使用阻塞語句=(按順序執行)
lf statement
答案:
module top_module(input a,input b,input sel_b1,input sel_b2,output wire out_assign,output reg out_always ); always@(*)beginif(sel_b1==1'b1&sel_b2==1'b1)beginout_always=b;endelsebeginout_always=a;endendassign out_assign=(sel_b1==1'b1&sel_b2==1'b1)?b:a;endmodule
lf statement latches
Case statement
答案:
module top_module ( input [2:0] sel, input [3:0] data0,input [3:0] data1,input [3:0] data2,input [3:0] data3,input [3:0] data4,input [3:0] data5,output reg [3:0] out );//always@(*) begin // This is a combinational circuitcase(sel)0:out=data0;1:out=data1;2:out=data2;3:out=data3;4:out=data4;5:out=data5;default: out = 0; // 可替換為 out <= 0;endcaseendendmodule
注意:
- 組合邏輯中 :優先使用
=
,保持代碼清晰性(顯式表示順序邏輯)。 - 時序邏輯中 :始終使用
<=
,避免競爭條件。 - 團隊協作時 :統一賦值風格,減少潛在錯誤。
Priority encoder
答案:
// synthesis verilog_input_version verilog_2001
module top_module (input [3:0] in,output reg [1:0] pos
);always @(*) begincase (in)4'b0000: pos = 2'd0;4'b0001: pos = 2'd0;4'b0010: pos = 2'd1;4'b0011: pos = 2'd0;4'b0100: pos = 2'd2;4'b0101: pos = 2'd0;4'b0110: pos = 2'd1;4'b0111: pos = 2'd0;4'b1000: pos = 2'd3;4'b1001: pos = 2'd0;4'b1010: pos = 2'd1;4'b1011: pos = 2'd0;4'b1100: pos = 2'd2;4'b1101: pos = 2'd0;4'b1110: pos = 2'd1;4'b1111: pos = 2'd0;default: pos = 2'd0; // 可選,因為上面已經覆蓋了所有情況endcase
endendmodule
?很蠢的枚舉方法,暫且不知道其他方法怎么寫