Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronic Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Register Log in

Question about shift register (VHDL)

Status
Not open for further replies.

mjvm171

Newbie level 5
Joined
May 5, 2011
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,332
Hello

I just to ask if my shift register code below is correct because the output that we get lacks one more shift..
example:

we need a data that looks like this 11111111 but the output we get is 01111111

Code:
begin
if (clk'event and clk = '1') then
if (TDRE = '1') then
dr <=iempty; 
dr <= Din;
end if;

if (RDRF ='1') then
dr<=sr;
Dout <= dr;
end if;

if (load = '1') then
sr <= dr;
elsif (shift = '1') then
sr <= (sr(6 downto 0) & core_rcve); --last rcved bit :research

end if;
end if;
Assistance is really appreciated

Thank you:grin:
 

TrickyDicky

Advanced Member level 5
Joined
Jun 7, 2010
Messages
7,049
Helped
2,072
Reputation
4,161
Reaction score
2,024
Trophy points
1,393
Activity points
38,909
sr looks like a shift register to me, using dr to load.
 

mjvm171

Newbie level 5
Joined
May 5, 2011
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,332
sr looks like a shift register to me, using dr to load.
yeah.. it's supposed to be a loading and unloading signal. Is that wrong? Should i just turn it to a buffer or something?

umm but anyways i did try to unload the contents of sr directly to Dout (Dout<=sr) but we still got 01111111 instead of 11111111...


I am really confused as to why this is happening..
 

TrickyDicky

Advanced Member level 5
Joined
Jun 7, 2010
Messages
7,049
Helped
2,072
Reputation
4,161
Reaction score
2,024
Trophy points
1,393
Activity points
38,909
its difficult to understand what you're talking about out of context. Theres nothing wrong with your code, and the problems you are having could happen for all sorts of reasons to do with inputs. I suspect its the inputs thats wrong, not the code.
 

mjvm171

Newbie level 5
Joined
May 5, 2011
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,332
its difficult to understand what you're talking about out of context. Theres nothing wrong with your code, and the problems you are having could happen for all sorts of reasons to do with inputs. I suspect its the inputs thats wrong, not the code.
hmm i see.. well then i'll have to check that but my input here is actually a data read from another device..

Nevertheless, Thanks for your answer.
 

mjvm171

Newbie level 5
Joined
May 5, 2011
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,332
have you testbenched this code?
yeah unfortunately the part where we get the 01111111 (the read command) can't be tested on a test bench, i guess, because the one responsible on giving data is the other device. It's the one pulling down the signal (pulled-up signal) that would be received by the shift register. We did test the write command though and it did work in the test bench and on the fpga.
 

FvM

Super Moderator
Staff member
Joined
Jan 22, 2008
Messages
47,960
Helped
14,147
Reputation
28,553
Reaction score
12,833
Trophy points
1,393
Location
Bochum, Germany
Activity points
278,232
Without knowing the input and expected output signal waveforms, nothing can be said.

I wonder, why the output is delayed by an additional clock cycle?
Code:
if (RDRF ='1') then
dr<=sr;
Dout <= dr;
end if;
 

mjvm171

Newbie level 5
Joined
May 5, 2011
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,332
Without knowing the input and expected output signal waveforms, nothing can be said.

I wonder, why the output is delayed by an additional clock cycle?
Code:
if (RDRF ='1') then
dr<=sr;
Dout <= dr;
end if;
is the additional clock cycle dr<=sr; ?

its supposed to be the data register. Hmm.. I'm kind of new in VHDL so I get lost most of the times ending with me not knowing what to do.
 

alexan_e

Administrator
Joined
Mar 16, 2008
Messages
11,895
Helped
2,021
Reputation
4,158
Reaction score
2,031
Trophy points
1,393
Location
Greece
Activity points
64,377
Also this part

if (clk'event and clk = '1') then
if (TDRE = '1') then
dr <=iempty;
dr <= Din;

end if;

dr will be assigned the value you wrote last which means that dr <=iempty; will be ignored.
Was one of the lines supposed to be sr and not dr?

Alex
 

mjvm171

Newbie level 5
Joined
May 5, 2011
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,332
Also this part

if (clk'event and clk = '1') then
if (TDRE = '1') then
dr <=iempty;
dr <= Din;

end if;

dr will be assigned the value you wrote last which means that dr <=iempty; will be ignored.
Was one of the lines supposed to be sr and not dr?

Alex
no.. i forgot to remove dr<= iempty lol my mistake. its just something to test the dr signal.

so you mean to say that it's better if I just make it Dout <= sr.. hmm do you have any suggestions on how i could make the data register because it seems like its delaying the signal and it might be a reason why the output is not shifted properly.

thank you
 

alexan_e

Administrator
Joined
Mar 16, 2008
Messages
11,895
Helped
2,021
Reputation
4,158
Reaction score
2,031
Trophy points
1,393
Location
Greece
Activity points
64,377
I assume that this code is inside a process, note that dr, sr are signals so

Code VHDL - [expand]
1
2
3
dr<=sr;  -- the sr value will be assigned the next time that the process in entered, dr will keep the same value it had when the process was entered
Dout <= dr;     -- that means that in this line you assign the "old" dr 
end if;



Alex
 

mjvm171

Newbie level 5
Joined
May 5, 2011
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,332
I assume that this code is inside a process, note that dr, sr are signals so

Code VHDL - [expand]
1
2
3
dr<=sr;  -- the sr value will be assigned the next time that the process in entered, dr will keep the same value it had when the process was entered
Dout <= dr;     -- that means that in this line you assign the "old" dr 
end if;



Alex
oh I see, I could now understand better thank you very much..
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top