2017-10-13 1493 views
0

我在想什麼是取8個1位輸入並計數1。然後代表那些1。在Verilog中,在8位輸入中計數並輸出1的個數?

01010111應該輸出0101(有來自輸入五1的)

module 8to4 (in,out,hold,clk,reset); 
input [7:0] in; //1 bit inputs 
reg [7:0] hold; //possible use for case statement 
output [3:0] out; //Shows the count of bits 

always @(clk) 
    begin 
    out = in[0] + in[1] + in[2] + in[3] + in[4] + in[5] + in[6] + in[7]; //Adds the inputs from testbench and outputs it 
    end 
endmodule 

問題:

  • 是不是正確的方式有8個1位輸入?或者我需要將每個變量聲明爲一位ex:輸入A,B,C,D,E,F,G,H;
  • 如果我上面的代碼是接近正確的,那是出去顯示1的計數的正確方法?我需要一個案例陳述嗎?

我對Verilog非常陌生,所以我甚至不想考慮一個測試平臺。

回答

0

你寫它的方式很可能是因爲它可以更容易參數化的比特數寫它的更好的方法。但從技術上講,你有一個8位輸入。

module 8to4 #(parameter WIDTH=8) (input [WIDTH-1:0] in, 
         output reg [3:0] out,hold, 
         input clk,reset); 
    reg [WIDTH-1:0] temp; 
    integer ii; 
    always @(clk) 
    begin 
     temp = 0; 
     for(ii=0; ii<WIDTH; i = i + 1) 
     temp = temp + in[ii]; 
     out <= temp; 
    end 
endmodule 
+0

對不起,我還是新來此。你能否解釋一下'#(WIDTH-8)'?還有一堆谷歌搜索'整數二;'老實說,我不知道Verilog可以做這樣的整數,我不知道如何編寫一個測試臺。 –

+0

對不起,這是一個錯字。我正在參數化您的模塊,以便它可以用於不同大小的輸入。當WIDTH = 8時,for循環與原始表達式完全相同。綜合工具將我的循環展開到您的表達式中。但是現在它已經被參數化了,你可以重寫'WIDTH'到16或者其他什麼。 –

0

從邏輯上說,代碼是正確的。

但是你可以改善它像下面這樣。

  • out設爲reg,因爲您在過程分配中使用它。
  • 使用reset。理想情況下,任何代碼都應該具有重置狀態,這在代碼中是缺少的。
  • 聲明hold,clk & reset端口的方向(輸入/輸出),該端口當前未指定。
  • 正如戴夫提到的,您可以使用parameters代碼。