仪器社区

求解释 一个简单的四位数字频率计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呢?谢谢好心人啊!!!
评论
全部评论
dogahome
不知道你这程序是哪弄来的,里面有错误且代码风格不好,锁存器只能是电平锁存,触发器才用边缘触发的。要是做项目的话,这样的代码风格具有易读性,易维护性,和可移植性。还要多多学习哈,我为你提供下我写的代码风格,可以供你参考。

我针对【例 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;
15 0 2011-08-31 0条评论 回复
xqtxws0806
希望你扔掉这本书, 看到他在always的时序模块里使用了阻塞赋值, 不知道他要干嘛!!!!!!
testbench是产生特定的序列来输入到你的RTL里面去, 然后采用你RTL的输出, 在自动进行check, 看输出是不是和你期望的一样.
testbench因为重用和随机控制的原因, 会分成很多层, 这个等你verilog熟悉了再看吧.
3 0 2011-08-29 0条评论 回复
wszaizhj
代码都挺简单的,要知道功能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
20 0 2011-08-26 0条评论 回复
879844530
三条程序那么多,我就没空解释那么多了我帮你解释下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的话才有效、,不然没用的,
12 0 2011-08-26 0条评论 回复
您可能感兴趣的社区主题
加载中...
发布 评论