在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2325|回复: 4

初学,请大侠们给挑挑毛病吧

[复制链接]
发表于 2003-10-16 18:59:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
用ISE+ModelSim前仿真时,VSYNC信号不出现,不知道是什么原因。是reg型的信号没有初始?还是数字传送时出了问题?
还有,请大侠们指教一下关于综合、后方针已经引脚定义的方法。
//*for real condition;
`define HSYNC_L 268
`define HSYNC_H 1560
`define VSYNC_L 3
`define VSYNC_H 262
//*/
/*for simulate condition
`define HSYNC_L 4
`define HSYNC_H 100
`define VSYNC_L 3
`define VSYNC_H 50
*/
/*
`define H_START_L 7
`define H_START_H 10
`define V_START_L 8
`define V_START_H 15
*/
/* Top module*/
module top5(clk_in,RESET,HSYNC,VSYNC,DATA,push,CLK_OUT);
input clk_in,RESET,push;
output HSYNC,VSYNC,CLK_OUT;
output [7:0] DATA;
wire clk;
reg reset;
//
wire [7:0] R;
wire [7:0] G;
wire [7:0] B;
wire HSYNC;
//wire VSYNC;
wire [1:0] CLK_B10;
wire HSYNC_B0;
wire HSYNC_temp;
//wire VSYNC;
always @(negedge clk_in)
reset<=RESET;
//D_FF D_FF_reset(1'b1,clk,reset,RESET);

assign clk=clk_in;
//reg [7:0] DATA;
assign CLK_OUT=clk;
HSYNC_BLOCK HSYNC_BLOCK(clk,reset,HSYNC_temp,CLK_B10);
D_FF D_FF_HSYNC (HSYNC_temp,clk,HSYNC);
VSYNC_BLOCK VSYNC_BLOCK(HSYNC,reset,VSYNC,HSYNC_B0);
DATA_OUT DATA_OUT(clk,reset,R,G,B,CLK_B10,HSYNC_B0,DATA);
IMAGE IMAGE(push,reset,R,G,B);

endmodule
/* CLK_COUNTER and HSYNC output*/
module HSYNC_BLOCK (clk_in,reset,HSYNC,CLK_B10);
input clk_in,reset;
output HSYNC;
//output H_START;
output [1:0] CLK_B10;
//reg H_START;
reg [10:0] CLK_COUNTER;
wire [10:0] HSY_L;
wire [10:0] HSY_H;
//wire [10:0] START_L;
//wire [10:0] START_H;
assign HSY_L=`HSYNC_L;
assign HSY_H=`HSYNC_H;
//assign START_L=`H_START_L;
//assign START_H=`H_START_H;

always @(negedge clk_in)
begin
if(reset==0)
begin
CLK_COUNTER<=0;
//H_START<=0;  //***********
end
else if(CLK_COUNTER==HSY_H) CLK_COUNTER<=1;
//************
//else if(CLK_COUNTER==START_L) H_START<=1;
//else if(CLK_COUNTER==START_H) H_START<=0;
else CLK_COUNTER<=CLK_COUNTER+1;
end
assign HSYNC=((CLK_COUNTER<=HSY_L)&&(CLK_COUNTER!=0))? 0:1;
assign CLK_B10[1:0]=CLK_COUNTER[1:0];

endmodule
/* VSYNC output */
module VSYNC_BLOCK(clk_in,reset,VSYNC,HSYNC_B0);
input clk_in,reset;
output VSYNC;
//output V_START;
output HSYNC_B0;
//reg V_START;
reg [8:0] HSY_COUNTER;
wire [8:0] VSY_L;
wire [8:0] VSY_H;
//wire [8:0] START_L;
//wire [8:0] START_H;
assign VSY_L=`VSYNC_L;
assign VSY_H=`VSYNC_H;
//assign START_L=`V_START_L;
//assign START_H=`V_START_H;

