如何用Verilog设计一个异步清0、同步时钟使能和异步数据加载型8位二进制家法计数器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Verilog设计一个异步清0、同步时钟使能和异步数据加载型8位二进制家法计数器?相关的知识,希望对你有一定的参考价值。

如题~最好能解说下为什么那么设计~谢谢

1、在jsp或者html中使用jquery发送ajax请求,这里是获取后台的某个接口。

2、只需要修改ajax请求中的async参数即可,async是异步的意思,如果需要设置同步,只需要设置为async=false。

3、设置成异步只需要修改async=true就是异步了,javascript代码运行时并不会等待ajax返回结果,而是直接向下执行。

4、为了测试完整,这里贴出后台接口的大概处理代码。

参考技术A module counter(
clk,
rst_n,
load,
loaden,
cnt
);

input clk;
input rst_n;
input [7:0] load;
input loaden;
output [7:0] cnt;

reg [7:0] cnt;

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 8'b0;
else if(loaden)
cnt <= load;
else
cnt <= cnt + 8'b1;
end

endmodule
你的要求是这样的,所以这样设计。本回答被提问者采纳

verilog常考面试题之同步FIFO设计(给定位宽和深度)


fifo(first in first out)fifo的作用是缓冲,分为同步fifo和异步fifo,跟其他存储单元例如RAM的区别最大在于RAM有地址线,可寻址读写,而FIFO不可寻址,所以读写地址得用读写指针生成。

1.同步fifo的写时钟和读时钟是同一个时钟域(信号基于同一个时钟变化)

2.同步fifo的三部分:

fifo写控制逻辑:产生写地址(决定往哪写,从0开始写)、写有效信号、写满(决定是否还能写)等信号;
fifo读控制逻辑:产生读地址(决定从哪读,从0开始读)、读有效信号、读满(决定是否还能读)等信号;
fifo的存储实体(reg、memory)

例如:给定位宽为8,深度16

一、首先定义参数,方便后续修改或者其他人使用时直接通过传参进行,包括数据位宽、FIFO深度、地址位宽(log2(fifo深度))、读的模式(组合逻辑或者时序逻辑),读指针,写指针,存储状态。接口信号主要是:时钟和复位、写的端口信号、读的端口信号

module
#(
  parameter addr_width=4,
  parameter data_width=8,
  parameter data_depth=1<<addr_width,
)
(input clk,
 input rstn,
 input [data_depth-1:0] w_data,
 output [data_depth-1:0] r_data,
 input w_en,
 input r_en,
 output full,
 output empty,

 reg [data_depth-1:0] w_pointer,//写指针产生写地址
 reg [data_depth-1:0] r_pointer,//读指针产生读地址
 reg [data_width-1:0]mem[data_depth-1:0]//存储器用于存数据,
 reg [data_depth-1:0] status,//用于空满状态判断,

二、空满状态判断

assign full=(status==data_depth-1)?`b1:`b0;
assign empty=(status==0)?`b1:`b0;

三、读写指针的控制:当写(读)指针=深度-1,表示满,写(读)指针清零。当写有效且未满时,写指针加1;当读有效且未空时,读指针减1。

//写
always @(posedge clk or negedge rstn)begin
   if(!rstn)
    w_pointer<=0;
    else if(full)
     w_pointer<=0;
     else if(w_en && ~full)
      w_pointer<= w_pointer+1;
    end
// 读  
always @(posedge clk or negedge rstn)begin
   if(!rstn)
    r_pointer<=0;
    else if(empty)
     r_pointer<=0;
     else if(r_en && ~empty)
      r_pointer<= r_pointer+1;
    end  

四、存储器状态,当同时读写时,保持;写,加1;读,减1。(时序逻辑的else可写可不写,本身带有保持)

always @(posedge clk or negedge rstn)begin
   if(!rstn)
    status<=0;
    else if(w_en && r_en)
     status<=status;
     else if(r_en && ~empty)
      status<= status-1;
      else if(w_en && ~full)
      status<= status+1;
    end  

五、写入数据,将写入的数据存入memory中。数组需要一位一位的索引,一位一位的赋值,因此用了for循环(for循环不耗时)

integer i;
always @(posedge clk or negedge rstn)begin
   if(!rstn)begin
    for(i=0;i<data_depth;i=i+1)
    mem[i]<=0;
    end
    else if(w_en && ~full)
    mem[w_pointer]<=w_data;
end

六、读数据

always @(posedge clk or negedge rstn)begin
   if(!rstn)begin
   r_data<=0;
   end
   else if(r_en && ~empty)
   r_data<=mem[r_pointer];
end

以上是关于如何用Verilog设计一个异步清0、同步时钟使能和异步数据加载型8位二进制家法计数器?的主要内容,如果未能解决你的问题,请参考以下文章

verilog--记verilog程序设计的一点心得

异步fifo的Verilog实现

Verilog简单功能实现--同步FIFO

Verilog学习笔记简单功能实现...............同步FIFO

Verilog输入两个时钟是对齐的吗

异步fifo要求用verilog编写