2013-09-07 2 views
2

У меня есть следующий код verilog. Идея заключается в сохранении значения счетчика во время сброса. Тем не менее, я не уверен, будет ли он синтезироваться (памяти требуется синхронный сброс). Я получаю скрипты DRC, и память, bufreadaddr, bufreadval оптимизированы. Какие еще способы написать это?Verilog: Сохранять значение счетчика, если установлен сброс

module counter (clk,reset, d_out,laststoredvalue, bufreadaddr, bufreadval, resetcount) ; 
input clk ,reset ; 
input [5:0] resetcount; 

output [15:0] d_out; 
output [15:0] laststoredvalue; 
input [5:0] bufreadaddr; 
output [15:0] bufreadval; 
reg [15:0] bufreadval; 

reg [15:0] laststoredvalue; 

reg [15:0] d_out; 
reg [15:0] d_out_mem[63:0]; 

always @(negedge reset or posedge clk) begin 
     if (reset == 0) begin 
      d_out <= 16'h0000; 
      d_out_mem[resetcount] <= d_out; 
      laststoredvalue <= d_out; 
     end else begin 
       d_out <= d_out + 1'b1; 
      end 
end 

always @(bufreadaddr) 
     bufreadval = d_out_mem[bufreadaddr]; 


integer count; 
initial begin 
    count = 0; 
end 
always @(posedge clk) begin 
    count = count + 1; 
    //$display(count); 
end 


endmodule 
+0

Этот вопрос упоминается здесь: https://danluu.com/why-hardware-development-is-hard/ –

ответ

0

привет, я внесла небольшое изменение для вашего кода; добавлена ​​временная переменная для хранения вывода в регистре, которая сохранит предыдущее значение при сбросе;

module counter (clk,reset, d_out,laststoredvalue, bufreadaddr, bufreadval, resetcount) ; 
input clk ,reset ; 
input [5:0] resetcount; 

output [15:0] d_out; 
output [15:0] laststoredvalue; 
input [5:0] bufreadaddr; 
output [15:0] bufreadval; 
reg [15:0] bufreadval; 

reg [15:0] laststoredvalue; 
reg [15:0] temp; 
reg [15:0] d_out; 
reg [15:0] d_out_mem[63:0]; 

always @(negedge reset or posedge clk) begin 
     if (reset == 0) begin 

      d_out_mem[resetcount] = d_out; 
      laststoredvalue = temp; 
       d_out = #10 16'h0000; 
     end 
      else begin 

       d_out = d_out + 1'b1; 
        temp = d_out; 
      end 
end 

always @(bufreadaddr) 
     bufreadval = d_out_mem[bufreadaddr]; 

endmodule 

Остальной код такой же, как есть.

Смежные вопросы