【问题标题】:Verilog count odd and even numbers in ramVerilog计算ram中的奇数和偶数
【发布时间】:2016-11-25 06:22:37
【问题描述】:

我正在使用 quartus 2 9.1。我在 verilog 上有一个单端口 RAM 程序,我添加了 reg

偶数

按第一位检查是奇数还是偶数,求和时为 1 或 0。我需要通过数据输入在ram中输入16个数字,然后计算有多少奇数和偶数。但我尝试了类似的东西:

output wire [4:0] count;
count = count + data[0]; //to count odd numbers, then i could take away from 16 and get even number - in simulation its just 0 or 1..

或类似的东西:

output wire [4:0] count;
always @*
begin
if(data[0])
even=1;
else
    begin
    even=0;
    count = count + 1;
    end
end

但计数不想显示奇数或偶数的 sumaliton 数。我的代码:

   module kok 
( 
input [7:0] data, 
input [5:0] addr, 
input we, clk, 
output [7:0] q, 
output reg even 
); 

// Declare the RAM variable 
reg [7:0] ram[63:0]; 

// Variable to hold the registered read address 
reg [5:0] addr_reg; 

always @ (posedge clk) 
begin 
// Write 
if (we) 
ram[addr] <= data; 

addr_reg <= addr; 

end 

always @(posedge data) 
begin 
even = data[0]; 
end 

// Continuous assignment implies read returns NEW data. 
// This is the natural behavior of the TriMatrix memory 
// blocks in Single Port mode. 
assign q = ram[addr_reg]; 

endmodule

【问题讨论】:

    标签: verilog


    【解决方案1】:

    我对您的问题的理解是您想要一个输出 count 信号,该信号计算您有多少次偶数。

    创建一个顶层

    module top (
         input [7:0] data, 
         input [5:0] addr, 
         input we
    );
      reg clk= 1;
      initial begin
        forever #5 clk = ~clk;
      end
    
      reg reset_count = 0;
      initial begin
        #5 reset_count = 1'b1;
        #20 reset_count = 1'b0;
      end
    
      kok u_kok (.clk(clk),
                 .data(data),
                 .addr(addr),
                 .we(we),
                 .reset_count(reset_count)
                 );
    endmodule
    

    将此添加到module_kok

    module kok 
    ( 
    input       reset_count,
    input [7:0] data, 
    input [5:0] addr, 
    input we, clk, 
    output [7:0] q, 
    output reg even,
    output reg [4:0] count
    ); 
    
    // Declare the RAM variable 
    reg [7:0] ram[63:0]; 
    
    // Variable to hold the registered read address 
    reg [5:0] addr_reg; 
    
    always @ (posedge clk) 
    begin 
    // Write 
    if (we) 
      ram[addr] <= data; 
    addr_reg <= addr; 
    end 
    
    always @(posedge clk) 
    begin
      even <= data[0]; 
    end
    
      always @(posedge even or posedge reset_count)
    begin
      if (reset_count) begin
        count <= 'h0;
      end
      else begin
        count <= count+1'b1;
      end
    end
    
    
    // Continuous assignment implies read returns NEW data. 
    // This is the natural behavior of the TriMatrix memory 
    // blocks in Single Port mode. 
    assign q = ram[addr_reg]; 
    
    endmodule
    

    请注意,在计数器溢出之前,您只能数到 2**5=32。

    这是一个工作示例:https://www.edaplayground.com/x/qRs

    【讨论】:

    • 你好,谢谢你的回答,但在模拟中我得到了这个:IMGUR
    • 如何连接时钟?)
    • 你在哪里实例化你的模块?
    • 在笔记本上的 quartus 2 9.1 SP2 中,verilog hdl
    • 好吧,我不是这个意思。我建议你先去阅读一些关于verilog的教程和入门课程。您需要一个顶级模块来实例化您的模块 kok。然后你挂上你的时钟。如果您在 FPGA 上执行此操作,您可以通过其中一个引脚连接时钟输入。您如何切换数据输入?您需要类似地切换时钟...
    【解决方案2】:

    计数器需要处于时钟进程中(即在始终@posedge clk 中)。因此,计数器也需要是 reg(而不是线)。您还需要弄清楚哪些条件应该重新启动您的计数器,以及是否需要考虑溢出条件等。这取决于您的实际使用情况。

    【讨论】:

    • 我怎样才能知道那里的情况? module kok ( input [7:0] data, input [5:0] addr, input we, clk, output [7:0] q, output reg odd, output [7:0] qd ); reg [7:0] cnt; assign qd = cnt; reg [7:0] ram[63:0]; reg [5:0] addr_reg; always @* begin odd = data[0]; end always @ (posedge clk) begin if(odd) cnt = cnt + 1; // Write if (we) ram[addr] &lt;= data; addr_reg &lt;= addr; end assign q = ram[addr_reg]; endmodulesimulation screen
    • 好吧,如果你想知道计数器应该在什么条件下被重置,你需要知道你希望你的计数器如何工作。例如,您说您应该计算 16 个操作,但您的模块似乎没有输入指示这 16 个操作何时完成?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    相关资源
    最近更新 更多