always @(negedge clk_in)
begin
if(reset==0)
begin
HSY_COUNTER<=0;
//********
//V_START<=0;
end
else if(HSY_COUNTER==VSY_H) HSY_COUNTER<=1;
//************
//else if(HSY_COUNTER==START_L) V_START<=1;
//else if(HSY_COUNTER==START_H) V_START<=0;
else HSY_COUNTER<=HSY_COUNTER+1;
end
assign VSYNC=((HSY_COUNTER<=VSY_L)&&(HSY_COUNTER!=0))? 0:1;
assign HSYNC_B0=HSY_COUNTER[0];
endmodule
/* DATA output and DATA Quene */
module DATA_OUT(clk_in,reset,R,G,B,CLK_B10,HSYNC_B0,DATA);
input clk_in,reset;
input HSYNC_B0;
input [7:0] R,G,B;
input [1:0] CLK_B10;
output [7:0] DATA;
reg [7:0] DATA;
always @(negedge clk_in)
begin
if(reset)//&&H_START&&V_START)
begin
case({HSYNC_B0,CLK_B10[1],CLK_B10[0]})
//偶数行输出
3'b001: DATA<=8'bzzzzzzzz;
3'b010: DATA<=R;
3'b011: DATA<=G;
3'b000: DATA<=B;
//奇数行输出
3'b101: DATA<=8'bzzzzzzzz;
3'b110: DATA<=G;
3'b111: DATA<=B;
3'b100: DATA<=R;
endcase
end
else
DATA<=0;
end
endmodule
/* Push to change image */
module IMAGE(push,reset,R,G,B);
input push,reset;
output [7:0] R,G,B;
reg [1:0] image;
reg [7:0] R,G,B;
//initial
//image=0;
always @(posedge push)
begin
if(reset)
begin
image=image+1;
case({image[1],image[0]})
2'b01:
begin
R<=8'b00000000;
G<=8'b11111111;
B<=8'b11111111;
end
2'b10:
begin
G<=8'b00000000;
R<=8'b11111111;
B<=8'b11111111;
end
2'b11:
begin
B<=8'b00000000;
G<=8'b11111111;
R<=8'b11111111;
end
2'b00:
begin
R<=8'b00000000;
G<=8'b00000000;
B<=8'b00000000;
end
endcase
end
end
endmodule
/* module D flip flop */
module D_FF(D,clk,Q);
input D,clk;
output Q;
reg Q;
always @(negedge clk)
Q<=D;
endmodule
发表于 2003-10-16 21:13:06 | 显示全部楼层

初学,请大侠们给挑挑毛病吧

没有看到你的testbench,所以不知道你加的信号是怎么样的,建议自己先动手调试一下,VSYNC出不来就把HSY_COUNTER的信号调出来看,或者单独调试一下VSYNC_BLOCK先。
发表于 2003-10-17 09:37:57 | 显示全部楼层

初学,请大侠们给挑挑毛病吧

原因如下:VSYNC_BLOCK模块采用的是同步复位,只有当clk_in的上升沿和reset=0时,HSY_COUNTER才复位为0。在用modelsim仿真时,此前HSY_COUNTER的值为不定态。而该模块的时钟信号由顶层模块中的另一个模块产生,当reset=0时,VSYNC_BLOCK模块的时钟实际上没有沿的变化,因此HSY_COUNTER的值没有初始值(xxxx),当reset结束产生时钟后,根据verilog的运算规则,x+1=x,从而使得VSYNC无输出。当然这是modelsim仿真时出现的结果,实际运行应该是有输出的。
不过你这种写法不是很好,为什么不用clk_in作为所有模块的时钟输入?
 楼主| 发表于 2003-10-17 17:31:40 | 显示全部楼层

初学,请大侠们给挑挑毛病吧

我昨晚也发现是这个原因了,现在已经挑好。实际上,VSYNC_BLOCK模块的时钟信号HSYNC出现上升延激发always语句时,是不可能存在reset=0的情况的,因为HSYNC来自HSYNC_BLOCK模块,而这个模块在产生HSYNC变化时,reset已经=1了,所以,永远也没有办法对VSYNC_BLOCK中的reg赋值。我的解决方法是在VSYNC_BLOCK中自己产生一个晚于HSYNC信号的reset信号。留下的问题是:两级计数器应该如何对其内部的reg进行赋值呢?
发表于 2003-10-17 18:17:23 | 显示全部楼层

初学,请大侠们给挑挑毛病吧

[这个贴子最后由一声叹息在 2003/10/17 06:22pm 第 1 次编辑]

其实将你的复位信号改成异步复位就可以解决你的仿真问题了,根据你的设计环境可以将reset信号用DFF同步一下,再施加到内部的各个模块作为异步复位。
不过还是建议你用clk_in作为所有模块的时钟信号。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-4-6 17:46 , Processed in 0.019895 second(s), 8 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表