求解释 一个简单的四位数字频率计verilog hdl程序。 王金明那本书上的
汽车火车票报销
2011-08-25
【例 11.2】4 位数字频率计控制模块 module fre_ctrl(clk,rst,count_en,count_clr,load); output count_en,count_clr,load; input clk,rst; reg count_en,load; always @(posedge clk) begin if(rst) begin count_en=0; load=1; end else begin coun... 【例 11.2】4 位数字频率计控制模块
module fre_ctrl(clk,rst,count_en,count_clr,load);
output count_en,count_clr,load;
input clk,rst;
reg count_en,load;
always @(posedge clk)
begin
if(rst) begin count_en=0; load=1; end
else begin
count_en=~count_en;
load=~count_en; //load 信号的产生
end
end
assign count_clr=~clk&load; //count_clr 信号的产生
endmodule
【例 11.3】4 位数字频率计计数子模块
module count10(out,cout,en,clr,clk);
output[3:0] out;
output cout;
input en,clr,clk;
reg[3:0] out;
always @(posedge clk or posedge clr)
begin
if (clr) out = 0; //异步清0
else if(en)
begin
if(out==9) out=0;
else out = out+1;
end
end
assign cout =((out==9)&en)?1:0; //产生进位信号
endmodule
【例 11.4】频率计锁存器模块
module latch_16(qo,din,load);
output[15:0] qo;
王金明:《Verilog HDL 程序设计教程》
- 57 -
input[15:0] din;
input load;
reg[15:0] qo;
always @(posedge load)
begin qo=din; end
endmodule
关键是解释这三个程序。。还有,怎么写test——bench呢?谢谢好心人啊!!!
全部评论
不知道你这程序是哪弄来的,里面有错误且代码风格不好,锁存器只能是电平锁存,触发器才用边缘触发的。要是做项目的话,这样的代码风格具有易读性,易维护性,和可移植性。还要多多学习哈,我为你提供下我写的代码风格,可以供你参考。
我针对【例 11.4】频率计锁存器模块来讲(提醒:锁存器只能是电平锁存),所以你这书上是错误的,并且时序电路只能用非阻塞赋值。
//=====================================================
//Author :XXXXXXXX
//Date :XXXXXXXX
//Function :XXXXXXXX
//=====================================================
module latch(
//Input ports
DI,
LOAD,
//Output ports
DO
);
//=====================================================
//Input and output declaration
//=====================================================
input [15:0] DI;
input LOAD;
output [15:0] DO;
//=====================================================
//Wire and reg declaration
//=====================================================
wire [15:0] DI;
wire LOAD;
reg [15:0] DO;//方法一
wrie [15:0] DO;//方法二
//=====================================================
//Logic
//=====================================================
由于锁存器是电平锁存,因此是组合逻辑电路。而组合逻辑电路有两种实现方法,
针对这两种方法我都写出来供你参考。
注意事项:用always实现组合逻辑电路,被赋值的变量必须为reg型变量,因此在声明的时候为
reg [15:0] DO;
用asssign实现组合逻辑电路,被赋值的变量必须为wire型变量,因此在声明的时候为
wire [15:0] DO; 已在上面的声明中注明。
方法一:
always @ (*)
begin
if(LOAD)
DO<=DI;
end
方法二:
assign DO = (LOAD) ? DI : DO;
希望你扔掉这本书, 看到他在always的时序模块里使用了阻塞赋值, 不知道他要干嘛!!!!!!
testbench是产生特定的序列来输入到你的RTL里面去, 然后采用你RTL的输出, 在自动进行check, 看输出是不是和你期望的一样.
testbench因为重用和随机控制的原因, 会分成很多层, 这个等你verilog熟悉了再看吧.
代码都挺简单的,要知道功能Z简单直接的方法就是把它仿真出来看波形,这种testbench也比较简单,其实激励就是把程序需要的输入信号给它,也就是用另个代码写一段本身代码所需要的输入信号,如【例 11.2】中需要clk,rst,
reg clk;
reg rst;
always #5 clk=~clk;
initial
begin
clk=0;
rst = 1;
#350 rst=0;
#500 rst=1;
end
单位由你定义的timescale决定,如`timescale 1ns / 1ps也就是clk周期是10ns
三条程序那么多,我就没空解释那么多了我帮你解释下diyi条的,你慢慢琢磨其他的,等你成熟了之后你会发现这个东西不难的。
module fre_ctrl(clk,rst,count_en,count_clr,load);
output count_en,count_clr,load;
input clk,rst;
reg count_en,load;
always @(posedge clk) //这个是上升沿触发
begin
if(rst) begin count_en=0; load=1; end //这表示如果rst是1的话就复位。
else begin
count_en=~count_en; //这就是取反而已
load=~count_en; //load 信号的产生 也是取反,
end
end
assign count_clr=~clk&load; //count_clr 信号的产生 而且如果load是1的话才有效、,不然没用的,
您可能感兴趣的社区主题
评论
选购仪器 上yiqi.com
仪器网络推广
品牌网上传播
长按识别二维码查看信息详情